double apop_fdist_llike(apop_data *d, apop_model *m){ Nullcheck_mpd(d, m, GSL_NAN); double df[2]; df[0] = m->parameters->vector->data[0]; df[1] = m->parameters->vector->data[1]; return apop_map_sum(d, .fn_dp=one_f, .param =df); }
/* \adoc cdf At the moment, only implemented for the Binomial. Let the first element of the data set (top of the vector or point (0,0) in the matrix, your pick) be $L$; then I return the sum of the odds of a draw from the given Binomial distribution returning $0, 1, \dots, L$ hits. */ static double binomial_cdf(apop_data *d, apop_model *est){ Nullcheck_mpd(d, est, GSL_NAN) Get_vmsizes(d); //firstcol double hitcount = apop_data_get(d, .col=firstcol); double n = gsl_vector_get(est->parameters->vector, 0); double p = gsl_vector_get(est->parameters->vector, 1); return gsl_cdf_binomial_P(hitcount, p, n); }
static double multinomial_log_likelihood(apop_data *d, apop_model *params){ Nullcheck_mpd(d, params, GSL_NAN); double *pv = params->parameters->vector->data; double n = pv[0]; Apop_assert_c(pv[1] <=1, GSL_NAN, 1, "The input parameters should be [n, p_1, (...)], but " "element 1 of the parameter vector is >1.") //mostly makes sense for the binomial. if (n==2) return apop_map_sum(d, .fn_vp=binomial_ll, .param=params->parameters->vector); pv[0] = 1 - (apop_sum(params->parameters->vector)-n);//making the params a p-vector. Put n back at the end. double out = apop_map_sum(d, .fn_vp=multinomial_ll, .param=params); pv[0]=n; return out; }
static long double wishart_ll(apop_data *in, apop_model *m){ Nullcheck_mpd(in, m, GSL_NAN); wishartstruct_t ws = { .paraminv = apop_matrix_inverse(m->parameters->matrix), .len = sqrt(in->matrix->size2), .df = m->parameters->vector->data[0] }; double paramdet = apop_matrix_determinant(m->parameters->matrix); if (paramdet < 1e-3) return GSL_NEGINF; double ll = apop_map_sum(in, .fn_vp = one_wishart_row, .param=&ws, .part='r'); double k = log(ws.df)*ws.df/2.; k -= M_LN2 * ws.len* ws.df/2.; k -= log(paramdet) * ws.df/2.; k -= apop_multivariate_lngamma(ws.df/2., ws.len); return ll + k*in->matrix->size1; } static int apop_wishart_draw(double *out, gsl_rng *r, apop_model *m){ /* Translated from the Fortran by BK. Fortran comments: C SUBROUTINE DWSHRT(D, N, NP, NNP, SB, SA) C C ALGORITHM AS 53 APPL. STATIST. (1972) VOL.21, NO.3 C C Wishart variate generator. On output, SA is an upper-triangular C matrix of size NP * NP [...] C whose elements have a Wishart(N, SIGMA) distribution. */ Nullcheck_mp(m, ); int np = m->parameters->matrix->size1; int n = m->parameters->vector->data[0]; if (!m->more) { gsl_matrix *ccc = apop_matrix_copy(m->parameters->matrix); gsl_linalg_cholesky_decomp(ccc); for (int i=0; i < ccc->size1; i++) //zero out the upper diagonal for (int j=i+1; j < ccc->size2; j++) gsl_matrix_set(ccc, i, j, 0); m->more = apop_matrix_to_data(ccc); m->more_size = sizeof(apop_data); } apop_data *Chol = m->more; apop_data *rmatrix = apop_data_calloc(np, np); Staticdef(apop_model *, std_normal, apop_model_set_parameters(apop_normal, 0, 1)); //C Load diagonal elements with square root of chi-square variates for(int i = 0; i< np; i++){ int DF = n - i; apop_data_set(rmatrix, i, i, sqrt(gsl_ran_chisq(r, DF))); } for(int i = 1; i< np; i++) //off-diagonal triangles: Normals. for(int j = 0; j< i; j++){ double ndraw; apop_draw(&ndraw, r, std_normal); assert (!gsl_isnan(ndraw)); apop_data_set(rmatrix, i, j, ndraw); } //Now find C * rand * rand' * C' apop_data *cr = apop_dot(Chol, rmatrix); apop_data *crr = apop_dot(cr, rmatrix, .form2='t'); apop_data *crrc = apop_dot(crr, Chol, .form2='t'); memmove(out, crrc->matrix->data, sizeof(double)*np*np); apop_data_free(rmatrix); apop_data_free(cr); apop_data_free(crrc); apop_data_free(crr); return 0; }
double apop_chisq_llike(apop_data *d, apop_model *m){ Nullcheck_mpd(d, m, GSL_NAN); double df = m->parameters->vector->data[0]; return apop_map_sum(d, .fn_dp=one_chisq, .param =&df); }
double apop_tdist_llike(apop_data *d, apop_model *m){ Nullcheck_mpd(d, m, GSL_NAN); double *params = m->parameters->vector->data; return apop_map_sum(d, .fn_dp=one_t, .param=¶ms); }