Welch's t 检验的行为与不相等的组大小

机器算法验证 r t检验 样本量
2022-03-17 18:35:19

似乎在某些情况下,Welch 的 t 检验可以给出夸大的 p 值和不平衡的组大小。例如,考虑以下从相同高斯分布中采样的不等组大小的模拟。

set.seed(42)
sapply(2:10, function(n) {
  out <- replicate(100000, t.test(rnorm(100), rnorm(n))$p.value)
  mean(out < 0.01) / 0.01
})
# [1] 7.928 3.139 1.913 1.606 1.371 1.285 1.178 1.141 1.192

这个结论正确吗?是否有关于何时适合 Welch t 检验的组大小的一般准则?是否有已知的方法来纠正这种明显的偏差,或者如果群体在规模方面不平衡,我们通常应该假设方差相等吗?

更新:

澄清一下,我有兴趣为 Welch t 检验建立最小样本量,低于该样本量我们需要对误报的可能性保持谨慎(仅限于我们乐于假设方差相等的情况)。

我认为这个对来自相同分布的样本进行简单模拟的图,不同的样本大小更清楚地说明了这个问题。在所有情况下,如果测试按预期执行,我们预计 p 值 < 0.05 的平均测试数等于 0.05。

t检验结果

我会得出结论,如果任何组的 N < ~5,我们需要谨慎使用 Welch t 检验,特别是如果 N = 2。

请注意,我没有调查不等方差,正如 BruceET 所指出的那样,如果不加以考虑,可能会导致潜在的高误报率。

dosim <- function(var.equal) {
  sapply(seq_len(nrow(g)), function(i) {
    pv <- replicate(
      reps,
      t.test(rnorm(g[i, "N1"]), rnorm(g[i, "N2"]), var.equal = var.equal)$p.value
    )
    mean(pv < 0.05)
  })
}

reps <- 10000
g <- expand.grid(list(N1 = 2:100, N2 = c(2, 3, 4, 5, 6, 10)))

g$Welch <- dosim(FALSE)
g$Student <- dosim(TRUE)
g <- tidyr::gather(g, "stat", "value", "Welch", "Student")
g$N2 <- factor(g$N2)

ggplot(g, aes(x = N1, y = value, col = N2)) +
  geom_point() +
  geom_line() +
  facet_grid(stat ~ .) +
  ylab("Mean(p < 0.05)")

有关的:

2个回答

这个问题足够宽泛,需要进行模拟研究(其中一些关键部分无疑已经完成),这远远超出了我们通常的答案风格。

如果我们知道两个总体具有相同的方差,则 Welch 2 样本 t 检验不能完全与合并 t 检验一样好。

(1)在“5% 水平”的 Welch 检验给出的 I 类错误略高于 5%我没有探索小于 5 的样本大小。n1=5,n2=100(0.054±0.0014).

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5), rnorm(100))[2:3]))
mean(out[1,])
[1] 4.902672         # avg DF about 5
mean(out[2,] < .05)
[1] 0.05443          # avg P-val about 5%

在下面的 100,000 个模拟 P 值的直方图中,左侧的栗色条表示测试的真实显着性水平(I 型错误)。它的宽度为 0.5,高度约为 0.108,总面积约为 0.054,

在此处输入图像描述

(2)当方差相等时的 5% 水平的合并检验。在这里,所有测试的 DF =显着性水平非常接近预期的 5%。n1=5,n2=100n1+n22=103

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5), rnorm(100), var.eq=T)[2:3]))
mean(out[1,])
[1] 103             # DF exactly n1 + n2 - 2 = 103
mean(out[2,] < .05)
[1] 0.0493          # P-val exactly 5% from transparent theory

在此处输入图像描述

(3)但是,如果较小样本的方差为 4,而较大的样本方差为 1,则标称 5% 显着性水平的合并检验实际上具有近 30% 的显着性水平(大量错误发现)。

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5,0,2), rnorm(100), var.eq=T)[2:3]))
mean(out[1,])
[1] 103
mean(out[2,] < .05)
[1] 0.2853

在此处输入图像描述

(4) Welch 测试可能不会有 5% 的 I 类错误。即便如此,在平均 P 值接近 5% 的情况下,当方差不相等时,它显然比合并检验更可取,如 (3) 中所示。

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5,0,2), rnorm(100))[2:3]))
mean(out[1,])
[1] 4.209818
mean(out[2,] < .05)
[1] 0.05158

在此处输入图像描述

(5) 两个模拟中的第一个侧重于功率。如果方差不相等且大小严重不平衡),则检测不同的能力约为 90%。(n1=5,n2=100μ1=4μ2=0

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5,4,2), rnorm(100))[2:3]))
mean(out[1,])
[1] 4.209818
mean(out[2,] < .05)
[1] 0.90977

在下图中,左侧的绿色条表示测试的功率。所以现在,高大的第一个酒吧是一件好事

在此处输入图像描述

(6)如果我们平衡数据(大小为 5 的两个样本),与之前的模拟相比,Welch 检验的功效几乎没有降低。将均值更改为相等,样本大小为 5,方差不相等,类似的模拟(未显示)给出显着性水平 4.9%

set.seed(1234)
out = replicate(10^5, as.numeric(t.test(rnorm(5,4,2), rnorm(5))[2:3]))
mean(out[1,])
[1] 6.000759
mean(out[2,] < .05)
[1] 0.89743

在此处输入图像描述

总结评论。这些模拟都没有改变建议更喜欢韦尔奇测试而不是合并测试,除了小样本量,在这种情况下,先验信息是否方差相等可能有助于在韦尔奇测试和合并测试之间做出决定。

我试图用上面的几个模拟来探索相关的方向,但我当然不会声称他们解决了任何问题。如果有人有来自相关模拟的信息,可以完善或扩展我的“没有新消息”的结论,我很乐意看到它们。

这里的问题似乎不是由于样本量本身不平衡,而是由于对其中一个样本使用了非常小的样本量,p 值的不均匀性似乎正在发生。下面我展示了高分辨率直方图,显示模拟 p 值,用于比较具有标准正常值的样本和具有标准正常值的另一个样本。(每次比较使用模拟,直方图使用 bin 宽度,因此您可以获得真实分布的高分辨率。)nX=100nY=2,...,10K=106w=0.01

如您所见,对于非常小的样本,存在一个非均匀分布,其 p 值较小的概率高于预期。我不完全确定这种现象的起源,但我有一些强烈的怀疑。众所周知,标准样本方差估计量会产生一个估计的标准偏差,该偏差对小样本有偏差(参见例如,这里)。对于正常数据,样本标准偏差被一个已知的“校正因子”向下偏置,这对非常小的样本具有相当大的影响。如果在 Welch 的 T 检验中低估了较小样本的真实标准差,那么自然的期望是,这将低估在无差异的原假设下样本均值之间可能存在的差异,这会使 p 值产生偏差向下。由于这正是我们在直方图中看到的,我怀疑这种现象是由于样本标准差作为对真实标准差的估计值的向下偏差而发生的。我怀疑如果您要将标准小样本“校正”应用于样本标准差,在韦尔奇检验的检验统计中,

在此处输入图像描述

#Generate p-value simulations from Welch's test
#First sample is set to sample size of 100
#Second sample has sample sizes from 2, ..., 30
set.seed(97142903)
SIMS  <- 10^6;
PVALS <- matrix(NA, nrow = SIMS, ncol = 9);
for (n in 2:10)   {
for (i in 1:SIMS) {
    PVALS[i, n-1] <- t.test(rnorm(100), rnorm(n))$p.value; } }

#Generate data frame of p-value simulations
DATA <- data.frame(n = rep(2:10, each = SIMS),
                   p = as.vector(PVALS));

#Plot the KDEs of the p-value simulations
library(ggplot2);
THEME <- theme(plot.title    = element_text(hjust = 0.5, size = 14, face = 'bold'),
               plot.subtitle = element_text(hjust = 0.5, face = 'bold'));
FIGURE <- ggplot(aes(x = p), data = DATA) +
          geom_histogram(binwidth = 0.01, boundary = 0, fill = 'blue') +
          facet_wrap(~ n, ncol = 1) +
          THEME +
          ggtitle('Histograms of p-value simulations') +
          labs(subtitle = '(Sample of 100 against sample of stated size)') +
          xlab('p value') + ylab('Count');
FIGURE;