方差分析(ANOVA)用于比较多个总体均值。它不逐对执行 t 检验,而是先用一个总体检验判断组间变异是否超过组内随机变异所能解释的范围。
核心思想
ANOVA 将总变异拆成组间和组内部分,并构造:
F 值大表示组均值之间的差异相对于组内波动较大。显著的总体 F 检验只说明至少有一组均值不同,不说明具体是哪几组。
常见设计
| 类型 | 结构 |
|---|---|
| 单因素 ANOVA | 一个分类自变量 |
| 双因素 ANOVA | 两个分类自变量及可能的交互作用 |
| 重复测量 ANOVA | 同一对象在多个时间或条件下测量 |
| ANCOVA | 分类因素加连续协变量 |
重复测量不能作为普通独立观测处理,应使用对应的重复测量或混合模型。
单因素 ANOVA
set.seed(123)
df <- data.frame(
group = rep(c("A", "B", "C"), each = 10),
value = c(
rnorm(10, 5, 1),
rnorm(10, 6, 1),
rnorm(10, 7, 1)
)
)
fit <- aov(value ~ group, data = df)
summary(fit)
Pr(>F) 是总体检验的 p 值。还应按组报告样本量、均值、标准差和区间。
模型假设
经典单因素 ANOVA 主要依赖:
- 观测独立;
- 模型形式正确;
- 各组误差方差相近;
- 小样本推断时残差近似正态。
检查应围绕模型残差,而不是只对每个原始组机械执行正态性检验:
par(mfrow = c(2, 2))
plot(fit)
par(mfrow = c(1, 1))
library(car)
leveneTest(value ~ group, data = df)
独立性来自研究设计,无法靠残差图补救。
事后比较
总体检验显著后,使用预先计划的对比或经过多重性控制的事后比较:
TukeyHSD(fit)
Tukey 结果给出组间均值差、置信区间和校正后的 p 值。不要在显著 ANOVA 之后再做一组未经校正的 t 检验。
双因素与交互作用
set.seed(42)
df2 <- expand.grid(
drug = c("A", "B"),
sex = c("Female", "Male"),
replicate = 1:12
)
df2$value <- rnorm(nrow(df2), 10, 2)
fit2 <- aov(value ~ drug * sex, data = df2)
summary(fit2)
drug * sex 展开为两个主效应和 drug:sex 交互作用。交互显著表示药物效应随性别而变化,此时不能脱离交互单独概括一个共同主效应。
绘制各组合的均值与区间有助于解释交互:
interaction.plot(
x.factor = df2$drug,
trace.factor = df2$sex,
response = df2$value
)
假设不满足时
- 方差明显不齐:考虑 Welch ANOVA;
- 强偏态或异常值且目标允许秩解释:考虑 Kruskal–Wallis;
- 聚类或重复测量:使用混合效应模型或相应重复测量方法;
- 预先指定少数科学对比:直接建模并控制这些对比。
替代方法改变了参数或零假设,不能只把它们看成“让 p 值正常”的按钮。
报告
报告设计、各组描述统计、F 值、自由度、p 值、效应大小,以及事后比较的差异与区间。总体检验、具体比较和图形应回答同一个研究问题。