作者:王翰洋 (北京大學)
Stata 連享會: 知乎 | 簡書 | 碼雲Stata連享會「Stata現場班報名中……」
「不顯著」是很多跑回歸的人的痛處,但有時不顯著並非是故事本身的原因,而是多重共線性導致的。多元分析中,當兩個或更多的變數出現相關的時候,就有可能出現多重共線性問題。一般的多重共線性並不影響估計,但高度的共線性會使估計的方差膨脹,t 值縮水,導致統計推斷失效。
本文介紹了兩種經典的篩選變數、應對多重共線性的參數方法,「Ridge 回歸」和「Lasso 回歸」。
1. Ridge回歸
Ridge 回歸 (Hoerl and Kennard, 1970) 的原理和 OLS 估計類似,但是對係數的大小設置了懲罰項。具體來說,
其中,t 代表懲罰的力度,t 越大,對係數的大小懲罰越重,約束越緊。取係數的平方和形式可以避免正負係數相抵消的情況。在矩陣形式中,Z 按照傳統是標準化之後的(均值為 0,方差為 1),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 也是對係數的大小設置了懲罰項,但懲罰項引入的方式略不同,具體來說,
等價地,我們可以用以下損失函數來表示:
仍然,λ 是這個問題的調整參數,不過一般情況下我們無法得到 β 的顯示解。但是,當數據矩陣中各變數都相互正交且模為 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。