繁体   English   中英

R,JAGS,r2jags:在“ for”循环的开头访问最后一个元素

[英]R, JAGS, r2jags: access last element at the beginning of a `for` loop

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

要测量残留效应,我必须访问列表中的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]

这行代码有两个问题,值得指出:

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

马特

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM