Thanks for getting back to me so quickly. Here is the nimble code. After some tinkering I realize that the error code most likely stems from the observation model later in the model (highlighted in yellow). Here is the full model:
nc <- nimbleCode({
#---------------
# DEFINE PRIORS
#---------------
## Prior for step parameter (U parameter in MARSS models)
#--------------------------------------------------------
for (l in 1:Nloc){
step[l] ~ dunif(-10,10) # time-invariant
}
## Prior for Q parameter (Process error MARSS models)
#--------------------------------------------------------
# Q prior from wishart distribution: dwish ~ (omega, degrees of freedom)
tauQ[1:Nloc, 1:Nloc] ~ dwish(Omega[1:Nloc,1:Nloc], Nloc)
for (l in 1:Nloc) {
Omega[l,l] <- l
}
for (i in 1:(Nloc-1)) {
for (j in (i+1):Nloc) {
Omega[i,j] <- 0
Omega[j,i] <- 0
}
}
# MVN Process error
sigmaQ[1:Nloc, 1:Nloc] <- inverse(tauQ[1:Nloc, 1:Nloc]) # convert from precision to sd
## Prior for R parameter (observation error in MARRS model)
#----------------------------------------------------------
# Assuming observation error is different for each location
for(l in 1:Nloc) {
tauR[l] ~ dgamma(0.001,0.001)
sigmaR[l] <- 1/sqrt(tauR[l])
}
## MVN prior on initial state for each location
#---------------------------------------------
for (l in 1:Nloc){
X[1,1,l] ~dnorm(1,5)
}
## Priors for thresholds
#------------------------
for(l in 1:Nloc){
tau[l,1] ~ dnorm(0,0.01)
for(j in 1:3){
delta[l,j] ~ dexp(2)
tau[l,j+1] <- tau[l,j] + delta[l,j]
}
}
## Prior for random efect of location
#---------------------------------
for (l in 1:Nloc){
loc.eta[l] ~ dnorm(loc.muhat,loc.tau)
}
loc.muhat ~ dunif(-10,10)
loc.tau <- 1/pow(loc.sigma,2) ## convert stddev to precision (sigma defiend above)
loc.sigma ~ dunif(0,5)
## Prior for random efect of site
#---------------------------------
for (s in 1:Nsite){
site.eta[s] ~ dnorm(site.muhat,site.tau)
}
site.muhat ~ dunif(-10,10)
site.tau <- 1/pow(site.sigma,2) ## convert stddev to precision (sigma defiend above)
site.sigma ~ dunif(0,5)
## Prior for random effect of diver
#-----------------------------------
for (k in 1:Ndiver){
diver.eta[k] ~ dnorm(diver.muhat,diver.tau)
}
diver.muhat ~ dunif(-10,10)
diver.tau <- 1/pow(diver.sigma,2) ## convert stddev to precision (sigma defiend above)
diver.sigma ~ dunif(0,5)
#-------------------
# OBSERVATION MODEL
#-------------------
for (l in 1:Nloc){
for(i in 1:Nobs[l]) {
exp.mu[i,1,l] <- X[year[l,i],1,l]+loc.eta[loc[l,i]]+site.eta[site[l,i]]+diver.eta[diver[l,i]]
#cumulative logistic probabilities
logit(Q[i,1,l]) <- tau[l,1]-exp.mu[i,1,l] p[i,1,l] <- Q[i,1,l]
for (j in 2:4){
logit(Q[i,j,l]) <- tau[l,j]-exp.mu[i,1,l] p[i,j,l] <- Q[i,j,l] - Q[i,j-1,l]
}
p[i,5,l] <- 1 - Q[i,4,l]
predY[l,i] ~ dcat(p[i,1:5,l]) #p[i,] sums to 1 for each i
Y[l,i] ~ dnorm(predY[l,i],tauR[l])
}
}
#-------------------
# PROCESS MODEL
#-------------------
for (t in 2:Nyear){
for (l in 1:Nloc){
predX[t,1,l] <- X[t-1,1,l]+step[l]
}
X[t,1,1:Nloc] ~ dmnorm(predX[t,1,1:Nloc],tauQ[1:Nloc, 1:Nloc])
}
})
m <- nimbleModel(nc, constants = list(Nloc=6,Nsite=539,Ndiver=1572,Nyear=27,Nobs=c(2170,977,839,696,875,683),year=constants_list[[1]]$year,loc=constants_list[[1]]$loc,site=constants_list[[1]]$site,diver=constants_list[[1]]$diver,Y=constants_list[[1]]$Y)
I realize you cannot reproduce some of the constants, but thought post this in the mean time while I try to figure out how to reproduce the data. Maybe you can see something blaring that I have overlooked.