第10讲:简单线性回归
2026年04月29日
cor.test() 检验相关系数是否显著wt 与 mpg 的相关系数 \(r = -0.87\),这就是今天回归分析的起点
summary(lm()) ——R 语言输出逐行解析predict() 函数的使用初中就学过的简单方程
\[ y = a - bx\] 在中学时,\(a\) 和 \(b\) 是已知数,我们的任务是:任意给定一个\(x\),求出\(y\)的值。
但现在,我们的已知条件和未知条件变了,相应的,任务也变了!
注记
一个维多利亚时代的发现
Francis Galton(1822—1911)
他的发现让他惊讶:
父母亲极高 → 子女通常会比父母亲矮一些
父母亲极矮 → 子女通常会比父母亲高一些
子女的身高总是倾向于向平均值靠拢。
高尔顿把这个现象叫做:
"Regression to the Mean"
向均值回归
为什么会这样?
极端结果 = 真实遗传因素 + 运气(随机误差)
下一代再抽一次,运气不再那么极端,结果就"回归"到了均值附近。
提示
生活中的"回归均值":
这是统计规律,不是命运。
注记
后来,"回归"这个词被数学家卡尔·皮尔逊(Karl Pearson)推广,用来指代所有"用一个变量预测另一个变量"的统计方法。今天我们说的"回归分析",用法早已超越了高尔顿的原意——但名字保留下来了。
从散点图到一条直线
看到散点图,我们想画一条直线来概括趋势:
这条直线的方程就是简单线性回归方程:
\[\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x\]
\[y = \underbrace{\beta_0}_{\text{截距}} + \underbrace{\beta_1}_{\text{斜率}} x + \underbrace{\varepsilon}_{\text{误差项}}\]
| 符号 | 名称 | 含义 | 财务案例 |
|---|---|---|---|
| \(y\) | 因变量 | 我们想预测的量 | 销量 |
| \(x\) | 自变量 | 我们用来预测的量 | 广告费 |
| \(\beta_0\) | 截距 | \(x=0\) 时,\(y\) 的理论值 | 不投广告时的基础销量 |
| \(\beta_1\) | 斜率 | \(x\) 每增加 1 个单位,\(y\) 增加多少 | 每多投 1 万广告,销量增加多少 |
| \(\varepsilon\) | 误差项 | 模型无法解释的随机波动 | 季节、促销、偶然因素…… |
注记
\(\beta_0\) 和 \(\beta_1\) 是未知的总体真实值,我们用数据估计它们,估计值写作 \(\hat{\beta}_0\) 和 \(\hat{\beta}_1\)(读作"β hat")。
怎么找到"最好"的那条直线?
答案:让所有点到直线的距离之和最小的那条线!
残差(Residual):实际值与预测值的差
\[e_i = y_i - \hat{y}_i = y_i - (\hat{\beta}_0 + \hat{\beta}_1 x_i)\]
目标: 找到 \(\hat{\beta}_0\) 和 \(\hat{\beta}_1\),使残差平方和(RSS)最小:
\[\text{minimize} \quad \text{RSS} = \sum_{i=1}^{n} e_i^2 = \sum_{i=1}^{n}(y_i - \hat{\beta}_0 - \hat{\beta}_1 x_i)^2\]
提示
为什么要"平方"?
注记
OLS 不需要手算。 你只需要理解它的目标:让误差最小。R 语言一行代码 lm() 就能完成所有计算。
通过微积分(对 RSS 求偏导,令导数为零),可以解出:
\[\hat{\beta}_1 = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n}(x_i - \bar{x})^2} = r_{xy} \cdot \frac{s_y}{s_x}\]
\[\hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x}\]
从公式看出几件事:
重要
考试不要求手推公式。
但要知道:
① OLS 是"让误差平方和最小"
② R 语言用 lm() 自动完成计算
summary(lm())
R 输出的每一行都有含义
用上讲已经探索过的 mtcars 数据:
Call:
lm(formula = mpg ~ wt, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.543 -2.365 -0.125 1.410 6.873
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.285 1.878 19.86 < 2e-16 ***
wt -5.344 0.559 -9.56 1.3e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.05 on 30 degrees of freedom
Multiple R-squared: 0.753, Adjusted R-squared: 0.745
F-statistic: 91.4 on 1 and 30 DF, p-value: 1.29e-10
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.285 1.878 19.86 < 2e-16 ***
wt -5.344 0.559 -9.56 1.29e-10 ***
| 列名 | 含义 | 本例解读 |
|---|---|---|
Estimate |
系数估计值 \(\hat{\beta}\) | 截距=37.3,斜率=-5.34 |
Std. Error |
估计的不确定性(标准误) | 斜率的标准误=0.56 |
t value |
\(t\) 统计量 = Estimate ÷ Std.Error | \(-5.344/0.559 = -9.56\) |
Pr(>|t|) |
双尾 \(p\) 值 | \(p < 0.001\),极其显著 |
*** |
显著性星号 |
*** = \(p < 0.01\)
|
提示
业务语言解读斜率:wt 的 Estimate = −5.344,意思是:车重每增加 1000 磅,每加仑油预期行驶里程下降 5.344 英里。
p-value = 1.29e-10,意思是:如果车重和油耗真的无关,观察到这么强的负相关的概率不到十亿分之一。
| \(p\) 值范围 | 标记 | 含义 | 记忆方法 |
|---|---|---|---|
| \(p < 0.01\) | *** |
极其显著 | 三颗星,最强 |
| \(0.01 \leq p < 0.05\) | ** |
非常显著 | 两颗星 |
| \(0.05 \leq p < 0.10\) | . |
边缘显著 | 注意,不算显著! |
| \(p \geq 0.10\) | (空白) | 不显著 | 无法拒绝原假设 |
重要
统计显著 ≠ 实际重要
\(p\) 值只告诉你"这个系数是否可靠或可信",不告诉你系数有多大、在业务上是否重要。
样本量极大时,即使非常小的效应也会显著(\(p < 0.05\))。
Multiple R-squared: 0.7528
Adjusted R-squared: 0.7446
F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10
\(R^2\)(决定系数)= 0.753
车重(
wt)解释了油耗(mpg)75.3% 的变异。
剩余 24.7% 由其他因素(发动机、气动……)决定。
\[R^2 = 1 - \frac{\text{SS}_\text{Residual}}{\text{SS}_\text{Total}} \in [0, 1]\]
\(F\) 检验:p = 1.29e-10
整个模型(不只是某个系数)是否有预测价值?
\(p < 0.05\) → 模型整体显著,回归有意义。
注记
简单回归中: \(F\) 检验的 \(p\) 值 = 斜率 \(t\) 检验的 \(p\) 值(因为只有一个自变量)。
多元回归中: \(F\) 检验和各系数 \(t\) 检验的 \(p\) 值可以不同。
广告费能预测销量吗?
月份 广告费 销量
1 1 12 25
2 2 15 28
3 3 18 32
4 4 20 35
5 5 22 38
6 6 25 42
7 7 28 46
8 8 30 50
9 9 32 53
10 10 35 57
11 11 38 61
12 12 40 65
提示
原则:永远先画散点图,再建模型。 如果散点图呈现非线性(如 U 形、指数型),直接套线性回归就会出错。
Call:
lm(formula = 销量 ~ 广告费, data = ad_data)
Residuals:
Min 1Q Median 3Q Max
-0.860 -0.339 -0.146 0.281 1.237
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.4399 0.5673 11.3 4.9e-07 ***
广告费 1.4436 0.0205 70.4 8.2e-15 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.619 on 10 degrees of freedom
Multiple R-squared: 0.998, Adjusted R-squared: 0.998
F-statistic: 4.95e+03 on 1 and 10 DF, p-value: 8.18e-15
回归方程:
\[\widehat{\text{销量}} = 6.44 + 1.44 \times \text{广告费}\]
截距 \(\hat{\beta}_0 = 6.44\)
广告费为 0 时,预期销量约 6.44 万件。
→ 这是品牌自然流量、回头客带来的基础销量。
斜率 \(\hat{\beta}_1 = 1.44\)
广告费每增加 1 万元,销量预期增加 1.44 万件。
→ 广告投入的边际效益是 1.44。
\(p < 0.001\)(***)
→ 广告费对销量的影响极其显著。
\(R^2 = 0.998\)
→ 广告费解释了销量 99.8% 的变异。
→ 模型拟合非常好(但要注意:数据只有 12 个月,样本量小)。
注记
\(R^2\) 极高有时要警惕:样本量太小或变量之间有内在依赖(如时间序列)都会人为抬高 \(R^2\)。
重要
财务决策者真正关心的问题:
"我多花 10 万元广告费,值吗?"
用回归方程回答:
\[\Delta\widehat{\text{销量}} = 1.44 \times \Delta\text{广告费} = 1.44 \times 10 = 14.4 \text{ 万件}\]
进一步:如果每件商品利润 = 2 元,则
\[\text{增量利润} = 14.4 \times 2 = 28.8 \text{ 万元}\]
\[\text{广告 ROI} = \frac{28.8}{10} = 2.88\]
每投入 1 万元广告,带来 2.88 万元利润回报——这就是回归分析的业务价值。
用模型预测新数据
predict() 函数的基本用法 1
78.6
注记
点预测给出一个数值,但这个数值一定有不确定性。更诚实的做法是给出区间估计。
fit lwr upr
1 78.6 77.5 79.8
fit lwr upr
1 78.6 76.8 80.4
| 置信区间 | 预测区间 | |
|---|---|---|
| 回答的问题 | 均值销量的范围? | 某月实际销量的范围? |
| 宽度 | 较窄 | 较宽(包含 \(\varepsilon\)) |
| 用于 | 评估模型精度 | 实际业务预测 |
# 生成预测数据
pred_range <- data.frame(广告费 = seq(5, 55, length.out = 100))
conf_int <- predict(ad_model, newdata = pred_range, interval = "confidence")
pred_int <- predict(ad_model, newdata = pred_range, interval = "prediction")
plot_df <- bind_cols(pred_range,
as.data.frame(conf_int) |> rename(fit=fit, conf_lwr=lwr, conf_upr=upr),
as.data.frame(pred_int) |> select(pred_lwr=lwr, pred_upr=upr))
ggplot(plot_df, aes(x = 广告费)) +
geom_ribbon(aes(ymin = pred_lwr, ymax = pred_upr),
fill = "#4472C4", alpha = 0.15) +
geom_ribbon(aes(ymin = conf_lwr, ymax = conf_upr),
fill = "#e05c2a", alpha = 0.3) +
geom_line(aes(y = fit), color = "#e05c2a", linewidth = 1.3) +
geom_point(data = ad_data, aes(x = 广告费, y = 销量),
size = 3, color = "#1a3a5c") +
annotate("text", x = 8, y = 90,
label = "蓝色宽带:预测区间(单次实际值)", color = "#4472C4",
hjust = 0, size = 3.5) +
annotate("text", x = 8, y = 85,
label = "橙色窄带:置信区间(均值范围)", color = "#e05c2a",
hjust = 0, size = 3.5) +
labs(
title = "回归预测的两种区间",
subtitle = "预测区间 ⊃ 置信区间:前者更宽,因为包含了个体随机误差",
x = "广告费(万元)", y = "销量(万件)"
)重要
不要在数据范围之外随意外推!
我们的数据只覆盖广告费 12—40 万元的范围。预测广告费 = 200 万元时的销量,完全是在猜测——市场可能早就饱和了。
学习路线图
重要
以下内容是本课程的基础,期末考试必考,实际工作必用:
注记
以下内容理解含义即可,不需要记公式、不需要手算:
OLS 的数学推导:斜率和截距的求解公式(\(\hat{\beta}_1 = r_{xy} \cdot {s_y\over s_x}\))——知道 R 在帮你算就好
\(t\) 统计量的计算:知道 \(t = {\hat{\beta}_1 \over \text{SE}(\hat{\beta}_1)}\),知道它用来检验"系数是否为零"
\(F\) 统计量:知道它检验"整体模型是否有价值",会看 \(p\) 值就够
置信区间的数学公式:\(\hat{\beta}_j \pm t_{0.025} \times \text{SE}(\hat{\beta}_j)\)——R 的 confint() 直接给你
警告
以下是初学者最容易犯的错误,请对照检查:
| 错误 | 正确理解 |
|---|---|
| "\(p\) 值越小,说明系数越大" |
\(p\) 值只说明显著性,系数大小看 Estimate
|
| "\(R^2 = 0.99\) 说明模型完美" | \(R^2\) 高可能是过拟合,要结合样本量和业务判断 |
| "相关就是因果" | 回归不能证明因果,只能量化关联 |
| "模型显著,可以随意外推" | 数据范围之外的预测不可靠,需要领域知识支撑 |
| "截距没有意义,忽略它" | 截距是回归方程的一部分,忽略会导致预测错误 |
回归的历史:高尔顿 1886 年发现"向均值回归","regression"由此得名;今天的回归分析用途已大大扩展
回归方程:\(\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x\);截距是 \(x=0\) 时 \(y\) 的基准值;斜率是 \(x\) 每变化一个单位,\(y\) 预期变化多少
OLS:通过最小化残差平方和找到最优直线;不用手算,lm() 自动完成
读懂输出:Estimate(系数大小)→ Pr(>|t|)(显著性)→ R-squared(解释力)→ F-statistic(整体有效性)
预测:predict() 做点预测;置信区间估计均值,预测区间估计单次实际值;不要在数据范围外随意外推
使用 mtcars 数据集,建立用马力(hp)预测油耗(mpg)的回归模型。写出回归方程,解释斜率的实际含义,判断 \(p\) 值和 \(R^2\)
对上述模型,用 predict() 预测当 hp = 150 时的 mpg,并给出 95% 预测区间
在第 1 题的散点图中,用 geom_smooth(method = "lm") 画出回归线,叠加 95% 置信区间阴影.
使用 diamonds 数据集,建立用克拉数(carat)预测价格(price)的回归模型。注意:先画散点图——关系是线性的吗?如果不是,尝试对 price 取对数后再建模,比较两个模型的 \(R^2\)
思考题:高尔顿的"向均值回归"是一种统计规律,不是命运。你能想到生活或工作中被误解为因果的"回归均值"案例吗?(提示:体育运动员的"二年级诅咒")
lm(y ~ x1 + x2 + x3) 语法,vif() 函数,逐步回归提示
今天的简单回归是基础。多元回归只是在右边多加几个 \(x\),核心逻辑完全一致。把今天的内容搞透,下讲就会非常轻松。
第10讲:简单线性回归
「回归分析让我们能够用数据说话,而不是靠感觉拍脑袋。」
—— 弗朗西斯·高尔顿(Francis Galton),1886
数据挖掘与R语言 | 第10讲:简单线性回归