def test_sample(self): with self.SMC_test: mtrace = pm.sample(draws=self.samples, step=pm.SMC()) x = mtrace['X'] mu1d = np.abs(x).mean(axis=0) np.testing.assert_allclose(self.muref, mu1d, rtol=0., atol=0.03)
def main(): n = 4 mu1 = np.ones(n) * (1. / 2) with pm.Model() as ATMIP_test: X = pm.Uniform('X', shape=n, lower=-2. * np.ones_like(mu1), upper=2. * np.ones_like(mu1), testval=-1. * np.ones_like(mu1)) kd4 = pm.Lognormal('kd4', mu=np.log(0.3), sd=1) # k_d4 = pm.Lognormal('k_d4', mu=np.log(6E-3), sd=9) # kSOCSon = pm.Lognormal('kSOCSon', mu=np.log(1E-6), sd = 2) # kpa = pm.Lognormal('kpa', mu=np.log(1E-6), sd = 2) # R1 = pm.Uniform('R1', lower=900, upper=5000) # R2 = pm.Uniform('R2', lower=900, upper=5000) # gamma = pm.Uniform('gamma', lower=2, upper=30) llk = pm.Potential('llk', two_gaussians(X, kd4)) with ATMIP_test: trace = pm.sample(100, chains=50, step=pm.SMC()) plt.figure() pm.traceplot(trace) plt.savefig("mc_testing.pdf") s = pm.stats.summary(trace) s.to_csv('mcmc_parameter_summary.csv')
def test_start(self): with pm.Model() as model: a = pm.Poisson("a", 5) b = pm.HalfNormal("b", 10) y = pm.Normal("y", a, b, observed=[1, 2, 3, 4]) start = { "a": np.random.poisson(5, size=500), "b_log__": np.abs(np.random.normal(0, 10, size=500)), } trace = pm.sample(500, start=start, step=pm.SMC())
def test_sample_n_core(self, cores, stage): step_kwargs = {'homepath': self.test_folder, 'stage': stage} with self.ATMIP_test: mtrace = pm.sample(draws=self.samples, chains=self.chains, cores=cores, step=pm.SMC(), step_kwargs=step_kwargs) x = mtrace.get_values('X') mu1d = np.abs(x).mean(axis=0) np.testing.assert_allclose(self.muref, mu1d, rtol=0., atol=0.03)
def test_ml(self): data = np.repeat([1, 0], [50, 50]) marginals = [] a_prior_0, b_prior_0 = 1., 1. a_prior_1, b_prior_1 = 20., 20. for alpha, beta in ((a_prior_0, b_prior_0), (a_prior_1, b_prior_1)): with pm.Model() as model: a = pm.Beta('a', alpha, beta) y = pm.Bernoulli('y', a, observed=data) trace = pm.sample(2000, step=pm.SMC()) marginals.append(model.marginal_likelihood) # compare to the analytical result assert abs((marginals[1] / marginals[0]) - 4.0) <= 1
def test_discrete_continuous(self): with pm.Model() as model: a = pm.Poisson('a', 5) b = pm.HalfNormal('b', 10) y = pm.Normal('y', a, b, observed=[1, 2, 3, 4]) trace = pm.sample(step=pm.SMC())
az.plot_trace(trace_BF) plt.savefig('B11197_05_11.png', dpi=300) # In[17]: pM1 = trace_BF['model_index'].mean() pM0 = 1 - pM1 BF = (pM0 / pM1) * (p[1] / p[0]) BF # In[18]: with pm.Model() as model_BF_0: theta = pm.Beta('theta', 4, 8) y = pm.Bernoulli('y', theta, observed=y_d) trace_BF_0 = pm.sample(2500, step=pm.SMC()) with pm.Model() as model_BF_1: theta = pm.Beta('theta', 8, 4) y = pm.Bernoulli('y', theta, observed=y_d) trace_BF_1 = pm.sample(2500, step=pm.SMC()) # In[19]: model_BF_0.marginal_likelihood / model_BF_1.marginal_likelihood # ## Bayes factors and information criteria # In[20]: traces = []
az.plot_trace(trace_bf) # %% pm1 = trace_bf['model_index'].mean() pm0 = 1 - pm1 bf = (pm0 / pm1) * (p[1] / p[0]) # %% bf # %% with pm.Model() as model_bf_0: theta = pm.Beta('theta', 4, 8) y = pm.Bernoulli('y', theta, observed=y_d) trace_bf_0 = pm.sample(2500, step=pm.SMC()) with pm.Model() as model_bf_1: theta = pm.Beta('theta', 8, 4) y = pm.Bernoulli('y', theta, observed=y_d) trace_bf_1 = pm.sample(2500, step=pm.SMC()) model_bf_0.marginal_likelihood / model_bf_1.marginal_likelihood # %% traces = [] waics = [] for coins, heads in [(30, 9), (300, 90)]: y_d = np.repeat([0, 1], [coins - heads, heads]) for priors in [(4, 8), (8, 4)]: with pm.Model() as model:
def beam_model(f): return gaussian_beam(f, beam_gauss_width) nsamp = 6000 # Set whether to use the beam_model if fitinfo_dict[gal][name]['use_beam']: fit_beam_model = beam_model else: fit_beam_model = None out, summ, trace, fit_model = \ fit_pspec_model(freqs, ps1D, ps1D_stddev, beam_model=fit_beam_model, step=pm.SMC(), nsamp=nsamp, fixB=fitinfo_dict[gal][name]['fixB']) row_names.append("{0}_{1}_{2}".format(gal.lower(), name, res_type)) fit_results['logA'].append(np.array(summ['mean'])[0]) fit_results['ind'].append(np.array(summ['mean'])[1]) # fit_results['logB'].append(np.array(summ['mean'])[2]) fit_results['logA_std'].append(np.array(summ['sd'])[0]) fit_results['ind_std'].append(np.array(summ['sd'])[1]) # fit_results['logB_std'].append(np.array(summ['sd'])[2]) plt.figure(figsize=(8.4, 2.9))
'confidence', ] target_name = 'awareness' experiment = 'e1' # for some of the variables, we need to rescale them to a more preferable range like 0-1 name_for_scale = ['awareness'] # ['ah', 'av', 'bj', 'cm', 'db', 'ddb', 'fcm', 'kf', 'kk', 'ml', 'qa','sk', 'yv'] # get one of the participants' data transition_matrix, sub = [], [] transition_count = [] for participant, df_sub in df.groupby('participant'): awareness = df_sub['awareness'].values - 1 with pm.Model() as model: a = pm.Beta('a', 0.5, 0.5) yl = pm.Bernoulli('yl', a, observed=awareness) trace = pm.sample(1000, step=pm.SMC(), random_seed=42) # for 1-back temp = pd.crosstab(pd.Series(df_sub['awareness'].values[1:], name='N'), pd.Series(df_sub['awareness'].values[:-1], name='N-1'), normalize=1) transition_matrix.append(temp.get_values().flatten()) temp = pd.crosstab( pd.Series(df_sub['awareness'].values[1:], name='N'), pd.Series(df_sub['awareness'].values[:-1], name='N-1'), ) transition_count.append(temp.get_values().flatten()) sub.append(participant) df1_transition = pd.DataFrame(transition_matrix, columns=[ 'unaware-unaware', 'aware-unaware',
def fit_pspec_model( freqs, ps1D, ps1D_stddev, beam_model=None, ntune=2000, nsamp=6000, step=pm.SMC(), cores=1, chains=100, fixB=False, noise_term=False, progressbar=True, return_model=False, ): def powerlaw_model(f, logA, ind, logB=-20): return 10**logA * f**-ind + 10**logB if beam_model is not None: if noise_term: def powerlaw_fit_model(f, logA, ind, logB=-20, logC=-20): return powerlaw_model(f, logA, ind, logB) * beam_model(f) + 10**logC else: def powerlaw_fit_model(f, logA, ind, logB=-20): return powerlaw_model(f, logA, ind, logB) * beam_model(f) else: if noise_term: def powerlaw_fit_model(f, logA, ind, logB=-20, logC=-20): return powerlaw_model(f, logA, ind, logB) + 10**logC else: powerlaw_fit_model = powerlaw_model # Try a pymc model to fit with pm.Model() as model: logA = pm.Uniform('logA', -20., 20.) ind = pm.Uniform('index', 0.0, 10.) if not fixB: logB = pm.Uniform('logB', -20., 20.) else: logB = -20. # Weak Gaussian priors # logA = pm.Normal('logA', 0., 10.) # ind = pm.Normal('index', 0.0, 3.) # if not fixB: # logB = pm.Normal('logB', 0., 10.) # else: # logB = -20. if noise_term: logC = pm.Uniform('logC', -20., 20.) # logC = pm.Normal('logC', 0., 10.) ps_vals = pm.Normal('obs', powerlaw_fit_model(freqs, logA, ind, logB=logB, logC=logC), sd=ps1D_stddev, observed=ps1D) else: ps_vals = pm.Normal('obs', powerlaw_fit_model(freqs, logA, ind, logB=logB), sd=ps1D_stddev, observed=ps1D) # step = pm.Slice() # step = pm.NUTS() # step = pm.SMC() trace = pm.sample(nsamp, tune=ntune, step=step, progressbar=progressbar, cores=cores, chains=chains) summ = pm.summary(trace) out = [np.array(summ['mean']), np.array(summ['sd'])] if return_model: return out, summ, trace, powerlaw_fit_model, model else: return out, summ, trace, powerlaw_fit_model
def fit_broken_pspec_model(freqs, ps1D, ps1D_stddev, beam_model=None, ntune=2000, nsamp=6000, step=pm.SMC(), cores=1, chains=100, fixB=False, noise_term=False, progressbar=True, return_model=False, trace_name=None): # https://docs.astropy.org/en/stable/api/astropy.modeling.powerlaws.SmoothlyBrokenPowerLaw1D.html def broken_powerlaw_model(f, logA, ind1, ind2, break_f, logB=-20, delta=0.1): A = 10**logA B = 10**logB return A * (f / break_f)**-ind1 * (0.5 * (1 + (f / break_f)**(1 / delta)))**( (ind1 - ind2) * delta) + B if beam_model is not None: if noise_term: def powerlaw_fit_model(f, logA, ind1, ind2, break_f, logB=-20, logC=-20): return broken_powerlaw_model(f, logA, ind1, ind2, break_f, logB) * beam_model(f) + 10**logC else: def powerlaw_fit_model(f, logA, ind1, ind2, break_f, logB=-20): return broken_powerlaw_model(f, logA, ind1, ind2, break_f, logB) * beam_model(f) else: if noise_term: def powerlaw_fit_model(f, logA, ind1, ind2, break_f, logB=-20, logC=-20): return broken_powerlaw_model(f, logA, ind1, ind2, break_f, logB) + 10**logC else: powerlaw_fit_model = broken_powerlaw_model # Try a pymc model to fit with pm.Model() as model: logA = pm.Uniform('logA', -20., 20.) ind1 = pm.Uniform('index1', 0.0, 10.) # logA = pm.Normal('logA', 0., 10.) # ind1 = pm.Normal('index1', 0.0, 3.) # if not fixB: # logB = pm.Normal('logB', 0., 10.) # else: # logB = -20. # Second index is a perturbation on the first. ind2 = ind1 + pm.Normal('index2', 0.0, 10.) break_f = pm.Uniform('break_f', freqs.min(), freqs.max()) if not fixB: logB = pm.Uniform('logB', -20., 20.) else: logB = -20. if noise_term: logC = pm.Uniform('logC', -20., 20.) # logC = pm.Normal('logC', 0., 10.) ps_vals = pm.Normal('obs', powerlaw_fit_model(freqs, logA, ind1, ind2, break_f, logB=logB, logC=logC), sd=ps1D_stddev, observed=ps1D, shape=freqs.shape) else: ps_vals = pm.Normal('obs', powerlaw_fit_model(freqs, logA, ind1, ind2, break_f, logB=logB), sd=ps1D_stddev, observed=ps1D, shape=freqs.shape) # step = pm.Slice() # step = pm.NUTS() # step = pm.SMC() if trace_name is not None: trace = pm.load_trace(trace_name) else: trace = pm.sample(nsamp, tune=ntune, step=step, progressbar=progressbar, cores=cores, chains=chains) summ = pm.summary(trace) out = [np.array(summ['mean']), np.array(summ['sd'])] if return_model: return out, summ, trace, powerlaw_fit_model, model else: return out, summ, trace, powerlaw_fit_model
with mixedEffect: tracede = pm.sample(5000, njobs=50, tune=1000, step=pm.DEMetropolis()) pm.traceplot(tracede, lines={ 'w': w0, 'z': z0 }) #%% SMC n_chains = 500 samples = 1000 tune_interval = 25 with mixedEffect: mtrace = pm.sample(samples, chains=n_chains, step=pm.SMC(tune_interval=tune_interval)) #%% pm.traceplot(mtrace, lines={ 'w': w0, 'z': z0 }) #%% plot advi and NUTS (copy from pymc3 example) burnin = 1000 from scipy import stats import seaborn as sns gbij = approx.bij means = gbij.rmap(approx.mean.eval()) cov = approx.cov.eval() sds = gbij.rmap(np.diag(cov)**.5)