当前位置:   article > 正文

多重共线性

多重共线性

1.回归模型自变量彼此相关称为多重共线性,它给模型提供重复信息

2.多重共线性会造成模型不稳定,可能会得到无法解释的现象

3.检测共线性的方法通常有相关性分析,显著性检验和方差膨胀因子分析

4.处理共线性的方法通常有提前筛选变量,逐步回归选择,正则化与数据降维

1.多重共线性产生的问题

回归模型(线性回归,逻辑回归)中两个或两个以上的自变量彼此相关时,则称回归模型中存在多重共线性,也就是说共线性的自变量提供了重复的信息。

它会造成模型不稳定,会造成回归系数,截距系数的估计非常不稳定,这种不稳定的具体表现是:很可能回归系数原来正,但因为共线性而变为负。这对于一些自变量的可解释性来讲可能是致命的,因为得到错误系数无法解释正常发生的现象。

2.多重共线性检测方法

多重共线性有很多检测方法,最简单直接的就是计算各自变量之间的相关系数,并进行显著性检验。具体的,如果出现以下情况,可能存在多重共线性:

(1)模型中各对自变量之间显著性相关。

(2)当模型线性关系(F检验)显著时,几乎所有回归系数的t检验不显著。

(3)回归系数的正负号与预期的相反。

(4)方差膨胀因子(VIF)检测,一般认为VIF大于10,则存在严重的多重共线性。

前三点在以往的文章(假设检验专题,回归模型理论分析)都有详细介绍,这里我们侧重介绍第四点,方差膨胀因子(Variance Inflation Factor,VIF)

先给出方差膨胀因子的表达式:

如果VIF越大,那么表明可决系数R2越大,说明变量Xi与其他自变量的线性关系强,说明原模型存在多重共线性可能性越大。

经验判断方法表明:当0<VIF<10,不存在 多重共线性;当10≤VIF<100,存在较强的多重共线性;当VIF≥100,存在严重多重共线性

利用python可以实现方差膨胀因子的计算

  1. from statsmodels.stats.outliers_influence import variance_inflation_factor
  2. def checkVIF_new(df):   
  3.     '''
  4.     :param df:仅包含所有自变量X的数据集,DataFrame形式
  5.     :return: 返回每个变量对于的VIF值
  6.     '''
  7.     df.insert(0,'constant',1) #添加常数项
  8.     name = df.columns
  9.     x = np.matrix(df)
  10.     VIF_list = [variance_inflation_factor(x,i) for i in range(x.shape[1])]
  11.     VIF = pd.DataFrame({'feature':name,"VIF":VIF_list})
  12.     return VIF

3.多重共线性的处理

多重共线性对于线性回归是种灾难,并且我们不可能完全消除,而只能利用一些方法来减轻它的影响。对于多重共线性的处理方式,有以下几种思路:

(1)提前筛选变量:可以利用相关检验来或变量聚类的方法。

(2)子集选择:包括逐步回归和最优子集法。常用的是逐步回归。

(3)收缩方法:正则化方法。LASSO回归可以实现筛选变量的功能。

(4)维数缩减:数据的降维。

第一点在假设检验系列有详细介绍,以后聚类会专门讲解;第三点在介绍线性回归模型有介绍(传送门:线性回归之原理介绍),第四点在数据降维系列有介绍,这里我们侧重介绍第二点,逐步回归

逐步回归分为向前逐步和向后逐步,这里介绍向后逐步,其思想是:对入模的变量建立模型,从大到小逐步剔除不通过显著性检验p值的变量,再循环建立模型,直到所有变量都通过显著性检验。

以逻辑回归为例,用python接口statsmodels.api.smf可以实现这个过程:

  1. # 后向逐步法~逻辑回归
  2. import statsmodels.api as smf
  3. def gra_reg(gra_data,X,y,a=0.01):
  4.     '''
  5.     :param gra_data:要进行逐步回归的DataFrame数据集
  6.     :param X:自变量列表
  7.     :param y:因变量
  8.     :param a:显著性水平,这里默认为0.01
  9.     :return 返回不存在共线性的逐步回归结果与变量列表
  10.     '''
  11.     y_label = gra_data[y]
  12.     while True:
  13.         X_data = gra_data[X]
  14.         # X_data = smf.add_constant(X_data)
  15.         anal = smf.Logit(y_label, X_data).fit()
  16.         P = anal.pvalues # 得到统计检验的P值
  17.         P_di = dict(zip(P.keys(), P.values)) # 字典化变量与P值
  18.         if max(P_di.values()) > a:
  19.             X.remove(max(P_di, key=lambda x: P_di[x]))
  20.         else:
  21.             break
  22.     return anal, X

参考资料:

https://www.zhihu.com/question/270451437

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/605261
推荐阅读
相关标签
  

闽ICP备14008679号