R、JAGS、r2jags:访问“for”循环开头的最后一个元素
R, JAGS, r2jags: access last element at the beginning of a `for` loop
我正在研究实验设计问题并尝试通过 R
和 r2jags
拟合 JAGS
模型。
要测量结转效应,我必须访问列表中的 i-1
元素以获得其中一个变量。当 i=1
时,此变量必须 return 其值列表中的最后一项。我尝试使用 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 中将 j 设为虚拟变量并将其作为数据提供给 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]]
马特
我正在研究实验设计问题并尝试通过 R
和 r2jags
拟合 JAGS
模型。
要测量结转效应,我必须访问列表中的 i-1
元素以获得其中一个变量。当 i=1
时,此变量必须 return 其值列表中的最后一项。我尝试使用 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 中将 j 设为虚拟变量并将其作为数据提供给 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]]
马特