I know one can use the Bound method to impost constant constraints on the priors. What I need to do is to impost a constraint relating the prior random variables. I am wondering is this possible?
I used to do it this way:
with pm.Model(): bound = pm.Uniform('b',-1,0) mu = pm.Normal('mu',0.,1.) b_mu = pm.Deterministic('b_mu', tt.switch(tt.le(mu, bound), bound, mu)) trace = pm.sample() plt.scatter(trace['bound'], trace['b_mu'])
b_mu would be constrained by
bound. However, I am not completely sure doing so is correct as it makes the prior improper. Maybe an additional constraint with
pm.Potential is needed.
It is working!
I am not an expert in Bayesian but I have read a recent paper (https://arxiv.org/abs/1712.03549) that if the prior is improper, sometimes the MCMC sampling can still behave as if it is proper (it shouldn’t). Is there a way to check using PyMC3? I think PPC could not detect this?
Thanks a lot!
What I am concerned about is subtle bias. However, I do not know the precise detail of how it will affect the estimation etc. I guess it depends on how the bounded prior is implemented in the model. Maybe the mathematicians can weight in on this @aseyboldt, @colcarroll, @AustinRochford, @fonnesbeck etc.
So that shouldn’t be an improper distribution. You can write down the integral if you’re patient, or you can point out that your example is equivalent to
with pm.Model(): bound = pm.Uniform('b',-1,0) mu = pm.Normal('mu',0.,1.) b_mu = pm.Deterministic('b_mu', tt.max([bound, mu])) trace = pm.sample(10000)
and so the pdf of
b_mu is bounded above by the sum of
∫ b_mu < ∫ bound + mu = 2 < ∞.
The same argument should hold for the
max of any (proper) RVs!
It is reassuring to know that what I have been doing is not wrong - I always thought of this kind of a hack