我在带有数据块和data =参数的任何模型中从run.jags()获得了一些违反直觉的行为。它似乎使用run.jags的data参数作为实际模型,但在环境中搜索数据块中使用的任何内容。以下是一个非常简单的模型示例:
data {
ylen <- length(y)
}
model {
for (i in 1:ylen) {
y[i] ~ dnorm(mu,1)
}
mu ~ dnorm(0,1/10^2)
}
如果我这样运行,我会收到错误:
> run.jags('trivial.jags',data=list(y=c(5,5,5,6)),monitor=c('ylen','mu'))
Error: The following error was obtained while attempting to parse the data:
Error in eval(expr, envir, enclos) : object 'y' not found
但是,如果我创建一个变量&#34; y&#34;在调用环境中使用它,但是以一种非常奇怪的方式:
> y<-c(-1,-1,-1)
> run.jags('trivial.jags',data=list(y=c(5,5,5,6)),monitor=c('ylen','mu'))
Compiling rjags model...
Calling the simulation using the rjags method...
Note: the model did not require adaptation
Burning in the model for 4000 iterations...
|**************************************************| 100%
Running the model for 10000 iterations...
|**************************************************| 100%
Simulation complete
Calculating summary statistics...
Note: The monitored variable 'ylen' appears to be non-stochastic; it will not be included
in the convergence diagnostic
Calculating the Gelman-Rubin statistic for 2 variables....
Finished running the simulation
JAGS model summary statistics from 20000 samples (chains = 2; adapt+burnin = 5000):
Lower95 Median Upper95 Mean SD Mode MCerr MC%ofSD SSeff AC.10 psrf
ylen 3 3 3 3 0 3 -- -- -- -- --
mu 3.8339 4.9742 6.0987 4.9747 0.57625 -- 0.0040089 0.7 20661 0.011 1.0001
所以你可以看到它似乎使用了来自调用环境的y来计算长度,到达3,但是使用数据列表中的y值作为实际数据,到达mu = 5。
如果我使用rjags,它会按照我的预期工作,对数据块中的实际模型和派生变量的计算使用data =参数。
这是runjags中的错误吗?如何让它使用data =参数run.jags()来计算数据块中的计算?
我在runjags_2.0.3-2和runjags_2.0.4-2
上尝试了这个答案 0 :(得分:1)
是的,这是runjags中的一个错误,由于您的清晰且可重复的示例,现在将为下一个版本修复错误!问题的根源在于尝试保持与BUGS模型文本的兼容性,该文本可以包括数据列表(这与JAGS使用的数据块不同)。
与此同时,可能的解决方法是在R中计算ylen并将其传递给数据列表中的JAGS(另请参见模型本身中的#data#构造),或者直接在模型中使用length(y)例如:
model {
for (i in 1:length(y)) {
y[i] ~ dnorm(mu,1)
}
mu ~ dnorm(0,1/10^2)
}
希望有所帮助,
马特