跳转至

8.2   简单线性回归

本节学习目标

  • 看懂「用一根直线代表一片散点」是怎么回事,会用最小二乘法 (OLS) 的结果
  • \(R^2\) 读成「这根线比一律猜平均强多少」
  • 明白同样的广告效应,换一批城市估出来会上下浮动,所以要给一个 区间
  • statsmodels 在广告数据上跑通拟合、置信区间与预测
  • (选读)想知道公式是怎么推出来的,看 §8.2.8

8.2.1   多投 1 万广告能换多少销售

某连锁奶茶品牌想知道:在不同城市投入的 广告费 究竟带来了多少 销售额 ?市场部从 10 个城市抓了一年的数据,把每个城市的广告投入(万元)和当年销售额(百万元)画成散点图,云团明显向右上方延伸——广告多的城市销售也高

但老板要的不是『高低』,而是一句具体的话:『再加 1 万广告,平均能带来多少销售?』这个『多少』必须是一根线、一个斜率、一个数字。散点图上能凭眼睛画无数条线,问题是——哪一条最能代表这堆点?

凭眼睛画线我也能画啊, 凭啥某条最好?
凭一个谁都服气的规则。 这节我们一步步把它找出来。

这就是本节的故事:从一片散点云里抠出一根有意义的直线,并诚实地说出『这根线靠不靠谱』。老板还会追问一句更狠的:这根线,到底比『不看广告、一律猜平均销售』强多少?我们一个一个回答。


8.2.2   先用眼睛找那根线

把那 10 个城市想成 10 把图钉钉在墙上,你手里有一根橡皮筋直尺。怎么放这把尺,才算『最贴近』这些钉子?

最小二乘法 (OLS) 的回答只有一句:让每个钉子到尺子的竖直距离,平方之后加起来最小

  • 为什么是 竖直 距离?因为我们要回答的是『给定广告投入,销售额偏了多少』,看的是上下方向,不是斜着量。
  • 为什么要 平方 ?因为正负偏差不平方就会互相抵消;平方后既都变成正的,又对『偏得特别离谱』的点惩罚更重。
就一句话: 竖直距离平方和最小。 别想斜着量, 别想绝对值。

先别急着写公式,用下面这个动画亲手感受一下:每个点是一座城市,橙线是当前这批城市里『最贴近』的那条线。

图 8.2.1 最小二乘拟合

图 8.2.1   灰色竖线是残差;OLS 找的就是『所有竖线长度平方和最小』的那条直线。
噪声一调大, 拟合线就乱晃!

记住三句直觉就够了:(1) OLS 是几何上的『最贴近』;(2) 这条线一定穿过数据的重心 \((\bar{x}, \bar{y})\);(3) 一个离群的极端城市,因为残差被平方,会把整根线撬歪——所以一颗『钉子』也可能让尺子转向。


8.2.3   手把手算出广告的回报

直觉有了,怎么把那根线真的算出来?我们假设广告投入 \(x\) 和销售额 \(y\) 背后有一条 真实直线,但每座城市还会被随机因素(节假日、对手、天气)扰一下:

\[ y = \beta_0 + \beta_1 x + \varepsilon \]
  • \(\beta_1\)斜率:广告每多投 1 万,销售平均多多少——老板真正想要的那个数;
  • \(\beta_0\)截距:完全不打广告时的销售底盘;
  • \(\varepsilon\) 是没法解释的随机扰动。

OLS 解出的『最贴近直线』有一个现成的公式,先 拿来用(它是怎么推出来的,放在 §8.2.8 选读):

\[ \hat{\beta}_1 = \dfrac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2}, \qquad \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} \]

市场部那 10 个城市,先算几个汇总量:广告均值 \(\bar{x}=5\)、销售均值 \(\bar{y}=15\),再算出 \(\sum (x_i-\bar{x})^2 = 80\)\(\sum (x_i-\bar{x})(y_i-\bar{y}) = 128\)。代进去:

\[ \hat{\beta}_1 = \dfrac{128}{80} = 1.6, \qquad \hat{\beta}_0 = 15 - 1.6 \times 5 = 7 \]
所以广告每多 1 万, 销售平均多 1.6 百万?
对。 截距 7 是不打广告的底盘。 这就是老板要的答案。

顺带一个漂亮的小发现:这个斜率正好等于 上一节的相关系数 \(r\) 换算了单位,即 \(\hat{\beta}_1 = r \cdot s_y / s_x\)。换句话说,回归就是给『相关』装上了单位——相关说『同涨同跌有多齐』,回归说『多 1 万换几百万』。

你知道吗

『最小二乘法』之父是高斯(Gauss)。1801 年,他用这套方法根据天文学家仅有的少量观测,预测了小行星 Ceres 重新出现的位置——结果完全准确,震惊了整个欧洲天文学界。同一时期勒让德(Legendre)也独立发表了同样的方法,两人为优先权争论已久;但今天公认高斯不仅更早,还配套证明了它在『正态误差』下的统计最优性。


8.2.4   这根线画得好不好:R²

线画好了,怎么说它『画得好』?StatQuest 有个特别好用的问法:拿你的线,去跟一个 最笨的基准 比。

  • 最笨的基准(只猜均值):完全不看广告,对每座城市都预测销售 \(=\bar{y}\)。这时数据围着均值上下散开的总量,记作 \(\text{SS(mean)}\)
  • 你的拟合线(用上广告):预测 \(\hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i\)。这时数据围着拟合线还剩下的散开量,记作 \(\text{SS(fit)}\)

用了广告之后『被消掉』的那部分散开量,占原来的比例,就是 决定系数 \(R^2\)

\[ R^2 = \dfrac{\text{SS(mean)} - \text{SS(fit)}}{\text{SS(mean)}} \]
$R^2$ 就一句话: 用了广告之后, 围着均值的散开消掉了几成

图 8.2.2 R² 的方差分解

图 8.2.2   同一份广告数据:左图竖线是『围着均值』的散开 SS(mean),右图竖线是『围着拟合线』剩下的散开 SS(fit);右图明显短了一截,短掉的比例就是 $R^2$。

写成课本里的记号也一样:\(\text{SS(mean)}\) 是总变异 SST,\(\text{SS(fit)}\) 是残差 SSE,于是 \(R^2 = 1 - \text{SSE}/\text{SST}\),取值在 \(0\)\(1\) 之间,越大越好。简单线性回归里还有个巧合:\(R^2 = r^2\),正好是相关系数的平方。

10 个城市的例子算出来 \(R^2 \approx 0.91\),也就是说 广告一个因素,就解释了九成的销售差异。如果还想知道『预测一座新城市平均会差多少』,看 残差标准误 \(s\)(相当于这根线的『典型误差棒』),它就是把剩下的散开量摊到每个点上再开方。

$R^2$ 高也别先得意——它看不出漏掉了别的变量。

8.2.5   斜率靠不靠谱:换一批城市试试

上面那个 \(1.6\),是从 这 10 座城市 算出来的。要是市场部当初抽的是另外 10 座城市呢?

那算出来的 1.6, 换一批城市还会是 1.6 吗?
多半不会, 会上下飘。 但飘得有规律——来看。

下面的动画就在干这件事:假设广告的真实效应是 \(1.6\),反复『再抽一组城市』,每组各算一次广告效应的估计,把它们堆成柱子。

所以一个估计光报 \(1.6\) 是不够的,还得告诉别人它『能飘多远』。统计学用 标准误 \(\text{SE}(\hat{\beta}_1)\) 量这个飘动幅度,再据此给一个 置信区间(用法先记住,推导见 §8.2.8):

\[ 95\% \text{ 置信区间} = \hat{\beta}_1 \pm t_{0.025,\,n-2} \cdot \text{SE}(\hat{\beta}_1) \]

回到 10 城的例子,算出 \(\text{SE}(\hat{\beta}_1) \approx 0.18\),于是:

  • \(t = 1.6 / 0.18 \approx 9.0\),远大于临界值——几乎不可能是『广告其实没用』的巧合
  • 95% 置信区间约 \([1.19,\ 2.01]\)

老板要的答案于是变成一句更诚实的话:每万元广告大约带来 1.2 ~ 2.0 百万销售,最佳猜测 1.6

别只报 1.6 ——1.19 到 2.01 都可能。 点估计 + 区间, 一起报。

8.2.6   预测一个新城市:两种区间

回归这根线有两种用法:解释(盯着斜率 \(1.6\) 说『广告的边际效应』,但要不要读成因果,先回看 §8.1)和 预测(给一座新城市的广告投入 \(x_0\),估它的销售)。

做预测时要分清你问的是哪一种,因为区间宽窄差很多:

  • 问『一类城市的平均销售』(均值置信区间):只有那根线本身的不确定,区间
  • 问『某一座具体城市的销售』(预测区间):除了线的不确定,还要再加上这座城市自己的随机扰动 \(\varepsilon\),区间 得多。
\[ \hat{y}_0 \pm t_{\alpha/2,\,n-2} \cdot s \sqrt{1 + \dfrac{1}{n} + \dfrac{(x_0 - \bar{x})^2}{S_{xx}}} \]

公式里那个孤零零的 +1,就是『还没发生的随机扰动』——它只出现在预测区间里。还有一点:\(x_0\) 离样本中心越远,根号里的 \((x_0-\bar{x})^2\) 越大,两种区间都越宽。

图 8.2.3 均值置信带 vs 预测带

图 8.2.3   深色窄带是『平均销售』的置信带,浅色宽带是『某座城市销售』的预测带;预测带更宽,因为它多吞了随机扰动 $\varepsilon$,而且两条带都在远离样本中心处张开。
样本只到 10 万, 我能预测 50 万吗?
能算, 但区间会宽到没用。 外推有惩罚, 别赌

应用场景

营销 ROI 估计、电商定价(销量 vs 价格弹性)、临床剂量-效应曲线、传感器线性校准——只要相信 \(X\)\(Y\) 在你关心的范围里近似一条直线,简单线性回归就是最透明、最易复盘的工具。


8.2.7   用 Python 把广告数据跑到底

手算太累, Python 能一口气出结果吗?
能。 `statsmodels` 一个 `.summary()` ——一栏对一句话

我们造一份带固定随机种子、可复现的 拟真广告数据(200 座城市,电视 / 广播 / 报纸投入 → 销售额,系数呼应 ISLP 第 3 章),先只用电视广告 TV 做简单回归。完整脚本见 docs/assets/scripts/ch08_regression/02_simple_linear_regression.py

import numpy as np, pandas as pd
import statsmodels.formula.api as smf

rng = np.random.default_rng(8)              # 固定 seed -> 结果可复现
n = 200
TV = rng.uniform(0, 300, n)
sales = 2.9 + 0.046 * TV + rng.normal(0, 1.7, n)
df = pd.DataFrame({"TV": TV, "sales": sales})

model = smf.ols("sales ~ TV", data=df).fit()
print(model.summary())                      # ① 一张完整报告
print(model.conf_int())                     # ② 系数的置信区间
new = pd.DataFrame({"TV": [50, 150, 250]})
print(model.get_prediction(new).summary_frame())   # ③ 平均区间 vs 预测区间

① 报告(节选) ——表里每个数字,都能在前几节找到对应的那句话:

                 coef    std err          t      P>|t|      [0.025      0.975]
Intercept      7.6631      0.455     16.835      0.000       6.765       8.561
TV             0.0464      0.003     17.096      0.000       0.041       0.052
R-squared:      0.596     F-statistic: 292.3     Prob (F): 7.58e-41   n = 200
报告里这一栏 就是前面说的 这里读到什么
coef (TV) 斜率 \(\hat{\beta}_1\)(§8.2.3) 每多 1 单位电视广告,销售平均 +0.046
std err 标准误 \(\text{SE}\)(§8.2.5) 这个估计能飘 \(\pm 0.003\)
t / P>\|t\| \(t\) 检验(§8.2.5) \(t=17\)\(p\approx 0\),广告 确实有用
R-squared \(R^2\)(§8.2.4) 单靠电视广告解释了 约 60% 的销售差异

② 置信区间 model.conf_int() 给出 \(\hat{\beta}_{TV}\) 的 95% 区间 \([0.0411,\ 0.0518]\)——和报告最后两栏一致。

③ 平均区间 vs 预测区间 get_prediction(...).summary_frame()

 TV    mean   mean_ci_lower  mean_ci_upper   obs_ci_lower  obs_ci_upper
 50    9.984        9.304        10.664           3.557        16.411
150   14.626       14.173        15.078           8.219        21.032
250   19.267       18.545        19.989          12.836        25.699

\(TV=150\):『一类城市的平均销售』区间 \([14.17, 15.08]\) 又窄又稳;『某一座城市的销售』区间 \([8.22, 21.03]\) 宽得多。这正是 §8.2.6 那个 +1 的代价,画出来就是上面 图 8.2.3 的内窄外宽两条带。

最后给模型做个体检:把残差对拟合值画出来,看有没有违反假设(喇叭口、弯曲趋势都是警报)。

图 8.2.4 残差-拟合诊断图

图 8.2.4   残差随机散布在 0 线两侧、没有喇叭口也没有曲线趋势,说明『线性 + 同方差』大致成立——这张图是 §8.4 回归诊断的预演。
原来报告里每个数, 都能在前面找到家!

8.2.8   选读 · 公式从哪来:正规方程到抽样分布

前面我们一直『拿来就用』。这一节把那几个公式补上推导,给想深究的读者;只想会用的,可以直接跳到小结

一、闭式解:两条正规方程

要让残差平方和 \(\text{RSS} = \sum (y_i - \beta_0 - \beta_1 x_i)^2\) 最小,对 \(\beta_0, \beta_1\) 分别求偏导并置 0,得到两条 正规方程 (normal equations)

\[ \frac{\partial \text{RSS}}{\partial \beta_0} = -2\sum (y_i - \beta_0 - \beta_1 x_i) = 0 \;\Longrightarrow\; \sum e_i = 0 \]
\[ \frac{\partial \text{RSS}}{\partial \beta_1} = -2\sum x_i (y_i - \beta_0 - \beta_1 x_i) = 0 \;\Longrightarrow\; \sum x_i e_i = 0 \]

第一条 \(\sum e_i = 0\) 正是『拟合线必过重心 \((\bar{x}, \bar{y})\)』的代数原因;两条联立就解出 §8.2.3 那个闭式公式。

二、\(\hat{\beta}_1\) 的无偏性、方差与抽样分布

\(X\) 看作固定,唯一的随机性来自误差。记 \(S_{xx} = \sum (x_i - \bar{x})^2\),闭式解可写成 \(Y_i\) 的线性组合:

\[ \hat{\beta}_1 = \sum w_i Y_i, \qquad w_i = \dfrac{x_i - \bar{x}}{S_{xx}}, \qquad \sum w_i = 0,\ \sum w_i x_i = 1 \]

无偏(估计的期望等于真值):

\[ E[\hat{\beta}_1] = \sum w_i (\beta_0 + \beta_1 x_i) = \beta_0 \underbrace{\textstyle\sum w_i}_{0} + \beta_1 \underbrace{\textstyle\sum w_i x_i}_{1} = \beta_1 \]

方差与标准误(各 \(Y_i\) 独立、方差都是 \(\sigma^2\),且 \(\sum w_i^2 = 1/S_{xx}\)):

\[ \text{Var}(\hat{\beta}_1) = \sigma^2 \sum w_i^2 = \dfrac{\sigma^2}{S_{xx}}, \qquad \text{SE}(\hat{\beta}_1) = \dfrac{\hat{\sigma}}{\sqrt{S_{xx}}} \]

这就解释了动画 8.2.2 的现象:城市越多 \(S_{xx}\) 越大,柱子越窄;噪声 \(\sigma\) 越大,柱子越宽。误差正态时,\(\hat{\beta}_1\) 也正态,用估计的 \(\hat{\sigma}\) 代替 \(\sigma\) 后变成 \(t\) 分布:

\[ \dfrac{\hat{\beta}_1 - \beta_1}{\text{SE}(\hat{\beta}_1)} \sim t_{\,n-2} \]

为什么是 \(n-2\):两条正规方程各锁住一个自由度,残差只在 \(n-2\) 维里自由活动,用 \(n-2\) 作分母才能让 \(\hat{\sigma}^2 = \text{SSE}/(n-2)\) 无偏。这正是 §8.2.4 残差标准误里那个 \(n-2\) 的来历。

原来 n−2 不是凑的, 是两条方程扣出来的。

三、Gauss-Markov 与 OLS = MLE

Gauss-Markov 定理:只要满足 线性、误差不相关、同方差 这三条(注意:不含正态性),OLS 就是 最佳线性无偏估计 (BLUE) ——所有无偏的线性估计里方差最小。

正态性是 额外 的一条,它的用处有两个:让 §8.2.5 的 \(t\)\(F\) 检验是 精确 的;以及——当误差正态时,最大化似然恰好等于最小化残差平方和。写出高斯对数似然:

\[ \ell(\beta_0, \beta_1, \sigma^2) = -\dfrac{n}{2}\ln(2\pi\sigma^2) - \dfrac{1}{2\sigma^2}\sum (y_i - \beta_0 - \beta_1 x_i)^2 \]

\(\beta\) 求极大只跟最后那个求和项有关,而它正是 RSS,于是 \(\hat{\beta}^{\text{MLE}} = \hat{\beta}^{\text{OLS}}\)

口诀: BLUE 只要线性 + 不相关 + 同方差; 正态是另算的。

8.2.9   本节小结

  • OLS 的规则只有一句:竖直残差平方和最小,由此得到唯一的最优直线,斜率 \(\hat{\beta}_1 = r \cdot s_y/s_x\)
  • \(R^2\) = 围着均值的散开被消掉了几成\(\text{SS(mean)}\)\(\text{SS(fit)}\) 之差占比),等价于 \(1-\text{SSE}/\text{SST}\)
  • 同一个斜率,换一批样本会上下飘;飘动幅度就是标准误,据此给 置信区间,点估计和区间要一起报。
  • 预测『一类城市的平均』用窄的置信区间,预测『某一座城市』用宽的预测区间——后者多吞一个随机扰动 \(\varepsilon\),外推还要付『区间变宽』的代价。
  • 想深究公式来历看 §8.2.8:正规方程、无偏性、\(\text{Var}=\sigma^2/S_{xx}\)\(t_{n-2}\)、Gauss-Markov 与 OLS=MLE。
  • 下节 §8.3 把 1 个 \(X\) 推广到 \(p\)\(X\),进入多元线性回归。