使用R語言進行Metroplis-in-Gibbs採樣和MCMC運行分析

原文鏈接:http://tecdat.cn/?p=12200


對於許多模型,例如物流模型,沒有共軛先驗。因此,吉布斯採樣不適用。

這篇文章展示了我們如何使用Metropolis-Hastings(MH)從每次Gibbs迭代中的非共軛條件後驗對象中進行採樣–比網格方法更好的替代方法。

我將說明該算法,給出一些R代碼結果,然後分析R代碼以識別MH算法中的瓶頸。

模型

此示例的模擬數據是包含患者的橫截面數據集。有一個二元結果,ÿ一個二元治療變量,一種一個因子age。年齡是具有3個等級的分類變量。我用貝葉斯邏輯迴歸建模:

對於大都市吉布斯來說,這是一個相當現實的示例:

  1. 我們有一個二進制結果,爲此我們採用了非線性鏈接函數。
  2. 我們有一個需要調整的因素。
  3. 我們正在估計我們關心的更多參數。在這種情況下,我們確實關心治療效果的估計\ beta_1,因此其他係數在某種意義上是令人討厭的參數。我不會說這是一個“高維”設置,但肯定會給採樣器帶來壓力。

非規範條件後驗

讓我們看一下該模型的(非標準化)條件後驗。我不會進行推導,但是它遵循我以前的帖子中使用的相同過程。

 

此條件分佈不是已知分佈,因此我們不能簡單地使用Gibbs從中進行採樣。相反,在每個gibbs迭代中,我們需要另一個採樣步驟來從該條件後驗中提取。第二個採樣器將是MH採樣器。

 

Metroplis-in-Gibbs採樣

目標是從中取樣。請注意,這是4維密度。

MH採樣器的工作方式如下:

  1. 開始採樣。
  2. 讓我們假設將提案分配的方差設置爲某個常數。
  3. 我們計算在上一次繪製時評估的非標準化密度與當前提案的比率:   
  4. 如果該比率大於1,則當前提議的密度高於先前值的密度。因此,我們“接受”了提案並確定了。然後,我們使用以提案爲中心的提案分佈重複步驟2-4  ,然後生成新提案。如果該比率小於1,則當前建議值的密度低於先前建議。

因此,總是接受產生更高條件的後驗評估的提議。但是,有時僅接受具有較低密度評估的提案-提案的相對密度評估越低,其接受的可能性就越低。

經過多次迭代,從後驗的高密度區域開始的抽樣被接受,並且被接受的序列“爬升”到高密度區域。一旦序列到達此高密度區域,它將趨於保持在那裏。因此,這也類似於模擬退火

這種表示法很容易擴展到我們的4維示例:提案分佈現在是4維多元高斯模型。代替標量方差參數,我們有一個協方差矩陣。因此,我們的建議是係數的向量。從這個意義上講,我們運行的是Gibbs –使用MH每次迭代繪製整個係數塊。

 

  • 跳躍分佈的方差是重要的參數。如果方差太小,則當前提案可能會非常接近最後一個值,因此[R也很可能接近1。因此,我們會非常頻繁地接受,但由於接受的值彼此之間非常接近,因此我們會攀升至較高在許多次迭代中慢慢降低密度區域。如果方差太大,則序列到達高密度區域後可能無法保留在該區域。
  • 許多“自適應” MH方法是此處描述的基本算法的變體,但包括調整週期以找到產生最佳接受率的跳躍分佈方差。
  • MH中計算量最大的部分是密度評估。對於每個Gibbs迭代,我們必須兩次評估4維密度。
  • 儘管此符號很容易擴展到高維度,但性能本身在高維度上會變差。這樣做的原因是非常技術性的,但是非常有趣。

結果

這是我們感興趣的4個參數的MCMC鏈。紅線表示真實值。


profvis(expr = {
for(i in 2:gibbs_iter){
  # sample from posterior of phi
  gibbs_res[i,p+1] <- rcond_post_phi(gibbs_res[i-1,1:p], 
                                     alpha, gamma, lambda, p)
  # sample from posterior of beta vector ( using MH )
  mh_draw <- rcond_post_beta_mh(gibbs_res[i-1,1:p], gibbs_res[i,p+1], 
                                lambda, X, Y, mh_trials=5, jump_v=.01)

}
})


par(mfrow=c(2,2))
plot(gibbs_res[,1],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
     main='Intercept')
abline(h=-1,col='red')
plot(gibbs_res[,2],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
     main='Age1')
abline(h=.7,col='red')
plot(gibbs_res[,3],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
     main='Age2')
abline(h=1.1,col='red')
plot(gibbs_res[,4],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
     main='Treatment')
abline(h=1.1,col='red')

# calculate posterior means and credible intervals
post_burn_trim<-gibbs_res[seq(1000,gibbs_iter,100),]
colMeans(post_burn_trim)
apply(post_burn_trim, 2, quantile, p=c(.025,.975))

 

 

有一些改進的空間:

  • 接受率只有18%,我本可以調整跳躍分佈協方差矩陣來獲得更好的比率。
  • 我認爲更多的迭代肯定會在這裏有所幫助。這些鏈看起來不錯,但仍然是自相關的。

關於貝葉斯範式的好處是,所有推斷都是使用後驗分佈完成的。現在,係數估計值是對數刻度,但是如果我們需要比值比,則只需對後驗取冪。如果我們想要對比值比進行區間估計,那麼我們就可以獲取指數後驗平局的2.5%和97.5%。

下面是使用R分析,顯示了這一點。for循環運行Gibbs迭代。在每個Gibbs迭代中,我都調用函數rcond_post_beta_mh(),該函數使用MH從參數向量的條件後驗中得出圖形。

 

深入研究rcond_post_beta_mh(),我們看到子例程log_cond_post_beta()是MH運行中的瓶頸。此函數是beta載體的對數條件後驗密度,將其評估兩次。

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章