为什么 2 x 2 ANOVA 的 I 类错误率为 10-15%?

机器算法验证 方差分析 多重比较 类型 i 和 ii 错误
2022-04-18 21:55:48

在使用 R 测试 I 类错误率时,我发现使用 2-way ANOVA 的误报率高于 5%。

但是,我认为使用 ANOVA(而不是多次测试)的原因之一是控制 I 型错误。那么,我做错了什么?

这是R代码:

generate.dat <- function(N=30)
  # Generate data with 2 factors.
  # N is number of subjects per group.
{
  # id is the subject id, we use N*4 because there are four groups.
  # group is the full name of the group, A1, A2, B1, B2
  # value is the measured/observed result in our experiment, again N*4.
  # the mean value is 0 for all groups, i.e. there are no effects of group.
  dat <- data.frame(id=factor(1:(N*4)),
                    group=factor(c(
                          rep(c("A1", "A2"), each=N),
                          rep(c("B1", "B2"), each=N))),
                    value=rnorm(N*4))

  # split group into separate factors
  dat$factor1 <- factor(substring(dat$group, 1, 1))
  dat$factor2 <- factor(substring(dat$group, 2, 2))

  dat
}

# e.g.
# dat <- generate.dat(3)
# print(dat)
#   id group       value factor1 factor2
# 1   1    A1  0.42385602       A       1
# 2   2    A1 -0.34829466       A       1
# 3   3    A1 -1.40946883       A       1
# 4   4    A2 -0.09177423       A       2
# 5   5    A2 -1.26614034       A       2
# 6   6    A2 -1.18024188       A       2
# 7   7    B1 -0.86129559       B       1
# 8   8    B1 -1.30517594       B       1
# 9   9    B1  0.50221849       B       1
# 10 10    B2  0.42755864       B       2
# 11 11    B2 -0.03262990       B       2
# 12 12    B2  0.85593000       B       2

do.anova <- function(dat)
  # Perform a 2 way between-subjects anova on dat.
  # Return the lowest p value obtained.
  # (We are interested whether there is at least one significant effect
  # in this particular data set).
{
  results <- aov(value ~ factor1 * factor2, data=dat)
  min( summary(results)[[1]]$`Pr(>F)`[1:3] )
}


# Peform 1000 replications:
# each time generate some data and get the lowest p value
# from the resulting anova.
out <- replicate(1000, do.anova(generate.dat()))

# How many times out of the 1000 was there a significant effect?
sum(out < .05) / 1000 # about 14%

我怀疑真的有 14% 的机会找到效果,那我做错了什么?

非常感谢。

2个回答

正如我们在上面的评论中已经讨论过的,ANOVA 控制了跨“家族”级别的家族类型 I 错误率,而不是跨“家族”因素。例如,具有 10 个组(水平)的单向 ANOVA 控制错误率,而不是执行所有 45 个成对 t 检验,这显然会遇到多重比较问题。但是,双向 ANOVA 测试两个因素和一个交互作用,因此基本上执行三个单独的 F 检验。正如您的模拟很好地证明的那样,这也受到多重比较问题的影响,该问题不受 ANOVA 控制。请注意,因此您的模拟提供了对理论预期错误率的非常精确的估计。1(10.05)3=0.14

我不是这方面的专家,但是在我写了上面的评论之后,我进行了谷歌搜索,偶然发现了Cramer 等人。Multiway ANOVA: Prevalence, Consequences, and Remedies 中的隐藏多重性,显然是 2013 年的预印本。让我逐字引用他们的摘要:

许多实证研究人员没有意识到常见的多因素方差分析 (ANOVA) 存在多重比较问题。在两个因素的情况下,三个独立的零假设要接受检验(即,两个主效应和一个交互作用)。因此,I 类错误的概率是 14% 而不是 5%。我们解释了多重比较问题,并证明研究人员几乎从不纠正它。我们描述了几种更正程序之一(即顺序 Bonferroni),并表明它的应用改变了 60 篇文章中的 45 篇中至少一个实质性结论。在多路 ANOVA 中对抗多重性的另一种方法是预先注册假设。

ANOVA 程序可以控制整个因子集和交互作用中的全族误差,但您需要正确执行此操作,而不是查看多个 p 值的最小值。查看整体 F 测试的一种方法是summary.lm在结果对象上运行,而不仅仅是summary查看打印输出的底部。对于仿真,使用该anova函数可以更容易地与空模型(仅截取)进行比较。这是您的模拟功能的新版本,用于进行整体测试:

do.anova2 <- function(dat) {
  results <- aov(value ~ factor1 * factor2, data=dat)
  results0 <- update(results, .~1)
  anova(results0, results)[2,6]
}

当我们运行这个版本时:

> out2 <- replicate(1000, do.anova2(generate.dat()))
> mean(out2 < 0.05)
[1] 0.043
> out2 <- replicate(1000, do.anova2(generate.dat()))
> mean(out2 < 0.05)
[1] 0.049
> out2 <- replicate(1000, do.anova2(generate.dat()))
> mean(out2 < 0.05)
[1] 0.051
>

我们看到了您预期的大约 5%。