# Transforming a multinomial model into a dirichlet-multinomial

**URL:** <https://discourse.mc-stan.org/t/transforming-a-multinomial-model-into-a-dirichlet-multinomial/26399>\
**Category:** Modeling\
**Tags:** dirichlet-multinomial\
**Created:** [February 17, 2022, 8:59am UTC](https://discourse.mc-stan.org/t/transforming-a-multinomial-model-into-a-dirichlet-multinomial/26399 "2022-02-17T08:59:42Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![nhuurre](https://avatars.discourse-cdn.com/v4/letter/n/ad7895/32.png) [@nhuurre](https://discourse.mc-stan.org/u/nhuurre)\
**Post date:** [February 17, 2022, 10:12am UTC](https://discourse.mc-stan.org/t/transforming-a-multinomial-model-into-a-dirichlet-multinomial/26399/2 "2022-02-17T10:12:42Z")

</div>

> [@jriou](#):
>
> ```no-highlight
> for(i in 1:L) trans_output[i] ~ dirichlet(phi*output[i]);
> for(i in 1:S) cat_data[i] ~ multinomial(output[i] );
> 
> ```

Err, shouldn’t that be `multinomial(trans_output[i])`? And actually, how do the shapes make sense here, why does first loop have 1:L when `output` is of length S and the outermost dimension of `trans_output` is G?

[Dirichlet-multinomial](https://en.wikipedia.org/wiki/Dirichlet-multinomial_distribution) has a closed-form PMF. Maybe you could use that.

```stan
functions {
  real dirichlet_multinomial_lpmf(int[] y, vector alpha) {
    real sum_alpha = sum(alpha);
    return lgamma(sum_alpha) - lgamma(sum(y) + sum_alpha)
           // + lgamma(sum(y)+1) - sum(lgamma(to_vector(y)+1) // constant, may omit
           + sum(lgamma(to_vector(y) + alpha)) - sum(lgamma(alpha));
  }
}
parameters {
  real<lower=0> theta[P]; // parameters for the ODE
  real<lower=0> phi;
}
model {
  ...
  for(i in 1:S) cat_data[i] ~ dirichlet_multinomial(phi*output[i]);
}

```

---

_[View the full topic](https://discourse.mc-stan.org/t/transforming-a-multinomial-model-into-a-dirichlet-multinomial/26399)._
