1 什么是多重共线性

多重共线性回归模型使用 多重线性回归共线性_数据个数多重共线性回归模型使用 多重线性回归共线性_数据_02使得多重共线性回归模型使用 多重线性回归共线性_多重共线性回归模型使用_03则称自变量多重共线性回归模型使用 多重线性回归共线性_线性回归_04之间存在着完全多重共线性。在完全共线性的情况下,某一个自变量可以完全由其他自变量线性表示。但是这种情况并不常见,常见的是上述等式近似成立的情况。即存在不全为0的多重共线性回归模型使用 多重线性回归共线性_数据个数多重共线性回归模型使用 多重线性回归共线性_数据_02使得多重共线性回归模型使用 多重线性回归共线性_数据_07则称自变量多重共线性回归模型使用 多重线性回归共线性_线性回归_04之间存在近似共线性。

2 多重共线性和线性回归模型
2.1 最小二乘法

  最小二乘法(Ordinary Least Squares, OLS)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
  多元线性回归模型可以使用最小二乘法进行求解。其具体的推导过程在参考资料2中已经详细列出,这里不再赘述。回归模型参数的最小二乘估计的表达式为:
多重共线性回归模型使用 多重线性回归共线性_数据_09

2.2 多重共线性对线性回归的影响

多重共线性回归模型使用 多重线性回归共线性_线性回归_10的秩多重共线性回归模型使用 多重线性回归共线性_多重共线性回归模型使用_11,此时多重共线性回归模型使用 多重线性回归共线性_数据_12,此时正规方程组的解不唯一。多重共线性回归模型使用 多重线性回归共线性_最小二乘法_13不存在,回归参数的最小二乘轨迹表达式多重共线性回归模型使用 多重线性回归共线性_线性回归_14不成立。
  而对于近似共线性,此时矩阵多重共线性回归模型使用 多重线性回归共线性_线性回归_15的秩多重共线性回归模型使用 多重线性回归共线性_最小二乘法_16,但此时估计量的方差非常大。即多重共线性回归模型使用 多重线性回归共线性_最小二乘法_17当为近似共线性时,多重共线性回归模型使用 多重线性回归共线性_线性回归_18(多重共线性回归模型使用 多重线性回归共线性_数据_19多重共线性回归模型使用 多重线性回归共线性_数据_20的特征根)必然有趋向于0的,此时多重共线性回归模型使用 多重线性回归共线性_数据_21的方差会非常大,导致多重共线性回归模型使用 多重线性回归共线性_数据_21有效性降低。
  另外,多重共线性会导致变量的显著性检验失去意义,有可能将重要的解释变量排除在模型之外;多重共线性可能会导致模型的预测功能失效,变大的方差容易使区间预测的“区间”变大,使预测失去意义。

3 多重共线性的检测
3.1 检测方法

多重共线性回归模型使用 多重线性回归共线性_多重共线性回归模型使用_23其中多重共线性回归模型使用 多重线性回归共线性_数据_24为自变量多重共线性回归模型使用 多重线性回归共线性_线性回归_25对其他自变量做回归分析时的R_squared值(多重共线性回归模型使用 多重线性回归共线性_数据_26称为容忍度)。方差膨胀系数VIF越大,说明自变量之间存在共线性的可能性越大。一般来讲,如果方差膨胀因子超过10,则回归模型存在严重的多重共线性。

3.2 示例
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
from statsmodels.stats.outliers_influence import variance_inflation_factor
import seaborn as sns
from matplotlib import pyplot as plt
from patsy.highlevel import dmatrices

X,y=make_regression(n_samples=100,n_features=2,noise=1,n_targets=1)
X=pd.DataFrame(X,columns=['feat1','feat2'])
X['feat3']=4*X['feat2']+np.random.randn(X.shape[0]) #人为制造多重共线性
#1.计算自变量之间的相关性并可视化
X_corr=X.corr()
sns.heatmap(X_corr,annot=True)
plt.show()

#2.计算各个变量的方差膨胀因子
data=X.copy()
data['target']=y
Y,X_matrix=dmatrices('target~feat1+feat2+feat3',data=data,return_type='dataframe')
#X_matrix会比X多一个常数列
vif=pd.DataFrame()
vif['feature']=X_matrix.columns
vif['VIF']=[variance_inflation_factor(X_matrix.values,i) for i in range(X_matrix.shape[1])]

#3-1.先对无共线性的数据进行OLS求解
X_1=X[['feat1','feat2']]
lr=LinearRegression()
lr.fit(X_1,y)
y_pred=lr.predict(X_1)
print("无共线性字段时模型效果:MSE={:.3f}".format(mean_squared_error(y, y_pred)))
print("无共线性字段时模型参数:{:.3f}、{:.3f}".format(lr.coef_[0],lr.coef_[1]))
print("无共线性字段时模型参数:{:.3f}".format(lr.intercept_))

#3-2.对有共线性的数据进行OLS求解
X_2=X[['feat1','feat2','feat3']]
lr1=LinearRegression()
lr1.fit(X_2,y)
y_pred1=lr1.predict(X_2)
print("有共线性字段时模型效果:MSE={:.3f}".format(mean_squared_error(y, y_pred1)))
print("有共线性字段时模型参数:{:.3f}、{:.3f}、{:.3f}".format(lr1.coef_[0],lr1.coef_[1],lr1.coef_[2]))
print("有共线性字段时模型参数:{:.3f}".format(lr1.intercept_))

结果如下:

(1)热力图:可以看出feat2和feat3之间存在较高的相关性。

多重共线性回归模型使用 多重线性回归共线性_数据_27


(2) VIF矩阵: 特征feat2和feat3的VIF指数都大于10,说明原数据中有与其存在线性关系的特征。

多重共线性回归模型使用 多重线性回归共线性_最小二乘法_28


(3)模型结果:从试验结果中可以看出,数据中存在共线性并不会对模型的效果产生太大影响(目前还不太清楚什么情况下会使模型预测失效)。从代码中可以知道,feat3与feat2之间存在共线性,理论上这两个参数的重要性应该相当。但从共线性数据训练的模型结果中可以看出,feat3对于模型的影响微乎其微(这就是前面说的使变量的显著性检验失去意义)。

无共线性字段时模型效果:MSE=0.861
无共线性字段时模型参数:91.748、29.889
无共线性字段时模型参数:0.169
有共线性字段时模型效果:MSE=0.852
有共线性字段时模型参数:91.771、29.467、0.102
有共线性字段时模型参数:0.176

  当数据中存在多重共线性时,可以选择删除变量、PCA方法处理或者使用Lasso等带有正则化项的模型。

考资料

百度文库:多重共线性的情形及其处理

计量经济学:多元线性回归的最小二乘估计

百度百科:方差膨胀系数