多重共線性檢驗-方差膨脹係數(VIF)

 

  方差膨脹係數(variance inflation factor,VIF)是衡量多元線性迴歸模型中復 (多重)共線性嚴重程度的一種度量。它表示迴歸係數估計量的方差與假設自變量間不線性相關時方差相比的比值。dom

  多重共線性是指自變量之間存在線性相關關係,即一個自變量能夠是其餘一個或幾個自變量的線性組合。若存在多重共線性,計算自變量的偏回歸係數時矩陣不可逆。其表現主要有:整個模型的方差分析結果與各個自變量的迴歸係數的檢驗結果不一致,專業判斷有統計學意義的自變量檢驗結果卻無心義,自變量的係數或符號與實際狀況嚴重不符等。
檢驗方法主要有:容忍度(Tolerance)和方差膨脹係數(Variance inflation factor,VIF)。其中最經常使用的是VIF,計算公式爲:
VIF的取值大於1。VIF值越接近於1,多重共線性越輕,反之越重。當多重共線性嚴重時,應採起適當的方法進行調整  [3]  。容忍度的值界於0至1之間,當容忍度值較小時,表示此自變量與其餘自變量之間存在共線性。容忍度這個變量回歸係數的估計值不夠穩定,則迴歸係數的計算值也會有很大偏差。方差膨脹係數是容忍度的倒數,VIF越大,表示自變量的容忍度越小,越有共線性問題。
  一般以10做爲判斷邊界。當VIF<10,不存在多重共線性;當10<=VIF<100,存在較強的多重共線性;當VIF>=100, 存在嚴重多重共線性。

import numpy as np
from sklearn.linear_model import LinearRegression測試

coef0=np.array([5,6,7,8,9,10,11,12])
X1=np.random.rand(100,8)
y=np.dot(X1,coef0)+np.random.normal(0,1.5,size=100)
training=np.random.choice([True,False],p=[0.8,0.2],size=100)
lr1=LinearRegression()
lr1.fit(X1[training],y[training])
# 係數的均方偏差MSE
print(((lr1.coef_-coef0)**2).sum()/8)
# 測試集準確率(R2)
print(lr1.score(X1[~training],y[~training]))spa


X2=np.column_stack([X1,np.dot(X1[:,[0,1]],np.array([1,1]))+np.random.normal(0,0.05,size=100)])
X2=np.column_stack([X2,np.dot(X2[:,[1,2,3]],np.array([1,1,1]))+np.random.normal(0,0.05,size=100)])
X3=np.column_stack([X1,np.random.rand(100,2)])orm

import matplotlib.pyplot as plt
clf=LinearRegression()
vif2=np.zeros((10,1))
for i in range(10):
tmp=[k for k in range(10) if k!=i]
clf.fit(X2[:,tmp],X2[:,i])
vifi=1/(1-clf.score(X2[:,tmp],X2[:,i]))
vif2[i]=vifiblog

plt.figure()
ax = plt.gca()
ax.plot(vif2)
#ax.plot(vif3)
plt.xlabel('feature')
plt.ylabel('VIF')
plt.title('VIF coefficients of the features')
plt.axis('tight')
plt.show()ci

相關文章
相關標籤/搜索