Negative binomial won't recognize int dispersion parameter

For some reason Stan doesn’t like that I’ve given assigned the value 1 to the phi argument in the negative binomial distribution. I find this perplexing since other packages like brms use this exact syntax when you specify a geometric distribution for the response data.

model {

  // priors including all constants
  for(s in 1:S){
    for(t in s:S){
      target += beta_lpdf(P[s,t] | 0.5, 0.5) ;
    }
  }
  // likelihood including all constants
  if(!prior_only){
     target += neg_binomial_2_log_lpmf(Y | eta, 1) ;
  }
} 

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:

neg_binomial_2_log_lpmf(matrix, matrix, int)

Available argument signatures for neg_binomial_2_log_lpmf:

neg_binomial_2_log_lpmf(int, real, real)
neg_binomial_2_log_lpmf(int, real, real[ ])
neg_binomial_2_log_lpmf(int, real, vector)
neg_binomial_2_log_lpmf(int, real, row_vector)
neg_binomial_2_log_lpmf(int, real[ ], real)
neg_binomial_2_log_lpmf(int, real[ ], real[ ])
neg_binomial_2_log_lpmf(int, real[ ], vector)
neg_binomial_2_log_lpmf(int, real[ ], row_vector)
neg_binomial_2_log_lpmf(int, vector, real)
neg_binomial_2_log_lpmf(int, vector, real[ ])
neg_binomial_2_log_lpmf(int, vector, vector)
neg_binomial_2_log_lpmf(int, vector, row_vector)
neg_binomial_2_log_lpmf(int, row_vector, real)
neg_binomial_2_log_lpmf(int, row_vector, real[ ])
neg_binomial_2_log_lpmf(int, row_vector, vector)
neg_binomial_2_log_lpmf(int, row_vector, row_vector)
neg_binomial_2_log_lpmf(int[ ], real, real)
neg_binomial_2_log_lpmf(int[ ], real, real[ ])
neg_binomial_2_log_lpmf(int[ ], real, vector)
neg_binomial_2_log_lpmf(int[ ], real, row_vector)
neg_binomial_2_log_lpmf(int[ ], real[ ], real)
neg_binomial_2_log_lpmf(int[ ], real[ ], real[ ])
neg_binomial_2_log_lpmf(int[ ], real[ ], vector)
neg_binomial_2_log_lpmf(int[ ], real[ ], row_vector)
neg_binomial_2_log_lpmf(int[ ], vector, real)
neg_binomial_2_log_lpmf(int[ ], vector, real[ ])
neg_binomial_2_log_lpmf(int[ ], vector, vector)
neg_binomial_2_log_lpmf(int[ ], vector, row_vector)
neg_binomial_2_log_lpmf(int[ ], row_vector, real)
neg_binomial_2_log_lpmf(int[ ], row_vector, real[ ])
neg_binomial_2_log_lpmf(int[ ], row_vector, vector)
neg_binomial_2_log_lpmf(int[ ], row_vector, row_vector)

error in ‘model428418796aa8_Orchid_Stan_Code’ at line 40, column 49

38:   // likelihood including all constants
39:   if (!prior_only) {
40:     target += neg_binomial_2_log_lpmf(Y | eta, 1) ;
                                                    ^
41:   }

Error in stanc(file = file, model_code = model_code, model_name = model_name, :
failed to parse Stan model ‘Orchid Stan Code’ due to the above error.

Yeah, just do 1.0. What you wrote should be legal, but it is easy enough to work around.

I’ve already tried that. It didn’t fix the issue.

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:

neg_binomial_2_log_lpmf(matrix, matrix, real)

Available argument signatures for neg_binomial_2_log_lpmf:

neg_binomial_2_log_lpmf(int, real, real)
neg_binomial_2_log_lpmf(int, real, real[ ])
neg_binomial_2_log_lpmf(int, real, vector)
neg_binomial_2_log_lpmf(int, real, row_vector)
neg_binomial_2_log_lpmf(int, real[ ], real)
neg_binomial_2_log_lpmf(int, real[ ], real[ ])
neg_binomial_2_log_lpmf(int, real[ ], vector)
neg_binomial_2_log_lpmf(int, real[ ], row_vector)
neg_binomial_2_log_lpmf(int, vector, real)
neg_binomial_2_log_lpmf(int, vector, real[ ])
neg_binomial_2_log_lpmf(int, vector, vector)
neg_binomial_2_log_lpmf(int, vector, row_vector)
neg_binomial_2_log_lpmf(int, row_vector, real)
neg_binomial_2_log_lpmf(int, row_vector, real[ ])
neg_binomial_2_log_lpmf(int, row_vector, vector)
neg_binomial_2_log_lpmf(int, row_vector, row_vector)
neg_binomial_2_log_lpmf(int[ ], real, real)
neg_binomial_2_log_lpmf(int[ ], real, real[ ])
neg_binomial_2_log_lpmf(int[ ], real, vector)
neg_binomial_2_log_lpmf(int[ ], real, row_vector)
neg_binomial_2_log_lpmf(int[ ], real[ ], real)
neg_binomial_2_log_lpmf(int[ ], real[ ], real[ ])
neg_binomial_2_log_lpmf(int[ ], real[ ], vector)
neg_binomial_2_log_lpmf(int[ ], real[ ], row_vector)
neg_binomial_2_log_lpmf(int[ ], vector, real)
neg_binomial_2_log_lpmf(int[ ], vector, real[ ])
neg_binomial_2_log_lpmf(int[ ], vector, vector)
neg_binomial_2_log_lpmf(int[ ], vector, row_vector)
neg_binomial_2_log_lpmf(int[ ], row_vector, real)
neg_binomial_2_log_lpmf(int[ ], row_vector, real[ ])
neg_binomial_2_log_lpmf(int[ ], row_vector, vector)
neg_binomial_2_log_lpmf(int[ ], row_vector, row_vector)

error in ‘model428474bc19f9_Orchid_Stan_Code’ at line 39, column 49

37:   }
38:   // likelihood including all constants
39:   target += neg_binomial_2_log_lpmf(Y | eta, 1.0) ;
                                                    ^
40: 

Error in stanc(file = file, model_code = model_code, model_name = model_name, :
failed to parse Stan model ‘Orchid Stan Code’ due to the above error.

Now it does not like the matrices (although the int may have been ok before). Your Y needs to be a two-dimensional int array rather than a matrix. And you may need to loop over the first dimension, so it would be something like

for (j in 1:J) target += neg_binomial_2_log_lpmf(Y[j] | eta[ , j] 1);

Great. This does fix the issue. Though, it did open up other issues in the code I had to address before I could be sure.

Related, how does one multiple an int with a real number? This issue came up when fixing my code. The solution I came up with was to simply keep a real valued duplicate of the int data, but this is not an elegant solution.

1 Like

int * real should definitely work. What was the line of code in question and parser error?

Below is the error I received. Everything works fine when a create a duplicate copy of Y that is a real matrix instead of a 2d int array.

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:

dot_product(int[ ], row_vector)

Available argument signatures for dot_product:

dot_product(vector, vector)
dot_product(row_vector, row_vector)
dot_product(vector, row_vector)
dot_product(row_vector, vector)
dot_product(real[ ], real[ ])

error in ‘modelf1838707a2c_Orchid_Stan_Code’ at line 24, column 79

22:   for(n in 1:N){
23:     for(s in 1:S){
24:         logpcond[n,s] = log(P[s,s]) + dot_product(Y[n,(s+1):],log(P[s,(s+1):])) ;
                                                                                  ^
25:     }

Error in stanc(file = file, model_code = model_code, model_name = model_name, :
failed to parse Stan model ‘Orchid Stan Code’ due to the above error.

1 Like

int * real should work but int[] * vector won’t. It will if you do

dot_product(to_vector(Y[n, (s + 1):]), log(P[s,(s+1):]));
1 Like

Great. It works now. Thanks for your help.