Overcome the error: Initialization failed in rstan::sampling()

Overcome the error: Initialization failed in rstan::sampling()

rstan::sampling() 失败并出现以下错误。

[1] "Error in sampler$call_sampler(args_list[[i]]) : Initialization failed."
[1] "error occurred during calling the sampler; sampling not done"
Stan model 'foo' does not contain samples.
Stan model 'foo' does not contain samples.
Stan model 'foo' does not contain samples.
Stan model 'foo' does not contain samples.

其中,foo 表示 stan 文件的名称 foo.stan

不一致因此无法初始化的可重现示例:

model <- 
  stan_model(model_code = "parameters { real<lower = 0> y; }
                           transformed parameters { real<upper = -1> z = y; }")

fit <- sampling(model)

这会在 RStan 2.18.1 中产生以下输出:

> fit <- sampling(model)

SAMPLING FOR MODEL '64719d6dccb64c32b0d897ef1f340d74' NOW (CHAIN 1).
Chain 1: Initialization between (-2, 2) failed after 100 attempts. 
[1] "Error in sampler$call_sampler(args_list[[i]]) : Initialization failed."
error occurred during calling the sampler; sampling not done

这是生成的 fit 结构的开头:

> str(fit)
Formal class 'stanfit' [package "rstan"] with 10 slots
  ..@ model_name: chr "64719d6dccb64c32b0d897ef1f340d74"
  ..@ model_pars: chr [1:3] "y" "z" "lp__"
  ..@ par_dims  :List of 3
  .. ..$ y   : num(0) 
  .. ..$ z   : num(0) 
  .. ..$ lp__: num(0) 
  ..@ mode      : int 2
  ..@ sim       : list()

所以你可以使用测试

length(fit@sim) == 0

如果有样本,它们将显示为变量 sim 中的列表。

警告:这个问题经常出现是因为没有很好地制定参数约束。 Stan 假设满足约束的每个参数值都在模型中得到支持。否则,模型通常无法初始化。最好的解决方案是固定参数的约束和参数的尺度,以便模型可以随机初始化。如果约束条件制定得当,数值问题也会导致问题。将参数缩放到单位比例会有所帮助。此外,大间隔统一先验可能是一个问题,因为初始化将在中间点附近进行。如果问题很好地缩放并且约束形成良好,那么您可以减少初始化的时间间隔,这会有所帮助。否则,您真的必须提供自己合理的 init 才能使事情变得健壮。如果 100 次尝试已经失败,则重试通常不会奏效。