Могу ли я указать JAGS автоматически перезапускаться после сбоя с начальными значениями?

Моя модель вышла из строя со следующей ошибкой:

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 для запуска JAGS из R.


person Tomas    schedule 26.02.2015    source источник


Ответы (2)


В ранджагах для этого нет возможности, но было бы довольно просто написать себя так:

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

[Обратите внимание, что если эта модель НИКОГДА не сработает, цикл никогда не остановится!]

Лучшей идеей может быть указание функции/списка начальных значений, которые обеспечивают начальные значения, которые гарантированно будут работать (если это возможно).

В runjags версии 2 можно будет восстановить успешные симуляции, когда некоторые симуляции потерпели крах, поэтому, если вы запускали (скажем) 5 цепочек параллельно, то, если 1 или 2 рухнули, у вас все равно будет 3 или 4. Это должно быть выпущено в течение ближайшие пару недель, и содержит большое количество других улучшений.

person Matt Denwood    schedule 26.02.2015

Обычно возникновение этой ошибки указывает на серьезную основную проблему. Я не думаю, что стратегия «попробовать еще раз» в целом полезна (и особенно потому, что начальные значения по умолчанию являются детерминированными).

Начальные значения по умолчанию, сгенерированные JAGS, задаются «типичным» значением из предыдущего распределения (например, среднее, медиана или мода). Если выясняется, что это не соответствует данным, обычно возможны две причины:

  1. Апостериорные ограничения, которые необходимо учитывать, например, при моделировании подвергнутых цензуре данных о выживании с использованием интервального распределения.
  2. Конфликт априорных данных, например. априорное среднее настолько далеко от значения, поддерживаемого данными, что имеет нулевую вероятность.

Эти проблемы остаются теми же, когда вы указываете свои собственные начальные значения.

Если вы считаете, что можете генерировать хорошие начальные значения большую часть времени, с редкими сбоями, то, возможно, стоит повторить попытки внутри вызова try(), но я думаю, что это необычный случай.

person Martyn Plummer    schedule 26.02.2015
comment
Мартин, я сам задаю начальные значения и сам нашел случай (одна ковариата имела экстремальное значение, что в сочетании с определенными коэффициентами было проблемой). Но в принципе я думаю, что повторная попытка в случае такой ошибки является хорошей идеей (с пользовательскими инициализациями), и лучше всего это будет делать сам JAGS, потому что JAGS знает, что это была за ошибка. - person Tomas; 26.02.2015