Help with Poisson intermediate parameters

Hi everyone,

I was hoping to include a Poisson variable as intermediate parameter in my model, though I know Stan doesn’t allow integer parameters. I was wondering if log_sum_exp or similar functions can be applied on Poisson…

The math expression of this part of model is:
\lambda_t \sim \Gamma(\alpha, 1);
N_t |\lambda_t \sim Poisson(\lambda_t\frac{1-\rho}{\rho});
\zeta_t|N_t \sim \Gamma(N_t, \beta/\rho)

This is a time series model, with X_t be observations and model as X_t = \rho X_{t-1} + \zeta_t. If the integer parameter is supported, I was hoping some model looks like:

  int<lower=1> T;
  int<lower=0> x[T];
  real<lower=0> rho;
  real<lower=0> alpha;
  real<lower=0> beta;
  real<lower=0> lambda[T-1];
  int<lower=0> N[T-1];
transformed data{
  real<lower=0> zeta[T-1];
  for (t in 2:T){
    zeta[t-1] = x[t] - rho * x[t-1]
model {
  lambda ~ gamma(alpha, 1);
  N ~ poisson(lambda);
  zeta ~ gamma(N, beta)

Will log_sum_exp work on Poisson?

Thanks for any reply!

1 Like


There are few approaches. First, you might want to do something similar to what @bgoodri does here, which is to sum terms until they’re really small.

Another thing you can do is adaptive truncation, which I discussed in my StanCon2020 contribution.

1 Like

This might also lend itself to closed-form marginalisation. Let’s do a few calculations and see where we end up. Again, let’s consider the model.

N_t |\lambda_t \sim \operatorname{Poisson}(\lambda_t\frac{1-\rho}{\rho})
\zeta_t|N_t \sim \operatorname{Gamma}(N_t, \beta/\rho)

What we want is the marginal for \zeta_t, i.e.

f_Z(\zeta_t) = \sum_{k=0}^\infty f_{Z, N}(\zeta_t, N_t = k) = \sum_{k=0}^\infty f_{Z|N}(\zeta_t| N_t = k)f_N(N_t = k).

Substituting the relevant functions in, we get

f_Z(\zeta_t) = \sum_{k=0}^\infty \frac{b^k}{(k-1)!} \zeta_t^{k-1} \exp(-b\zeta_t)\frac{\theta_t^k \exp(-\theta_t)}{k!},

where b := \beta/\rho and \theta_t := \lambda_t(1-\rho)/\rho.

Rerranging we get

f_Z(\zeta_t) = \exp(-(b\zeta_t + \theta_t))\zeta_t^{-1}\sum_{k=0}^\infty \frac{[b\zeta_t\theta_t]^k}{(k-1)!k!}.

It turns out that the sum in the last expression has a nice closed-form, which leads to

f_Z(\zeta_t) = \exp(-(b\zeta_t + \theta_t)) \zeta_t^{-1}\sqrt{b\zeta_t\theta_t} I_1(2\sqrt{b\zeta_t\theta_t}),

where I_1(\cdot) is the modified Bessel function of the first kind. It seems this is now implemented in Stan, so you might be able to write your marginalisation in closed-form in Stan after all.

EDIT: see @nhuurre’s post.


Neat, but I think \zeta_t^{-1} went missing during rearranging.
Here’s what I get


The Bessel function series

\sum_{N=1}^\infty \frac{\left(\frac{1}{4}x^2\right)^{N-1}}{(N-1)!\, N!} = \sum_{k=0}^\infty \frac{\left(\frac{1}{4}x^2\right)^k}{k!\, (k+1)!} = \frac{2}{x} I_1(x)

corresponds to the N>0 part of the marginalization. Poisson distribution has non-negligible chance of producing a zero; gamma(0,beta) is a degenerate always-zero distribution that needs to be considered separately.

1 Like

Oh yeah. By the time I realised I had forgotten to type that in, I was already in bed. Thanks!

Thanks @maxbiostat! Sorry about the late response…my PC was sent for repair so I can’t check the forum quite easily…
I never thought about Bessel function, it looks like a perfect closed form solution. I’ll try coding as soon as my computer comes back. Thanks again for the help!

1 Like

To anyone reading this post in the future, I think one way to handle this complication cleanly is to truncate the distribution of N_t at zero and then the expression becomes

1 Like