赞
踩
这么可爱的你,就关注我一下吧~
在回归模型中,如果两个或两个以上自变量之间存在相关性,这种自变量之间的相关性,就叫做多重共线性。多重共线性普遍存在,适度的多重共线性可以不做处理。
当自变量之间高度相关(相关系数在0.7以上)时,将很难判定每一个单独的自变量对因变量的影响程度,这时候我们就需要做相应处理了。
这里我们举个例子,让大家更直观的了解多重共线性的影响:
import numpy as np
from pandas import DataFrame as df
import statsmodels.api as sm
e = np.random.normal(size=100)
# 我们先给定两个x变量,以及y值
x = df(np.linspace(0,100,100),columns=['x1'])
x['x2'] = np.linspace(10,1,100)
x = sm.add_constant(x)
y = np.dot(x, [1,2,3]) + e
# 拟合y
ols_model = sm.OLS(y,x).fit()
ols_model.summary()
拟合结果如下:
由上图我们可以看出,拟合的x1系数为2.0035,x2的系数为3.0862,拟合的系数与真实系数基本相同。
现我们加入一个变量x3,x3与x2线性相关,我们再看一下拟合后的参数
new_x = x.copy()
new_x['x3'] = new_x['x2']*3
new_ols_model = sm.OLS(y,new_x).fit()
new_ols_model.summary()
根据拟合后的结果我们可以看出:加入x3后,x2的系数为0.3114,明显变小了,并且原来x2的权重拆分成x2与x3的权重,那么就会有无数种拆分方法,因此系数就会不稳定,甚至会出现负数的情况。
模型拟合的变量的系数符号与业务实际不符
一般相关系数>0.7,认为变量间存在多重共线性
我们可以根据相关系数可以看出X2与x3线性相关
# 相关系数
coeff = np.corrcoef(new_x['x2'],new_x['x3'])
也可以使用方差膨胀因子VIF来识别多重共线性,变量的VIF越大说明该变量的共线性情况越严重。
一般样本量在10W+时,VIF>10就存在多重共线性
样本量在10W以下时,VIF>5就出现多重共线性
几千的小样本时需要VIF<2。
公式
算法
看到公式大家可能会一脸懵,现在我们就来解释一下VIF的具体算法:
我们知道new_x有三个变量x1、x2、x3
首先我们将x1作为因变量,x2、x3为自变量做回归,得到模型的拟合优度,计算出x1的VIF
然后以x2为因变量,x1、x3为自变量做回归,得到模型的拟合优度,计算出x2的VIF
同理我们可以得出x3的VIF。
# VIF
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = [variance_inflation_factor(new_x.iloc[:,1:].values,i) for i in range(len(new_x.columns)-1)]
firstvif = df({"vars": new_x.columns[1:], "vif": vif})
由上图可以看出,x2、x3的VIF都是无穷大inf,所以x2、x3存在严重的多重共线性
=====================================================================
此外我还整理了一些线性回归相关的文章
【线性回归:为什么损失函数要使用均方误差】
【线性回归_案例代码(kaggle房价预测)】
【OLS回归_结果解读】
【线性回归_原理】
更多详细内容请关注我的公众号~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。