""" from __future__ import division import numpy as np import pymc3 as pm import matplotlib.pyplot as plt from plot_post import plot_post ## specify the Data y = np.repeat([0, 1], [3, 6]) # 3 tails 6 heads with pm.Model() as model: # Hyperhyperprior: model_index = pm.DiscreteUniform('model_index', lower=0, upper=1) # Hyperprior: kappa_theta = 12 mu_theta = pm.switch(pm.eq(model_index, 1), 0.25, 0.75) # Prior distribution: a_theta = mu_theta * kappa_theta b_theta = (1 - mu_theta) * kappa_theta theta = pm.Beta('theta', a_theta, b_theta) # theta distributed as beta density #likelihood y = pm.Bernoulli('y', theta, observed=y) start = pm.find_MAP() step = pm.Metropolis() trace = pm.sample(10000, step, start=start, progressbar=False) ## Check the results. burnin = 2000 # posterior samples to discard thin = 1 # posterior samples to discard
# Hyperprior on mu and kappa: kappa = pm.Gamma('kappa', shape_Gamma, rate_Gamma, shape=n_cond) mu0 = pm.Beta('mu0', 1, 1) a_Beta0 = mu0 * kappa[cond_of_subj] b_Beta0 = (1 - mu0) * kappa[cond_of_subj] mu1 = pm.Beta('mu1', 1, 1, shape=n_cond) a_Beta1 = mu1[cond_of_subj] * kappa[cond_of_subj] b_Beta1 = (1 - mu1[cond_of_subj]) * kappa[cond_of_subj] #Prior on theta theta0 = pm.Beta('theta0', a_Beta0, b_Beta0, shape=n_subj) theta1 = pm.Beta('theta1', a_Beta1, b_Beta1, shape=n_subj) # if model_index == 0 then sample from theta1 else sample from theta0 theta = pm.switch(pm.eq(model_index, 0), theta1, theta0) # Likelihood: y = pm.Binomial('y', p=theta, n=n_trl_of_subj, observed=n_corr_of_subj) # Sampling start = pm.find_MAP() step1 = pm.Metropolis(model.vars[1:]) step2 = pm.ElemwiseCategoricalStep(var=model_index,values=[0,1]) trace = pm.sample(20000, [step1, step2], start=start, progressbar=False) # EXAMINE THE RESULTS. burnin = 10000 thin = 10
# THE DATA. N = 30 z = 8 y = np.repeat([1, 0], [z, N - z]) # THE MODEL. with pm.Model() as model: # Hyperprior on model index: model_index = pm.DiscreteUniform('model_index', lower=0, upper=1) # Prior nu = pm.Normal('nu', mu=0, tau=0.1) # it is posible to use tau or sd eta = pm.Gamma('eta', .1, .1) theta0 = 1 / (1 + pm.exp(-nu)) # theta from model index 0 theta1 = pm.exp(-eta) # theta from model index 1 theta = pm.switch(pm.eq(model_index, 0), theta0, theta1) # Likelihood y = pm.Bernoulli('y', p=theta, observed=y) # Sampling start = pm.find_MAP() step1 = pm.Metropolis(model.vars[1:]) step2 = pm.ElemwiseCategoricalStep(var=model_index, values=[0, 1]) trace = pm.sample(10000, [step1, step2], start=start, progressbar=False) # EXAMINE THE RESULTS. burnin = 1000 thin = 5 ## Print summary for each trace #pm.summary(trace[burnin::thin]) #pm.summary(trace)