0

我正在研究一个实验设计问题,并试图通过和拟合JAGS模型。Rr2jags

为了测量残留效应,我必须访问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 中尝试实现的一个简单示例。对于 variable 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]
4

1 回答 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)

但是,在 R 中制作 ja 虚拟变量并将其作为数据提供给 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]]

马特

于 2016-04-24T19:21:14.537 回答