run.jags 数据搜索环境

run.jags search environment for data

在任何具有数据块和 data= 参数的模型中,我从 run.jags() 得到了一些违反直觉的行为。它似乎将 run.jags 的数据参数用于实际模型,但在环境中搜索数据块中使用的任何内容。这是一个非常简单的模型示例:

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

但是,如果我在调用环境中创建一个变量 "y",它就会被使用,但是使用的方式很奇怪:

> 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= 参数。

这是 运行jags 中的错误吗?我怎样才能让它在数据块中使用 run.jags() 的 data= 参数进行计算?

我在 runjags_2.0.3-2 和 runjags_2.0.4-2

上试过了

是的,这是 runjags 中的一个错误,由于您清晰且可重现的示例,现在将在下一个版本中修复该错误!问题的根源在于试图保持与可以包含数据列表的 BUGS 模型文本的兼容性(这与 JAGS 使用的数据块不同)。

与此同时,可能的解决方法是在 R 中计算 ylen 并将其传递给数据列表中的 JAGS(另请参阅模型本身中的#data# 构造),或者在直接建模例如:

model {
for (i in 1:length(y)) {
    y[i] ~ dnorm(mu,1)
}
mu ~ dnorm(0,1/10^2)
}

希望对您有所帮助,

马特