Hi! Just wondering if there is a way to implement this model: Constraint or prior dependent on multiple parameters - Questions - PyMC Discourse in numpyro?
i didn’t look at the post very closely but you should just be able to use factor
, which is the equivalent of Potential
. numpyro also has factor
Thanks Martin for that link! Can we also place a “prior” on the factor
? In the PyMC3 discussion linked, the factor
added is a ratio between two parameters, and a normal distribution prior was placed on this quantity.
hi @tcuongd please refer to the docs. afaik factor
is more or less exactly equivalent to Potential
and deterministic
is more or less exactly equivalent to deterministic
. if that isn’t enough information to enable you to do what you want to do please try to formulate a specific self-contained question about a specific model (without reference to external posts) and we can likely be of more help.
Thanks Martin, fair call and you’re totally right! I dug into the docs a little deeper and was able to replicate that bit of the PyMC3 code using factor
. For completeness, I think the translation is:
PyMC3:
with pm.Model() as model:
inv_b0 = pm.Flat('inv_b0')
b1 = pm.Flat('b1')
b0b1 = pm.Deterministic('b1/b0', b1*inv_b0)
pm.Potential('constraint', pm.Normal.dist(5., 1.).logp(b0b1))
...
Numpyro:
import numpyro
import numpyro.dist as dist
def model():
inv_b0 = numpyro.sample("inv_b0", dist.Uniform(0, 1))
b1 = numpyro.sample("b1", dist.Uniform(0, 1))
b0b1 = numpyro.deterministic("b0b1", b1 * inv_b0)
constraint = dist.Normal(5, 1).log_prob(b0b1)
numpyro.factor("constraint", constraint)
...
How would we implement a hard constraint for b1/b0 to the posterior instead of just setting a prior for it, as shown here?