R, JAGS, r2jags: доступ к последнему элементу в начале цикла for

Я работаю над проблемой дизайна эксперимента и пытаюсь подогнать модель JAGS через R и r2jags.

Чтобы измерить эффект переноса, я должен получить доступ к элементу i-1 в списке для одной из переменных. Когда i=1, эта переменная должна возвращать последний элемент в своем списке значений. Я пытался использовать ifelse(), но это не сработало.

Что я пробовал:

for (i in 1:Ntotal){
    j <- ifelse(i==1,Ntotal,j)
    y[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- mu + beta*a[i] + tau_d*b[i]*period[i] + rho*product[j] + epsilon[i]
    epsilon[i] ~ dnorm(0, tau)  # gaussian error
    }

Я получаю сообщение об ошибке:

Error in jags.model(file = "TEMPmodel.txt", data = dataList, n.chains = 3,  : 
  RUNTIME ERROR:
Compilation error on line 7.
Possible directed cycle involving j

Любое понимание того, как достичь моего решения, приветствуется.

Простой пример в R того, чего я пытаюсь достичь, если вышеизложенное не ясно. Для переменной d я должен получить доступ к предыдущему элементу. При запуске в начале индекса предыдущий элемент является последним элементом. Для JAGS я не уверен, как закодировать мою модель для этого.

i = 1
exam <- data.frame(a=c(5,6,7), b=c(10,11,12), d=c(20,21,22))

exam$a[i] + exam$b[i] + exam$d[i-1]

person user2205916    schedule 24.04.2016    source источник


Ответы (1)


Есть несколько проблем с этой строкой кода, на которые стоит обратить внимание:

j <- ifelse(i==1,Ntotal,j)

Во-первых, он находится внутри цикла for, поэтому вы пытаетесь переопределить узел j, поэтому вы должны индексировать j по i. Во-вторых, j определяется как само по себе — отсюда и сообщение направленного цикла. Следующий код делает то, что, как я думаю, вы хотите:

m <- 'model{

    for(i in 1:10){
        j[i] <- ifelse(i==1, 10, i-1)
    }

    #monitor# j
}'

runjags::run.jags(m)

Однако может быть проще сделать j фиктивной переменной в R и предоставить ее JAGS в качестве данных, т.е.:

m <- 'model{

    for(i in 1:N){
        new[i] <- j[i]
        # Or something else involving j[i]
    }

    #monitor# new
    #data# j, N
}'

N <- 10
j <- c(2:N, 1)
runjags::run.jags(m)

В любом случае, всякий раз, когда вы ссылаетесь на j, вам нужно будет индексировать его по i, например:

product[j[i]]

Мэтт

person Matt Denwood    schedule 24.04.2016