Воспроизводимый пример, который является непоследовательным и поэтому невозможно инициализировать:
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
.
ПРЕДУПРЕЖДЕНИЕ : Эта проблема часто возникает из-за того, что ограничения плохо сформулированы для параметров. Стэн предполагает, что каждое значение параметров, которое удовлетворяет ограничениям, поддерживается в модели. Если этого не произойдет, модель обычно не будет инициализироваться. Лучшее решение - установить ограничения на параметры и шкалы параметров, чтобы модель могла быть инициализирована случайным образом. Если ограничения хорошо сформулированы, численные проблемы также могут вызвать проблемы. Масштабирование параметров в единицу измерения может помочь. Кроме того, большие постоянные интервалы могут быть проблемой, потому что инициализация будет примерно на полпути. Если проблема хорошо масштабирована, а ограничения хорошо сформированы, вы можете уменьшить интервал для инициализации, что может помочь. В противном случае вы действительно должны предоставить свои разумные инструменты для того, чтобы вещи были надежными. Повторная попытка, если 100 попыток уже не удалась, обычно не работает.