一、定義
多重共線性(Multicollinearity)是指線性回歸模型中的解釋變量之間由於存在較精確相關關系或高度相關關系而使模型估計失真或難以估計准確。完全共線性的情況並不多見,一般出現的是在一定程度上的共線性,即近似共線性。
二. 目前常用的多重共線性診斷方法
1.自變量的相關系數矩陣R診斷法:研究變量的兩兩相關分析,如果自變量間的二元相關系數值很大,則認為存在多重共線性。但無確定的標准判斷相關系數的大小與共線性的關系。有時,相關系數值不大,也不能排除多重共線性的可能。
R實現:畫協方差矩陣圖
2.方差膨脹因子(the variance inflation factor,VIF)診斷法:方差膨脹因子表達式為:VIFi=1/(1-R2i)。其中Ri為自變量xi對其余自變量作回歸分析的復相關系數。當VIFi很大時,表明自變量間存在多重共線性。該診斷方法也存在臨界值不易確定的問題,在應用時須慎重。
判斷:VIFj>10時,說明自變量x與其余自變量之間存在嚴重的多重共線關系,這種多重共線性可能會過度地影響最小二乘估計值
3.容忍值(Tolerance,簡記為Tol)法:容忍值實際上是VIF的倒數,即Tol=1/VIF。其取值在0~1之間,Tol越接近1,說明自變量間的共線性越弱。在應用時一般先預先指定一個Tol值,容忍值小於指定值的變量不能進入方程,從而保證進入方程的變量的相關系數矩陣為非奇異陣,計算結果具有穩定性。但是,有的自變量即使通過了容忍性檢驗進入方程,仍可導致結果的不穩定。
4.多元決定系數值診斷法:假定多元回歸模型p個自變量,其多元決定系數為R2y(X1,X2,…,Xp)。分別構成不含其中某個自變量(Xi,i=1,2,…,p)的p個回歸模型,並應用最小二乘法准則擬合回歸方程,求出它們各自的決定系數R2i(i=1,2,…,p)。如果其中較大的一個R2k與R2y很接近,就表明該自變量在模型中對多元決定系數的影響不大,說明該變量對Y總變異的解釋能力可由其他自變量代替。它很有可能是其他自變量的線性組合。因此,該自變量進入模型后就有可能引起多重共線性問題。該方法也存在臨界值和主觀判斷問題。
5.條件數與特征分析法:在自變量的觀測值構成的設計矩陣X中,求出變量相關系數R的特征值,如果某個特征值很小(如小於0.05 ),或所有特征值的倒數之和為自變量數目的5倍以上,表明自變量間存在多重共線性關系。
三. R語言實現多重共線性的檢驗
1、 方差膨脹因子VIF
得到各個系數的方差膨脹因子,一般認為,當0<VIF<10,不存在多重共線性(注意:在《R語言實戰》第2版P182中認為VIF>4就存在多重共線性);當10≤VIF<100,存在較強的多重共線性,當VIF>=100,多重共線性非常嚴重。
library(car)
vif(lm.sol)
注意:需要安裝car包。
2、基於條件數和特征分析法
step1: 利用kappa函數,計算自變量矩陣的條件數;
step2: 判斷是否存在多重共線性. 從實際經驗的角度,一般若條件數<100,則認為多重共線性的程度很小,若100<=條件數<=1000,則認為存在中等程度的多重共線性,若條件數>1000,則認為存在嚴重的多重共線性.
注意:不用裝包,kappa是R中內置函數,可以直接使用!
四. 解決方法
1、 處理時可以進行逐步回歸,用step()命令,比如你一開始的模型是fm=lm(),step(fm)選擇最小AIC信息統計量就可以了。這種方法是排除引起共線性的變量,是解決多重共線性的比較常用方法!
2、 增大樣本量,盡量樣本量要遠遠大於自變量個數。
3、 回歸系數的有偏估計(嶺回歸,主成分分析,偏最小二乘法)
例如:
> collinear<-data.frame(
Y=c(10.006, 9.737, 15.087, 8.422, 8.625, 16.289,
5.958, 9.313, 12.960, 5.541, 8.756, 10.937),
X1=rep(c(8, 0, 2, 0), c(3, 3, 3, 3)),
X2=rep(c(1, 0, 7, 0), c(3, 3, 3, 3)),
X3=rep(c(1, 9, 0), c(3, 3, 6)),
X4=rep(c(1, 0, 1, 10), c(1, 2, 6, 3)),
X5=c(0.541, 0.130, 2.116, -2.397, -0.046, 0.365,
1.996, 0.228, 1.38, -0.798, 0.257, 0.440),
X6=c(-0.099, 0.070, 0.115, 0.252, 0.017, 1.504,
-0.865, -0.055, 0.502, -0.399, 0.101, 0.432)
)
> XX<-cor(collinear[2:7])
> kappa(XX,exact=TRUE) #exact=TRUE表示精確計算條件數;
[1] 2195.908 #大於1000,有嚴重的多重共線性
# eigen(XX)
> library(car)
載入需要的程輯包:carData
> vif.dia<-vif(lm(Y~.,data = collinear))
> sort(vif.dia,decreasing = TRUE)
X4 X3 X1 X2 X5 X6
297.714658 266.263648 182.051943 161.361942 1.919992 1.455265
#逐步回歸 > fit <- lm(Y~.,data=collinear) > fit_step <- step(fit) > summary(fit_step)
