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.