当前位置: 首页 > news >正文

线性回归原理推导与应用(十一):多重共线性

多重共线性的定义与影响

多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

根据定义和影响程度,可以将多重共线性分为极端共线性和一般共线性。极端共线性一般是指变量间有准确的相关关系,例如x1=x2+1,x3=3x2x_1= x_2+ 1,x_3= 3x_2x1=x2+1,x3=3x2等,一般共线性则是指自变量高度相关。

多重共线性对模型的影响

光看定义比较抽象,所以下面我们结合多元线性回归的原理具体说明一下什么是多重共线性以及其对线性模型的影响。

在多元线性回归中,我们使用多个自变量来预测因变量,其方程可以表示为:
y=w0+w1x1+w2x2+⋯+wnxny =w_0 + w_1x_1 + w_2x_2 + \cdots + w_nx_ny=w0+w1x1+w2x2++wnxn
其中:
x1,x2,…,xnx_1, x_2, …, x_nx1,x2,,xn 表示不同的自变量,w1,w2,…,wnw_1, w_2, …, w_nw1,w2,,wn 表示各个自变量对应的回归系数。

对模型参数的影响

现在假设有这样一个多元线性回归方程模型:
y=10+2x1+5x2y = 10 + 2x_1 + 5x_2y=10+2x1+5x2
假设 x1x_1x1x2x_2x2 之间存在强相关性,我们可以将它们的关系表示为:
x1=x2+1x_1= x_2+ 1x1=x2+1
那么,原始方程可以转化为以下几种形式:
y=12+7x2y=5+7x1y=7.5+4.5x1+2.5x2⋯y = 12 + 7x_2 \\ y = 5 + 7x_1\\ y = 7.5 + 4.5x_1 + 2.5x_2 \\ \cdots y=12+7x2y=5+7x1y=7.5+4.5x1+2.5x2
可以发现如果存在多重共线性,可以得到一系列不同回归系数下自变量的组合,这些回归模型的回归系数不同,但得到的预测值yyy完全相同(自变量精确相关,极端共线性)或相差不大(自变量高度相关,一般共线性),此时不同模型下的误差平方和相同或相差不大,都可能是恰当的模型,所以如果存在多重共线性,会导致模型的截距项(intercept)和系数(coefficients)无法确定,回归系数可能有很大波动,例如可能由正变负,还可能变为0等等。

对求解过程的影响

在之前的多元回归原理的推导中我们讲解并推导了最小二乘法求解的过程,如果对这一方面不熟悉的可以看一下这篇文章:https://smilecoc.blog.csdn.net/article/details/138210463,在这里我们推导出求解参数的矩阵形式:
w=(XTX)−1XTYw=(X^TX)^{−1}X^TYw=(XTX)1XTY
可以看到计算公式中需要计算逆矩阵 w=(XTX)−1w=(X^TX)^{−1}w=(XTX)1,且(XTX)−1=(XTX)∗∣XTX∣(X^{T}X)^{-1}=\frac{(X^{T}X)^*}{|X^{T}X|}(XTX)1=XTX(XTX),当存在共线性时,若
(1)自变量存在精确相关关系,则行列式 ∣XTX∣|X^{T}X|XTX 为0,矩阵不可逆,不存在逆矩阵。即此时求不出
的最小二乘估计。
(2)自变量存在高度相关关系,比如 x1≈2x2x_1\approx 2x_2x12x2,则行列式 ∣XTX∣|X^{T}X|XTX 近似为0,由于处在计算公式的分母上,此时计算得到的回归系数的偏差会很大。

多重共线性的判断

那么如何判断变量之间是否有多重共线性呢?一般可以通过方差膨胀因子(Variance inflation factor,VIF)和容忍度(tolerance,T)来诊断多重共线性,VIF和容忍度两者互为倒数,两者的计算公式分别为:
T=1−Ri2VIF=11−Ri2T={1-R_i^2}\\[15pt]VIF=\frac{1}{1-R_i^2}T=1Ri2VIF=1Ri21

这两个指标中均涉及R方,先来复习一下这个概念:R方是回归分析中的一个关键概念,也称为决定系数(coefficient of determination),记作R2R^2R2R2R^2R2用于评估回归模型对数据的拟合优度。例如,R2=0.9R^2= 0.9R2=0.9 意味着目标变量yyy中90%的变化可以由模型中的自变量解释。R2R^2R2的具体计算原理和公式在之前的线性回归系列文章中也有说明过,感兴趣的可以查看。

VIF如何判断出多重共线性呢?VIF首先为每个自变量拟合一个线性回归模型,使用其余的自变量作为预测变量。
x1=α1x2+α2x3+…+αn−1xnx2=θ1x1+θ2x3+…+θn−1xn⋯xn=δ1x1+δ2x2+…+δn−1xn−1x_1 = \alpha_1 x_2 + \alpha_2x_3 + … + \alpha_{n-1}x_n\\ x_2 = \theta_1 x_1 + \theta_2x_3 + … + \theta_{n-1}x_n \\ \cdots \\ x_n = \delta_1 x_1 + \delta_2x_2 + … + \delta_{n-1}x_{n-1} x1=α1x2+α2x3++αn1xnx2=θ1x1+θ2x3++θn1xnxn=δ1x1+δ2x2++δn1xn1
之后对于每个线性回归模型计算决定系数R2R^2R2。每个自变量,每个回归方程都可以计算出对应的R2R^2R2值(记为Ri2R_i^2Ri2),表示其他自变量能够解释该自变量变变化的程度。使用上面的VIF计算公式即可计算出每个自变量对应的VIF值。

一般地,当VIF的最大值>10(Ri2>0.9R_i^2 > 0.9Ri2>0.9)时,则认为有严重的共线性,建议处理,如果5≤VIF<10(0.8≤Ri2<0.9)5 ≤ VIF < 10(0.8 ≤R_i^2 < 0.9)5VIF<10(0.8Ri2<0.9)时,则认为有轻度共线性,需关注。

Python计算VIF

Python计算VIF的方法有:使用statsmodels库、使用pandas和numpy库手动计算,这里使用statsmodels库,它提供了一个名为variance_inflation_factor()的函数来计算VIF

import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor# 示例数据集
data = {'X1': [1, 2, 3, 4, 5],
'X2': [2, 4, 5, 8, 9],
'X3': [29, 3, 7, 18, 6],
'Y': [1, 2, 3, 4, 5]
}df = pd.DataFrame(data)#在计算VIF之前,我们需要移除目标变量,只保留自变量
X = df[['X1', 'X2', 'X3']]
vif_data = pd.DataFrame()
vif_data['Feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))]
print(vif_data)

运行代码后即可得到每一个自变量的VIF值。

  Feature         VIF
0      X1  256.918238
1      X2  266.626208
2      X3    1.835335

从结果可以看出前两个自变量存在很强的共线性。

如何消除多重共线性

最后来说一下如何消除多重共线性。

进行建模时,首先需要计算两两相关系数,将相关系数较高的变量去除。这一步相当于对变量进行一次初筛,注意:这一步只是降维,不保证消除多重共线性,因为 3 个以上变量仍可能“抱团”。

其次在建模中,可以使用岭回归,Lasso回归等正则化收缩回归系数来减轻多重共线性的影响,并可以删除系数趋近于0的变量。

最后可以计算VIF值,当VIF值过大的时候就需要对变量进行处理。

除了直接删除变量外,如果有的时候不好删除变量,可以使用PCA等降维方法保留大部分的变量信息。

参考文章:
https://zhuanlan.zhihu.com/p/355241680
https://avoid.overfit.cn/post/512ff1c71eb14f758ff82a94baf06f4c
在这里插入图片描述

http://www.xdnf.cn/news/1374661.html

相关文章:

  • 获取服务器指标的信息
  • bin log 和 redo log有什么区别
  • Mybatis总结
  • 【如何解决Java中的ClassCastException类转换异常问题】
  • 基于Matlab结合肤色检测与卷积神经网络的人脸识别方法研究
  • 基于MATLAB/Simulink的单机带负荷仿真系统搭建
  • 分布式2PC理论
  • 使用 html2canvas + jspdf 实现页面元素下载为pdf文件
  • UE5 查找组件
  • 云原生安全架构设计与零信任实践
  • 预测模型及超参数:1.传统机器学习:SVR与KNN
  • 工业网络安全:保护制造系统和数据
  • HIVE的Window functions窗口函数【二】
  • 【Hadoop】Zookeeper、HBase、Sqoop
  • 全球位置智能软件CR10为73%,市场集中度高
  • Java中高效获取IP地域信息方案全解析:从入门到生产实践
  • jQuery版EasyUI的ComboBox(下拉列表框)问题
  • JS(面试)
  • Proxmox VE 中启用 CentOS 虚拟机的串口终端(xterm.js 控制台)
  • 深度剖析HTTP和HTTPS
  • .NetCore 接入 Nacos,实现配置中心和服务注册
  • 本地windows电脑部署html网页到互联网:html+node.js+ngrok/natapp
  • oracle 表空间扩容(增加新的数据文件)
  • 使用appium对安卓(使用夜神模拟器)运行自动化测试
  • STM32八大模式
  • 基于单片机空调温度控制测温ds18b20系统Proteus仿真(含全部资料)
  • 人机交互如何变革科普展示?哪些技术正成吸睛焦点?
  • 初春养生指南模板页
  • Rust 登堂 之 迭代器Iterator(三)
  • el-carousel在新增或者删除el-carousel-item时默认跳到第一页的原因和解决