I'm trying to implement a model in PyMC3 which relies on a switch with a stochastic condition in the final step, and hence can't pass observed values to the model.
Question. What is the "correct" way to pass observations in a PyMC3 model, when the last step is not a stochastic variable?
Some context: I'm attempting to model intermittent demand using PyMC3 (demand is mostly zero, but occasionally a positive integer). The statistical model I am trying to implement is to model the demand $X_t$ at time $t$ by $$X_t\sim\begin{cases} 0 & \text{with probability } 1 - p \\ Poisson(\mu) & \text{with probability } p \end{cases}$$ (no time dependence), or perhaps more formally, $$\begin{eqnarray}\alpha & \sim & Bernoulli(p) \\ X_t & \sim & \begin{cases} Poisson(\mu) & \text{if } \alpha=1 \\ 0 & \text{if } \alpha=0 \end{cases} \end{eqnarray}$$
I attempted to implement this model in PyMC3 by
import pymc3 as pm
from theano import tensor as tt
with pm.Model() as model:
p = pm.Beta('p', alpha=1, beta=1)
mu = pm.Gamma('mu', alpha=0.001, beta=0.001)
alpha = pm.Bernoulli('alpha', p)
demand_pos = pm.Poisson('demand', mu)
obs = pm.math.switch(tt.eq(alpha, 1), 0, demand_pos)
The issue is that obs
is not a distribution, and so has no observed
parameter.