2016-04-24 11 views
0

Я работаю над проблемой проектирования эксперимента и пытаюсь установить модель JAGS через R и r2jags.R, JAGS, r2jags: доступ к последнему элементу в начале цикла `for`

Чтобы измерить эффект переноса, я должен получить доступ к элементу 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] 

ответ

0

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

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

Во-первых, он находится внутри для цикла, так что вы пытаетесь повторно определить узел 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) 

Однако, это может быть проще сделать Ja фиктивную переменную R и предоставить его зазубринами, как данные, то есть:

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]] 

Matt