0

我的模型因以下错误而失败:

Compiling rjags model...
Error: The following error occured when compiling and adapting the model using rjags:
 Error in rjags::jags.model(model, data = dataenv, inits = inits, n.chains = length(runjags.object$end.state),  :
  Error in node Y[34,10]
Observed node inconsistent with unobserved parents at initialization.
Try setting appropriate initial values.

我做了一些诊断,发现链 3 中的初始值存在问题。但是,这种情况有时会发生。在这种情况下,有没有办法告诉run.jagsJAGS 自己重新尝试并重新运行模型?例如,告诉他再做 N 次尝试正确初始化模型。那将是非常合乎逻辑的事情,而不仅仅是失败。还是我必须手动做一些tryCatch事情?

PS:请注意,我目前正在使用run.jags从 R 运行 JAGS。

4

2 回答 2

2

runjags 中没有提供这样的功能,但是像这样编写自己会相当简单:

success <- FALSE
while(!success){
    s <- try(results <- run.jags(...))
    success <- class(s)!='try-error'
}
results

[请注意,如果此模型永远无法工作,则循环将永远不会停止!]

一个更好的想法可能是指定一个初始值函数/列表,该函数/列表提供保证工作的初始值(如果可能)。

在 runjags 版本 2 中,当某些模拟崩溃时,可以恢复成功的模拟,所以如果你并行运行(比如说)5 个链,那么如果 1 或 2 崩溃,你仍然有 3 或 4 个。应该在接下来的几周,并包含大量其他改进。

于 2015-02-26T10:48:25.003 回答
1

通常,当发生此错误时,它表明存在严重的潜在问题。我认为“再试一次”的策略通常没有用(尤其是因为默认初始值是确定性的)。

JAGS 生成的默认初始值由先验分布中的“典型”值(例如均值、中值或众数)给出。如果事实证明这与数据不一致,那么通常有两个可能的原因:

  1. 需要考虑的后验约束,例如在使用 dinterval 分布对删失的生存数据进行建模时
  2. 先验数据冲突,例如先验均值与数据支持的值相差太远,以至于它的可能性为零。

当您提供自己的初始值时,这些问题仍然存在。

如果您认为您可以在大多数情况下生成良好的初始值,但偶尔会失败,那么在调用 try() 中重复尝试可能是值得的,但我认为这是一个不寻常的情况。

于 2015-02-26T13:58:53.797 回答