I’m trying to understand how to fit a joint distribution in pymc3.
Here’s a toy model to illustrate my question. Suppose I have data y[2,N] drawn from a mixture model, with some mixing proportion, where the mixture component y_i = k determines two things:
- The mean of the Normal distribution that y[0,i] is sampled from (either theta1 or theta2).
- The rate of the Poisson distribution that y[1,i] is sampled from (either rate1 or rate2).
How do I implement such a model in pymc3?
My attempt is below (marginalizing out cluster assignments). I may be going down the wrong track since I don’t understand how to dealing with data where each observation has elements drawn from multiple distributions. The current code gives the error “too many indices for array” at line “normal_data = y[0,i]”.
def likelihood(theta, rate): def logp(y): normal_data = y[0,:] poisson_data = y[1,:] return (pm.Poisson.dist(rate).logp(poisson_data) + pm.Normal.dist(theta, 1).logp(normal_data)) return logp basic_model = pm.Model() with basic_model: theta1 = pm.Uniform('theta1', 0, 1) theta2 = pm.Uniform('theta2', 0, 1) rate1 = pm.Exponential('rate1', 1) rate2 = pm.Exponential('rate2', 1) mix_proportion = pm.Uniform('lambda', 0, 1) custom = pm.DensityDist('custom', likelihood(theta1, theta2)) y_obs = pm.Mixture('y_obs', mix_proportion, [custom(theta1, rate1), custom(theta2, rate2)], observed=data)