基于Python回归模型的多重共线性分析

article/2025/9/19 23:36:23
本文主要是运用两种方法消除回归模型中的多重共线性问题

一、多重共线性的诊断

  1. 扩大因子法

扩大因子法是通过对自变量进行计算的结果:

其中是自变量的中心化标准矩阵。

是每个自变量的扩大引子。

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

代码如下:

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))
  1. 特征根判定法

特征根的方法是计算行列式,X 是自变量矩阵。计算该等式的特征根的个数,有多少个特征根接近0,就有几个变量存在多重共线性,然后将最大特征根和最小特征根进行计算

当k < 100 时,存在多重共线性

当100 k1000时,存在较强的多重共线性

当k > 1000时,存在严重的多重共线性。

代码如下:

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() 
#计算条件数
print('条件数结果:')
cormatrix = df.iloc[:, 1:].corr(method='pearson')  # 相关系数矩阵
eigvalues, eigvec = np.linalg.eig(cormatrix)  # eigvalues特征根,eigvec特征向量
Condtion_No = max(eigvalues) / eigvalues
print(pd.Series(Condtion_No))  # 条件数判断

二、消除多重共线性

前提准备:

这里先把后面那些方法需要用到的前提函数先准备好,后面就直接讲方法了😘,如下:

import numpy as np
import statsmodels.formula.api as smf
import pandas as pd
from itertools import combinations# 求所有可能的变量组合
def comb(a):  # 参数a为所有自变量的列表all = []for i in range(len(a) + 1):num_choose = i  # 从列表a中选num_choose个变量combins = [c for c in combinations(a, num_choose)]for i in combins:i = list(i)all.append(i)return all# 对列表variables中的变量进行组合并建立模型,参数df为读入的数据
def buildModel(variables, df):combine = ''for variable in variables:combine = combine + variable + '+'  # 对列表中的变量进行组合combine = combine[:-1]if len(combine) == 0:combine = '1'result = smf.ols('y~' + combine, data=df).fit()  # 得出回归结果return result# 变量列表和对应的aic以dataframe的形式输出
def printDataFrame(model, aic):  # model为所有备选变量组合的列表,aic为所有备选模型aic的列表data = {'model': model, 'aic': aic}  # 输出Dataframe形式frame = pd.DataFrame(data)print(frame)
  1. 所有子集回归

所有子集回归就是将自变量所有组合列出来,然后对每一个组合进行回归建模,然后通过AIC准则判最小断段选出最优的组合。

# 所有子集回归(主要找AIC最小的自变量组合模型)
def allSubset(a, df):  # 参数a为所有自变量的列表,参数df为读入的数据all = []all = comb(a)  # 先获取所有变量组合组合aic = []  # 保存所有aic值for i in all:  # 遍历所有组合result = buildModel(i, df)  # 对每一种组合建立模型aic.append(result.aic)  # 获取aic并加入aic列表printDataFrame(all, aic)print("最小AIC为:{}".format(min(aic)))index = aic.index(min(aic))print("里面包含的自变量为:{}".format(all[index]))temp = all[index]  # 获取最终变量组合result = buildModel(temp, df)  # 输出最终的回归结果print("回归结果:")print(result.summary())#举例
a = ['x1','x2','x3','x4','x5']
df = pd.read_csv('文件路径')
allSubset(a, df)
  1. 前进法

前进法顾名思义就是一步一步的往前走,就是确定一个初始的变量(一般情况设置为一个常数),然后再逐步的往模型加变量,然后通过AIC最小选出最佳的自变量个数。

代码如下:

# 前进法
def forward(a, df):all = []all = comb(a)  # 求所有组合start = []for i in range(len(all)):  # 把所有长度为0和长度为1的变量组合放入start列表中if len(all[i]) == 0 or len(all[i]) == 1:start.append(all[i])# start=all[:len(a)+1]while (len(start) > 1):# variables=[]aic = []for i in start:  # 遍历所有组合result = buildModel(i, df)  # 对每一种组合建立模型aic.append(result.aic)printDataFrame(start, aic)  # 输出print("最小AIC为:{}".format(min(aic)))index = aic.index(min(aic))print("里面包含的自变量为:{}".format(start[index]))temp = start[index]if (index == 0):  # 若aic最小的模型为起始模型则结束循环breakstart = []start.append(temp)  # 下一次循环的起始模型为上一次模型aic最小的模型,起始模型始终是列表的第一个元素for i in all:  # 遍历所有变量组合,选取比起始变量组合多一个变量且拥有起始变量组合所有元素的变量组合if len(i) == len(temp) + 1 and set(temp) < set(i):start.append(i)print("*" * 50)result = buildModel(temp, df)  # 输出最终的回归结果print("回归结果:")print(result.summary())#举例
a = ['x1','x2','x3','x4','x5']
df = pd.read_csv('文件路径')
forward(a, df)
  1. 后退法

后退法就是将全部变量建立好模型后,将变量一个一个的删除建立模型,通过AIC最小选出最好的组合。

代码如下:

# 后退法
def backward(a, df):all = []all = comb(a)  # 求所有组合start = []for i in range(len(all) - 1, -1, -1):  # 把所有长度为len(a)和长度为len(a)-1的变量组合放入start列表中if len(all[i]) == len(a) or len(all[i]) == len(a) - 1:start.append(all[i])while (len(start) > 0):aic = []for i in start:  # 遍历所有组合result = buildModel(i, df)  # 对每一种组合建立模型aic.append(result.aic)printDataFrame(start, aic)  # 输出print("最小AIC为:{}".format(min(aic)))index = aic.index(min(aic))print("里面包含的自变量为:{}".format(start[index]))temp = start[index]if (index == 0):  # 若aic最小的模型为起始模型则结束循环breakt = set(start[0]).difference(set(temp))print("删减变量:{}".format(t))start = []   # 下一次循环的起始模型为上一次模型aic最小的模型start.append(temp)for i in all:if len(i) == len(temp) - 1 and set(temp) > set(i):  # 遍历所有变量组合,选取比起始变量组合少一个变量且所有变量都在起始变量组合中的变量组合start.append(i)print("*" * 50)result = buildModel(temp, df)  # 输出最终的回归结果print("回归结果:")print(result.summary())#举例
a = ['x1','x2','x3','x4','x5']
df = pd.read_csv('文件路径')
backward(a, df)
  1. 逐步回归法

该方法是结合了前进法和后退法,先建立全变量的模型,在该模型基础上通过剔除P个变量和添加剩余的m-p个变量,在建立模型,通过AIC最小判断,直到不再添加和剔除则结束,选出aic最小的模型。

# 逐步回归法
def stepWise(a, df):all = []dele = []  # 可删减的变量列表add = []  # 可添加的变量列表addOrDele = []var = []all = comb(a)  # 求所有组合start = []for i in range(len(all) - 1, -1, -1):  # 把所有长度为len(a)和长度为len(a)-1的变量组合放入start列表中if len(all[i]) == len(a) or len(all[i]) == len(a) - 1:start.append(all[i])while (1):aic = []for i in start:  # 遍历所有组合result = buildModel(i, df)  # 对每一种组合建立模型aic.append(result.aic)printDataFrame(start, aic)  # 输出print("最小AIC为:{}".format(min(aic)))index = aic.index(min(aic))print("里面包含的自变量为:{}".format(start[index]))temp = start[index]if (index == 0):  # 若aic最小的模型为起始模型则结束循环breakif len(temp) > len(start[0]):  # 如果最小aic模型的变量组合长度大于起始模型,说明添加了变量t = set(temp).difference(set(start[0]))print("增加变量:{}".format(t))addOrDele.append("+")var.append(t)if len(temp) < len(start[0]):  # 如果最小aic模型的变量组合长度小于起始模型,说明删减了变量t = set(start[0]).difference(set(temp))print("删减变量:{}".format(t))addOrDele.append("-")var.append(t)start = []start.append(temp)dele = []add = []for i in a:if i in start[0]:dele.append(i)else:add.append(i)print("可增加的变量为:{}".format(add))print("可删减的变量为:{}".format(dele))# 删除的情况for i in all:  # 选取比起始变量组合多一个变量且拥有起始变量组合所有元素的变量组合if len(i) == len(temp) - 1 and set(temp) > set(i):start.append(i)# 增加的情况for i in all:  # 选取比起始变量组合少一个变量且所有变量都在起始变量组合中的变量组合if len(i) == len(temp) + 1 and set(temp) < set(i):start.append(i)print("*" * 50)data = {'': addOrDele, 'd': var}  # 输出删减增加变量的情况frame = pd.DataFrame(data)print(frame)result = buildModel(temp, df)  # 输出最终的回归结果print("回归结果:")print(result.summary())
#举例
a = ['x1','x2','x3','x4','x5']
df = pd.read_csv('文件路径')
stepWise(a, df)

总结:

以上就是本文的全部内容,有疑问和错误望指出,感谢!一起学习和进步。


http://chatgpt.dhexx.cn/article/5q4NC2aN.shtml

相关文章

解决多元线性回归的多重共线性问题

在上一章我们提到多重共线性的影响以及产生的原因&#xff0c;因为在解释变量存在多重共线性的情况下&#xff0c;使用普通最小二乘法估计参数会导致参数估计方差太大&#xff0c;使普通最小二乘法的效果很不理想。在这篇文章中我们将讨论如何解决多元线性回归中的多重共线性问…

如何消除多重共线性

介绍 机器学习是一种解决不能明确编码的问题的方法&#xff0c;例如&#xff0c;分类问题。机器学习模型将从数据中学习一种模式&#xff0c;因此我们可以使用它来确定数据属于哪个类。 但有个问题。这个模型是如何工作的?一些人不能接受一个性能良好的模型&#xff0c;因为…

去除多重共线性的5种方法,你学废了嘛?

什么是多重共线性呢? 就是回归模型多个特征之间具有很强的相关性。 多重共线性&#xff0c;听起来很就很严重&#xff0c;其实没有很大的危害&#xff0c;只是容易过拟合&#xff0c;或者导致模型无法解释。尤其是在实际项目中&#xff0c;我们需要解释模型的特征对目标变量…

特征共线性问题

多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中&#xff0c;例如决策树或者朴素贝叶斯&#xff0c;前者的建模过程时逐渐递进&#xff0c;每次都只有一个变量参与&#xff0c;这种机制含有抗多重共线性干扰的功能&#xff1b;后者假设变量之间是相互独立的…

多重共线性问题的几种解决方法

在多元线性回归模型经典假设中&#xff0c;其重要假定之一是回归模型的解释变量之间不存在线性关系&#xff0c;也就是说&#xff0c;解释变量X1&#xff0c;X2&#xff0c;……&#xff0c;Xk中的任何一个都不能是其他解释变量的线性组合。如果违背这一假定&#xff0c;即线性…

多重共线性问题如何解决?

​ 一、多重共线性说明 多重共线性一般是指&#xff1a;如果有两个或者多个自变量高度相关&#xff08;相关系数大于0.8&#xff09;&#xff0c;难以区分一个自变量对因变量的影响和作用&#xff0c;将自变量相关性产生的后果定义为多重共线性&#xff0c;一般提出多重共线性…

多重共线性如何分析?

判断标准 常见的直观判断方法共有四个&#xff0c;如下&#xff1a; &#xff08;1&#xff09;某些自变量的相关系数值较大&#xff08;比如大于0.8&#xff09;等&#xff0c;可以利用pearson相关系数检验法一般是利用解释变量之间的线性相关程度判断&#xff0c;一般标准是…

多元回归自变量存在共线性

多重线性回归要求各个自变量之间相互独立&#xff0c;不存在多重共线性。所谓多重共线性&#xff0c;是指自变量之间存在某种相关或者高度相关的关系&#xff0c;其中某个自变量可以被其他自变量组成的线性组合来解释。 医学研究中常见的生理资料&#xff0c;如收缩压和舒张压…

多重共线性

1.回归模型自变量彼此相关称为多重共线性&#xff0c;它给模型提供重复信息 2.多重共线性会造成模型不稳定&#xff0c;可能会得到无法解释的现象 3.检测共线性的方法通常有相关性分析&#xff0c;显著性检验和方差膨胀因子分析 4.处理共线性的方法通常有提前筛选变量&#xff…

多重共线性的影响、判定及消除的方法

目录 1 什么是多重共线性&#xff1f; 2 多重共线性的影响 3 共线性的判别指标&#xff08;方差膨胀因子&#xff09; 3.1 拟合优度 3.2 方差膨胀因子VIF 4 多重共线性处理方法 4.1 手动移除出共线性的变量 4.2 逐步回归法 4.2.1 向前法 4.2.2 后退法 4.2.3 逐步选…

如何处理多重共线性问题

一、说明 当回归模型中两个或者两个以上的自变量高度相关&#xff08;比如相关系数大于0.7&#xff09;时&#xff0c;则称为多重共线性。虽然在实际分析中&#xff0c;自变量高度相关是很常见的&#xff0c;但是在回归分析中存在多重共线性可能会导致一些问题&#xff0c;比如…

谈多重共线性

谈多重共线性 本文主要讨论古典假定中无多重共线性被违反的情况&#xff0c;主要情况包括多重共线性的实质和产生的原因、后果、检验方法及无多重共线性假定违反后的处置方法。 第一节 什么是多重共线性 一、多重共线性的含义 讨论多元线性回归模型的估计时&#xff0c;强调…

多重共线性详解

目录 解释变量与自变量&#xff0c;被解释变量与因变量 1、多重共线性的现象 2、出现的原因 3、判别标准 4、检验方法 5、多重共线性有什么影响 6、多重共线性处理方法 7、其他说明 8、多重共线性识别-python代码8.1、vif检验8.2 相关系数8.3 聚类 9、宏观把握共线性问题9.1、共…

浅谈共线性的产生以及解决方法(中篇——今生)

浅谈共线性的产生以及解决方法(中篇——今生) 上篇我们讲到共线性概念以及共线性问题存在时对模型的影响。那么如何对样本数据中存在的共线性问题进行诊断呢&#xff1f; 3 多重共线性的诊断方法 3.1 相关系数法 对于一个样本数据集&#xff0c;我们要了解解释变量&#xf…

共线性那些事儿

我们经常听说&#xff0c;建模时应当尽量避免共线性&#xff08;collinearity&#xff09;&#xff0c;共线性会导致参数估计不稳定、模型不可靠等等。那么共线性究竟有多可怕&#xff1f;共线性具体会带来什么问题&#xff1f;共线性得到的模型是否真的不行&#xff1f;笔者通…

多元线性模型中共线性产生的原因解析

在很多书籍中谈到了共线性问题&#xff0c;作为多元统计中基本假设之一&#xff0c;却经常被违背&#xff0c;影响模型稳定性和统计power。在不少的论文中谈到了&#xff0c;国内的很多书籍往往一笔带过。因为&#xff0c;属于统计计算领域内容&#xff0c;非专业人士&#xff…

好好谈谈共线性问题

好好谈谈共线性问题 马东什么 算法工程师 8 人 赞同了该文章 共线性&#xff0c;即 同线性或同线型。统计学中&#xff0c;共线性即 多重共线性。 多重共线性&#xff08;Multicollinearity&#xff09;是指线性回归模型中的解释变量之间由于存在精确 相关关系或高度相关关系而…

树莓派中SIM7600G-H 4G DONGLE模块使用记录(一)PPP拨号上网/4G上网

项目场景&#xff1a; 如何使用SIM7600系列的4G通信模块进行PPP网上拨号以实现4G通信&#xff0c;在讲解前&#xff0c;未搭建好树莓派远程连接桌面的读者可以先转向树莓派4B环境搭建电脑远程连接打开文件管理闪退(上)。 模块简介&#xff1a; SIM7600X 4G DONGLE是一款工业级…

Linux系统下使用4G模块EC20实现拨号上网

驱动的实现过程 实现4G功能分为两步,第一步内核能成功识别出该设备,第二步实现拨号上网.最后提一下自带的定位功能 一.添加内核USB驱动 这里直接使用内核已经存在的USB驱动,只需要让内核能识别出该USB设备,并自动加载驱动生成对应的/devUSB*设备节点 获取EC20的PID和VID 把模块…

4G模块适配与调试

笔记目录 RK平台4G模块适配1、识别VID、PID2、添加VID\PID到android的option驱动中3、插上sim卡&#xff0c;4G模块一定要接上天线4、根据安卓系统和安卓版本发给模块厂要求其提供ril库5、预置ril库6、在framework中添加根据pid和vid关联ril库的代码7、可以通过一下命令查看ril…