多个虚拟变量的回归(One-way ANOVA)

Nov 8, 2023

前一篇文章证明了在两组比较中 $t^2 = F$,t检验、ANOVA、回归三者等价。

现在从两组推广到多组。单因素ANOVA有 $k$ 个处理组($k \ge 2$),想知道各组均值是否有差异。传统做法:算组间平方和、组内平方和、F统计量,查表做结论。

回归视角:把 $k$ 个组编码为 $k-1$ 个虚拟变量,做多元线性回归,然后做整体F检验。

从两组到多组:问题在哪?

两组时,一个虚拟变量就够了——$X=0$ 表示A组,$X=1$ 表示B组。多组时,你不能用一个变量编码"A、B、C"三种取值(因为 C 和 A 的差距不一定刚好是 B 和 A 的两倍,假设线性的数值关系毫无道理)。

解决方案:用 $k-1$ 个虚拟变量。

以三组为例。设对照组为A组,构造两个虚拟变量:

$$ X_{B} = \begin{cases} 1, & \rm{B组} \\ 0, & \rm{其他} \end{cases} \quad X_{C} = \begin{cases} 1, & \rm{C组} \\ 0, & \rm{其他} \end{cases} $$

A组对应 $(X_B, X_C) = (0, 0)$,作为参照组(reference group)。回归模型:

$$ Y = \beta_0 + \beta_B X_B + \beta_C X_C + \varepsilon $$

OLS估计结果:

ANOVA的F检验 = 回归的整体F检验

ANOVA的零假设是"所有组均值相等":

$$ H_0: \mu_{\rm A} = \mu_{\rm B} = \mu_{\rm C} $$

在回归语言里,这等价于:

$$ H_0: \beta_B = \beta_C = 0 $$

即"所有虚拟变量的系数同时为零"。这恰好是回归的整体F检验(overall F-test)要检验的假设。

ANOVA计算:

$$ F = \frac{SS_{\rm between} / (k - 1)}{SS_{\rm within} / (N - k)} $$

回归的整体F检验计算:

$$ F = \frac{(TSS - RSS) / (k - 1)}{RSS / (N - k)} $$

其中 $TSS$ 是总平方和(仅截距模型的残差平方和),$RSS$ 是全模型的残差平方和。可以证明:$TSS - RSS = SS_{\rm between}$,$RSS = SS_{\rm within}$。

所以F统计量完全相等。

一个三组的数值验证

三组数据:

用 R 做单因素 ANOVA:

A <- c(3.0, 3.5, 3.2, 3.8)
B <- c(5.0, 5.5, 5.3, 4.8)
C <- c(7.0, 7.2, 6.8, 7.5)
Y <- c(A, B, C)
group <- factor(rep(c("A", "B", "C"), each = 4))
summary(aov(Y ~ group))

用 R 做回归:

summary(lm(Y ~ group))
            Df Sum Sq Mean Sq F value   Pr(>F)
group        2 28.152  14.076     137 1.83e-07 ***
Residuals    9  0.925   0.103
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

---

Call:
lm(formula = Y ~ group)

Residuals:
    Min      1Q  Median      3Q     Max
-0.3750 -0.2125 -0.0250  0.2000  0.4250

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   3.3750     0.1603   21.05 5.77e-09 ***
groupB        1.7750     0.2267    7.83 2.63e-05 ***
groupC        3.7500     0.2267   16.54 4.81e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.3206 on 9 degrees of freedom
Multiple R-squared:  0.9682,    Adjusted R-squared:  0.9611
F-statistic:   137 on 2 and 9 DF,  p-value: 1.827e-07

回归输出的 F-statistic 和 ANOVA 表的 F 值完全一致。

参照组的选择

你可能会问:为什么选A组作为参照组?选B组或C组行不行?

都可以。回归系数会随之变化($\beta_B$ 变成"B相对于新的参照组"),但整体F检验的结果不变。因为不管参照组是谁,模型拟合的 $\hat{Y}$ 是一样的——每个组的预测值仍然等于该组的样本均值。F检验只关心"加入虚拟变量之后模型是否有显著改进",不关心单个系数的含义。

这就是ANOVA的妙处:它只问"组间有没有差异",不问你"谁比谁高多少"。回归框架完美复现了这一逻辑。

虚拟变量的矩阵形式

更一般地,$k$ 组需要 $k-1$ 个虚拟变量。回归的设计矩阵(design matrix)长这样:

$$ X = \begin{bmatrix} 1 & 0 & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & & \vdots \\ 1 & 1 & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & & \vdots \\ 1 & 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \vdots & & \vdots \\ \end{bmatrix} $$

第一列全是 $1$(截距),后面 $k-1$ 列分别标识第 $2, 3, \ldots, k$ 组的成员。模型就是 $Y = X\beta + \varepsilon$。

OLS的正规方程 $(X'X)\hat\beta = X'Y$ 解出来,每个系数恰好是"该组均值减参照组均值"。

回归的t检验告诉你什么?

回归不仅给你整体F检验,还给每个系数的t检验。这比ANOVA多出来的信息是:你可以看具体哪一组和参照组有显著差异。

但要注意,这些t检验没有做多重比较校正。如果你想做所有两两比较(pairwise comparisons),ANOVA框架下有 Tukey HSD、Bonferroni 等方法,回归框架下也可以手动实现。本质上还是同一个东西——你只是在用不同的接口调同一个模型。

一个有意思的视角

学ANOVA的时候,教科书通常会讲"总变异 = 组间变异 + 组内变异"的平方和分解。这个分解在回归里叫"方差分析表"(ANOVA table)——注意到没?回归的输出里本身就有一个叫"ANOVA"的表。

不是巧合。是同一个东西的两个名字。

基础统计里有很多这样的"同一事物不同名字":t检验的 pooled 方差就是回归的 MSE,组间平方和就是回归平方和,组内平方和就是残差平方和。学通了之后回头看,会觉得教科书故意把简单的事情拆散来讲。

拆散也有拆散的好处——每个概念独立讲,初学者不容易混淆。但代价是你看不到全貌。这个系列的目的,就是把拼图重新拼回去。