2016-04-24 81 views
0

我正在處理實驗設計問題,並嘗試通過Rr2jags來匹配JAGS模型。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) 

首先,它是在for循環,這樣你想重新定義節點j - 所以你必須用i來索引j。其次,j被定義爲自身 - 因此是定向循環消息。下面的代碼做什麼,我想你想:

m <- 'model{ 

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

    #monitor# j 
}' 

runjags::run.jags(m) 

然而,隨着數據,即它可能是簡單的方式,JA虛擬變量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您將需要指數它通過我 - 如:

product[j[i]] 

馬特

相關問題