首页 / 资讯中心 / 文章详情

R语言线性回归模型诊断:四张图掌握残差、正态性与异常点排查

R语言线性回归模型诊断:四张图掌握残差、正态性与异常点排查 ★ FEATURED ARTICLE
我记得有一次给业务方交线性回归模型报告对方看完后问了一句你怎么证明这个模型是能用的我当时的做法很朴素没有把R方、F统计量这些指标一顿摆而是直接在R语言里敲了一行plot(lm_model)把四张模型诊断图打出来一张一张指给他们看。结果很有意思对方反而觉得比看一堆数字更直观也更可信。这件事让我意识到R语言里的线性回归模型诊断图远不只是给自己看的技术产物。它是你理解数据、验证模型假设、发现异常点的重要工具更是你和非技术背景的合作者之间沟通模型质量的通用语言。尤其是Residuals vs Fitted、Normal QQ、Scale-Location、Residuals vs Leverage这四张图把线性回归的线性关系、正态性、同方差性、影响点这四个核心假设全部覆盖了。这篇文章我就以自己的实际使用经验为线索把这四张图的原理、读图方法、常见问题排查以及我踩过的坑完整过一遍。无论你是刚开始接触R语言的新手还是已经跑过不少回归但没仔细研究过诊断图的同学看完都能直接上手。1. 为什么线性回归跑完必须先看这四张图1.1 线性回归的四个基本假设以及它们“失效”的样子线性回归看起来简单但很多初学者容易忽略一个关键点模型输出的p值、置信区间、R方都是在若干假设成立的前提下计算出来的。如果假设被严重违背那些漂亮的指标就是空中楼阁。一般来说用普通最小二乘法OLS拟合线性回归时我们默认残差满足四条性质线性关系因变量和自变量之间是线性关系如果实际是非线性模型就会系统性地拟合不足。残差独立性观测之间相互独立尤其在时间序列或空间数据里容易出问题。同方差性残差的方差在不同拟合值水平上大致相同。如果方差随拟合值增大而增大就是异方差。残差正态性残差服从正态分布。虽然中心极限定理能在一定程度上兜底但样本量不够或偏态严重时小样本的推断就会失真。除了上述四条回归诊断还需要关注“强影响点”。也就是某些个别观测对回归系数的影响特别大删掉一个点模型就完全变样。这样的点可能是真实数据也可能是录入错误需要特别对待。这四个假设和一个隐患恰好就是四张图各自负责检查的领域。plot(lm_model)一次给你四张图不是随机凑数而是一套组合拳。1.2 R语言里plot()一键出四张图在R语言中运行线性模型后直接调用plot()默认会依次生成四张图。为了对比清楚我们先用经典的mtcars数据集做一个简单示意。lm_car - lm(mpg ~ wt hp, data mtcars) # 默认输出四张图R会提示你按回车翻页 plot(lm_car) # 也可以在一页里拼出2x2的四宫格 par(mfrow c(2, 2)) plot(lm_car)四张图与需要检验的假设对应关系如下图名检查什么不满足时意味着什么Residuals vs Fitted线性关系、同方差性的初步迹象图中有明显弯曲或喇叭形Normal QQ残差正态性点明显偏离对角线Scale-Location同方差性红色趋势线明显倾斜点带宽度变化大Residuals vs Leverage强影响点、高杠杆点出现落在Cook距离等高线外侧的点顺便说一句R的默认行为是先显示前两张按回车再显示后两张。早期我不熟悉的时候经常只看到前两张就关了窗口以为这就是全部后来才发现后两张同样关键。所以最好用par(mfrow c(2, 2))一次拼出来效率高也方便整体观察。2. Residuals vs Fitted线性关系和同方差性的第一道关卡2.1 读图要点散点形态与参考红线这张图的横轴是模型的拟合值Fitted values纵轴是残差Residuals。每个点代表一个观测的残差大小。图上通常会有一条红色的平滑曲线R语言默认用lowess方法拟合用来帮助肉眼识别残差的整体趋势。理想的图景是这样的红色曲线接近一条水平的直线且残差点在零线上下基本均匀地随机散布没有明显的规律。这至少说明模型没有漏掉明显的非线性结构方差也没有随着拟合值的增大而急剧膨胀。相反如果红色曲线出现明显的U形或倒U形说明模型存在非线性。最常见的例子是只用一个线性项去拟合原本是二次关系的数据中间一段残差全是正的两头全是负的画出来就是一条大弧线。这个信号比看任何指标都直接。如果点的分布呈“喇叭形”也就是说拟合值较小时残差挤在一起拟合值较大时残差四散开来这是异方差的典型信号。现实中很多经济数据、房价数据、生物实验数据都有这个特征。这时候虽然回归系数仍然是无偏的但标准误估计不准p值会失真置信区间也会误导你。2.2 从图中发现非线性加项和变换我自己最常用的是MASS包里的Boston数据集来做演示因为它的变量形态丰富非常适合展示诊断图的价值。比如用medv房价中位数对lstat低收入阶层比例做一元回归时几乎一定会看到Residuals vs Fitted图出现明显的U形弯曲。library(MASS) lm_boston1 - lm(medv ~ lstat, data Boston) par(mfrow c(2, 2)) plot(lm_boston1)原因并不复杂medv和lstat的关系本身就不是线性的房价随着低收入比例上升会先缓慢下降、再急剧下降整个形状更像曲线。这时候正确的做法不是硬着头皮接受而是考虑增加二次项、交互项或者对变量做变换。lm_boston2 - lm(medv ~ lstat I(lstat^2), data Boston)加上二次项之后残差图上的弧形通常会明显改善。我见过不少同学第一次看到这个现象时很慌以为数据有问题其实这是最常见也最好解决的模型设定问题。记住一个原则残差图上有弯曲先怀疑模型形式别急着骂数据。2.3 从图中发现异方差辅助检验与应对策略喇叭形态的异方差不如U形那么好修正。如果只是轻微喇叭很多人会直接忽略但如果情况比较严重建议做正式的辅助检验例如lmtest包的Breusch-Pagan检验。library(lmtest) bptest(lm_boston1)p值很小就说明异方差确实存在。应对的策略一般有这么几条对因变量做变换比如取对数或者开方这是最常用的方式改用加权最小二乘WLS给方差大的观测更小的权重使用稳健标准误HC1、HC2、HC3等来修正推断结果sandwich包可以直接做到。要说我个人体会最深的还是先取对数再看图。很多做经济数据、生物数据的场景因变量本质上就是正数且跨度大取完对数之后第一张图的喇叭形往往会收敛不少同时Q-Q图也会跟着变好。3. Normal QQ正态性假设到底怎么看3.1 Q-Q图背后的原理Normal QQ图的全称是分位数-分位数图。横轴是理论上正态分布的分位数纵轴是样本残差的实际分位数。如果残差来自正态分布那么点应该大致落在一条直线上。R会画出一条参考对角线你只需要看点是否紧密分布在参考线周围。这张图是很多人觉得最难读的图其实关键不在于“是不是所有点都严格在线上”而在于偏离发生在哪里。如果只是两端有一两个点稍微偏离通常不用太紧张如果是一条长长的曲线明显偏离比如左尾往下掉或者右尾往上翘那就说明残差分布的尾部比正态分布更厚或者存在明显偏态。打个比方正态分布就像一支纪律严格的队伍身材都在中间极矮和极高都非常少。如果你的数据里出现了很多“特别高”的样本Q-Q图的右端就会翘起来说明你的残差是右偏的。3.2 尾部偏离、S型代表什么实际工作中Q-Q图常见的形态大概有这么几类尾部上扬右尾比正态更长说明残差右偏可能存在少量很大的正残差尾部下沉左尾比正态更长说明左偏S形中间比较陡两端比较平或者反过来往往意味着分布峰度和正态不同。以上每种形态都对应着不同的数据问题。比如我在处理用户消费数据时候残差经常是严重右偏的因为少数用户消费极高导致右尾特别长。这时候直接做线性回归估计结果会被这些极端样本带偏正态性检验自然是一塌糊涂。但这里要重点提醒大样本情况下正态性假设并不是致命问题。线性回归里的t检验和F检验依赖的是“残差均值渐进正态”的性质样本量够大时经验上超过200、300就能比较放心即使残差不太正态推断结果仍然大致有效。所以我自己的判断标准是样本量大且Q-Q图只是轻微偏离可以忽略样本量小或者偏离严重才需要认真处理。3.3 正态性不满足的补救手段如果确实需要修正首选还是对因变量做变换。取对数、开根号、Box-Cox变换都可以目的都是把偏态分布“拉”回正态。MASS包里的boxcox()函数可以帮你自动搜索最优的变换参数非常方便。library(MASS) boxcox(lm_boston1, lambda seq(-2, 2, 0.1))另外如果变换解决不了说明问题可能出在模型结构上这时候可以考虑改用广义线性模型GLM比如泊松回归、逻辑回归或者对数据进行分组建模。现实数据不会乖乖遵循教科书里的所有假设灵活调整才是常态。4. Scale-Location同方差性的“放大镜”4.1 为什么有了第一张图还要再有一张初学的时候我有个疑问Residuals vs Fitted图不是已经能看出异方差了吗为什么还要专门做一张Scale-Location图后来才明白第一张图的纵轴是原始残差如果拟合值范围跨度大或者数据中存在强杠杆点喇叭形并不总是那么明显。Scale-Location图把纵轴换成了标准化残差的平方根相当于把残差的扩展程度“放大”了微小的方差变化更容易暴露出来。标准化残差就是把原始残差除以它的标准差估计值经过标准化之后不同位置残差的大小可比性更强。再开平方根主要是为了压缩大残差的尺度避免个别特别大的值把图形撑坏同时又能让方差增大的趋势在图上显示得更平滑。读图和第一张类似看点的散布宽度是否均匀以及红色趋势线是否基本水平。如果红色线明显向上走或向下走说明方差在随拟合值变化。另外如果点带在某个区域特别宽松在另一个区域特别紧凑同样值得怀疑。4.2 如何判断“值得担忧的异方差”判断异方差严不严重不能只看图毕竟图和图之间的差异有时候很微妙。我的经验是两条腿走路图作为视觉线索正式的统计检验作为决策依据。除了前面提到的Breusch-Pagan检验car包里的ncvTest()也可以做异方差的Score检验两者结论通常一致任选一个即可。library(car) ncvTest(lm_boston1)严格来说异方差影响的是标准误和置信区间对回归系数本身的无偏性影响不大。所以问题严重与否取决于你分析的目的是什么。如果是做预测异方差会影响预测区间的准确性如果是做变量显著性检验异方差会让p值偏低或偏高如果只是关注系数大小和方向影响相对有限。有一个实操细节我想特别提一下不要因为Scale-Location图看起来稍微有点斜就急着修正。真实数据很少完美轻微异方差在业务分析中是常态。我自己的阈值是辅助检验p值大于0.05就不再纠结p值很小同时图上的趋势线倾斜度肉眼可见才会处理。否则每跑一个模型都要大动干戈分析效率太低。5. Residuals vs Leverage异常值与高杠杆点的“缉拿”5.1 杠杆值、残差、Cook距离的关系最后这张图是很多人的盲区因为它涉及的概念稍微复杂一些杠杆值Leverage、残差Residuals和Cook距离。简单来说杠杆值衡量的是某个观测在自变量空间中的“极端程度”。如果某个观测的自变量组合离其他观测很远它的杠杆值就高。残差衡量的是模型对某个观测的预测偏差。Cook距离把两者结合起来衡量某个观测对回归系数的综合影响力。生活化一点理解班里大部分同学身高体重都聚在一团某个同学特别高、特别重这就是高杠杆某个同学特别不符合身高和体重的总体关系就是大残差如果这个又高又重、同时体重极度偏离预测的人被删掉全班回归线都变了那么他就是强影响点。图上横轴是杠杆值纵轴是标准化残差。R会把一些点标注出来方便你定位。图里还会画几条虚线等高线表示Cook距离的等值线。落在等高线外侧的点就被视为对回归结果有较大影响的可疑对象。5.2 图中等高线和观测点编号怎么读R生成的图中标注规则一般是这样落在Cook距离等高线外侧的点会显示观测编号。实际操作中我看到带编号的点会格外小心因为一个这样的点就足以让模型结论翻转。需要澄清的是并不是所有高杠杆点都需要删除。首先要判断它是不是数据录入错误如果不是再判断它是否代表真实存在的合理样本。如果它是合理的极端样本比如某个超高收入用户的消费数据它的存在可能正是业务上需要关注的重点这时候删除反而是错误的做法。我常做的处理顺序是先identify()在图上点击找出点号然后回到数据里查看这些观测的原始值确认是否有明显异常。如果是录入错误就修正或删除如果是合理数据但不合群我会用稳健回归比如M估计跑一遍看看系数变动是否剧烈。# 在图上点击靠近兴趣点的散点Esc结束 identify(x hatvalues(lm_boston1), y rstandard(lm_boston1))补充一个阈值经验杠杆值的经验判断线一般取 (2(p1)/n)其中p是自变量个数n是样本量。但实际看图时不用记公式也能判断因为只要点在右上角或右下角的危险区域R画图时通常会给出明显标记。6. 四张图配合使用的完整案例分析6.1 用波士顿房价数据建模并解读四张图光讲单个图的原理不够我把四张图串起来用Boston数据走一遍完整流程。先构建一个简单的模型library(MASS) data(Boston) lm_boston1 - lm(medv ~ lstat, data Boston) summary(lm_boston1)这个模型跑出来的结果里lstat的系数显著R方大约0.54。表面看起来还行但一旦进入plot(lm_boston1)问题就藏不住了。Residuals vs Fitted红色曲线呈现明显的U形左端和右端都偏离零线说明遗漏了非线性结构。同时点的散布并不均匀拟合值较大时残差更加发散。Normal QQ两端尤其是右端明显翘起说明残差存在右偏分布尾部比正态分布更厚。Scale-Location红色趋势线从左到右明显向上点的带宽也在变大异方差问题同样存在。Residuals vs Leverage右下角和右上角会出现个别带编号的点比如某些高房价区域对应的观测杠杆值不小需要核对。一张图可能有偶然性但四张图同时给出“模型不合格”的信号问题就比较确信了。这也正是四张图组合起来看的价值所在互相验证避免误判。6.2 诊断后的模型修正针对上面暴露的问题我通常做两步调整增加非线性项同时对因变量做对数变换。lm_boston2 - lm(log(medv) ~ lstat I(lstat^2) rm, data Boston) plot(lm_boston2)修正后再看四张图第一张图的U形明显消失了红线基本贴着零线走第二张图的点更紧贴对角线只有极个别点还在尾部轻微浮动第三张图的趋势线趋于水平带宽也更均匀第四张图个别点仍然有较大杠杆值但Cook距离提示的影响力已经下降。这说明模型的假设偏离得到了有效控制。这时候再去解释summary(lm_boston2)里的系数、p值心里就踏实多了。6.3 诊断图解决不了的自相关与多重共线性需要特别说明的是这四张图不是万能的。它们不负责检查残差的自相关性也不检查自变量的多重共线性。如果你处理的是时间序列数据还需要看残差的自相关图ACF/PACF和Durbin-Watson检验如果你怀疑自变量之间高度相关需要看vif()的结果。library(car) vif(lm_boston2)我见过不少同学把所有诊断都压在四张图上结果忽略了序列相关或者共线性问题最后结论被评审质疑才回头补各种检查。所以我的习惯是四张图作为常规体检特定场景再补充特定的专项检查这样才算完整。7. 常见问题与实操技巧7.1 常见问题快查表最后整理一份我自己经常参考的问题速查表遇到现象直接对照排查效率会高很多。图表现可能的问题对应处理方向Fitted图中红线出现U形/倒U形模型遗漏非线性项增加二次项、交互项或对变量做变换Fitted图中出现喇叭形异方差对因变量做log或Box-Cox变换或使用WLS、稳健标准误QQ图左右尾明显偏离残差非正态对y做变换考虑GLM或利用大样本渐进性质Scale-Location红线明显倾斜异方差同喇叭形处理并做bptest或ncvTest确认Leverage图中出现超Cook距离的点强影响点检查数据考虑修正或删除比较稳健回归结果四个图结论互相矛盾数据存在混合分布或分组结构考虑分层建模、加入分组变量、检查是否有离群簇这张表的逻辑是先看图找现象再依据现象用辅助检验或代码去确认最后才动手改模型。不要一上来就删点更不要看到点偏离就急着换模型结构。7.2 绘图中的细节与自定义我在实际操作中还踩过几个比较细节的坑也一并分享。第一只查看其中某一张图时可以用参数which。比如plot(lm_model, which 2)只看QQ图这样在跑循环或者批量出图时非常省事。plot(lm_boston1, which 2)第二中文环境下R的默认图形设备偶尔会出现中文标签乱码包括标题、轴标签显示成方块。解决办法是用CairoPNG保存图片或者把family参数调成中文字体。对于模型诊断图来说最简单的做法是干脆把main标题用英文反正看图的人关心的是形态不是标题语言。第三点特别多的时候观测点编号会叠在一起看不清楚。这时候可以把图形窗口开大一点或者用cex参数调整点的大小。R的plot.lm()支持用id.n参数控制标注多少个点默认是3个可以根据需要调整。plot(lm_boston1, id.n 5)第四如果需要把四张图输出成高清图片我一般用pdf()或png()配合res 300保存这样放在报告或者幻灯片里也不会发虚。pdf(lm_diagnostic.pdf, width 10, height 8) par(mfrow c(2, 2)) plot(lm_boston1) dev.off()这些看起来都是小细节但在正式分析报告里图清晰、编号明确、输出规范整体专业度会提升一大截。7.3 我自己的固定检查流程最后聊一下我个人的固定套路。每跑完一个线性回归模型不管结果多好看我都会强制自己执行一遍这套检查先看summary()对系数显著性和R方有个整体印象立刻运行plot(lm_model)把四张图拼在一页里过一遍从第一张图开始依次确认红线是否水平、QQ图尾部是否失控、Scale-Location是否倾斜、有没有危险点如果有可疑图再用bptest、ncvTest、vif等做辅助确认确认问题后回到建模阶段调整调整完重新出图对比直到四张图都“看起来顺眼”。这套流程说实话花不了多少时间但它救过我很多次。印象最深的一次是有一版模型指标非常漂亮几乎所有变量都显著但Residuals vs Fitted图红线的弯曲程度异常醒目。顺着图追查后发现数据里混进了一批完全不属于同一个分布的外部样本清理之后模型才算真正可用。如果没有这一眼那份报告交出去后面大概率会被打回来返工。R语言里线性回归的诊断图本质上就是用尽量少的篇幅告诉你这个模型到底靠不靠谱。四张图各有分工又互相配合。看懂它们不只能避免被异常值和错误假设带偏也能让你在跟别人讨论模型质量的时候更有底气。希望这篇文章能帮你少走一些我走过的弯路。
阅读完成 · 觉得有帮助?
咨询建站