赞
踩
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可以实现方差膨胀因子的计算
- from statsmodels.stats.outliers_influence import variance_inflation_factor
-
- def checkVIF_new(df):
- '''
- :param df:仅包含所有自变量X的数据集,DataFrame形式
- :return: 返回每个变量对于的VIF值
- '''
- df.insert(0,'constant',1) #添加常数项
- name = df.columns
- x = np.matrix(df)
- VIF_list = [variance_inflation_factor(x,i) for i in range(x.shape[1])]
- VIF = pd.DataFrame({'feature':name,"VIF":VIF_list})
-
- return VIF
3.多重共线性的处理
多重共线性对于线性回归是种灾难,并且我们不可能完全消除,而只能利用一些方法来减轻它的影响。对于多重共线性的处理方式,有以下几种思路:
(1)提前筛选变量:可以利用相关检验来或变量聚类的方法。
(2)子集选择:包括逐步回归和最优子集法。常用的是逐步回归。
(3)收缩方法:正则化方法。LASSO回归可以实现筛选变量的功能。
(4)维数缩减:数据的降维。
第一点在假设检验系列有详细介绍,以后聚类会专门讲解;第三点在介绍线性回归模型有介绍(传送门:线性回归之原理介绍),第四点在数据降维系列有介绍,这里我们侧重介绍第二点,逐步回归
逐步回归分为向前逐步和向后逐步,这里介绍向后逐步,其思想是:对入模的变量建立模型,从大到小逐步剔除不通过显著性检验p值的变量,再循环建立模型,直到所有变量都通过显著性检验。
以逻辑回归为例,用python接口statsmodels.api.smf可以实现这个过程:
- # 后向逐步法~逻辑回归
- import statsmodels.api as smf
-
- def gra_reg(gra_data,X,y,a=0.01):
- '''
- :param gra_data:要进行逐步回归的DataFrame数据集
- :param X:自变量列表
- :param y:因变量
- :param a:显著性水平,这里默认为0.01
- :return 返回不存在共线性的逐步回归结果与变量列表
- '''
-
- y_label = gra_data[y]
- while True:
- X_data = gra_data[X]
- # X_data = smf.add_constant(X_data)
- anal = smf.Logit(y_label, X_data).fit()
- P = anal.pvalues # 得到统计检验的P值
- P_di = dict(zip(P.keys(), P.values)) # 字典化变量与P值
- if max(P_di.values()) > a:
- X.remove(max(P_di, key=lambda x: P_di[x]))
- else:
- break
- return anal, X
参考资料:
https://www.zhihu.com/question/270451437
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。