the model is like this:
with pm.Model() as model_t:
mu = pm.Uniform(‘mu’, 0, 1)
sigma = pm.HalfNormal(‘sigma’, sd = 10)
nu = pm.Exponential(‘nu’, 1/30)
y = pm.StudentT(‘y’, mu=mu, sd=sigma, nu=nu, observed=data)
trace_t = pm.sample(1100)
chain_t = trace_t[100:]
Now I know the prior mu-3*sigma should less than 0.001, how should I put this knowledge in to this model?
Thanks!
You could use a Potential
to set the likelihood to -inf
whenever the constraint is not satisfied.
1 Like
Hi sammosummo:
I’m sorry I didn’t get your word, could you be more specific? thanks
If you want a hard constraint then you can use Potential
like @sammosummo suggested
example code:
with pm.Model() as model_t:
mu = pm.Uniform('mu', 0, 1)
sigma = pm.HalfNormal('sigma', sd = 10)
nu = pm.Exponential('nu', 1/30)
y = pm.StudentT('y', mu=mu, sd=sigma, nu=nu, observed=data)
constraint = pm.Potential('constraint', tt.switch(mu - 3*sigma > 0.001, -np.inf, 0))
trace_t = pm.sample(1000)
In general such hard constraints are not recommended as they have no derivative and jump either side of the boundary.
You don’t need to drop the first 100 samples from trace_t. pm.sample()
will already run 1000 burnin steps followed by 1000 samples. What is returned is just the 1000 samples.
2 Likes