我可以告诉JAGS在初始值失败后自动重新启动吗?

时间:2015-02-26 09:49:15

标签: r jags runjags

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

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.jags或JAGS本身重新尝试并重新运行模型?例如,告诉他再做N次尝试正确初始化模型。这将是非常合乎逻辑的事情,而不仅仅是失败。或者我必须手动执行一些tryCatch事情?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

通常,当发生此错误时,它表明存在严重的潜在问题。我不会想到&#34;再试一次&#34;通常很有用(特别是因为默认初始值是确定性的)。

JAGS生成的默认初始值由&#34;典型值&#34;来自先前分布的值(例如,均值,中值或模式)。如果事实证明这与数据不一致,那么通常有两个可能的原因:

  1. 需要考虑的后验约束,例如 用dinterval建模删失的生存数据 分配
  2. 先前数据冲突,例如先前的意思是到目前为止 远离数据所支持的零值 可能性。
  3. 当您提供自己的初始值时,这些问题保持不变。

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