I have a model of the type

```
for(I in 1:I){
for(j in 1:J){
target += multinomial_lpmf(y[I,j]|pi_);
}}
```

I can make the code more efficient by using the vectorisation trick (Stan User’s Guide)

```
for(I in 1:I){
vector[J] sum1;
for(j in 1:J){
sum[j] = multinomial_lpmf(y[I,j]|pi_);
}
target += sum(sum1);
}
```

However,

```
matrix[I,J] sum1;
for(I in 1:I){
for(j in 1:J){
sum[i,j] = multinomial_lpmf(y[I,j]|pi_);
}
}
for(I in 1:I){
vector[J] sum1;
for(j in 1:J){
sum[j] = multinomial_lpmf(y[I,j]|pi_);
}
}
target += sum(sum1);
```

so that the sum is over elements of the full matrix?

Geir

[edit: escaped Stan code]

I’m just guessing at your full model as you don’t provide data declarations. If it looks like this, where `y`

is an array of If your multinomial is fixed, you can just add all of the `y`

entries up in transformed data:

```
data {
array[I, J, N] int<lower=0> y;
}
transformed data {
array[N] int<lower=0> y_total = rep_array(0, N);
for (i in 1:I) {
for (j in 1:J) {
for (n in 1:N) {
y_total[n] += y[i, j n];
}
}
}
}
model {
y_total ~ multinomail(pi_);
}
```

But if it’s this:

```
data {
array[I, J] int<lower=0> y;
}
transformed data {
array[J] int<lower=0> y_total = rep_array(0, J);
for (i in 1:I) {
for (j in 1:J) {
y_total[j] += y[i, j];
}
}
}
model {
y_total ~ multinomial(pi_);
}
```

As you had it, the variable `I`

was being used as the loop variable and the bound, which shouldn’t even compile in Stan.