Hi all,
I’ve been following Ch. 7.4 of the Bayesian Methods for Hackers book, which is about implementing a t-test (Bayesian Estimation Supersedes the t-test or BESt), and there are some examples out there (including here) on this using pymc
but I’ve playing around with how one would do this using pystan
. There’s a very cool vignette on this using rstan
, but that takes a slightly different tack or approach.
Would anybody know if there’s a way to do this using pystan
?
Take this example from pymc
:
dataset_a = np.random.normal(10, 2, size=100)
dataset_b = np.random.normal(8, 3, size=100)
# the pymc part
pooled_sd = np.r_[dataset_a, dataset_b].std()
tau = 1./np.sqrt(1000.*pooled_sd) # pymc precision param, 1/sigma**2
# mu from normal
mu_a = pm.Normal('mu_a', np.r_[dataset_a, dataset_b].mean(), tau)
mu_b = pm.Normal('mu_b', np.r_[dataset_a, dataset_b].mean(), tau)
# sd from uniform
sd_a = pm.Uniform('sd_a', pooled_sd/1000., 1000.*pooled_sd)
sd_b = pm.Uniform('sd_b', pooled_sd/1000., 1000.*pooled_sd)
# nu from exponential
nu_minus_1 = pm.Exponential('nu-1', 1./29)
# putting it together
obs_a = pm.NoncentralT('obs_a', mu_a, 1.0/sd_a**2, nu_minus_1 + 1, observed=True, value=dataset_a)
obs_b = pm.NoncentralT('obs_b', mu_a, 1.0/sd_a**2, nu_minus_1 + 1, observed=True, value=dataset_b)
mcmc = pm.MCMC([obs_a, obs_b, mu_a, mu_b, sd_a, sd_b, nu_minus_1])
mcmc.sample(25000, 10000)
Then one can look at the traces of mu
s and sd
s and compare them.
Now, it seems to me, from the vignette, that the Stan equivalent would be to use…
data {
int<lower=1> n;
vector[n] y;
real<lower=0> r;
}
parameters {
real delta;
real<lower=0> sigma2;
}
model {
target += cauchy_lpdf(delta | 0, r);
target += log(1/sigma2);
target += normal_lpdf(y | delta*sqrt(sigma2), sqrt(sigma2));
}
…and get mu
and sd
from delta
and sigma2
. That said, is there a pystan
version of bridgesampling::bridge_sampler
and bridgesampling::error_measures
?