原文鏈接:http://tecdat.cn/?p=11161
概率編程使我們能夠實現統計模型,而不必擔心技術細節。這對於基於MCMC采樣的貝葉斯模型特別有用。
stan簡介
Stan是用於貝葉斯推理的C ++庫。它基於No-U-Turn采樣器(NUTS),該采樣器用於根據用戶指定的模型和數據估計后驗分布。使用Stan執行分析涉及以下步驟:
- 使用Stan建模語言指定統計模型。通常通過專用的.stan 文件完成此操作 。
- 准備要提供給模型的數據。
- 使用該
stan
函數從后驗分布中采樣 。 - 分析結果。
在本文中,我將通過兩個層次模型展示Stan的用法。我將使用第一個模型討論Stan的基本功能,並使用第二個示例演示更高級的應用程序。
學校數據集
我們要使用的第一個數據集是 學校的數據集 。該數據集衡量了教練計划對大學入學考試(在美國使用的學業能力測驗(SAT))的影響。 數據集如下所示:
正如我們所看到的,SAT並沒有兌現其諾言:對於八所學校中的大多數,短期教練的確提高了SAT分數 。對於此數據集,我們有興趣估算與每所學校相關的真實效果大小。可以使用兩種替代方法。首先,我們可以假設所有學校彼此獨立。但是,這將導致難以解釋的估計,因為學校的95%的后驗間隔由於高標准誤差而在很大程度上重疊。第二,假設所有學校的真實效果都相同,則可以匯總所有學校的數據。但是,這也是不合理的,因為應該有針對學校的效果(例如,不同的老師和學生)。
因此,需要另一個模型。分層模型的優點是可以合並來自所有八所學校(實驗)的信息,而無需假定它們具有共同的真實效果。我們可以通過以下方式指定層次貝葉斯模型:
根據該模型,教練的效果遵循正態分布,其均值是真實效果θjθj,其標准偏差為σjσj(從數據中得知)。真正的影響θjθj遵循參數μμ和ττ的正態分布。
定義Stan模型文件
在指定了要使用的模型之后,我們現在可以討論如何在Stan中指定此模型。在為上述模型定義Stan程序之前,讓我們看一下Stan建模語言的結構。
變量
在Stan中,可以通過以下方式定義變量:
注意,如果先驗已知變量,則應指定變量的上下邊界。
多維數據可以通過方括號指定:
程序
Stan中使用以下程序 :
- data:用於指定以貝葉斯規則為條件的數據
- 轉換后的數據:用於預處理數據
- 參數 (必填):用於指定模型的參數
- 轉換后的參數:用於計算后驗之前的參數處理
- 模型 (必填):用於指定模型本身
- 生成數量:用於對結果進行后處理
對於 模型 程序塊,可以兩種等效方式指定分布。第一個,使用以下統計符號:
第二種方法使用基於對數概率密度函數(lpdf)的程序化表示法:
Stan支持大量的概率分布。通過Stan指定模型時,該 lookup
函數會派上用場:它提供從R函數到Stan函數的映射。考慮以下示例:
在這里,我們看到rnorm
R 中的等價 normal_rng
於Stan。
模型
現在,我們了解了Stan建模語言的基礎知識,我們可以定義模型,並將其存儲在一個名為的文件中 schools.stan
:
注意,θ 永遠不會出現在參數中。這是因為我們沒有顯式地對θθ進行建模,而是對ηη(各個學校的標准化效果)進行了建模。然后, 根據μμ,ττ和ηη在變換后的參數部分構造θθ 。此參數化使采樣器更高效。
准備數據進行建模
在適合模型之前,我們需要將輸入數據編碼為一個列表,其參數應與Stan模型的數據部分中的條目相對應。對於學校數據,數據如下:
從后驗分布抽樣
我們可以使用stan
函數從后驗分布中采樣,該 函數執行以下三個步驟:
- 它將模型規范轉換為C ++代碼。
- 它將C ++代碼編譯為共享對象。
- 它根據指定的模型,數據和設置從后驗分布中采樣。
如果 rstan_options(auto_write = TRUE)
已在活動的R會話中執行,則相同模型的后續調用將比第一次調用快得多,因為該 stan
函數隨后跳過了前兩個步驟(轉換和編譯模型)。此外,我們將設置要使用的內核數:
現在,我們可以從后驗中編譯模型和樣本。唯一需要的兩個參數 stan
是模型文件的位置和要饋送到模型的數據。此處顯示的其他參數僅用於概述可能的選項:
模型解釋
我們將首先對模型進行基本解釋,然后研究MCMC程序。
基本模型解釋
要使用擬合模型執行推斷,我們可以使用 print
函數。
在此,行名稱表示估計的參數:mu是后驗分布的平均值,而tau是其標准偏差。eta和theta的條目分別表示矢量ηη和θθ的估計值。該 LP 條目顯示日志密度,這通常是不相關的。這些列表示計算值。百分比表示可靠的時間間隔。例如,指導的總體效果的95%可信區間μμ為[-1.27,18.26] [-1.27,18.26]。由於我們不確定平均值,因此θjθj的95%可信區間也很寬。例如,對於第一所學校,95%可信區間為[−2.19,32.33] [− 2.19,32.33]。
我們可以使用以下plot
函數來可視化估計中的不確定性 :
黑線表示95%的間隔,而紅線表示80%的間隔。圓圈表示平均值的估計。
我們可以使用以下extract
函數獲取生成的樣本 :
MCMC診斷
通過繪制采樣過程的軌跡圖,我們可以確定采樣期間是否出了問題。例如,如果鏈條在一個位置停留的時間過長或在一個方向上走了太多步,就是這種情況。我們可以使用以下traceplot
函數繪制模型中使用的四個鏈的軌跡 :
要從各個馬爾可夫鏈中獲取樣本,我們可以extract
再次使用該 函數:
為了對采樣過程進行更高級的分析,我們可以使用該 shinystan
軟件包 。使用該軟件包,可以通過以下方式啟動Shiny應用程序來分析擬合模型:
層次回歸
現在,我們對Stan有了基本的了解,我們可以深入研究更高級的應用程序:讓我們嘗試一下層次回歸。在常規回歸中,我們對以下形式的關系進行建模
此表示假設所有樣本都具有相同的分布。如果存在一組樣本,那么我們就會遇到問題,因為將忽略組內和組之間的潛在差異。
另一種選擇是為每個組建立一個回歸模型。但是,在這種情況下,估計單個模型時,小樣本量會帶來問題。
層次回歸是兩個極端之間的折衷。該模型假設組是相似的,但存在差異。
假設每個樣本都屬於KK組之一。然后,層次回歸指定如下:
其中YkYk是第kk組的結果,αkαk是截距,XkXk是特征,β(k)β(k)表示權重。層次模型不同於其中YkYk分別適合每個組的模型,因為假定參數αkαk和β(k)β(k)源自共同的分布。
數據集
分層回歸的經典示例是 鼠數據集。該縱向數據集包含5周內測得的 鼠體重。讓我們加載數據:
讓我們調查數據:
數據顯示線性增長趨勢對於不同的大鼠非常相似。但是,我們還看到,大鼠的初始體重不同,需要不同的截距,並且生長速度也需要不同的斜率。因此,分層模型似乎是適當的。
層次回歸模型的規范
該模型可以指定如下:
第i個大鼠的截距由αiαi表示,斜率由βiβi表示。注意,測量時間的中心是x = 22x = 22,它是時間序列數據的中值測量值(第22天)。
現在,我們可以指定模型並將其存儲在名為的文件中 rats.stan
:
請注意,模型代碼估算的是方差( sigmasq 變量)而不是標准偏差。
資料准備
為了准備模型數據,我們首先將測量點提取為數值,然后將所有內容編碼為列表結構:
擬合回歸模型
現在,我們可以為老鼠體重數據集擬合貝葉斯層次回歸模型:
層次回歸模型的預測
在確定了每只大鼠的αα和ββ之后,我們現在可以估計任意時間點單個大鼠的體重。在這里,我們有興趣尋找從第0天到第100天的大鼠體重。
與原始數據相比,該模型的估計是平滑的,因為每條曲線都遵循線性模型。研究最后一個圖中所示的置信區間,我們可以看到方差估計是合理的。我們對采樣時(第8至36天)的老鼠體重充滿信心,但是隨着我們遠離采樣區域,不確定性會增加。