如何处理多重共线性?(python)

时间:2024-11-25 18:32:03


1 什么是多重共线性?

如何处理多重共线性?(python)_统计学


如何处理多重共线性?(python)_python_02


若变量x1x2相关性增强,则β1β2方差会逐渐增大。当两者完全相关r=1时,方差变得无穷大

如何处理多重共线性?(python)_python实现_03


注意,多重共线性不影响拟合效果,但会造成系数的估计值不稳定,在回归方程高度显著的情况下,有些与因变量高度相关的自变量回归系数通不过显著性检验,甚至出现回归系数的正负号得不到合理解释的情况,变量间的经济结构关系产生了扭曲。

2 多重共线性的诊断方法?

1)方差扩大因子法

如何处理多重共线性?(python)_特征向量_04


如何处理多重共线性?(python)_统计学_05


VIF≥10时,则说明自变量x与其他自变量存在严重的多重共线性问题。

python实现:

from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.formula.api as smf
import pandas as pd
 
#读数据
df = pd.read_csv('文件路径')
#建模
result = smf.ols('y~x1+x2+x3+x4',data=df).fit() 
#计算扩大引子
VIFlist = []  #保存扩大引子
for i in range(1, 5, 1):  #这里循环次数是自变量的个数
    vif = variance_inflation_factor(result.model.exog, i)  # 参数为设计矩阵和变量数
    VIFlist.append(vif)
 
#以Series格式打印出结果
print('扩大因子法结果:\n',pd.Series(VIFlist))

2)特征根判定法

如何处理多重共线性?(python)_python实现_06


k<100 时,存在多重共线性;当 100≤k≤1000时,存在较强多重共线性;当 k>1000 时,存在严重多重共线性

如何处理多重共线性?(python)_python_07


如何处理多重共线性?(python)_统计学_08


方差比例的数值大小由特征根和特征向量的数值共同决定,特征根小,方差比例就大,更能反映共线性的程度。

python实现:

import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
 
#构建数据
data = np.array(
        [[1,78803,1219,910927,93308,644],
        [1,83818,1319,994130,95085,695],
        [1,89367,1453,998921,100164,719],
        [1,99066,1609,994000,105073,744],
        [1,109276,1802,1036737,105155,784],
        [1,120480,2053,1063238,105606,878],
        [1,136576,2358,1034276,97260,870],
        [1,161415,2694,1155219,111764,1102],
        [1,185999,3160,1142569,115583,1212],
        [1,219029,3697,1147337,125656,1394],
        [1,270844,4358,1295543,135670,1610],
        [1,321501,5100,1341674,146193,1712],
        [1,348499,6281,1425186,152451,1902],
        [1,411265,7802,1695000,167609,2103],
        [1,484753,9356,1996184,186226,2641],
        [1,539117,10933,1995402,189337,2957],
        [1,590422,12670,2602850,210597,3236],
        [1,644791,14598,2870004,230460,3611],
        [1,686450,16285,2922796,253484,4000],
        [1,740599,18575,3520129,281405,4440],
        ],dtype=np.double)


# 标准化后的变量
data_norm = data/np.sum(data**2,axis=0)**(1/2)
data_norm = np.round(np.dot(data_norm.T,data_norm),4)

# 计算特征值和特征向量
eigvalues, eigvec = np.linalg.eig(data_norm)  # eigvalues特征根,eigvec特征向量

var_portion = eigvec**2/eigvalues.reshape(-1,1)
var_portion = var_portion/np.sum(var_portion,axis=0).reshape(-1,1)

collinearity = np.c_[eigvalues, var_portion]
df = pd.DataFrame(collinearity, columns=['eigenvalue', 'constant','x1','x2','x3','x4','x5'])
df.insert(1, 'condition_index',(df['eigenvalue'].max()/df['eigenvalue'])**(1/2))
df = df.round(4).sort_values(by='eigenvalue',ascending=False)

3)直观判定法

方差扩大因子和条件数方法给出了识别多重共线性的数量标准,但不是识别多重共线性的绝对标准,还应结合其他直观方法综合判断,比如回归系数符号与实际经济意义相反的情况,则认为变量间存在多重共线性。

具体的直观判断方法如下:

  • 增加或剔除一个自变量,其他自变量的回归系数的估计值或显著性发生较大变化时,认为存在多重共线性
  • 当定性分析认为一些重要的自变量没通过显著性检验时,存在多重共线性
  • 当与因变量之间的简单相关系数绝对值很大的自变量在回归方程中没通过显著性检验时,存在多重共线性
  • 当有些自变量的回归系数的数值大小与预期相差很大,甚至正负号与定性分析结果相反时,存在多重共线性
  • 在自变量的相关矩阵中,当自变量间的相关系数较大时存在多重共线性
  • 当一些重要的自变量回归系数的标准误差较大时,存在多重共线性

3 如何消除多重共线性?

  • 删除不重要的解释变量(所有子集回归、前进法、后退法、逐步回归法)
  • 增大样本量
  • 回归系数的有偏估计(岭回归、主成分等)