本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析。

在这篇文章中,我们通过探索残差分析和用R可视化结果,深入研究了R语言。

残差本质上是当一个给定的模型(在文中是线性回归)不完全符合给定的观测值时留下的gap。

医学中的病理学发现的残留分析是一个形象的比喻。人们通常用代谢残留水平来作为衡量药物吸收的指标。

残差是用于建模的原始值与作为模型结果的对于原始值的估计之间的差异。

残差=y-y-hat,其中y是初始值,y-hat是计算值。

期望这个错误尽可能接近于零,并且通过残差找到任何异常值。

找到异常值的一个快速方法是使用标准化残差。第一种方法是简单地求出残差与其标准差的比值,因此,任何超过3个标准差的情况都可以被视为异常值。

## 标准化残差-相对于其标准偏差的比例残差

residueStandard

df[residueStandard>3,]

以下是得到的结果:

days.instant days.atemp days.hum days.windspeed days.casual

442 442 0.505046 0.755833 0.110704 3155

456 456 0.421708 0.738333 0.250617 2301

463 463 0.426129 0.254167 0.274871 3252

470 470 0.487996 0.502917 0.190917 2795

471 471 0.573875 0.507917 0.225129 2846

505 505 0.566908 0.456250 0.083975 3410

512 512 0.642696 0.732500 0.198992 2855

513 513 0.641425 0.697083 0.215171 3283

533 533 0.594708 0.504167 0.166667 2963

624 624 0.585867 0.501667 0.247521 3160

645 645 0.538521 0.664167 0.268025 3031

659 659 0.472842 0.572917 0.117537 2806

当然,我希望我的模型是无偏的,至少我想这样。因此回归线两边的任何残差,如果没有在这条线上,都是随机的,也就是说,没有任何特定的模式。

也就是说,我希望我的剩余误差分布遵循一个普通的正态分布。

使用R语言,只需两行代码就可以优雅地完成这项工作。

绘制残差柱状图;

添加一个分位数图,其中有一条线穿过,即第一个和第三个分位数。

hist(lmfit$residuals)

qqnorm(lmfit$residuals);qqline(lmfit$residuals)

于是,我们知道这个图偏离了正常值(正常值用直线表示)。

但这种非黑即白的信息一般是不够的。因此,我们应该检查偏态和峰度,以了解分布的分散性。

首先,我们将计算偏态;我们将使用一个简单的高尔顿偏态(Galton’s skewness)公式。

## 分布对称性检验:偏态

summary

Q1

Q2

Q3

skewness

skewness

[1] 0.2665384

这量化了分布的方向(分布于右侧或左侧,或者是否完全对称或均匀)。

另一个度量角度是峰度,它显示分布是朝向中心(+ve值)还是远离中心(-ve值)。峰度是一个量化离群值可能性的指标。正值表示离群的存在。

kurtosis(lmfit$residuals)

[1] 2.454145

接下来,除了可视化残差的分布,我还想找出残差是否相互关联。

对于一个模型来说,为了解释观测值的所有变化,残差必须随机发生,并且彼此不相关。

Durbin-Watson测试允许检验残差彼此之间的独立性。

dwt(lm(df$days.windspeed~df$days.atemp+df$days.hum),method='resample', alternative='two.sided')

lag Autocorrelation D-W Statistic p-value

1 0.2616792 1.475681 0

Alternative hypothesis: rho != 0

对于给定的自由度和观测次数,需要将统计值与临界值表确定的下限和上限进行比较。文中案例的值域是[1.55,1.67]。

由于计算的D-W统计值低于该范围的较低值,我们拒绝了残差不相关的零假设。因此取而代之的假设是残差之间可能存在相关性。

直观地看,这个假设可以通过研究模型在试图捕获原始Y值的增加值时失败的原因来了解。当捕获增加值时,随着y的增加,残差与y成正比。

将其与绘制拟合y-hat值与y值进行比较。当y-hat值趋于落后时,残差似乎与y共同增长,故此,因为过去的残值似乎继续沿着固定的坡度值运行,过去的残值似乎是当前值的更好预测因子。同时,在达尔文-沃森检验(Darwin-Watson tests)中在残差与先前值之间的差的平方和,与所有观测的给定残差之和的比较和对比中,发现了相关性。

因此,残余误差之间的相关性就像心率测试失灵一样。如果你的模型不能跟上Y的快速变化,它会越来越和一个检验玩命的跑步者的情况类似,没记录上的步数似乎比跑步者实际的步数更相关。

重构你的线性回归模型中的下意识影响。

有一点很重要:当对任何给定的观测集进行线性回归时,因变量(符号上表示为y)的计算估计量(符号上表示为y-hat)的每个值不仅依赖于当前值(例如,观察值),还依赖于每次观测。

毕竟,你的多元线性回归模型只在最小化因变量y的实际值和所有观测值y(y-hat)的计算估计值之间的误差后,才计算出每个影响因素的系数。

在数学上,这可以用简单的加权平均模型表示,如下所示。

Yhat(j)= w1j*Y(1)+w2j*Y(2)+w3j*Y(3)+w4j*Y(4)+.....+wnj*Y(n);

where n is number of observations and j is one particular estimated value.

如果你想用矩阵表示法来考虑这个问题,矩阵w的维数是[n,n],其中n是观察到的数目。同样,以矩阵形式表示的y具有尺寸[n,1],因此y-hat[j]表示为矩阵,因为它是两个矩阵(w和y)的乘积,并且具有与y相同的尺寸[n,1]。

因此,计算出的估计量的每一个值都可以表示为所有初始y值的加权平均值,表明给定的计算估计量在多大程度上受到每个初始y值的影响。

更简单地说,如果我看到一堆分散的观察结果,我必须以尽可能小的偏差,画一条直线穿过它们,也就是说,如果我必须遗漏一些观察结果,我必须在这条回归线的两侧平等地遗漏。

但是在这样做的同时,我(或选择的回归程序)不管来源何处,下意识地估计了每次观察对我回归线的斜率的影响程度。

我现在所做的就是重新计算这些影响。为了改变我的回归线,将它们包括在内或排除在外,每一个观察值的权重是多少?

权重的统计术语是hat values,因为它们连接了计算的估计量和它们的原始对应的估计量。

以下是用R语言计算的方法:

modelmatrix

hatvalues

首先,我们得到一个矩阵形式的模型。然后我们计算hat值。

或者,可以使用以下函数获得类似的结果。

hatvalues

让我们考虑一下可以施加在每个权重上的限制。

显然,权重的最小可能值等于所有原始Y值贡献相等的可能性(因为它们必须为线性回归程序贡献一些东西,通过对所有观测进行工作和优化来估计系数)。

在这种情况下,其值域的下限为1/n,其中n是观测总数。在任何情况下,因为n总是+ve,所以权重总是

现在试着将hat值加和,你会看到一个有趣的结果…

sum(hatvalues)

[1] 4

它们等于线性回归模型为计算考虑的影响因素数量+1。

例如,在示例数据集中,我们有三个因素,即温度、湿度和风速。

接下来,我们如何找到最重要或最有影响的观察结果?

一种优雅的方式是:

将hat值切分为四分位数。

应用95%标准过滤最异常值。

将该过滤标准应用于观察结果。

R语言允许你一步完成这些操作!

df[hatvalues>quantile(hatvalues,0.95),]

我们可以得到满足这一标准的具体观测结果。

days.instant days.atemp days.hum days.windspeed days.casual

9 9 0.1161750 0.434167 0.361950 54

21 21 0.1578330 0.457083 0.353242 75

22 22 0.0790696 0.400000 0.171970 93

26 26 0.2036000 0.862500 0.293850 34

32 32 0.2345300 0.829565 0.053213 47

36 36 0.2430580 0.929167 0.161079 100

45 45 0.3983500 0.375833 0.417908 208

50 50 0.3914040 0.187917 0.507463 532

65 65 0.3662520 0.948261 0.343287 114

69 69 0.3856680 0.000000 0.261877 46

90 90 0.2575750 0.918333 0.217646 179

94 94 0.5429290 0.426250 0.385571 734

95 95 0.3983500 0.642083 0.388067 167

106 106 0.4254920 0.888333 0.340808 121

153 153 0.6439420 0.305000 0.292287 736

239 239 0.6355560 0.850000 0.375617 226

249 249 0.5152000 0.886957 0.343943 204

293 293 0.4665250 0.636250 0.422275 471

302 302 0.2279130 0.882500 0.351371 57

341 341 0.4002460 0.970417 0.266175 50

368 368 0.1262750 0.441250 0.365671 89

383 383 0.2752540 0.443333 0.415429 109

388 388 0.2430580 0.911250 0.110708 145

408 408 0.1016580 0.464583 0.409212 73

421 421 0.2556750 0.395833 0.421642 317

433 433 0.5246040 0.567500 0.441563 486

434 434 0.3970830 0.407083 0.414800 447

463 463 0.4261290 0.254167 0.274871 3252

465 465 0.4766380 0.317500 0.358196 905

478 478 0.3895040 0.835417 0.344546 120

543 543 0.5947040 0.373333 0.347642 1077

627 627 0.5650670 0.872500 0.357587 371

667 667 0.4677710 0.694583 0.398008 998

668 668 0.4394000 0.880000 0.358200 2

694 694 0.2487420 0.404583 0.376871 532

722 722 0.2361130 0.441250 0.407346 205

726 726 0.2203330 0.823333 0.316546 9

最终,你可以用颜色编码使他们具象化。

##具象化

plot(df$days.casual,lmfit$fitted.values,col=ifelse(hatvalues>quantile(hatvalues,0.95),'red','blue'))

就是这样!这是进行残差分析和其重要性的简单概述。

原文标题:

Doing Residual Analysis Post Regression in R

https://dzone.com/articles/doing-residual-analysis-post-regression-in-r

r语言做断轴_手把手教你用R语言做回归后的残差分析相关推荐

  1. r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...

    作者:Abhijit Telang 翻译:张睿毅 校对:丁楠雅 文章来源:微信公众号 数据派THU 本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差分 ...

  2. 独家 | 手把手教你用R语言做回归后的残差分析(附代码)

    作者:Abhijit Telang 翻译:张睿毅 校对:丁楠雅 本文约2600字,建议阅读10分钟. 本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差 ...

  3. 用mysql做文本挖掘_手把手教你做文本挖掘

    一.文本挖掘定义 文本挖掘指的是从文本数据中获取有价值的信息和知识,它是数据挖掘中的一种方法.文本挖掘中最重要最基本的应用是实现文本的分类和聚类,前者是有监督的挖掘算法,后者是无监督的挖掘算法. 二. ...

  4. 贝叶斯软件genle教程_手把手教你用R的gemtc包对生存数据进行贝叶斯网状Meta分析...

    大家好,本教程将介绍如何使用R的gemtc包对生存数据(HR为效应量)进行贝叶斯网状Meta分析. 前提条件: 需要下载R软件(推荐使用的R版本为3.5.3),以及RStudio(一个R的友好交互界面 ...

  5. python画spc控制图_手把手教你SPC控制图怎么做以及SPC控制图分类

    01.什么是SPC控制图?SPC控制图怎么做以及SPC控制图分类. SPC控制图是SPC统计过程控制的核心工具,是对过程质量加以测定.记录从而进行控制管理的一种用科学方法设计的图,是用于分析和判断工序 ...

  6. tcga数据下载_手把手教你用R下载TCGA数据:CGDSR包

    各位科研芝士的朋友,大家好,今天我们继续分享关于TCGA数据下载的专题,之前,给大家推出了网页版cBioportal工具,进行数据下载,在上期中我们看到UCSC-XENA对应的R包UCSCXenaTo ...

  7. 飞桨模型保存_手把手教你用飞桨做词向量模型 SkipGram

    飞桨开发者说成员:肥猫.忆臻 在做 NLP 的任务时,一个非常 basic 的操作就是如何编码自然语言中的符号,例如词.短语,甚至词缀.目前流行的方法有大约三种: •  特征工程:这类方法依赖于手工特 ...

  8. c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...

    C语言结构体详细教学开始 前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号 ...

  9. ppt怎么把图片做成翻书效果_手把手教你做图片翻书效果.ppt

    手把手教你做图片翻书效果 第六张幻灯片 (第2张翻第3张的动画过程) 第七张幻灯片 (右边超链接到自定义放映中的"第3张翻第4张" , 左边超链接到自定义放映中的"第3张 ...

最新文章

  1. ASP.NET MVC开发微信(四)
  2. 关于交通创新,这五大智慧城市做了啥?
  3. shell实例第13讲:从FTP服务器下载文件
  4. PowerDesigner(16.1)使用
  5. 淘宝api 登录验证
  6. vgg 名人人脸图像库_您看起来像哪个名人? 图像相似度搜索模型
  7. 树莓派安装Ubuntu MATE及ROS系统
  8. NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
  9. 【转】 jquery遍历json数组方法
  10. java如何面试别人_Java面试如何考察候选人
  11. 软件测试中的二八定律到底是什么?
  12. H3C S3600 交换机NTP对等体模式的配置
  13. 【Python游戏】用Python基于centernet在win10平台开发,射击游戏 | 附带源码
  14. PDF怎么压缩文件大小
  15. CT一般扫描参数_CT胶片上那些与剂量相关的参数!
  16. 下一半***清除全集
  17. 用java实现的文本编辑器可以媲美windows自带的编辑器吗?(功能全,超详细)
  18. VMware虚拟机的三种网络连接模式的特点
  19. 【Unity】入门学习笔记180604——游戏动画设计(1)——概述/精灵对象动画
  20. 快应用采坑(1)-安装

热门文章

  1. 【Books系列】之第二本书:大冰《我不》读书笔记和读后感
  2. iOS9适配http,微信、qq、支付宝添加白名单
  3. [607]appium根据屏幕大小滑动界面|通过坐标定位元素
  4. Android 基于google Zxing实现二维码 条形码扫描,仿微信二维码扫描效果
  5. 你需了解:商务送礼的四大规矩
  6. 干货来袭!!!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第1天)线性代数篇:矩阵、向量及python实战
  7. SIP中603/decline中的意义
  8. 决策树入门案例:泰坦尼克号幸存者预测
  9. python加权随机_Python中的加权随机
  10. UI设计初学者必入门必看!