基本思路:最小二乘直线
线性回归是在一堆点中拟合一条直线:y = intercept + slope × x。在所有可能的直线中,lm() 选出让残差平方和最小的那一条,残差就是某个点和直线之间的竖直距离。平方会让大的偏差占据不成比例的分量,这就是为什么一个离谱的离群值就能让整条拟合线倾斜。
相关性给你的是一个没有单位的数字,用来衡量“两者一起变化的紧密程度”;而回归给你的是一个方程:它有单位,有可以解释的斜率,还有用来做预测的整套机制。
把这个公式读作“把 mpg 建模为 wt 的函数”。两个系数就是拟合出的直线:mpg ≈ 37.3 − 5.3 × weight。斜率有实际单位:车重每增加 1000 磅(wt 的单位是 1000 磅),每加仑大约少跑 5.3 英里。截距(重量为零时 37.3 mpg)只是直线与零点相交的位置;没有车是零重量的,所以不要过度解读它。
逐段解读 summary()
summary(fit) 的输出是每门统计课都会让你解读的内容。先运行它,然后一段一段地看:
Call:回显你拟合的模型。现在看起来无关紧要,但当你同时摆弄六个模型对象时,它能救你一命。
Residuals:剩余部分(实际值 − 预测值)的五数概括。你希望中位数接近 0,并且 Min/Max 与 1Q/3Q 大致对称;明显的不对称说明直线模型漏掉了什么。
Coefficients:输出的核心,每一项占一行:
- Estimate:拟合值。
wt的是 −5.34:车重每增加 1000 磅,mpg 大约减少 5.3。一定要把斜率翻译成带单位的一句话,这句话就是模型全部的实际意义。 - Std. Error:在重复抽样中,这个估计值会有多大的波动。离零只有一两个标准误的估计值是不可靠的。
- t value:Estimate ÷ Std. Error,即系数离零有多少个标准误(这里是 −9.56)。
- Pr(>|t|):针对“这个系数会不会其实是零?”的 p 值。
wt的 p 值约为 1.3e-10:如果重量和 mpg 真的没有线性关系,在 32 个样本中几乎不可能出现这么陡的斜率。p 值小说明这种关联存在的证据充分,但并不能证明模型是正确的,也不能衡量重要性(一个很小但估计得很精确的效应同样会得到很小的 p 值)。 - Signif. codes / 星号:p 值那一列的直观简写。方便,但不增加任何信息。
Residual standard error: 3.05 on 30 degrees of freedom:预测偏差的典型大小,单位与响应变量相同:预测值通常会偏差 3 mpg 左右。要结合 mpg 的取值范围(大约 10 至 34)来判断它。
Multiple R-squared: 0.75:重量解释了 mpg 大约 75% 的方差。Adjusted R-squared (0.74) 在重新计算时对每个预测变量加以惩罚,因为原始版本只会随着添加变量而增加,哪怕加的是随机噪声。比较预测变量数量不同的模型时,调整后的版本才是公平的。还要克制“好模型 = 高 R²”的条件反射:一个真正有用的效应可能出现在 R² 很低的模型里(结果本身噪声大,或者影响因素很多),而高 R² 也可能来自过拟合或泄露了信息的变量。
F-statistic: 91.4 ... p-value: 1.29e-10:对整个模型的检验,即这个模型是否胜过“对每个人都直接预测平均值”。只有一个预测变量时,它和斜率的 t 检验是重复的(注意 9.56² ≈ 91.4);有多个预测变量时,它就成了检验“至少一个系数不为零”的联合检验。它背后的机制与 ANOVA 中的方差分解相同。
多元回归:保持其他变量不变
用 + 添加预测变量:
解释方式有一个关键的变化。现在每个 Estimate 表示的是该预测变量在其他变量保持不变时的效应:wt 的系数(大约 −3.9,比 −5.3 小了)表示在马力相同的车之间比较时,额外重量带来的 mpg 损失。简单回归中的 −5.3 悄悄地把“更重的车往往马力也更大”这一事实也算了进去;多元回归则把它拆了出来。这也是添加变量时系数会变化的原因:如果新的预测变量与原有的变量相关,原有变量的“职责”就变了。R 方上升到 0.83 左右,此时与单变量模型做比较,公平的是调整后的版本。
预测:predict()
拟合好的模型就是一个函数,predict() 负责计算它的值。构造一个 newdata 数据框,让它的列名与预测变量完全一致:
两种区间回答的是不同的问题,把它们搞混是考试中的经典错误:
interval = "confidence":关于平均值的不确定性:“所有 2500 磅重的车,平均 mpg 在哪里?”区间较窄,并且会随数据增多而缩小。interval = "prediction":该重量的单辆新车可能落入的范围。宽得多,因为单辆车自身就围绕直线存在散布,而这种散布无论有多少数据都无法平均掉。
当问题针对的是一个新观测值时,如果报告的是置信区间,就会严重夸大你的精度。
诊断与外推陷阱
summary() 告诉你模型估计出了什么,残差图则告诉你该不该相信它。在交互式会话中:
par(mfrow = c(2, 2))
plot(fit) # four diagnostic plots
要看什么:Residuals vs Fitted 应该是一团没有形状的点云:出现曲线说明关系不是直线;出现漏斗形(散布随拟合值增大)说明方差不恒定,你的标准误就不准了。Q-Q 图中的点应该紧贴直线:厚尾说明离群值在扭曲拟合。Scale-Location 是再检查一次漏斗形。Residuals vs Leverage 标出强影响点,也就是单凭自己就能拉动系数的观测值(在 mtcars 中,Chrysler Imperial 这类特殊车型往往会出现在这里)。拟合之前先对原始数据画一张散点图,就能及早发现其中的大部分问题。
最后是任何诊断都发现不了的陷阱:外推。这个模型是从重量大约在 1500 至 5400 磅之间的车学来的。给 predict() 一个 8 的 wt,它会欣然返回一个负数的 mpg:数学可以把直线无限延伸下去,但证据在数据的边界就停止了。只在拟合时所用数据的范围之内(或附近)做预测。
要点回顾
fit <- lm(y ~ x, data = df)拟合最小二乘直线;coef(fit)是方程,summary(fit)是完整报告。- 把 Estimate 读成带单位的句子;
Pr(>|t|)问的是“它会不会是零?”,而不是“它重不重要?” - 残差标准误是以实际单位表示的典型偏差;调整后的 R 方是公平比较模型的指标。
- 在多元回归中,每个系数的含义都是“保持其他变量不变”;加入相关的预测变量后,系数会发生变化。
predict(fit, newdata, interval = ...):"confidence" 针对平均值,"prediction" 针对单个新个体,后者的区间更宽。- 用
plot(fit)检查曲线、漏斗形和强影响点;永远不要相信数据范围之外的预测。
下一篇:当结果是“是/否”而不是数字时,用 glm() 做逻辑回归。
常见问题
R 语言怎么做线性回归?
用 lm() 加一个公式:fit <- lm(mpg ~ wt, data = mtcars) 就是把 mpg 对重量做回归。然后 summary(fit) 会打印出系数、它们的 p 值、R 方和 F 统计量。用 + 添加更多预测变量:lm(mpg ~ wt + hp, data = mtcars)。
R 语言中 lm 的 summary 输出怎么解读?
在 Coefficients 部分,每个 Estimate 表示该预测变量每增加一个单位时(其他变量保持不变),响应变量的预期变化;Pr(>|t|) 检验这个系数是否可能为零。Multiple R-squared 是被解释的方差比例。底部的 F 统计量把整个模型和只有截距的模型做比较。
Multiple R-squared 和 Adjusted R-squared 有什么区别?
Multiple R-squared 是被解释方差的原始比例,只要添加预测变量它就只升不降,哪怕加的是毫无用处的变量。Adjusted R-squared 对每个预测变量都加以惩罚,所以只有当新变量确实有价值时它才会上升。比较模型时请用调整后的版本。
R 语言中怎么用回归模型预测新值?
构造一个数据框,让它的列名和预测变量一致,然后调用 predict(fit, newdata = ...)。加上 interval = "confidence" 可以得到平均响应的不确定性;加上 interval = "prediction" 可以得到单个新观测值可能落入的(宽得多的)范围。