# Problem using mulitonial

When including Stan code in your post it really helps if you make it as readable as possible by using Stan code chunks (```stan) with clear spacing and indentation. For example, use

``````model {
vector[N] mu = alpha + beta * x;
y ~ normal(mu, sigma);
}

I must not be understanding how to  properly code the multinomial in Stan. I use Rstan. Here's a simple example. After compiling, when I run the model I get an error message to the effect  that is am attempting to assign reals to a vector. Perhaps someone can identify the error in my code. Here's the example:

//simple_cjs_test.stan
// Jume 11 2018
// Basic cormack-jolly-seber mark-recapture model for one initial marking and release ocassion/site (site 1)
// and two recapture/resight ocassions (sites 2 and 3). Multinomial model:
// Cases: case1: total number marked (M), that survive to site2, are detected (resighted) at site2,
// and survive and are detected at site 3 (=m11).
// Case2: total number marked that survive to site 2, are not detected at site 2 but do survive
// to site 3 and are detected at site 3 (=m01). Note: survival from site 2 to 3
// and probability of detection  at site 3 are inseparable, hence one parameter for the joint
// probability of survival from 2 to 3 and detection at 3.
// Case3: total number marked that survive to site 2, are resighted at site 2 and not resigthed thereafter (=m10).
// Case4: total number marked that are never resighted (=m00).
// M = m11 + m01 + m10 + m00; m00 = M - (m11 + m01 + m10.
// Likelihood(dropping the combinatorics:
// p(m11, m01, m10, m00| s,p,v) = spv^m11 * s(1-p)v^m01 * sp(1-v)^m10 *(s(1-p)(1-v)+(1-s))^m00.

data {
int<lower=0> n_occasions;     // Mark and resight data
int<lower=0> marr[n_occasions];
}

parameters {
vector<lower=0, upper=1> phi;
// phi:Survival from inital marking at site1 to first resighting location at site2 (Alternative: s)
// phi:Probability of resigthing at site 2 (Alternative: p)
// phi:Probability of survival from site 2 to site 3 and recapture at site 3. (Alternative: v)
}

transformed parameters {
// simplex[n_occasions] pr[n_occasions];

// Define the cell probabilities of pr:
pr = phi * phi;
pr = phi *(1-phi)*phi;
pr = phi*phi*(1-phi);
pr = 1-(pr+pr+pr);

//  Alternative coding:
//  pr = s*p;
//  pr = s*(1-p)*v;
//  pr = s*p*(1-v);
//  pr = 1-(pr+pr+pr);

}

model {
// Priors
// Uniform priors for phi are implicitly defined.

// Define the multinomial likelihood
for (t in 1:n_occasions)
marr[t] ~ multinomial(pr[t]);
}

#simple_cjs_test.R.
#NG June 11 2018

library(rstan)
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())
set.seed(123)

n_occasions<-length(sdata\$marr)

stan_data = list(sdata,n_occasions)

## Parameters monitored
params <- c("phi")

#Alternative: params<-("s", "p", "v")

## MCMC settings
ni <- 2000
nt <- 1
nb <- 1000
nc <- 1

## Call Stan from R
simple_test_ex1  <- stan("simple_cjs_test.stan",
data = stan_data, pars = params,
chains = nc, iter = ni, warmup = nb, thin = nt,
seed = 1,
open_progress = FALSE)

## Summarize posteriors
print(simple_test_ex1, digits = 3)

marr <-
structure(c(350, 15, 250, 385))

Much thanks for any feedback

``````

The random variable for a multinomial is an array of integers with counts of each outcome. If you just have one integer between 1 and K, then you want to use the categorical distribution. See the manual.

Bob,
Thanks. But I thought that the Rdump data format is used for the variable marr produces an array of integers. hence my puzzlement regarding the run-time error. How should I code these four integers so that the multinomial sampling statement can read it?

In `marr[t] ~ multinomial(pr[t]);`, the expression `marr[t]` denotes an integer and `pr[t]` a real. The multinomial wants an integer array and vector. So the previous sampling statement should probably just be `marr ~ multinomial(pr)`.

Bob,

My apologies for not being able to respond sooner. Thanks for the suggestion. I dropped the for t … in the likelihood and recompiled and ran the model. I received an error that marr was not an integer. I eliminated this error by dropping the use of r_dump for the data in the .R file and replaced it with a column vector text file with head ‘marr’,. , then read the data in using read.table. Then it ran fine.

Thanks for reporting back!