百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

R语言实战-02-回归诊断-改进方法

bigegpt 2025-03-05 13:35 8 浏览

R语言实战-02-回归诊断-改进方法

  • 改进方法

  • 正态性

  • 误差的独立性

  • 线性

  • 同方差性

  • 线性模型综合假设

本系列是对 《R语言实战》感兴趣部分的阅读笔记,学习的目的在于理解函数,理解图像含义

在上一节中,你使用lm()函数来拟合OLS回归模型,通过summary()函数获取模型参数和相关统计量。但是,没有任何输出告诉你模型是否合适,你对模型参数推断的信心依赖于它在多 大程度上满足OLS模型统计假设。虽然在summary()函数对模型有了整体的描述, 但是它没有提供关于模型在多大程度上满足统计假设的任何信息。

在这一节中,我们来整理一下,如何评价线性模型

改进方法


正态性

与基础包中的plot()函数相比,qqPlot()函数提供了更为精确的正态假设检验方法,它画出了在n–p–1个自由度的t分布下的学生化残差(studentized residual,也称学生化删除残差或折叠 化残差)图形,其中n是样本大小,p是回归参数的数目(包括截距项)。代码如下:

library(car)
states <- as.data.frame(state.x77[,c("Murder", "Population",
"Illiteracy", "Income", "Frost")])
fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
qqPlot(fit, labels=row.names(states), id.method="identify",
simulate=TRUE, main="Q-Q Plot")
#当simulate=TRUE时,95%的置信区间将会用参数自助法


从上面这张图片可以看出 :

除了Nevada,所有的点都离直线很近,并都落在置信区间内,这表明正态性假设符合得很好。 但是你也必须关注Nevada,它有一个很大的正残差值(真实值-预测值),表明模型低估了该州 的谋杀率。特别地:

states["Nevada",]
#Nevada的谋杀率是11.5%

fitted(fit)["Nevada"]
#模型预测的谋杀率为3.9%

residuals(fit)["Nevada"]
Nevada: 7.62104160366928

rstudent(fit)["Nevada"]
Nevada: 3.54292863626562

可以看到,Nevada的谋杀率是11.5%,而模型预测的谋杀率为3.9%。 你应该会提出这样的问题:“为什么Nevada的谋杀率会比根据人口、收入、文盲率和温度预测所得的谋杀率高呢?”

可视化误差还有其他方法,比如使用下面的代码。residplot()函数生成学生化 残差柱状图(即直方图),并添加正态曲线、核密度曲线和轴须图。

#绘制学生化残差图的函数
residplot  <- function(fit,nbreaks=10){
    z <- rstudent(fit)
    hist(z, breaks=nbreaks,freq=FALSE,
        xlab="Studentized Residual",
        main="Distribution of Errors")
    rug(jitter(z),col="brown")
    curve(dnorm(x,mean=mean(z),sd=sd(z)),
         add=TRUE, col="blue",lwd=2)
    lines(density(z)$x, density(z)$y,
         col="red",lwd=2,lty=2)
    legend("topright",
          legend = c( "Normal Curve", "Kernel Density Curve"),
          lty=1:2, col=c("blue", "red"), cex=.7)
}
residplot(fit)

result:


确实可以看出除了一个很明显的离群点,误差很好地服从了正态分布

误差的独立性

#car包提供了一个可做Durbin-Watson检验的函数,能够检测误差的序列相关性。
durbinWatsonTest(fit)
#p值不显著(0.228)说明无自相关性。
#该检验使用于时间独立的数据,对于非聚集性的数据并不是用。
#durbinWatsonTest()函数使用自助法来导出p值。
#添加simulate=TRUE,则每次运行测试时获得的结果都将略有不同
lag Autocorrelation D-W Statistic p-value
   1      -0.2006929      2.317691   0.256
 Alternative hypothesis: rho != 0

线性

通过成分残差图(component plus residual plot)也称偏残差图(partial residual plot),你可以看看因变量与自变量之间是否呈非线性关系,也可以看看是否有不同于已设定线性模型的系统偏差,图形可用car包中的crPlots()函数绘制。

#谋杀绿对州各因素回归的成分残差图
library(car)
crPlots(fit)

result:


说明 若图形存在非线性,则说明你可能对预测变量的函数形式建模不够充分,那么就需要添加一些曲线成分,比如多项式项,或对一个或多个变量进行变换(如用log(X)代 替X),或用其他回归变体形式而不是线性回归。

同方差性

car包提供了两个有用的函数,可以判断误差方差是否恒定。ncvTest()函数生成一个积分检验,零假设为误差方差不变,备择假设为误差方差随着拟合值水平的变化而变化。若检验显著,则说明存在异方差性(误差方差不恒定)。

spreadLevelPlot()函数创建一个添加了最佳拟合曲线的散点图,展示标准化残差绝对值与拟合值的关系。

#检验同方差性
library(car)
ncvTest(fit)

# Non-constant Variance Score Test 
# Variance formula: ~ fitted.values 
# Chisquare = 1.746514, Df = 1, p = 0.18632
# Suggested power transformation:  1.209626

spreadLevelPlot(fit)

result:


可以看到,计分检验不显著(p=0.19),说明满足方差不变假设。 还可以通过分布水平图看到这一点,其中的点在水平的最佳拟合曲线周围呈水平随机分布。若违反了该假设, 你将会看到一个非水平的曲线。 代码结果建议幂次变换(suggested power transformation)的含义是,经过p次幂(Yp)变换,非恒定的误差方差将会平稳。例如,若图形显示出了非水平趋势, 建议幂次转换为0.5,在回归等式中用 Y 代替Y,可能会使模型满足同方差性。若建议幂次为0, 则使用对数变换。对于当前例子,异方差性很不明显,因此建议幂次接近1

线性模型综合假设

gvlma包中的gvlma()函数。gvlma()函数能对线性模型假设进行综合验证,同时还能做偏斜度、峰度和异方差性的评价。

换句话说,它给模型假设提供了一个单独的综合检验。

#线性模型假设的综合检验
install.packages("gvlma")
library(gvlma)
gvmodel <- gvlma(fit)
summary(gvmodel)

result

ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = fit) 

                    Value p-value                Decision
Global Stat        2.7728  0.5965 Assumptions acceptable.
Skewness(偏度)    1.5374  0.2150 Assumptions acceptable.
Kurtosis (峰度)   0.6376  0.4246 Assumptions acceptable.
Link Function      0.1154  0.7341 Assumptions acceptable.
Heteroscedasticity 0.4824  0.4873 Assumptions acceptable.

从输出项(Global Stat中的文字栏)我们可以看到数据满足OLS回归模型所有的统计假设 (p=0.597)。若Decision下的文字表明违反了假设条件(比如p<0.05)

相关推荐

程序员请收好:10个非常有用的 Visual Studio Code 插件

一个插件列表,可以让你的程序员生活变得轻松许多。作者|Daan译者|Elle出品|CSDN(ID:CSDNnews)以下为译文:无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人...

PADS在WIN10系统中菜单显示不全的解决方法

决定由AD转PADS,打开发现菜单显示不正常,如下图所示:这个是由于系统的默认字体不合适导致,修改一下系统默认字体即可,修改方法如下:打开开始菜单-->所有程序-->Windows系统--...

一文讲解Web前端开发基础环境配置

先从基本的HTML语言开始学习。一个网页的所有内容都是基于HTML,为了学好HTML,不使用任何集成工具,而用一个文本编辑器,直接从最简单的HTML开始编写HTML。先在网上下载notepad++文...

TCP/IP协议栈在Linux内核中的运行时序分析

本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。1Linux概述  1.1Linux操作系统架构简介Linux操作系统总体上由Linux...

从 Angular Route 中提前获取数据

#头条创作挑战赛#介绍提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用resolver,在AngularApp中应用re...

边做游戏边划水: 基于浅水方程的水面交互、河道交互模拟方法

以下文章来源于腾讯游戏学堂,作者Byreave篇一:基于浅水方程的水面交互本文主要介绍一种基于浅水方程的水体交互算法,在基本保持水体交互效果的前提下,实现了一种极简的水面模拟和物体交互方法。真实感的...

Nacos介绍及使用

一、Nacos介绍Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS...

Spring 中@Autowired,@Resource,@Inject 注解实现原理

使用案例前置条件:现在有一个Vehicle接口,它有两个实现类Bus和Car,现在还有一个类VehicleService需要注入一个Vehicle类型的Bean:publicinte...

一文带你搞懂Vue3 底层源码

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

一线开发大牛带你深度解析探讨模板解释器,解释器的生成

解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...

Nacos源码—9.Nacos升级gRPC分析五

大纲10.gRPC客户端初始化分析11.gRPC客户端的心跳机制(健康检查)12.gRPC服务端如何处理客户端的建立连接请求13.gRPC服务端如何映射各种请求与对应的Handler处理类14.gRP...

聊聊Spring AI的Tool Calling

序本文主要研究一下SpringAI的ToolCallingToolCallbackorg/springframework/ai/tool/ToolCallback.javapublicinter...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

在MySQL登录时出现Access denied for user ~~ (using password: YES)

Windows~~~在MySQL登录时出现Accessdeniedforuser‘root‘@‘localhost‘(usingpassword:YES),并修改MySQL密码目录适用...

mysql 8.0多实例批量部署script

背景最近一个项目上,客户需要把阿里云的rdsformysql数据库同步至线下,用作数据的灾备,需要在线下的服务器上部署mysql8.0多实例,为了加快部署的速度,写了一个脚本。解决方案#!/bi...