This is an excerpt from my model, where I’m specifying one of the three distributions in pm.Mixture two different ways. These should both be identical in the sense that they are uniform circular distributions, but only the second one works and doesn’t output an error of “ValueError: Domain error in arguments.” after running pm.sample_prior_predictive. Could anyone tell me why the first one gives me this error? I’ve included my full model at the very end in case it’s relevant. Thank you so much for your guidance.
-
dists = [ pm.VonMises.dist(mu=mushift[id], kappa=0.0), pm.VonMises.dist(mu=mushift[id], kappa=precision[id]), pm.VonMises.dist(mu=m, kappa=precision2[id]), ] w = tt.stack([1 - pmem[id], pmem[id] * ptar[id], pmem[id] * (1-ptar[id])]) y = pm.Mixture('y', w.T, dists, observed=x) prior = pm.sample_prior_predictive()
-
dists = [ pm.VonMises.dist(mu=mushift[id], kappa=0.000000000001), pm.VonMises.dist(mu=mushift[id], kappa=precision[id]), pm.VonMises.dist(mu=m, kappa=precision2[id]), ] w = tt.stack([1 - pmem[id], pmem[id] * ptar[id], pmem[id] * (1-ptar[id])]) y = pm.Mixture('y', w.T, dists, observed=x) prior = pm.sample_prior_predictive()
full model:
with pm.Model() as hierarchical_model:
# Priors
Cshift = pm.TruncatedNormal('Cshift', mu=0, sd=.5, lower=np.deg2rad(-15), upper=np.deg2rad(15))
Csd = pm.Gamma('Csd', alpha=2, beta=10)
CmA = pm.Exponential('CmA', .1)
CmB = pm.Exponential('CmB', .1)
CtA = pm.Exponential('CtA', .1)
CtB = pm.Exponential('CtB', .1)
Cshape = pm.Exponential('Cshape', .1)
Crate = pm.Exponential('Crate', .1)
Cshape2 = pm.Exponential('Cshape2', .1)
Crate2 = pm.Exponential('Crate2', .1)
# Deterministic transformations
Cmem = pm.Deterministic('Cmem',CmA/(CmA + CmB)) # 1-Cmem = prop of random guessing
Ctarget = pm.Deterministic('Ctarget',Cmem * (CtA/(CtA + CtB)))
Cswap = pm.Deterministic('Cswap',Cmem * (1-(CtA/(CtA + CtB))))
# Subject-level
mushift_tilde = pm.Normal('mushift_tilde', mu=0, sd=1, shape=nsubj) #non-centered reparameterization
mushift = pm.Deterministic('mushift', Cshift + mushift_tilde * Csd)
pmem = pm.Beta('pmem', alpha=CmA, beta=CmB, shape=nsubj)
ptar = pm.Beta('ptar', alpha=CtA, beta=CtB, shape=nsubj)
precision = pm.Bound(pm.Gamma, lower=.609, upper=33.33)('precision', alpha=Cshape, beta=Crate, shape=nsubj)
precision2 = pm.Bound(pm.Gamma, lower=.609, upper=33.33)('precision2', alpha=Cshape2, beta=Crate2, shape=nsubj)
# Trial-level
dists = [
pm.VonMises.dist(mu=mushift[id], kappa=0.0), #random guessing
pm.VonMises.dist(mu=mushift[id], kappa=precision[id]), #target with bias
pm.VonMises.dist(mu=m, kappa=precision2[id]), #swap
]
w = tt.stack([1 - pmem[id], pmem[id] * ptar[id], pmem[id] * (1-ptar[id])])
y = pm.Mixture('y', w.T, dists, observed=x)
prior = pm.sample_prior_predictive()
posterior = pm.sample(2000, tune=2000, chains=3, nuts_kwargs={'target_accept': 0.90})