2012-07-07 86 views
6

作爲這篇文章的標題說,當我嘗試運行代碼和數據,使用BRugsFit(與coda=T)在WinBUGS軟件正常工作,從R,我得到這些錯誤:OpenBUGS未能收斂於WinBUGS中收斂的模型。精確限制?

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)) 

...和典型inits(我用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四捨五入到更少的有效數字,如果是這樣,也許有一個設置我可以改變,使它停止這樣做?

+1

+1,只是問題的類別。我很高興看到有人應用BUGS。 – duffymo 2012-07-07 23:41:43

+2

你試過JAGS嗎?一般來說,即使有些棘手的問題,像BUGS一樣的黑盒採樣器可能會非常敏感...... – 2012-07-07 23:57:11

+0

我願意嘗試一下。它是否過度放鬆? WinBUGS有一些非常可怕的自相關沒有這個功能。另外,在JAGS中複製WinBUGS的多個鏈功能就像執行多個JAGS運行一樣簡單,然後將它們手動合併爲一個尾波? – f1r3br4nd 2012-07-08 01:26:40

回答

1

我試探性的答案,這似乎是一些組合...

  • format論據bugsInits()bugsData()命令設置爲fg
  • 參數化的先驗分佈,使得如果該參數是非常小的(在對數標度的負兩位數)的倒數(或一些其它適當的變換)被採樣。
  • 只需使用大變薄區間(在我的情況,80)和迭代了很多。 OpenBUGS目前不支持過度放鬆,就是這樣。
  • 如果一些變量是分類的,不要試圖將它們納入同一個總結爲連續變量。

爲了誰建議過度鬆弛關閉應答:問題是,我不能把它,沒有它,迭代永遠走。但這似乎是目前唯一的選擇。我希望WinBUGS手冊更加具體地說明謹慎使用此功能的含義。哦,我想我最終需要閱讀他們引用的論文。但是,由於這在OpenBUGS中還沒有提供,所以目前它是半開玩笑。

我會離開我的問題打開了一會兒,如果有人比我已經能夠拿出更好或更詳細的解答。