OpenBUGS не может сходиться на модели, которая сходится в WinBUGS. Предел точности?

Как следует из заголовка этого поста, когда я пытаюсь запустить код и данные, которые нормально работают в WinBUGS из R, используя BRugsFitcoda=T), я получаю следующие ошибки:

Error in glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  : 
  NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: algorithm did not converge 
3: glm.fit: algorithm did not converge 
4: glm.fit: algorithm did not converge 
5: step size truncated due to divergence 

Когда я делаю tail() на объекте коды, я снова и снова получаю одни и те же числа. С другой стороны, когда я запускаю WinBUGS, сохраняю код и загружаю его в R, я получаю некоторую стохастическую вариацию, как и ожидал, и никаких предупреждений о сходимости.

Вот моя модель (в ней используется «уловка с единицами», чтобы найти апостериорные значения для параметров распределения Логистик-Мейкхэм).

model {
    for(i in 1:n){
            ones[i]<-1;
            # here I pre-calculate two quantities that occur several times 
            # in the PDF, to save a little processing time
            expbx[i] <- exp(b*x[i]); expbx1[i]<- 1/(1+sd*(expbx[i]-1));
            # below is the actual PDF
            p[i]<-(c+a*expbx[i]*expbx1[i])*exp(-c*x[i])*pow(expbx1[i],1/s);
            # the ones trick
            ones[i]~dbern(p[i]);
    }
b~dunif(0,1); d~dexp(1); c~dexp(1); s.raw~dflat();
    # a (lambda) parametrized this way because it comes out more accurate
    # s forced to be > 0
    a<-b*d; s<-abs(s.raw);
    # NOT a standard deviation, just s times d, to save processing time
    sd<-s*d;
    # I save all the parameters I'm interested in to one vector, for convenient
    # viewing of them all in the same window.
    out[1]<-a; out[2]<-b; out[3]<-c; out[4]<-s; out[5]<-d;
}

Вот типичный пример моих данных:

 list(n= 148 ,x=c( 1246,1175,1048,1169,1043,802,543,719,1296,817,1122,542,839,443,1536,700,834,232,596,1096,1118,957,974,1031,1149,1044,1108,
519,677,569,952,1243,970,1736,1262,1026,979,1543,1029,761,533,540,511,1150,1589,1169,1029,1248,1572,638,731,525,968,1467,1596,1077,712,1603,1
203,991,37,1775,893,993,913,1487,1186,1381,977,1247,857,786,615,733,1206,1059,1508,569,1205,754,886,1099,843,599,780,1294,1603,1242,883,1320,
507,1097,1193,218,1362,1181,1118,453,1291,972,787,1061,1097,1100,1117,1174,596,1305,1071,940,919,999,1209,1043,1161,1016,1025,750,423,732,
1389,907,1184,1275,944,1209,1073,1098,1348,976,817,557,211,961,880,1039,1287,736,1400,1757,1355,977,198,689,853,1251,767,768 ))

... и типичные инициализации (использую 4 цепочки, истончение 20, сжигание 2000, 20000 итераций)

list( d=0.001738,b=0.0009672,c=0.002451,s.raw=0.001511 )
list( d=0.006217,b=0.005596,c=0.00777,s.raw=0.007019 )
list( d=1.504E-05,b=4.825E-06,c=2.172E-07,s.raw=6.104E-05 )
list( d=0.3011,b=0.03552,c=0.1274,s.raw=0.2549 )

Округляет ли OpenBUGS просто до меньшего числа значащих цифр, чем WinBUGS, и если да, возможно, есть параметр, который я могу изменить, чтобы он перестал это делать?


person bokov    schedule 07.07.2012    source источник
comment
+1, только за категорию вопроса. Я рад видеть, что кто-то применяет ОШИБКИ.   -  person duffymo    schedule 08.07.2012
comment
Вы пробовали ЯГС? В общем, для даже немного сложных задач семплеры типа BUGS-черного ящика могут быть очень чувствительны...   -  person Ben Bolker    schedule 08.07.2012
comment
Я готов попробовать. Это чрезмерно расслабляет? WinBUGS имеет довольно ужасную автокорреляцию без этой функции. Кроме того, является ли репликация функциональности множественных цепочек WinBUGS в JAGS такой же простой, как выполнение нескольких запусков JAGS, а затем объединение их в одну коду вручную?   -  person bokov    schedule 08.07.2012
comment
вы используете чрезмерную релаксацию? Согласно руководству WinBUGS, эту функцию следует использовать с осторожностью. Попробуйте отключить его и использовать большее значение n.thin!   -  person Tomas    schedule 10.07.2012


Ответы (1)


Мой предварительный ответ на это, кажется, представляет собой некоторую комбинацию...

  • Установка аргумента format для команд bugsInits() и bugsData() равным fg.
  • Параметризация априорного распределения таким образом, что, если параметр очень мал (в отрицательных двойных цифрах на логарифмической шкале), выбирается обратное (или какое-либо другое подходящее преобразование).
  • Просто используя большие интервалы прореживания (в моем случае 80) и МНОГО итераций. OpenBUGS в настоящее время не поддерживает чрезмерную релаксацию, вот и все.
  • Если некоторые из переменных являются категориальными, не пытайтесь включать их в ту же сводку, что и непрерывные переменные.

Ответчику, предложившему отключить чрезмерную релаксацию: проблема в том, что я не могу ее включить, а без нее итерации тянутся вечно. Но это, кажется, единственный выбор на данный момент. Я бы хотел, чтобы руководство WinBUGS было более конкретным в отношении того, что подразумевается под осторожностью при использовании этой функции. Ну ладно, я думаю, мне в конце концов нужно будет прочитать статью, которую они цитируют. Но, поскольку это даже не доступно в OpenBUGS, на данный момент это полуспорно.

Я оставлю свой вопрос открытым на некоторое время, на случай, если у кого-то будет лучший или более подробный ответ, чем то, что я смог придумать.

person bokov    schedule 23.07.2012