Python统计学13——回归的多重共线性、异方差、自相关的检验

news2024/11/19 19:38:11

在基础统计学,或者是计量经济学里面,需要对回归问题进行一些违背经典假设的检验,例如多重共线性、异方差、自相关的检验。这些检验用stata,r,Eviews什么都很简单,但是用python很多人都不会。下面就带大家实践一个回归案例完整版,看一下怎么实现。


回归案例 

导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
import statsmodels.api as sm
import statsmodels.formula.api as smf
pd.set_option('display.float_format', lambda x: '{:.4f}'.format(x))

读取数据,设定时间索引

df=pd.read_excel('数据.xlsx').dropna(axis=1).set_index('year')
df

数据量不大


描述性统计 

df.describe().T

画散点图

y = df['agriculture']
x_cols = ['primium', 'agrloans', 'product', 'employ', 'pay']
x = df[x_cols]
fig = plt.figure(figsize=(8,4), dpi=128)  
for i in range(5):
    plt.subplot(2,3,i + 1)  # 2行3列子图
    sns.scatterplot(x=x.iloc[:, i], y=y)
    #plt.ylabel(column[i], fontsize=12)
    #plt.xticks([])
plt.tight_layout()
plt.savefig('散点图.jpg',dpi=128)
plt.show()

 

 可以看到五个自变量其中除了employ外,其他和agriculture都是正相关

column = df.columns.tolist() # 列表头
fig = plt.figure(figsize=(6,6), dpi=128)  # 指定绘图对象宽度和高度
for i in range(6):
    plt.subplot(3,2,i + 1)  # 2行3列子图
    sns.boxplot(data=df.iloc[:,i].to_numpy(), orient="v",width=0.5)  # 箱式图
    plt.ylabel(column[i], fontsize=12)
    plt.xticks([])
plt.tight_layout()
plt.savefig('箱线图.jpg',dpi=128)
plt.show()

 

除了y自己外,其他的x的分布都较为对称,符合正态分布的假定¶


相关性分析

计算相关系数

df.corr()

plt.figure(figsize=(7,5),dpi=128)
sns.heatmap(df.corr().round(2), cmap='coolwarm', annot=True, annot_kws={"size": 10})
plt.savefig('相关系数.jpg')

 

 

employ和其他变量都是负相关,agriculture和x之间都有高度的相关性,但是X们间也存在高度的相关,例如primium和其他四个x相关系数都高达0.9以上,

说明模型可能存在多重共线性。


OLS,多元线性回归

model = smf.ols('agriculture~primium+agrloans+product+employ+pay', data=df)
model = model.fit()
model.summary()

 

模型的拟合优度高达96%,调整后的R2为0.945。说明这几个解释变量能高度解释y的变化.整体的F值为45.30,远超临界值,说明模型整体很显著。

在0.05 的显著性水平下,除了pay,其他四个变量都是显著的,说明他们的变化对y产生了显著性影响。

再来看单个变量的系数,其中employ系数为正,agrloans系数负,这些不符合理论期望,应该是模型存在多重共线性导致的¶

计算方差膨胀因子,查看多重共线性。


VIF计算

def VIF_calculate(df_all,y_name):
    x_cols=df.columns.to_list()
    x_cols.remove(y_name)
    
    def vif(df_exog,exog_name):
        exog_use = list(df_exog.columns)
        exog_use.remove(exog_name)
        model=smf.ols(f"{exog_name}~{'+'.join(list(exog_use))}",data=df_exog).fit()
        return 1./(1.-model.rsquared)

    df_vif=pd.DataFrame()
    for x in x_cols:
        df_vif.loc['VIF',x]=vif(df_all[x_cols],x)
        
    df_vif.loc['tolerance']=1/df_vif.loc['VIF']
    df_vif=df_vif.T.sort_values('VIF',ascending=False)
    df_vif.loc['mean_vif']=df_vif.mean()
    return df_vif
VIF_calculate(df,'agriculture')

 一般认为VIF值大于10,模型就会存在多重共线性。除了employ变量,其他四个变量之间都存在多重共线性的问题


残差检验

plt.rcParams ['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus']=False
 
x=model.fittedvalues;y=model.resid
 
plt.subplots(1,2,figsize=(8,3),dpi=128)
plt.subplot(121)
plt.scatter(model.fittedvalues,model.resid)
plt.xlabel('拟合值')
plt.ylabel('残差')
plt.title('(a)残差值与拟合值图',fontsize=15)
plt.axhline(0,ls='--')
 
ax2=plt.subplot(122)
pplot=sm.ProbPlot(model.resid,fit=True)
pplot.qqplot(line='r',ax=ax2,xlabel='期望正态值',ylabel='标准化的观测值')
ax2.set_title('(b)残差正态Q-Q图',fontsize=15)
plt.show()

 

残差均匀分布在0轴附近,模型不存在异方差等问题


异方差的white检验

from statsmodels.stats.diagnostic import het_white
wh = het_white(model.resid, model.model.exog)
print('LM Statistic: {:.3f}'.format(wh[0]))
print('LM p-value: {:.3f}'.format(wh[1]))
#print('F Statistic: {:.3f}'.format(wh[2]))   print('F p-value: {:.3f}'.format(wh[3]))


自相关的DW检验 

from statsmodels.stats.stattools import durbin_watson
dw = durbin_watson(model.resid)
print('DW statistic: {:.4f}'.format(dw))

 


 

下面处理多重共线性的问题

出现多重共线性问题时,可以采取以下几种方法进行处理:

1.删除相关性较强的变量。如果两个或多个自变量之间存在高度相关性,则可能会导致多重共线性问题。可以通过计算自变量之间的相关系数矩阵,然后删除其中相关性较强的变量,以降低共线性的影响。

2.主成分分析(PCA)。主成分分析可以将多个相关性较强的自变量转化为少数几个不相关的主成分,从而降低共线性的影响。可以使用Python中的sklearn.decomposition.PCA类进行主成分分析。

3.岭回归(Ridge Regression)。岭回归是一种正则化方法,可以通过在损失函数中增加一个惩罚项来避免过拟合。在存在多重共线性的情况下,使用岭回归可以降低模型方差,提高模型的泛化性能。

4.Lasso回归(Lasso Regression)。Lasso回归也是一种正则化方法,可以通过对回归系数的L1范数进行惩罚来实现特征选择和降维。Lasso回归可以通过缩小相关性较强的自变量的系数来降低多重共线性的影响。

5.收集更多数据。如果多重共线性问题来自于数据样本的局限性,那么可以通过收集更多的数据来缓解该问题。

(经济学应该只学了岭回归,就用这个吧)


岭回归

y = df['agriculture']
X = df[['primium', 'agrloans', 'product', 'employ', 'pay']]
from sklearn.linear_model import Ridge
model_ride = Ridge(alpha=10)
#拟合模型
model_ride.fit(X, y)
#计算测试集上的拟合优度
model_ride.score(X, y)

#模型截距
model_ride.intercept_

 

#模型系数 
#数据框展示系数
pd.DataFrame(model_ride.coef_, index=X.columns, columns=['Coefficient'])

 

 


(PS,回归结果的导出储存)

我们上面的ols回归的那个图,怎么存到excel表里面导出来呢?

我写了一个函数,直接可以存回归模型的结果,还可以批量存回归模型。

def 储存(writer,model,model_name='model_SH1'):
    df1 = pd.DataFrame(model.summary().tables[0])
    df2 = pd.DataFrame(model.summary().tables[1])
    df3 = pd.DataFrame(model.summary().tables[2])
    df1.to_excel(writer, sheet_name=model_name, startrow=0, startcol=0, header=False, index=False)
    df2.to_excel(writer, sheet_name=model_name, startrow=df1.shape[0]+1, startcol=0, header=False, index=False)
    df3.to_excel(writer, sheet_name=model_name, startrow=df1.shape[0]+df2.shape[0]+2, startcol=0, header=False, index=False)

三个参数,一个是pandas的excel表对象,一个是模型变量,一个是模型名称。

使用如下:

model_list=['model']
with pd.ExcelWriter('回归表.xlsx') as writer:
    for model_name in model_list:
        model=eval(model_name)
        储存(writer,model=model,model_name=model_name)

把你模型的变量名称用字符串传入列表,然后运行就行,生成一个excel工作簿。一个模型就存在一个sheet里面,有几个模型就有几个sheet。

这里只有一个模型,所以只有一个sheet表:

 和上面的ols结果是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023.5.14Ubuntu忘记MySQL密码

如果您忘记了MySQL的密码,可以按照以下步骤重置MySQL的密码: 停止MySQL服务: sudo service mysql stop启动MySQL服务,并跳过授权表: sudo mysqld_safe --skip-grant-tables &使用MySQL客户端连接到MySQL&#x…

【搭建轻量级图床】本地搭建LightPicture开源图床管理系统 - 异地远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

吃鸡史:傻鸡是怎么进化并“称霸”世界的?

鸡,给我们的印象是温顺的:温顺地长大,温顺地下蛋,温顺地进油锅… 若是鸡祖宗们知道,有一天它们的鸡子鸡孙会进化成一群不会飞、只知道吃的傻鸡,几千年前的红原鸡骨怕是都要惊得飞出土了! 毕竟…

day17 回话跟踪技术Cookie与Session

会话跟踪技术 问题:一次会话中的多次请求不会共享数据,不能显示.若通过传参数在路径上来解决该问题,不安全. 作用:解决HTTP无状态 http,cookie,session使用的区别 如果使用http中的request.setAttribute(),只能一次共享一个 若使用cookie,cookie存在浏览器中,每一次请求都…

JAVA——类间双向关联关系的实现-Contact与Phone类(电话簿管理系统)

首先:确定代码雏形框架(原始代码) 先根据以往经验写出一般的电话簿管理系统,先把代码雏形框架确定好。 原始代码运行结果: 原始代码源码: package bidirectionalDome;import java.util.ArrayList;public…

前端基础面试题八股文

html语义化的理解 代码结构: 使页面在没有css的情况下,也能够呈现出好的内容结构 有利于SEO: 爬虫根据标签来分配关键字的权重,因此可以和搜索引擎建立良好的沟通,帮助爬虫抓取更多的有效信息 方便其他设备解析: 如屏幕阅读器、盲人阅读器、移动设备等&#xff0c…

【敬伟ps教程】自由变换

文章目录 自由变换 自由变换 变换可以针对整个图层(组或链接图层),或者选区内 基本操作 编辑–自由变换(CtrilT); 自由变换的控件框来控制变换的效果; 自由变换是独立进行操作的模式,操作结束后需要点击确…

nginx -- 基本操作命令

修改nginx 配置,重新启动nginx流程,先进入到nginx目录 查看nginx状态 ps -ef | grep nginx 修改完/conf/nginx.conf 配置文件后保存 检查配置文件是否正确 ./sbin/nginx -t 检查文件配置正常 关闭nginx ./sbin/nginx -s quit 启动nginx ./sbin/nginx 完成

无线AP中小型、大型两种常见组网方式

无线AP(Access Point)网络覆盖是现代无线网络中的重要组成部分。它提供了无线信号的传输和接收功能,使用户能够在无线网络中进行通信和访问互联网。针对不同的需求和场景,存在两种常见的无线AP网络覆盖组网方式:中小型…

IMX6ULL平台的I2C

IMX6ULL平台的I2C 文章目录 IMX6ULL平台的I2C概述模式和操作 外部信号时钟功能描述I2C系统配置仲裁程序时钟同步信号交换外围总线访问复位中断字节顺序 初始化初始化序列启动的生成传输后软件响应停止的生成重复启动的生成从模式仲裁失败软件限制 I2C内存映射/寄存器定义I2C地址…

三维医学图像处理系统(PACS)源码

三维医学图像处理系统(PACS)源码 系统概述: 它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成, 具有完善的影…

opencv 裁剪图片方法详解

OpenCV 是一个用于计算机视觉和机器学习的开源库。它包含了很多图像处理的功能,包括裁剪图片。在 Python 中,我们可以使用 OpenCV 的 cv2 模块来实现图片的裁剪。 以下是使用 OpenCV 裁剪图片的详细步骤: 1. 导入所需的库: python…

python3.8,torch1.10.2+cu113、torch-geometric 安装

【1】conda create -n name python=3.8 【2】安装 torch 注意先看可适应的最高cuda版本 https://data.pyg.org/whl/ 版本对应 【3】按照顺序安装torch-geometric: torch-sparse、torch-scatter、torch-cluster、 torch-spline-conv \torch-geometric pip install torc…

详解c++新特性—c++11

目录 1、auto 1.1、解释 1.2、语法 1.3、注意事项 1.4、实例 1.5、auto和const的结合 1.6、auto的限制 1.7、auto的应用 2、decltype 2.1、解释 2.2、语法 2.3、注意事项 2.4、实例 2.5、decltype推导规则 2.6、decltype实际运用 3、返回值类型后置 3.1、解释…

怎么用手机拍照方式将车辆合格证转为excel表格?

将车辆合格证转为结构化的Excel文档是一项常见的需求,它可以让用户更方便快捷地对其中的数据进行查询和储存、管理。但当前支持这种需求的手机软件非常少,怎么办呢?用金鸣表格文字识别小程序,即可通过手机拍照,快速地实…

基于JavaSpringBoot+Vue+uniapp实现微信掌上图书小程序

最近开发了一个基于JavaSpringBootVueuniapp实现微信掌上图书小程序,系统非常的nice。 文章目录 1,系统技术简介1.1 Mysql数据库1.2SpringBoot框架 2,系统功能介绍2.1 系统前台功能2.2 系统后台管理2.3 流程图和结构功能图 3,系统…

HydroD 实用教程(八)频域水动力分析

目 录 一、前言二、前处理三、定义/提交作业3.1 创建分析作业3.2 定义分析工况3.3 配置分析选项3.4 设置输出文件3.5 提交求解计算 四、输出文件4.1 Hydrodynamic Results Interface File4.2 Loads Interface File4.3 Analysis Control Data File for Structural Analysis4.4 W…

导线舞动的防范措施

输电线路导线舞动在线监测装置 一、产品描述: 导线舞动幅度过大会导致铁塔等设施发生形变,严重的可能会发生铁塔坍塌,倒塔挂线,进而导致电力系统瘫痪,威胁到电力供应系统的稳定性,电力供应系统的稳定需要保…

SCSI介绍和SCSI命令承载于各类总线的方式

1. SCSI协议简介 小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。虽然名字里面带个接口,但实际上是一…

文本三剑客-Sed

sed工作原理 sed的特点: sed基本语法 模式空间中的编辑操作---地址定界 常用编辑命令 增添(a) 追加(i) 删除(d) 读入文件(r) 固定长度替换(y&#xff0…