I don’t know what is the goal but if it is just parameterization, you could use the ShiftedGamma
that was defined here (code below). It extends the PyMC3
Gamma distribution to be able to receive a parameter equivalent to loc
for SciPy
.
class ShiftedGamma(pm.Gamma):
def __init__(self, alpha, beta, shift, *args, **kwargs):
transform = pm.distributions.transforms.lowerbound(shift)
super().__init__(alpha=alpha, beta=beta, *args, **kwargs,
transform=transform)
self.shift = shift
self.mean += shift
self.mode += shift
def random(self):
return super().random() + self.shift
def logp(self, x):
return super().logp(x - self.shift)
Then just make sure that you transform scale
to beta
and you are good to go.
with pm.Model() as model:
alpha = pm.HalfNormal('alpha', 1)
scale = pm.HalfNormal('scale', 1)
loc = pm.HalfNormal('loc', 10)
beta = 1/scale
# likelihood
y_g = ShiftedGamma("y_g",
alpha=alpha,
beta=beta,
shift=loc, observed=y)
trace = pm.sample(
2000,
tune=2000
)
Hope it helps!