多重共线性诊断及处理

一、定义

多重共线性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)

  

 

posted @ 2018-11-26 11:34  Christina_笔记  阅读(28789)  评论(0编辑  收藏  举报