1. 起因
在回歸分析時,我們可能會遇到自變量的回歸系數(shù)與常識相反的情況,這種情況下,可以檢查下自變量間是否存在多重共線性的問題。又或者,回歸分析統(tǒng)計量顯示存在多重共線性(比如conditional number過大),也可能意味著存在多重共線性。(但有時單變量回歸,還會提示conditional number很大,這種只是與解釋變量的縮放有關(guān),參見單變量(一元線性)回歸,結(jié)果顯示存在多重共線性)
2. 什么是多重共線性
顧名思義,共線性是指兩個變量間一個變量可以表示為另一個變量的線性組合;而多重共線性指的就是針對多元線性回歸,自變量間存在一個變量可以表示為多個變量的線性組合的情況。
3. 多重共線性有什么影響
- 降低回歸系數(shù)估計量的可靠度。最小二乘法得到的估計量是基于變量間的相關(guān)性矩陣的,當(dāng)變量間的相關(guān)性過高時,將影響變量的方差估計,進而影響 t 統(tǒng)計量,降低參數(shù)估計的可信度。
- 回歸系數(shù)的解釋性含義受影響。對回歸分析進行解釋時,我們通常的表述是,在控制其他變量不變的情況下,
對
存在什么影響。但由于自變量間的相關(guān)性存在(比如
),是無法控制
不變而
變化的,即不能剝離出變量的獨立影響。
- 變量顯著性與否的影響。前面所說,t 統(tǒng)計量的計算是基于變量的方差的,方差又是依賴相關(guān)性矩陣的。多重共線性使得變量的方差變大,進而使得t值變小,可能使得變量不再顯著,這點是最關(guān)鍵的。
總而言之,影響可能是本身非常關(guān)鍵的變量不再顯著,明顯是正向影響的變量結(jié)果反而為負(fù)。舉個簡單例子,以長胖作為因變量(),吃肉和吃米飯作為自變量(
),可以表達(dá)為
,但由于我們吃肉和吃米飯之間存在非常高的相關(guān)性,可能估計得到的結(jié)果為
,結(jié)果發(fā)現(xiàn)吃米飯不長胖。這個時候就要注意多重共線性了。
4. 怎么識別多重共線性
除了回歸模型的提示如The condition number is large, 1.42e+04. This might indicate that there are strong multicollinearity or other numerical problems., 還需要自動檢測,主要包括方差膨脹因子( variance inflation factor, VIF)和相關(guān)性系數(shù)。容差值為VIF的倒數(shù),二者等價,不列出了。
方差膨脹因子(VIF)。VIF越大,相關(guān)性越強。一般認(rèn)為VIF超過10就過大,也有嚴(yán)格的認(rèn)為是5。我之前論文中找到過7.5的參考文獻。具體可視情況而定,不影響上述大局即可。VIF的計算方法是
,其中
是第 i 個變量與其他全部變量的復(fù)相關(guān)系數(shù)(
是拿變量
做因變量,對其他所有變量做一個新的回歸得到的可決系數(shù),具體復(fù)雜的數(shù)學(xué)推導(dǎo)可參見方差膨脹因子的數(shù)學(xué)本質(zhì))。
相關(guān)系數(shù)。這個就是VIF計算的本質(zhì),也是多重共線性的字面理解意思。對所有自變量繪制相關(guān)性矩陣圖,尤其注重那些相關(guān)系數(shù)超過0.7的變量,后續(xù)可以進行合并或者刪除的操作。
5. 如何計算方差膨脹因子(VIF)
相關(guān)性就不說了,下面利用statsmodels模塊計算VIF,具體函數(shù)是variance_inflation_factor,官方文檔參見statsmodels.stats.outliers_influence.variance_inflation_factor,statmodels模塊說如果VIF大于5,就證明改變量與其他的存在共線性了。
重點:在利用Python的statmodels模塊調(diào)用variance_inflation_factor計算時,一定要加常數(shù)項,不然VIF都會很大,參見Python計算方差膨脹因子VIF的對比測試。
計算代碼為:
# 計算方差膨脹因子
def check_vif():
input_path = "E:\\Data\\"
df = pd.read_csv(input_path + 'data.csv', header=0, encoding='gbk')
df = df.drop(['y'], axis=1) # 刪除多余變量,包括因變量
df = df.dropna(axis=0, how='any') # 刪除帶有任何空值的行
df['const'] = 1 # 添加常數(shù)項,這個是重點
x = np.array(df)
vif_list = [variance_inflation_factor(x, i) for i in range(x.shape[1])]
df_vif = pd.DataFrame({'variable': list(df.columns), 'vif': vif_list})
df_vif = df_vif[~(df_vif['variable'] == 'const')] # 刪除常數(shù)項
print(df_vif)
輸出結(jié)果即可查看各個變量對應(yīng)的多重共線性了。耶。
6. 如何解決多重共線性
- 變量刪減。如查看相關(guān)性系數(shù)矩陣可以看出,某一個變量如果與其他變量的相關(guān)性系數(shù)很高(大于0.7等),可進行變量刪除。刪除之后再去計算VIF進行判斷。
- 變量融合。比如對于第二產(chǎn)業(yè)產(chǎn)值和第三產(chǎn)業(yè)產(chǎn)值,二者相關(guān)性很高,可以合并為一個二三產(chǎn)業(yè)產(chǎn)值一個變量,且意義仍然存在。
- 增加樣本容量,減小參數(shù)估計量的方差。這個一般不太可行。
- 逐步回歸??梢宰屜到y(tǒng)自動識別出對Y有顯著影響的X變量,基本思想是將變量逐個引入模型,每引入一個解釋變量都要確保模型顯著性(F檢驗)和原始解釋變量的顯著性(t檢驗),如果引入后模型不顯著則不再引入,確保引入解釋變量后各個變量都是顯著的。這也是進行反復(fù)回歸,尋找最優(yōu)的解釋變量集合。
- 嶺回歸。上述方法不可行時,可采用更科學(xué)的方法即嶺回歸(在回歸模型后面加上懲罰項)。嶺回歸(ridge regression)是一種專用于共線性數(shù)據(jù)分析的有偏估計回歸方法,是一種改良的最小二乘法,通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價獲得回歸系數(shù)更為符合實際、更可靠的回歸方法,對病態(tài)數(shù)據(jù)的擬合要強于最小二乘法。(此處來源百科百科)。這種方法也更科學(xué)一些,不用刪減犧牲變量。
7. 小結(jié)
構(gòu)建回歸模型本身就存在一些探索性的步驟,不可能一蹴而就。除了考慮變量之間的共線性進行變量選擇,更重要的是,我們要明白為什么選擇特定變量,這些變量對被解釋變量的作用機制是什么,這個是回歸分析中更為關(guān)鍵的問題。
其他
關(guān)于VIF的其他一些英文解釋,讀起來更明白。
# 什么是VIF
The variance inflation factor is a measure for the increase of the
variance of the parameter estimates if an additional variable, given by
exog_idx is added to the linear regression. It is a measure for
multicollinearity of the design matrix, exog.
One recommendation is that if VIF is greater than 5, then the explanatory
variable given by exog_idx is highly collinear with the other explanatory
variables, and the parameter estimates will have large standard errors
because of this.
# 如何計算的
Assume we have a list of exogenous variable [X1, X2, X3, X4].
To calculate the VIF and Tolerance for each variable, we regress
each of them against other exogenous variables. For instance, the
regression model for X3 is defined as:
X3 ~ X1 + X2 + X4
And then we extract the R-squared from the model to calculate:
VIF = 1 / (1 - R-squared)
Tolerance = 1 - R-squared
The cutoff to detect multicollinearity:
VIF > 10 or Tolerance < 0.1
參考資料:
方差膨脹因子的數(shù)學(xué)本質(zhì),與皮爾遜相關(guān)系數(shù)的關(guān)系:https://www.zhihu.com/question/270451437
影響有哪些:https://zhuanlan.zhihu.com/p/56793236