1. 程式人生 > >Stata: 拉索迴歸和嶺迴歸 (Ridge, Lasso) 簡介

Stata: 拉索迴歸和嶺迴歸 (Ridge, Lasso) 簡介

作者:王翰洋 (北京大學)

Stata 連享會: 知乎 | 簡書 | 碼雲

Stata 現場班報名中……

文章目錄


「不顯著」是很多跑回歸的人的痛處,但有時不顯著並非是故事本身的原因,而是多重共線性導致的。多元分析中,當兩個或更多的變量出現相關的時候,就有可能出現多重共線性問題。一般的多重共線性並不影響估計,但高度的共線性會使估計的方差膨脹,t 值縮水,導致統計推斷失效。

本文介紹了兩種經典的篩選變數、應對多重共線性的引數方法,「Ridge 迴歸」和「Lasso 迴歸」。

1. Ridge迴歸

Ridge 迴歸 (Hoerl and Kennard, 1970) 的原理和 OLS 估計類似,但是對係數的大小設定了懲罰項。具體來說,

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \min_{\beta} (…

其中,t 代表懲罰的力度,t 越大,對係數的大小懲罰越重,約束越緊。取係數的平方和形式可以避免正負係數相抵消的情況。在矩陣形式中,Z 按照傳統是標準化之後的(均值為 0,方差為 1),y 也需要中心化。不難證明,這個優化問題的解是:

β r i d

g e = ( z T z + λ I p ) 1 z T y {\beta}^{ridge}=(z^{T}z+\lambda I_{p})^{-1}z^{T}y

顯然,λ 是這個問題的調整引數,當 λ 趨於 0 的時候,就退化為一般的 OLS 估計。當 λ 趨於正無窮的時候, 則是純截距迴歸。實踐中,可以通過交叉驗證(cross validation)的方法來選擇調整引數 λ 。在 Stata 命令中,可以通過命令 rxridge 來實現 Ridge 迴歸。命令基本格式是:

rxridge  y X_1 X_2 X_3 [if exp] [in range]  ///
        [, msteps(#) qshape(#) rescale(#) tol(#) ] 

具體說明如下:

  • msteps 代表共線性容忍引數每增加一單位所帶來的步數變化
  • qshape 控制了沿似似然空間收縮的形狀
  • rescale 是調整方差的引數,比如 rescale(1) 就是讓所有中心化變數方差都為 1 ,rescale(0) 就是讓所有變數都保持原來的方差
  • tol(#) 用於設定收斂判據

2. Lasso 迴歸

Lasso 也是對係數的大小設定了懲罰項,但懲罰項引入的方式略不同,具體來說,

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \min_{\beta} (…

等價地,我們可以用以下損失函式來表示:

P R S S ( β ) = ( y z β ) T ( y z β ) + λ β 1 PRSS(\beta)=(y-z\beta)^{T}(y-z\beta)+{\lambda} \| {\beta} \|_{1}

仍然,λ 是這個問題的調整引數,不過一般情況下我們無法得到 β 的顯示解。但是,當資料矩陣中各變數都相互正交且模為 1 時,我們可以得到 Lasso 的顯示解。在 Lasso 中,可以看到,懲罰項由平方換成了絕對值。雖然絕對值是凸函式,函式在 0 點有唯一的最小值,但其在此點不可導。當某項的懲罰係數足夠大時,那麼它將無法進入模型(變數選擇),只有那些迴歸係數非0的變數才會被選入模型。

在 Stata 中,我們可以安裝 lassopack 命令來實現 Lasso 迴歸,Lassopack 包含三個與 Lasso 相關的子命令(輸入 help lassopack 可以檢視詳情):

  • 子命令 lasso2 可進行 Lasso 估計;
  • 子命令 cvlasso 可進行 K 折交叉驗證(k-fold cross validation);
  • 子命令 rlasso 可以估計懲罰項由資料決定或者高維情形(變數維度超過樣本數)。

3. 演示資料集

下面我們用一個糖尿病資料集(Efron et al., 2004)來演示 Ridge 迴歸和 Lasso 迴歸,
這個資料集包括血液化驗等指標(Source:http://CRAN.R-project.org/package=lars)。除了被解釋變數 y 之外,還有 X 和 X2 兩組變數,前者是標準化後的,為 442x10 維矩陣,後者包括前者及一些互動作用,為 442x64 維矩陣,我們考慮 y 和 X2 。在匯入資料後,我們先進行 Ridge 迴歸。輸入命令

rxridge  y x2*, q(-1)

就可以得到 Ridge 迴歸的結果,估計的 sigma 為 0.690,最後迭代出的 MCAL 為 63,Summed SMSE 為 104.37。

Ridge Regression with Efron et al.(2004) dataset

然後我們考慮 Lasso 迴歸。輸入如下命令可以進行 Lasso 估計,最後一個選項代表顯示整個解的路徑:

lasso2  y x2* , plotpath(lambda)

下表顯示隨著調整引數λ由大變小,越來越多的變數進入模型,比如 λ=3.992e+04 時,常數項首先進入模型。
Model specification with tuning parameter

下圖為整個解的路徑(作為 λ 的函式),畫出了不同變量回歸係數的變化過程。其中,當 λ=0 時(下圖最左邊),不存在懲罰項,故此時 Lasso 等價於OLS。而當 λ 很大時(下圖最右邊),由於懲罰力度過大,所有變數係數均歸於 0 。這裡,由於變數非常多,整個圖頗有野獸派風格:

Solution path to Lasso Regression

緊接著,我們使用 K 折交叉驗證的方法來選擇最佳的調整引數。所謂的 K 折交叉驗證,是說將樣本資料隨機分為 K 個等分。將第 1 個子樣本作為 “驗證集”(validation set)而保留不用,而使用其餘 K-1 個子樣本作為 “訓練集”(training set)來估計此模型,再以此預測第 1 個子樣本,並計算第1個子樣本的 “均方預測誤差”(Mean Squared Prediction Error)。其次,將第 2 個子樣本作為驗證集,而使用其餘 K-1 個子樣本作為訓練集來預測第2個子樣本,並計算第 2 個子樣本的 MSPE。以此類推,將所有子樣本的 MSPE 加總,即可得整個樣本的 MSPE。最後,選擇調整引數 ,使得整個樣本的 MSPE 最小,故具有最佳的預測能力。我們輸入命令

cvlasso  y x2*, lopt seed(123)

其中,選擇項 “lopt” 表示選擇使 MSPE 最小的 λ,選擇項 “seed(123)” 表示將隨機數種子設為 123(可自行設定),以便結果具有可重複性;預設 K=10(即 10 折交叉驗證)。

Cross Validation, K=10

打星號處的 λ=2688.3717,這是使 MSPE 最小的調整引數,與此對應的估計結果如下圖所示:

Model selected with Lasso Regression

上表右邊第 1 列即為 Lasso 所估計的變數係數。其中,除常數項外,只有 14 個變數的係數為非零,而其餘變數(未出現在表中)的係數則為 0。考慮到作為收縮估計量的 Lasso 存在偏差(bias),上表右邊第 2 列彙報了 “Post Lasso” 估計量的結果,即僅使用 Lasso 進行變數篩選,然後扔掉 Lasso 的迴歸係數,再對篩選出來的變數進行 OLS 迴歸。

通過以上的介紹,我們已經掌握瞭如何使用 Stata 進行 Ridge 迴歸和 Lasso 迴歸,這是經典的解決高度共線性、篩選變數的方法。但是,近年來非常火熱的機器學習方法,在解決高度共線性、篩選變數方面,有更好的表現,期待看到更多的關於機器學習方法的 Stata 命令。

Stata 相關命令

這些都是外部命令,可以使用 findit cmdname 搜尋後下載,亦可直接使用 ssc install cmdname, replace 直接下載,詳情參見 「Stata: 外部命令的搜尋、安裝與使用」

  • help ridgereg // module to compute Ridge Regression Models
  • help elasticregress //perform elastic net regression, lasso regression, ridge regression, 作者自己的評價
  • help ridge2sls // Two-Stage Least Squares (2SLS) Ridge & Weighted Regression
  • help lassopack //module for lasso, square-root lasso, elastic net, ridge, adaptive lasso estimation and cross-validation

相關連結

關於我們

  • Stata 連享會(公眾號:StataChina)】由中山大學連玉君老師團隊創辦,旨在定期與大家分享 Stata 應用的各種經驗和技巧。
  • 公眾號推文同步釋出於 CSDN-Stata連享會簡書-Stata連享會知乎-連玉君Stata專欄。可以在上述網站中搜索關鍵詞StataStata連享會後關注我們。
  • 點選推文底部【閱讀原文】可以檢視推文中的連結並下載相關資料。
  • Stata連享會 精彩推文1 || 精彩推文2

聯絡我們

  • 歡迎賜稿: 歡迎將您的文章或筆記投稿至Stata連享會(公眾號: StataChina),我們會保留您的署名;錄用稿件達五篇以上,即可免費獲得 Stata 現場培訓 (初級或高階選其一) 資格。
  • 意見和資料: 歡迎您的寶貴意見,您也可以來信索取推文中提及的程式和資料。
  • 招募英才: 歡迎加入我們的團隊,一起學習 Stata。合作編輯或撰寫稿件五篇以上,即可免費獲得 Stata 現場培訓 (初級或高階選其一) 資格。
  • 聯絡郵件: [email protected]

往期精彩推文


歡迎加入Stata連享會(公眾號: StataChina)