Преодолеть ошибку: не удалось инициализировать в rstan :: sampling () - PullRequest
0 голосов
/ 02 июля 2019

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 означает имя стандартного файла foo.stan.

1 Ответ

1 голос
/ 02 июля 2019

Воспроизводимый пример, который является непоследовательным и поэтому невозможно инициализировать:

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 попыток уже не удалась, обычно не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...