I have a hierarchical model that’s currently setup like this:
def model(x, y, level1_id, level2_id):
level0_intercept = numpyro.sample('level0_intercept', dist.Normal(0, 1))
level0_intercept_scale = numpyro.sample('level0_intercept_scale', dist.Exponential(1))
with numpyro.plate('level1', len(set(level1_id)), dim = -1):
level1_intercept = numpyro.sample('level1_intercept', dist.Normal(level0_intercept, level0_intercept_scale))
level1_intercept_scale = numpyro.sample('level1_intercept_scale', dist.Exponential(1))
with numpyro.plate('level2', len(set(level2_id)), dim = -2):
level2_intercept = numpyro.sample('level2_intercept', dist.Normal(level1_intercept, level1_intercept_scale))
intercept = level2_intercept[level2_id, level1_id]
slope = numpyro.sample('slope', dist.Gamma(2, 1))
curvature = numpyro.sample('curvature', dist.Exponential(1))
loc = intercept - slope*x - curvature*x**2
scale = numpyro.sample('error', dist.HalfNormal(1))
with numpyro.plate('observation', len(x)):
numpyro.sample('y_est', dist.Normal(loc, scale), obs = y))
What I want to do is to include slope
& curvature
in the hierarchy, just like the intercept
.
But how do I do this for a gamma & exponential distribution?
For Gamma I guess I might be able to model concentration
& rate
in the hierarchy, but previous attempts has resolved in invalid values (<=0)