I asked this question at the JAGS sourceforge help forum but didn't get response there. I have the following JAGS model:

model {
    x ~ dbin(0.5, 10)
    # length of y is larger than 11
    for(i in 1:x) {
        y[i] ~ dnorm(0, 1)
    for(i in (x+1):length(y)) {
        y[i] ~ dnorm(2,1)

And here is the R code and simulated data to work with it:

y <- c(dnorm(4,0,1), dnorm(12,2,1))
data <- list(y = y)
jm <- jags.model('test.model', data = data)

However, I got an error message:

Error in jags.model("test.model", data = data) : RUNTIME ERROR:
Compilation error on line 3.
Cannot evaluate upper index of counter i

I wonder if it's because jags doesn't support variable index in for loops, but I didn't find any reference in the manual and google search. In this case, I don't know where is the data partitioned into two different likelihoods and I am trying to do inference on that. If jags doesn't support variable index in for loops, what alternatives can I try in such situation?

Thanks a lot for the help!

  • $\begingroup$ What is the length of y? Could it possibly be > dpois(10) + 1 ..? $\endgroup$ – Tim Jan 31 '15 at 21:41
  • $\begingroup$ @Tim, the length of y shall be well larger than 11. I can change the distribution of x to be binomial so that it's bounded, but still, I get the error. $\endgroup$ – qkhhly Jan 31 '15 at 21:46
  • $\begingroup$ Maximal value of Poisson distribution with mean = 10 is much larger than 11! Check in R: max(rpois(1e8, 10)). $\endgroup$ – Tim Jan 31 '15 at 21:49
  • $\begingroup$ As I said, I can change it to x ~ dbin(0.5, 10), so that maximal of x is 10, but there is still the error. So I don't think the range of x is the problem. $\endgroup$ – qkhhly Jan 31 '15 at 21:55

Actually the answer is pretty simple: for-loops in BUGS/JAGS are not for-loops. Those are declarative language and loops are just a way to declare "apply to all".

Excerpt from JAGS paper (Plummer, 2003):

The existence of “for” loops in the BUGS language is somewhat incongruous, since it is a declarative language, not a procedural one. For loops can be thought of as a kind of macro that succinctly describes repetitive structures. For example, the loop:

for (i in 1:2) {
   mu[i] <- alpha + beta*(x[i] - x.bar);
   Y[i] ~ dnorm(mu[i], tau);

can be thought of as expanding to

mu[1] <- alpha + beta*(x[1] - x.bar);
Y[1] ~ dnorm(mu[1], tau);
mu[2] <- alpha + beta*(x[2] - x.bar);
Y[2] ~ dnorm(mu[2], tau);

Your model declaration is simply not possible in BUGS/JAGS.

Since loops in BUGS/JAGS declare "repetitive structures" you should think of defining such a general structure that will be flexible enough to define both cases in a single loop. What may work is defining a dummy variable with values from 1 to $N$:

x ~ dbin(0.5, 10)
for (i in 1:N) {
   mu[i] <- ifelse(dummy[i] < x, 0, 2)
   y[i] ~ dnorm(mu[i], 1)

You could also try Stan instead since it is more flexible and enables you to do actual programming (rather than work-around tricks).

  • $\begingroup$ Unfortunately, Stan doesn't support discrete parameter. So it's not easy to do inference on discrete parameter in Stan. Could this be done in jags? $\endgroup$ – qkhhly Jan 31 '15 at 22:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.