void gammaexpo(){ printf("gamma/exponential\n"); apop_model *gamma = apop_model_set_parameters(apop_gamma, 1, 0.4); apop_model *drawfrom = apop_model_set_parameters(apop_exponential, 0.4); int draw_ct = 120; apop_data *draws = apop_model_draws(drawfrom, draw_ct); apop_model *gammaup = apop_update(draws, gamma, apop_exponential); apop_model_show(gammaup); gamma->more = apop_gamma; gamma->log_likelihood = fake_ll; Apop_settings_add_group(gamma, apop_mcmc, .burnin=.1, .periods=1e5, .proposal=apop_model_set_parameters(apop_normal, 1, .001)); apop_model *upd = apop_update(draws, gamma, apop_exponential); apop_model *gammaed = apop_estimate(upd->data, apop_gamma); apop_model_show(gammaed); deciles(gammaed, gammaup, 3); Apop_settings_add_group(gamma, apop_mcmc, .burnin=.1, .periods=1e5, .proposal=apop_model_set_parameters(apop_normal, 1, .01)); gamma->log_likelihood = NULL; apop_model *upd_r = apop_update(draws, gamma, apop_exponential); apop_model *gammafied2 = apop_estimate(apop_data_pmf_expand(upd_r->data, 2000), apop_gamma); deciles(gammafied2, gammaup, 5); }
void gammafish(){ printf("gamma/poisson\n"); apop_model *gamma = apop_model_set_parameters(apop_gamma, 1.5, 2.2); apop_model *drawfrom = apop_model_set_parameters(apop_poisson, 3.1); int draw_ct = 90; apop_data *draws = apop_model_draws(drawfrom, draw_ct); apop_model *gammaup = apop_update(draws, gamma, apop_poisson); apop_model_show(gammaup); gamma->more = apop_gamma; gamma->log_likelihood = fake_ll; apop_model *proposal = apop_model_fix_params(apop_model_set_parameters(apop_normal, NAN, 1)); proposal->parameters = apop_data_falloc((1), .9); //apop_data_set(apop_settings_get(gamma, apop_mcmc, proposal)->parameters, .val=.9); Apop_settings_add_group(gamma, apop_mcmc, .burnin=.1, .periods=1e4, .proposal=proposal); apop_model *upd = apop_update(draws, gamma, apop_poisson); apop_model *gammafied = apop_estimate(upd->data, apop_gamma); deciles(gammafied, gammaup, 5); //Apop_settings_add_group(beta, apop_mcmc, .burnin=.4, .periods=1e4); gamma->log_likelihood = NULL; apop_model *upd_r = apop_update(draws, gamma, apop_poisson); apop_model *gammafied2 = apop_estimate(apop_data_pmf_expand(upd_r->data, 2000), apop_gamma); deciles(gammafied2, gammaup, 5); deciles(gammafied, gammafied2, 5); }
void betabinom(){ apop_model *beta = apop_model_set_parameters(apop_beta, 10, 5); apop_model *drawfrom = apop_model_copy(apop_multinomial); drawfrom->parameters = apop_data_falloc((2), 30, .4); drawfrom->dsize = 2; int draw_ct = 80; apop_data *draws = apop_model_draws(drawfrom, draw_ct); apop_model *betaup = apop_update(draws, beta, apop_binomial); apop_model_show(betaup); beta->more = apop_beta; beta->log_likelihood = fake_ll; apop_model *bi = apop_model_fix_params(apop_model_set_parameters(apop_binomial, 30, NAN)); apop_model *upd = apop_update(draws, beta, bi); apop_model *betaed = apop_estimate(upd->data, apop_beta); deciles(betaed, betaup, 1); beta->log_likelihood = NULL; apop_model *upd_r = apop_update(draws, beta, bi); betaed = apop_estimate(apop_data_pmf_expand(upd_r->data, 2000), apop_beta); deciles(betaed, betaup, 1); apop_data *d2 = apop_model_draws(upd, draw_ct*2); apop_model *d2m = apop_estimate(d2, apop_beta); deciles(d2m, betaup, 1); }
int main(){ gsl_rng *r = apop_rng_alloc(2468); double binom_start = 0.6; double beta_start_a = 0.3; double beta_start_b = 0.5; int i, draws = 1500; double n = 4000; //First, the easy estimation using the conjugate distribution table. apop_model *bin = apop_model_set_parameters(apop_binomial, n, binom_start); apop_model *beta = apop_model_set_parameters(apop_beta, beta_start_a, beta_start_b); apop_model *updated = apop_update(.prior= beta, .likelihood=bin,.rng=r); //Now estimate via Gibbs sampling. //Requires a one-parameter binomial, with n fixed, //and a data set of n data points with the right p. apop_model *bcopy = apop_model_set_parameters(apop_binomial, n, GSL_NAN); apop_data *bin_draws = apop_data_fill(apop_data_alloc(1,2), n*(1-binom_start), n*binom_start); bin = apop_model_fix_params(bcopy); apop_model_add_group(beta, apop_update, .burnin=.1, .periods=1e4); apop_model *out_h = apop_update(bin_draws, beta, bin, NULL); //We now have a histogram of values for p. What's the closest beta //distribution? apop_data *d = apop_data_alloc(0, draws, 1); for(i=0; i < draws; i ++) apop_draw(apop_data_ptr(d, i, 0), r, out_h); apop_model *out_beta = apop_estimate(d, apop_beta); //Finally, we can compare the conjugate and Gibbs results: apop_vector_normalize(updated->parameters->vector); apop_vector_normalize(out_beta->parameters->vector); double error = apop_vector_distance(updated->parameters->vector, out_beta->parameters->vector, .metric='m'); double updated_size = apop_vector_sum(updated->parameters->vector); Apop_assert(error/updated_size < 0.01, "The error is %g, which is too big.", error/updated_size); }
int main(){ apop_model_print ( apop_estimate( apop_update( apop_model_draws( apop_model_mixture( apop_model_set_parameters(apop_poisson, 2.8), apop_model_set_parameters(apop_poisson, 2.0), apop_model_set_parameters(apop_poisson, 1.3) ), 1e4 ), truncate_model( apop_model_set_parameters(apop_normal, 2, 1), 0 ), apop_poisson )->data, apop_normal ) , NULL); }