跳转至

9.2   双因素方差分析

社团准备办一次公益义卖。小率负责比较两件事:海报是“简洁版”还是“彩色版”,推送时间是“中午”还是“晚上”。如果只看一个因素,就会漏掉另一个因素的影响。

图 9.2.0 小率设计义卖报名实验

海报风格 推送时间 报名人数
简洁 中午 31, 33, 32
简洁 晚上 48, 50, 47
彩色 中午 44, 46, 45
彩色 晚上 47, 49, 48
彩色海报看起来更吸引人,晚上推送也更好。那我分别做两个单因素 ANOVA 可以吗?
可以当作粗略探索,但会漏掉一个关键问题:彩色海报是不是只在中午特别有效?这就是交互作用。

9.2.1   两个因素会带来三个问题

双因素方差分析(Two-Way ANOVA)同时研究两个分类因素。它通常要回答三件事:

  • 因素 A 主效应:海报风格整体上是否影响报名人数?
  • 因素 B 主效应:推送时间整体上是否影响报名人数?
  • A × B 交互作用:海报风格的效果是否取决于推送时间?

图 9.2.1 双因素 ANOVA 先看交互再看主效应

交互作用可以用一句话判断:两条线是否平行。如果简洁海报从中午到晚上增加很多,而彩色海报从中午到晚上几乎不变,说明“时间的效果”取决于“海报风格”。

9.2.2   模型里多了一个乘法项

双因素 ANOVA 可以写成:

\[ Y=\mu+\alpha_i+\beta_j+(\alpha\beta)_{ij}+\varepsilon \]

这里:

  • \(\mu\) 是总体平均水平。
  • \(\alpha_i\) 是因素 A 的主效应。
  • \(\beta_j\) 是因素 B 的主效应。
  • \((\alpha\beta)_{ij}\) 是交互效应。
  • \(\varepsilon\) 是误差。

先看交互

如果交互作用显著,主效应的解释要更谨慎。因为“海报风格好不好”可能要分中午和晚上分别说。

9.2.3   双因素 ANOVA 表怎么读

双因素 ANOVA 表通常多出一行交互项:

来源 问的问题 读法
海报风格 简洁和彩色整体是否不同 主效应 A
推送时间 中午和晚上整体是否不同 主效应 B
海报风格 × 推送时间 一个因素的效果是否随另一个因素变化 交互作用
残差 同一条件下仍然存在的随机波动 组内误差

报告结果时,通常按这个顺序:

  1. 先报告交互作用是否显著。
  2. 若交互显著,再做简单效应分析。
  3. 若交互不显著,再解释主效应。

9.2.4   用 Python 拟合双因素 ANOVA

配套脚本放在:

docs/assets/scripts/ch09_anova/02_two_way_anova/main.py

核心代码如下:

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

df = pd.DataFrame({
    "style": ["简洁"] * 6 + ["彩色"] * 6,
    "time": ["中午"] * 3 + ["晚上"] * 3 + ["中午"] * 3 + ["晚上"] * 3,
    "count": [31, 33, 32, 48, 50, 47, 44, 46, 45, 47, 49, 48],
})

model = ols("count ~ C(style) * C(time)", data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)

别把交互作用当作小装饰

交互作用不是“额外加一行”这么简单。它会改变主效应的含义:有交互时,平均意义上的主效应可能掩盖局部差异。

也就是说,双因素 ANOVA 不只是省了两次分析,它能发现“组合方式”的效果。
对。现实里很多效果都不是单独发生的,而是和另一个条件一起发生的。

小率的笔记本

双因素 ANOVA 同时检验两个主效应和一个交互效应。画交互图时,线越不平行,越要怀疑交互。解释结果时先看交互,再看主效应。