WinBUGS軟件實現Meta分析的關鍵在于構建貝葉斯統計模型,目前有手工編寫代碼和構建Doodle模型兩種方法。手工編寫代碼具有靈活、方便的特點,但編寫語言易錯;Doodle模型的構建過程較為繁瑣,但不易出錯,且有利于加強對手工代碼結構的理解。本文簡要介紹使用WinBUGS軟件行二分類和連續型數據的傳統Meta分析、間接比較證據的Meta分析及網狀Meta分析和有序變量的Meta分析時Doodle模型的構建。
引用本文: 曾憲濤, 張超, 李勝, 徐暢, 郭毅. WinBUGS軟件實現Meta分析的Doodle模型圖的構建. 中國循證醫學雜志, 2014, 14(1): 101-109. doi: 10.7507/1672-2531.20140017 復制
隨著循證醫學不斷發展,Meta分析的類型也不斷豐富和完善[1],各種軟件[2]不斷被研發或完善以適應Meta分析發展的需求。這些軟件多是為基于經典頻率學派統計理論研發的,而WinBUGS軟件則是基于貝葉斯統計理論研發的一種軟件[3-5]。WinBUGS軟件可以實現任何類型的Meta分析,其實現Meta分析的關鍵在于模型構建。目前,在WinBUGS軟件中構建貝葉斯統計模型有手工編寫代碼和構建Doodle模型圖兩種方法。手工編寫代碼具有靈活、方便的特點,但編寫語言易出錯。Doodle模型圖的構建過程較為繁瑣,但有利于加強對手工代碼結構的了解且不易出錯。對于使用代碼構建模型,已有相關介紹[3, 4]。本文簡要介紹使用WinBUGS軟件實現二分類和連續型數據的頭對頭比較Meta分析及網狀Meta分析[5]、有序變量的Meta分析和間接比較證據的Meta分析[5]時Doodle模型圖的構建。
1 常用代碼及常規變量簡介
WinBUGS軟件當前最新版本為1.4,其簡介及安裝詳見《Meta分析系列之五:貝葉斯Meta分析與WinBUGS軟件》 [3]。
1.1 常用代碼
WinBUGS的常規代碼有3個:
① “ < -”為復制語句,與R語言相同,如“sigma < -1/sqrt(tau)”表示。
② “~”表示服從某種分布,dbin、dnorm、dgamma等為WinBUGS命令,分別指二項分布、正態分布及伽馬分布,如“ x~dnorm(μ,τ)”表示x服從正態分布dnorm(μ,τ)。
③“for(i in 1:N)”表示for循環,循環值“i”為從1到n之間依次取值,循環n次。
1.2 常規變量分布
WinBUGS軟件的常規變量分布有4種,見表 1。

2 Doodle模型圖簡介
WinBUGS軟件中有兩種貝葉斯統計模型構造方式:一種是手工編寫代碼,另一種是采用Doodle模型。手工書寫代碼靈活自由,但須記住眾多命令,且易出錯。其中Doodle模型采用圖形的形式構造統計模型,其操作簡單、形象,使統計模型層次清晰,但對于復雜模型,Doodle模型靈活性較差。在實際應用中可聯合兩種方法高效完成模型構建。本文主要介紹Doodle模型構建(更為詳盡的內容可參閱軟件攜帶的“ User manual ”及“ Doodle Quick Help ”)。
在WinBUGS軟件的使用中,Doodle模型比較特別,它由節點(nodes)、箭頭(edges)和平板(plates)三大要素構成,包含系列的小橢圓形(如theta、pc[i]、r[i]等)和小矩形(如nc[i]及nt[i])均為節點;箭頭分實線箭頭和雙線空心箭頭;右側和下側邊線較粗的大矩形稱為“平板0 ”,可以用圖形的方式來構建模型(圖 1)。模型的每個節點,都含有特定的屬性,如名稱(name)、類型(type)、分布(distribution)或邏輯函數的定義(orlogical functioned finition)等。

3 Doodle菜單構建Doodle模型圖
3.1 建立變量節點
在軟件上方的菜單欄中打開Doodle菜單,選擇New(新建)命令,可以打開一個名為“/New Doodle 0 ”的對話框。鍵入160、100和20,作為編輯窗口的顯示寬度、顯示高度和節點的寬度。這3個選項控制編輯窗口和節點的大小,輸入數值的大小應與模型相適合。點擊OK,一個無標題名(untitled1)的DoodleBUGS編輯窗口就產生了(注:可按默認值打開,窗口大小可按調節windows窗口的同樣方法進行調節)。
在此DoodleBUGS編輯窗口(untitled1)中的空白處單擊鼠標左鍵(下同),會自動產生一個橢圓形節點(注:在此窗口中,不能按習慣任意點擊,因為一點就會出現一個節點。刪除多余節點時,先用鼠標將需刪除的節點點擊選中,然后按住Ctrl鍵不放,再按下delete鍵或backspace鍵即可刪除),窗口左上方也會同時出現7個藍色的標題,依次為name(名稱)、type(類型)、density(密度)、mean(均值)、precision(精度)、lowerbound(下界)、upperbound(上界)。光標默認在名稱欄內閃爍,節點可用鼠標點中后隨意拖動。在名稱欄內,輸入此節點的名稱即可完成節點命名。
3.2 定義變量屬性
完成上述操作后,單擊名稱右側的類型欄,鼠標點擊“ type ”不放至其自動出現下拉菜單。菜單中有3個選項:隨機(stochastic)、邏輯(logical)和常量(constant);其所產生的圖形分別為:橢圓、橢圓和正方形,第一項均為默認值。
下面,根據參數的常見類型進行分類介紹:
3.2.1 隨機變量類型
選定隨機變量類型后,接著選擇參數的密度欄(其功能為附變量參數分布),單擊此欄會出現16種分布的下拉菜單欄。菜單欄中的常見變量分布介紹如下:
(1)正態分布。默認值:mean為0.0,precision為1.0E-6。如需設置mu~dnorm(0.0,1.0E-05),只需更改precision為1.0E-5即可;關于其下界和上界欄,一般不用輸入數值(因為不需要對此節點的數值范圍加以限制)。這樣,就完成了對參數mu或mu[i]的節點屬性定義。注意:對于mu[i]~dnorm(theta,tau)(其中theta,tau均為未知變量)時,mean和precision均無需設為theta、tau,因為此處需通過線條及箭頭關系分別將theta,tau賦到mu[i]的mean和precision參數中,后面有相關講解。
(2)γ分布。默認值:shape為1.0E-3,scale為1.0E-3。其意義不大,一般情況,我們對γ分布的參數shape及scale均賦值為0.001,如:tau~dgamma(0.001,0.001);同樣,其下界和上界欄一般也不用輸入數值。
(3)二項分布。默認值為空,如:rt[i]~dbin(pt[i],nt[i]),其中參數proportion與order無需手動鍵入pt[i],nt[i]賦值,需通過線條及箭頭關系來進行賦值,后面有相關講解。
(4)貝塔分布。默認值為空,如:p~dbeta(a,b),其中a,b常賦值0.001。但此分布使用不多。
(5)其他變量分布圖使用不多,本章就不做相關講解,具體可參閱軟件自帶的手冊或《The BUGS Book:A Practical Introduction to Bayesian Analysis》 [6]。
3.2.2 邏輯類型
通過類型選定邏輯變量類型后,接著開始選擇參數的連接關系欄(link)(其功能為表示參數間的關系),單擊此欄會出現5種分布的下拉菜單欄。菜單欄中的常見參數間關系介紹如下:
(1)identity。identity用來表示兩參數之間的“直接相等”關系,如precision[i] < -1/sigmasquare[i]表示為precision[i]與1/sigmasquare[i]相等,其與代碼中“ < -”均為“=”或賦值含義。
(2)logit。logit對數轉換關系式為:ln(x/(1-x)),如logit(pc[i]) < -mu[i],左邊的轉換式由計算機自行換算,而右邊mu[i]變量參數無需手動鍵入,也是通過線條及箭頭關系來對其參數value進行賦值。
(3)log。log自然對數關系式為:ln(x),如log(pc[i]) < -mu[i],左邊的轉換式由計算機自行換算,而右邊mu[i]變量參數無需鍵入,也是通過線條及箭頭關系來對其value參數進行賦值。
(4)另外兩種關系不常用,故不做介紹。
3.2.3 常數類型
同上類似,選中常量,此時節點自動轉換為長方形,且無其他賦值框,此種節點賦值是通過計算機數據導入而成。
3.3 建立節點關系
建立的各節點關系采用線條及箭頭來表示,下面以上述正態分布“ mu[i]~dnorm(theta,tau)”(其中theta,tau均為未知變量)為例進行簡要介紹。
在完成mu[i]、theta及tau三個節點建立及屬性定義后,保持節點mu[i]處于選中狀態,按住Ctrl鍵不放,點擊theta節點(內部),這時會在兩個節點之間產生一個實線箭頭,箭頭的方向從theta節點指向mu[i]節點,即將父節點與子節點進行連接,這時,在mu[i]屬性的mean欄中就會自動出現theta;同樣操作,將tau賦值到mu[i]屬性的precision欄中,這樣也就完成了對mu[i]參數的賦值。
對于正態分布參數的未知變量賦值、貝塔分布參數的未知變量以及變量間邏輯關系均用此操作來完成。
需注意的是:上述正態分布兩節點賦值過程不可倒置,由于計算機默認先賦值到mean欄,再賦值到precision欄。若想移動箭頭,不要去點擊箭頭,可通過移動節點實現,移動節點時箭頭會隨著自動調整;要想刪除箭頭,先選中子節點(箭頭所指),然后按住Ctrl鍵不放,再次點擊父節點(箭尾),箭頭刪除要注意秩序,否則會加上一個新箭頭。另外,實線箭頭表示隨機節點到隨機節點,雙線空心箭表示隨機節點到邏輯節點。
3.4 建立矩形(平板)
建立矩形(平板)用于多組數據,其意義為for循環。
按下Ctrl鍵不放,在Doodle窗口內的空白處點擊鼠標,就可創建一個“平板0 ”。用鼠標點擊平板0右側或下側較粗的邊線,就可選中并激活,并可對其進行移動。想對平板0的大小進行調整,將鼠標點擊平板0的右下角頂點進行拖動即可。若想刪除該平板,選中后按住Ctrl鍵不放,再按下delete鍵或backspace鍵即可刪除。
調整創建的平板0的大小至包含所有含下標節點(如:mu[i]節點),對于沒有下標節點(如:OR節點)的一律放至平板之外。當平板0被選中后,窗口的左上方會出現3個藍色的標題:指標、起始和結束(index、from和upto)。首先在指標文本框中輸入指標名稱(它表示一列整數序列數值),如mu[i]節點中,在index中輸入i、from中輸入1、upto中輸入n,表示從from中的數值到upto中的數值。至此,就完成了該平板的建立,亦是代碼建模中for循環的建立。需注意的是,上述平板(for循環)僅為單循環;若需建立多重循環,類似操作即可實現,但應注意各個平板中的節點應與代碼中的數組相對應。
至此,已全部完成Doodle模型的構建(圖 1)。這時建議通過File菜單中的Save as選擇合適的目錄進行保存,WinBUGS軟件會自動在文件名之后加上后綴名“.odc ”。
此外,建模還可以通過編寫代碼進行。編寫代碼大致分為3個部分,如圖 2所示(數據來源于文獻7中的“總有效率” [7])。

4 編寫代碼構建Doodle模型圖
下文均以隨機效應模型為例,介紹WinBUGS軟件中常用的構建Doodle模型圖的代碼及Doodle模型圖。
4.1 直接比較的二分類數據
4.2 直接比較的連續型數據
連續型數據隨機代碼如下:
model
{
for(i in 1:r)
{
d[i] < -x1[i]-x2[i]
v[i] < -s1[i]*s1[i]/n1[i]+s2[i]*s2[i]/n2[i]
t[i] < -1/v[i]
d[i]~dnorm(delta[i], t[i])
delta[i]~dnorm(theta, inv.tau)
}
theta~dnorm(0, 1.0E-4)
inv.tau~dgamma(0.001, 0.001)
tau2 < -1/inv.tau
tau < -sqrt(tau2)
}
構建的Doodle模型圖如圖 3。

4.3 直接比較的有序數據
本處介紹的為有序數據(3組)的隨機代碼:
model
{
?for(i in 1:r)
?{
??for(j in n[i]+1:n[i+1])
??{
????y[j, 1:3]~dmulti(p[j, ], ni[j])
????p[j, 1] < -Q[j, 1]
????p[j, 2] < -Q[j, 2]-Q[j, 1]
????p[j, 3] < -1-Q[j, 2]
???for(k in 1:2)
????{
?????logit(Q[j, k]) < -a[i, k]+beta1[i]*x1[j]
????}
??}
?beta1[i]~dnorm(gamma1, t)
?a[i, 1]~dnorm(0, 1.0E-4)
?a[i, 2]~dnorm(0, 1.0E-4)
}
?gamma1~dnorm(0, 1.0E-4)
?t~dgamma(0.001, 0.001)
?tausq < -1/t
?OR < -exp(gamma1)
}
構建的隨機Doodle模型圖如圖 4。

4.4 二分類數據的間接比較
二分類數據間接證據比較的Doodle模型構建的隨機代碼如下:
model
{
sw[1] < -0
for(i in 1:N)
??{
????logit(p[i]) < -mu[s[i]]+delta[i]*(1-equals(t[i], b[i]))
??r[i]~dbin(p[i], n[i])
??delta[i]~dnorm(md[i], taud[i])
??taud[i] < -tau*(1+equals(m[i], 3)/3)
??md[i] < -d[t[i]]-d[b[i]]+equals(m[i], 3)*sw[i]
?}
for(i in 2:N)
?{
?sw[i] < -(delta[i-1]-d[t[i-1]]+d[b[i-1]])/2
?}
for(j in 1:NS)
?{
??mu[j]~dnorm(0, 0.0001)
?}
d[1] < -0
for(k in 2:NT)
?{
??d[k]~dnorm(0, 0.0001)
?}
sd~dunif(0, 2)
tau < -1/pow(sd, 2)
mA~dnorm(0, 1)
for(k in 1:NT)
?{
??logit(T[k]) < -mA+d[k]
?}
for(k in 1:NT)
?{
??rk[k] < -NT+1-rank(T[], k)
??best[k] < -equals(rk[k], 1)
?}
for(c in 1:(NT-1))
?{
??for(k in(c+1):NT)
???{
????lor[c, k] < -d[k]-d[c]
????log(or[c, k]) < -lor[c, k]
???}
??}
}
構建的隨機Doodle模型圖如圖 5。

4.5 二分類數據的網狀Meta分析
二分類數據的網狀Meta分析構建Doodle模型圖的隨機代碼如下:
model
{
for(i in 1:ns)
{
?w[i, 1] < -0
?delta[i, 1] < -0
?mu[i]~dnorm(0, 0.0001)
??for(k in 1:na[i])
???{
????r[i, k]~dbin(p[i, k], n[i, k])
????logit(p[i, k]) < -mu[i]+delta[i, k]
????rhat[i, k] < -p[i, k]*n[i, k]
??????dev[i, k] < -2*(r[i, k]*(log(r[i, k])-log(rhat[i, k]))+(n[i, k]-r[i, k])*(log(n[i, k]-r[i, k])-log(n[i, k]-rhat[i, k])))
???}
??resdev[i] < -sum(dev[i, 1:na[i]])
??for(k in 2:na[i])
???{
????delta[i, k]~dnorm(md[i, k], taud[i, k])
????md[i, k] < -d[t[i, k]]-d[t[i, 1]]+sw[i, k]
????taud[i, k] < -tau*2*(k-1)/k
????w[i, k] < -(delta[i, k]-d[t[i, k]]+d[t[i, 1]])
????sw[i, k] < -sum(w[i, 1:k-1])/(k-1)
???}
???}
??totresdev < -sum(resdev[])
??d[1] < -0
??for(k in 2:nt)
???{
????d[k]~dnorm(0, 0.0001)
???}
???sd~dunif(0, 5)
???tau < -pow(sd, -2)
???for(c in 1:(nt-1))
????{
?????for(k in(c+1):nt)
??????{
????????or[c, k] < -exp(d[k]-d[c])
????????lor[c, k] < -(d[k]-d[c])
??????}
????}
????for(k in 1:nt)
??????{
???????rk[k] < -nt+1-rank(d[], k)
???????best[k] < -equals(rk[k], 1)
??????}
?????}
構建的隨機Doodle模型圖如圖 6。

4.6 連續性數據的網狀Meta分析
連續性數據的網狀Meta分析構建Doodle模型圖的隨機代碼如下:
model{
??for(i in 1:ns)
??{
???w[i, 1] < -0
???delta[i, 1] < -0
???mu[i]~dnorm(0, .0001)
???for(k in 1:na[i])
????{
????var[i, k] < -pow(se[i, k], 2)
????prec[i, k] < -1/var[i, k]
????y[i, k]~dnorm(theta[i, k], prec[i, k])
????theta[i, k] < -mu[i]+delta[i, k]
?????dev[i, k] < -(y[i, k]-theta[i, k])*(y[i, k]-theta[i, k])*prec[i, k]
????}
???resdev[i] < -sum(dev[i, 1:na[i]])
????for(k in 2:na[i])
????{ delta[i, k]~dnorm(md[i, k], taud[i, k])
?????md[i, k] < -d[t[i, k]]-d[t[i, 1]]+sw[i, k]
?????taud[i, k] < -tau *2*(k-1)/k
??????w[i, k] < -(delta[i, k]-d[t[i, k]]+d[t[i, 1]])
????sw[i, k] < -sum(w[i, 1:k-1])/(k-1)
???}
?}
??totresdev < -sum(resdev[])
??d[1] < -0
??for(k in 2:nt){ d[k]~dnorm(0, .0001)}
??sd~dunif(0, 5)
??tau < -pow(sd, -2)
???for(c in 1:(nt-1)){ for(k in(c+1):nt){ diff[c, k] < -(d[c]-d[k])}}
??for(k in 1:nt)
??{
??rk[k] < -nt+1-rank(d[], k)
??best[k] < -equals(rk[k], 1)
??}
}
構建的隨機Doodle模型圖如圖 7。

5 結語
WinBUGS軟件幾乎可以實現任何類型的Meta分析,但建模是保證數據運行的前提與關鍵。通過建模,即可讓使用者深入理解WinBUGS軟件及貝葉斯模塊的內部結構,掌握WinBUGS的常用代碼、變量的內涵及特色、操作關鍵點等內容。此外,通過建模還可以知曉WinBUGS軟件對于不同類型數據的統計分析功能,特別是通過編寫代碼來建模時,既可以了解WinBUGS軟件代碼編寫的風格,亦可以比較掌握不同數據類型之間的代碼差異,便于對代碼編寫知識的進一步掌握。此外,筆者建議在編寫代碼后,可嘗試建立相關的Doodle模型以加強對該手工代碼建模的結構層次的進一步了解。
所有的Meta分析均可在Doodle模型建立之后,輸入數據及設定初始值后完成。本文僅演示了使用隨機效應模型建立Doodle模型,其他的效應模型讀者可自行嘗試。
隨著循證醫學不斷發展,Meta分析的類型也不斷豐富和完善[1],各種軟件[2]不斷被研發或完善以適應Meta分析發展的需求。這些軟件多是為基于經典頻率學派統計理論研發的,而WinBUGS軟件則是基于貝葉斯統計理論研發的一種軟件[3-5]。WinBUGS軟件可以實現任何類型的Meta分析,其實現Meta分析的關鍵在于模型構建。目前,在WinBUGS軟件中構建貝葉斯統計模型有手工編寫代碼和構建Doodle模型圖兩種方法。手工編寫代碼具有靈活、方便的特點,但編寫語言易出錯。Doodle模型圖的構建過程較為繁瑣,但有利于加強對手工代碼結構的了解且不易出錯。對于使用代碼構建模型,已有相關介紹[3, 4]。本文簡要介紹使用WinBUGS軟件實現二分類和連續型數據的頭對頭比較Meta分析及網狀Meta分析[5]、有序變量的Meta分析和間接比較證據的Meta分析[5]時Doodle模型圖的構建。
1 常用代碼及常規變量簡介
WinBUGS軟件當前最新版本為1.4,其簡介及安裝詳見《Meta分析系列之五:貝葉斯Meta分析與WinBUGS軟件》 [3]。
1.1 常用代碼
WinBUGS的常規代碼有3個:
① “ < -”為復制語句,與R語言相同,如“sigma < -1/sqrt(tau)”表示。
② “~”表示服從某種分布,dbin、dnorm、dgamma等為WinBUGS命令,分別指二項分布、正態分布及伽馬分布,如“ x~dnorm(μ,τ)”表示x服從正態分布dnorm(μ,τ)。
③“for(i in 1:N)”表示for循環,循環值“i”為從1到n之間依次取值,循環n次。
1.2 常規變量分布
WinBUGS軟件的常規變量分布有4種,見表 1。

2 Doodle模型圖簡介
WinBUGS軟件中有兩種貝葉斯統計模型構造方式:一種是手工編寫代碼,另一種是采用Doodle模型。手工書寫代碼靈活自由,但須記住眾多命令,且易出錯。其中Doodle模型采用圖形的形式構造統計模型,其操作簡單、形象,使統計模型層次清晰,但對于復雜模型,Doodle模型靈活性較差。在實際應用中可聯合兩種方法高效完成模型構建。本文主要介紹Doodle模型構建(更為詳盡的內容可參閱軟件攜帶的“ User manual ”及“ Doodle Quick Help ”)。
在WinBUGS軟件的使用中,Doodle模型比較特別,它由節點(nodes)、箭頭(edges)和平板(plates)三大要素構成,包含系列的小橢圓形(如theta、pc[i]、r[i]等)和小矩形(如nc[i]及nt[i])均為節點;箭頭分實線箭頭和雙線空心箭頭;右側和下側邊線較粗的大矩形稱為“平板0 ”,可以用圖形的方式來構建模型(圖 1)。模型的每個節點,都含有特定的屬性,如名稱(name)、類型(type)、分布(distribution)或邏輯函數的定義(orlogical functioned finition)等。

3 Doodle菜單構建Doodle模型圖
3.1 建立變量節點
在軟件上方的菜單欄中打開Doodle菜單,選擇New(新建)命令,可以打開一個名為“/New Doodle 0 ”的對話框。鍵入160、100和20,作為編輯窗口的顯示寬度、顯示高度和節點的寬度。這3個選項控制編輯窗口和節點的大小,輸入數值的大小應與模型相適合。點擊OK,一個無標題名(untitled1)的DoodleBUGS編輯窗口就產生了(注:可按默認值打開,窗口大小可按調節windows窗口的同樣方法進行調節)。
在此DoodleBUGS編輯窗口(untitled1)中的空白處單擊鼠標左鍵(下同),會自動產生一個橢圓形節點(注:在此窗口中,不能按習慣任意點擊,因為一點就會出現一個節點。刪除多余節點時,先用鼠標將需刪除的節點點擊選中,然后按住Ctrl鍵不放,再按下delete鍵或backspace鍵即可刪除),窗口左上方也會同時出現7個藍色的標題,依次為name(名稱)、type(類型)、density(密度)、mean(均值)、precision(精度)、lowerbound(下界)、upperbound(上界)。光標默認在名稱欄內閃爍,節點可用鼠標點中后隨意拖動。在名稱欄內,輸入此節點的名稱即可完成節點命名。
3.2 定義變量屬性
完成上述操作后,單擊名稱右側的類型欄,鼠標點擊“ type ”不放至其自動出現下拉菜單。菜單中有3個選項:隨機(stochastic)、邏輯(logical)和常量(constant);其所產生的圖形分別為:橢圓、橢圓和正方形,第一項均為默認值。
下面,根據參數的常見類型進行分類介紹:
3.2.1 隨機變量類型
選定隨機變量類型后,接著選擇參數的密度欄(其功能為附變量參數分布),單擊此欄會出現16種分布的下拉菜單欄。菜單欄中的常見變量分布介紹如下:
(1)正態分布。默認值:mean為0.0,precision為1.0E-6。如需設置mu~dnorm(0.0,1.0E-05),只需更改precision為1.0E-5即可;關于其下界和上界欄,一般不用輸入數值(因為不需要對此節點的數值范圍加以限制)。這樣,就完成了對參數mu或mu[i]的節點屬性定義。注意:對于mu[i]~dnorm(theta,tau)(其中theta,tau均為未知變量)時,mean和precision均無需設為theta、tau,因為此處需通過線條及箭頭關系分別將theta,tau賦到mu[i]的mean和precision參數中,后面有相關講解。
(2)γ分布。默認值:shape為1.0E-3,scale為1.0E-3。其意義不大,一般情況,我們對γ分布的參數shape及scale均賦值為0.001,如:tau~dgamma(0.001,0.001);同樣,其下界和上界欄一般也不用輸入數值。
(3)二項分布。默認值為空,如:rt[i]~dbin(pt[i],nt[i]),其中參數proportion與order無需手動鍵入pt[i],nt[i]賦值,需通過線條及箭頭關系來進行賦值,后面有相關講解。
(4)貝塔分布。默認值為空,如:p~dbeta(a,b),其中a,b常賦值0.001。但此分布使用不多。
(5)其他變量分布圖使用不多,本章就不做相關講解,具體可參閱軟件自帶的手冊或《The BUGS Book:A Practical Introduction to Bayesian Analysis》 [6]。
3.2.2 邏輯類型
通過類型選定邏輯變量類型后,接著開始選擇參數的連接關系欄(link)(其功能為表示參數間的關系),單擊此欄會出現5種分布的下拉菜單欄。菜單欄中的常見參數間關系介紹如下:
(1)identity。identity用來表示兩參數之間的“直接相等”關系,如precision[i] < -1/sigmasquare[i]表示為precision[i]與1/sigmasquare[i]相等,其與代碼中“ < -”均為“=”或賦值含義。
(2)logit。logit對數轉換關系式為:ln(x/(1-x)),如logit(pc[i]) < -mu[i],左邊的轉換式由計算機自行換算,而右邊mu[i]變量參數無需手動鍵入,也是通過線條及箭頭關系來對其參數value進行賦值。
(3)log。log自然對數關系式為:ln(x),如log(pc[i]) < -mu[i],左邊的轉換式由計算機自行換算,而右邊mu[i]變量參數無需鍵入,也是通過線條及箭頭關系來對其value參數進行賦值。
(4)另外兩種關系不常用,故不做介紹。
3.2.3 常數類型
同上類似,選中常量,此時節點自動轉換為長方形,且無其他賦值框,此種節點賦值是通過計算機數據導入而成。
3.3 建立節點關系
建立的各節點關系采用線條及箭頭來表示,下面以上述正態分布“ mu[i]~dnorm(theta,tau)”(其中theta,tau均為未知變量)為例進行簡要介紹。
在完成mu[i]、theta及tau三個節點建立及屬性定義后,保持節點mu[i]處于選中狀態,按住Ctrl鍵不放,點擊theta節點(內部),這時會在兩個節點之間產生一個實線箭頭,箭頭的方向從theta節點指向mu[i]節點,即將父節點與子節點進行連接,這時,在mu[i]屬性的mean欄中就會自動出現theta;同樣操作,將tau賦值到mu[i]屬性的precision欄中,這樣也就完成了對mu[i]參數的賦值。
對于正態分布參數的未知變量賦值、貝塔分布參數的未知變量以及變量間邏輯關系均用此操作來完成。
需注意的是:上述正態分布兩節點賦值過程不可倒置,由于計算機默認先賦值到mean欄,再賦值到precision欄。若想移動箭頭,不要去點擊箭頭,可通過移動節點實現,移動節點時箭頭會隨著自動調整;要想刪除箭頭,先選中子節點(箭頭所指),然后按住Ctrl鍵不放,再次點擊父節點(箭尾),箭頭刪除要注意秩序,否則會加上一個新箭頭。另外,實線箭頭表示隨機節點到隨機節點,雙線空心箭表示隨機節點到邏輯節點。
3.4 建立矩形(平板)
建立矩形(平板)用于多組數據,其意義為for循環。
按下Ctrl鍵不放,在Doodle窗口內的空白處點擊鼠標,就可創建一個“平板0 ”。用鼠標點擊平板0右側或下側較粗的邊線,就可選中并激活,并可對其進行移動。想對平板0的大小進行調整,將鼠標點擊平板0的右下角頂點進行拖動即可。若想刪除該平板,選中后按住Ctrl鍵不放,再按下delete鍵或backspace鍵即可刪除。
調整創建的平板0的大小至包含所有含下標節點(如:mu[i]節點),對于沒有下標節點(如:OR節點)的一律放至平板之外。當平板0被選中后,窗口的左上方會出現3個藍色的標題:指標、起始和結束(index、from和upto)。首先在指標文本框中輸入指標名稱(它表示一列整數序列數值),如mu[i]節點中,在index中輸入i、from中輸入1、upto中輸入n,表示從from中的數值到upto中的數值。至此,就完成了該平板的建立,亦是代碼建模中for循環的建立。需注意的是,上述平板(for循環)僅為單循環;若需建立多重循環,類似操作即可實現,但應注意各個平板中的節點應與代碼中的數組相對應。
至此,已全部完成Doodle模型的構建(圖 1)。這時建議通過File菜單中的Save as選擇合適的目錄進行保存,WinBUGS軟件會自動在文件名之后加上后綴名“.odc ”。
此外,建模還可以通過編寫代碼進行。編寫代碼大致分為3個部分,如圖 2所示(數據來源于文獻7中的“總有效率” [7])。

4 編寫代碼構建Doodle模型圖
下文均以隨機效應模型為例,介紹WinBUGS軟件中常用的構建Doodle模型圖的代碼及Doodle模型圖。
4.1 直接比較的二分類數據
4.2 直接比較的連續型數據
連續型數據隨機代碼如下:
model
{
for(i in 1:r)
{
d[i] < -x1[i]-x2[i]
v[i] < -s1[i]*s1[i]/n1[i]+s2[i]*s2[i]/n2[i]
t[i] < -1/v[i]
d[i]~dnorm(delta[i], t[i])
delta[i]~dnorm(theta, inv.tau)
}
theta~dnorm(0, 1.0E-4)
inv.tau~dgamma(0.001, 0.001)
tau2 < -1/inv.tau
tau < -sqrt(tau2)
}
構建的Doodle模型圖如圖 3。

4.3 直接比較的有序數據
本處介紹的為有序數據(3組)的隨機代碼:
model
{
?for(i in 1:r)
?{
??for(j in n[i]+1:n[i+1])
??{
????y[j, 1:3]~dmulti(p[j, ], ni[j])
????p[j, 1] < -Q[j, 1]
????p[j, 2] < -Q[j, 2]-Q[j, 1]
????p[j, 3] < -1-Q[j, 2]
???for(k in 1:2)
????{
?????logit(Q[j, k]) < -a[i, k]+beta1[i]*x1[j]
????}
??}
?beta1[i]~dnorm(gamma1, t)
?a[i, 1]~dnorm(0, 1.0E-4)
?a[i, 2]~dnorm(0, 1.0E-4)
}
?gamma1~dnorm(0, 1.0E-4)
?t~dgamma(0.001, 0.001)
?tausq < -1/t
?OR < -exp(gamma1)
}
構建的隨機Doodle模型圖如圖 4。

4.4 二分類數據的間接比較
二分類數據間接證據比較的Doodle模型構建的隨機代碼如下:
model
{
sw[1] < -0
for(i in 1:N)
??{
????logit(p[i]) < -mu[s[i]]+delta[i]*(1-equals(t[i], b[i]))
??r[i]~dbin(p[i], n[i])
??delta[i]~dnorm(md[i], taud[i])
??taud[i] < -tau*(1+equals(m[i], 3)/3)
??md[i] < -d[t[i]]-d[b[i]]+equals(m[i], 3)*sw[i]
?}
for(i in 2:N)
?{
?sw[i] < -(delta[i-1]-d[t[i-1]]+d[b[i-1]])/2
?}
for(j in 1:NS)
?{
??mu[j]~dnorm(0, 0.0001)
?}
d[1] < -0
for(k in 2:NT)
?{
??d[k]~dnorm(0, 0.0001)
?}
sd~dunif(0, 2)
tau < -1/pow(sd, 2)
mA~dnorm(0, 1)
for(k in 1:NT)
?{
??logit(T[k]) < -mA+d[k]
?}
for(k in 1:NT)
?{
??rk[k] < -NT+1-rank(T[], k)
??best[k] < -equals(rk[k], 1)
?}
for(c in 1:(NT-1))
?{
??for(k in(c+1):NT)
???{
????lor[c, k] < -d[k]-d[c]
????log(or[c, k]) < -lor[c, k]
???}
??}
}
構建的隨機Doodle模型圖如圖 5。

4.5 二分類數據的網狀Meta分析
二分類數據的網狀Meta分析構建Doodle模型圖的隨機代碼如下:
model
{
for(i in 1:ns)
{
?w[i, 1] < -0
?delta[i, 1] < -0
?mu[i]~dnorm(0, 0.0001)
??for(k in 1:na[i])
???{
????r[i, k]~dbin(p[i, k], n[i, k])
????logit(p[i, k]) < -mu[i]+delta[i, k]
????rhat[i, k] < -p[i, k]*n[i, k]
??????dev[i, k] < -2*(r[i, k]*(log(r[i, k])-log(rhat[i, k]))+(n[i, k]-r[i, k])*(log(n[i, k]-r[i, k])-log(n[i, k]-rhat[i, k])))
???}
??resdev[i] < -sum(dev[i, 1:na[i]])
??for(k in 2:na[i])
???{
????delta[i, k]~dnorm(md[i, k], taud[i, k])
????md[i, k] < -d[t[i, k]]-d[t[i, 1]]+sw[i, k]
????taud[i, k] < -tau*2*(k-1)/k
????w[i, k] < -(delta[i, k]-d[t[i, k]]+d[t[i, 1]])
????sw[i, k] < -sum(w[i, 1:k-1])/(k-1)
???}
???}
??totresdev < -sum(resdev[])
??d[1] < -0
??for(k in 2:nt)
???{
????d[k]~dnorm(0, 0.0001)
???}
???sd~dunif(0, 5)
???tau < -pow(sd, -2)
???for(c in 1:(nt-1))
????{
?????for(k in(c+1):nt)
??????{
????????or[c, k] < -exp(d[k]-d[c])
????????lor[c, k] < -(d[k]-d[c])
??????}
????}
????for(k in 1:nt)
??????{
???????rk[k] < -nt+1-rank(d[], k)
???????best[k] < -equals(rk[k], 1)
??????}
?????}
構建的隨機Doodle模型圖如圖 6。

4.6 連續性數據的網狀Meta分析
連續性數據的網狀Meta分析構建Doodle模型圖的隨機代碼如下:
model{
??for(i in 1:ns)
??{
???w[i, 1] < -0
???delta[i, 1] < -0
???mu[i]~dnorm(0, .0001)
???for(k in 1:na[i])
????{
????var[i, k] < -pow(se[i, k], 2)
????prec[i, k] < -1/var[i, k]
????y[i, k]~dnorm(theta[i, k], prec[i, k])
????theta[i, k] < -mu[i]+delta[i, k]
?????dev[i, k] < -(y[i, k]-theta[i, k])*(y[i, k]-theta[i, k])*prec[i, k]
????}
???resdev[i] < -sum(dev[i, 1:na[i]])
????for(k in 2:na[i])
????{ delta[i, k]~dnorm(md[i, k], taud[i, k])
?????md[i, k] < -d[t[i, k]]-d[t[i, 1]]+sw[i, k]
?????taud[i, k] < -tau *2*(k-1)/k
??????w[i, k] < -(delta[i, k]-d[t[i, k]]+d[t[i, 1]])
????sw[i, k] < -sum(w[i, 1:k-1])/(k-1)
???}
?}
??totresdev < -sum(resdev[])
??d[1] < -0
??for(k in 2:nt){ d[k]~dnorm(0, .0001)}
??sd~dunif(0, 5)
??tau < -pow(sd, -2)
???for(c in 1:(nt-1)){ for(k in(c+1):nt){ diff[c, k] < -(d[c]-d[k])}}
??for(k in 1:nt)
??{
??rk[k] < -nt+1-rank(d[], k)
??best[k] < -equals(rk[k], 1)
??}
}
構建的隨機Doodle模型圖如圖 7。

5 結語
WinBUGS軟件幾乎可以實現任何類型的Meta分析,但建模是保證數據運行的前提與關鍵。通過建模,即可讓使用者深入理解WinBUGS軟件及貝葉斯模塊的內部結構,掌握WinBUGS的常用代碼、變量的內涵及特色、操作關鍵點等內容。此外,通過建模還可以知曉WinBUGS軟件對于不同類型數據的統計分析功能,特別是通過編寫代碼來建模時,既可以了解WinBUGS軟件代碼編寫的風格,亦可以比較掌握不同數據類型之間的代碼差異,便于對代碼編寫知識的進一步掌握。此外,筆者建議在編寫代碼后,可嘗試建立相關的Doodle模型以加強對該手工代碼建模的結構層次的進一步了解。
所有的Meta分析均可在Doodle模型建立之后,輸入數據及設定初始值后完成。本文僅演示了使用隨機效應模型建立Doodle模型,其他的效應模型讀者可自行嘗試。