The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Equivalence to Conditional Gamma-Poisson Model

Patrick Brown

2026-10-09

Equivalence to Conditional Gamma-Poisson Model

The Dirichlet-multinomial distribution with parameter \(\alpha\) is equivalent to a conditional Gamma-Poisson model. This equivalence provides an alternative interpretation and can be useful for understanding the properties of the distribution.

Consider a Gamma-Poisson hierarchy where:

  1. \(U_k \sim \text{Gamma}(\alpha, 1)\)
  2. \(\lambda_k = \mu_k U_k\)
  3. \(y_k \mid \lambda_k \sim \text{Poisson}(\lambda_k)\) for \(k = 1, \ldots, K\)

Given \(\lambda_k\), the distribution of \(y_k\) is Poisson:

\[\begin{equation} y_k \mid \lambda_k \sim \text{Poisson}(\lambda_k) \end{equation}\]

The distribution of \(\mathbf{y}\) conditioned on the sum given the \(\lambda_k\) is multinomial:

\[\begin{equation}\label{eq:multinom} P(\mathbf{y} \mid \boldsymbol{\lambda}, \sum_{k=1}^K Y_k = N) = \frac{N!}{\prod_{k=1}^K y_k!} \prod_{k=1}^K \left(\frac{\lambda_k}{\sum_{j=1}^K \lambda_j}\right)^{y_k} \end{equation}\]

Integrating out the \(U_k\) gives the Dirichlet-multinomial distribution:

\[\begin{equation}\label{eq:dm} P(\mathbf{y} \mid \alpha, \boldsymbol{\mu}, N) = \frac{N!}{\prod_{k=1}^K y_k!} \frac{\Gamma(\alpha)}{\Gamma(N+\alpha)} \prod_{k=1}^K \frac{\Gamma(y_k+\alpha \mu_k)}{\Gamma(\alpha \mu_k)}. \prod_{k=1}^K \frac{\Gamma(y_k+\alpha\mu_k)}{\Gamma(\alpha\mu_k)}. \end{equation}\]

Note that \(\text{E}(U_k) = 1\) and \[ \text{sd}(U_k) = 1/\sqrt(\alpha) \]

Simplificaiton

Here is the simplification of the Dirichlet-multinomial PMF using the gamma recurrence identity.

The key identity is the gamma recurrence over an integer number of steps:

\[\begin{equation}\label{eq:gamma_ratio} \frac{\Gamma(x+n)}{\Gamma(x)} = x(x+1)\cdots(x+n-1) \end{equation}\]

Equation \(\ref{eq:dm}\) becomes

\[\begin{equation}\label{eq:dm_ratio} P(\mathbf{y} \mid \alpha, \boldsymbol{\mu}, N) = \frac{N!}{\prod_{k=1}^K y_k!} \frac{1}{\prod_{j=0}^{N-1} (\alpha + j)} \prod_{k=1}^K \prod_{j=0}^{y_k-1} (\alpha \mu_k + j) \end{equation}\]

substitute \[ \alpha = \frac{1}{\tau^2} \] to give \[\begin{equation}\label{eq:dm_ratio_tau} P(\mathbf{y} \mid \tau, \boldsymbol{\mu}, N) = \frac{N!}{\prod_{k=1}^K y_k!} \frac{\tau^{2N}}{\prod_{j=0}^{N-1} (1 + j \tau^2)} \prod_{k=1}^K \frac{\prod_{j=0}^{y_k-1} (\mu_k + j \tau^2)}{\tau^{2y_k}} \end{equation}\]

The \(\tau^2\) cancel. On the log scale:

\[\begin{equation}\label{eq:dm_ratio_log} \log P(\mathbf{y} \mid \tau, \boldsymbol{\mu}, N)= \log(N!) - \sum_{k=1}^K \log(y_k!) - \sum_{j=0}^{N-1} \log(1 + j \tau^2) + \sum_{k=1}^K \sum_{j=0}^{y_k-1} \log(\mu_k + j \tau^2) \end{equation}\]

Note that when \(\tau = 0\) then

\[\begin{equation}\label{eq:dm_ratio_log_zero} \log P(\mathbf{y} \mid \tau=0, \boldsymbol{\mu}, N)= \log(N!) - \sum_{k=1}^K \log(y_k!) + \sum_{k=1}^K y_k \log(\mu_k) \end{equation}\]

which is the multinomial density

K <- 6
N <- 100 * K
mu <- 2
tau <- 0.2
mu_vec <- rep(mu, K)
alpha <- mu_vec / sum(mu_vec)

U <- rgamma(N, shape = tau^(-2), rate = tau^(-2))
c(mean(U), sd(U))
## [1] 1.0084683 0.2015098
lambda <- mu * U
y <- rpois(N, lambda)

cc_matrix <- Matrix::sparseMatrix(
  i = 1:N, j = rep(seq(1, N / K), each = K), x = 1
)

mu_vec <- rep(mu, K)
alpha_norm <- mu_vec / sum(mu_vec)
alpha <- alpha_norm / tau^2

log_dens_with_gammas <- log_dens_simplified <- rep(NA, ncol(cc_matrix))

for (D in 1:ncol(cc_matrix)) {
  # Extract the indices where the column has non-zero values
  indices_here <- which(cc_matrix[, D] == 1)
  y_here <- y[indices_here]

  # Simplified log density using the sum formula
  # Handle zeros correctly by filtering them out for the sum
  y_double_sum <- mapply(seq,
    len = y_here,
    from = alpha_norm,
    MoreArgs = list(by = tau^2)
  )

  log_dens_simplified[D] <-
    lfactorial(sum(y_here)) -
    sum(lfactorial(y_here)) -
    sum(log(seq(from = 1, by = tau^2, len = sum(y_here)))) +
    sum(log(unlist(y_double_sum)))

  # Log density using Gamma functions
  # lgamma is defined for all non-negative integers, so no special handling needed for zeros
  log_dens_with_gammas[D] <-
    lgamma(sum(alpha)) + lgamma(sum(y_here) + 1) -
    lgamma(sum(y_here) + sum(alpha)) +
    sum(lgamma(y_here + alpha)) -
    sum(lgamma(alpha)) - sum(lgamma(y_here + 1))
}
plot(log_dens_simplified, log_dens_with_gammas,
  xlab = "simplified", ylab = "gammas"
)
abline(0, 1)

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.