韦尔奇检验似乎比等方差 t 检验差得多

机器算法验证 假设检验 t检验 统计能力 群体差异 萨特思韦特
2022-03-21 12:42:15

Python 中的 SciPy 函数,ttest_ind()默认情况下与t-假设方差相等的测试。有一个参数equal_var = False可以将其切换到 Welch 检验,其中不假定两个样本的方差相等。

这似乎表明,当两个样本在设计上具有不同的方差时,Welch 检验应该表现更好。所以,我开始对此进行测试。令人惊讶的是,我得到的结论恰恰相反。

from scipy.stats import norm, ttest_ind 
a1 = norm.rvs(10, 14, size = 6)
a2 = norm.rvs(13, 3, 100)
p_val1 = ttest_ind(a1, a2)[1]
p_val2 = ttest_ind(a1, a2, equal_var = False)[1]

在这里,我们从平均值为 10 和标准差为 14 的正态分布中生成 6 个样本。然后从另一个正态分布中生成 100 个样本,平均值为 13 和标准差为 3。很明显,这两个样本的方差不相等。首先p-价值来自简单t-假设方差相等的测试,而第二个来自 Welch 测试。首先p- 值始终小于 1%,而第二个值通常约为 30-40%。而且由于手段实际上不同,韦尔奇测试表现不佳。这里的一个批评是我没有考虑误报率,只考虑功率。这在下图中得到了纠正,该图绘制了两个测试的假阳性到假阴性率,因此考虑了两者。

这可以在两个测试的 alpha-beta 曲线中可视化(假阳性率与假阴性率一起绘制)。两个样本t-test 的假阴性率比 Welch 测试低得多(以蓝色绘制)。

为什么韦尔奇测试如此轻松地被击败?是否存在其他可能优于两个样本的条件t-测试?如果没有,为什么要使用它?


编辑:下面的情节有一个错误。就统计功效而言,这两个测试的实际表现是相同的。请参阅我的答案以获得更正的情节。

在此处输入图像描述


3个回答

您只关注检测差异的能力,而忽略错误拒绝原假设的可能性,从而使用有缺陷的指标来衡量测试的性能。如果您只想优化此指标,那么您可以使用的“最佳”统计测试将是只为所有输入数据返回 p = 0 的测试。

您应该复制您的示例,并将两个样本中的均值设置为 0。

从下面的示例中可以看出,如果没有差异,则正常 t 检验在大约 50% 的时间里错误地拒绝了原假设。

n.sim <- 1e4
p1.w <- p2.t <- rep(0, n.sim)
for (i in 1:n.sim)
{
  x <- rnorm(6, 0, 13)
  y <- rnorm(100, 0, 3)
  p1.w[i] <- t.test(x,y, var.equal = FALSE)$p.value
  p2.t[i] <- t.test(x,y, var.equal = TRUE)$p.value
} 
sum(p1.w < 0.05)/n.sim
sum(p2.t < 0.05)/n.sim

如果样本量不相等,则正态 t.test 最容易违反等方差假设。如果较小的样本具有较高的方差,则会经常错误地拒绝原假设;如果较小的样本具有较低的方差,则过于保守。你的例子是第一种情况。

与教科书 t 检验相比,这是对 Welch 检验效力的担忧。让我们设置一个小模拟实验,看看是否有任何差异。

我们可以调制的东西是:

  • 手段的不同
  • 样本量
  • 组间方差的差异,以及
  • 如果我们使用 welch 或常规 t 检验。

我将通过检查来调整样本量n1/n2. 与方差相同σ1/σ2. 我将在网格上模拟结果并为每个网格点运行 1000 次测试。我在 R 中这样做,所以我假设 scipy 开发人员没有错误地实施测试。

这是实验的R代码

library(tidyverse)


pwr = function(n, effect_size, ratio, equal_var = F){
  reps = replicate(1000,{
    x = rnorm(100, 0, 1)
    y = rnorm(ceiling(n*100), effect_size, ratio)
    test = t.test(x,y,var.equal = equal_var)$p.value
    test<0.05
  })
  
  mean(reps)
}

results = crossing(
  n = seq(0.1, 1, 0.1),
  effect_size = c(0.2, 0.5, 0.8, 2.0),
  ratio = c(1, 2, 4, 8, 16),
  equal_var = c(T,F)
) %>% 
  mutate(power = pmap_dbl(list(n=n, effect_size = effect_size, ratio = ratio, equal_var = equal_var), pwr))


results %>% 
  ggplot(aes(x=n, y=power, color = factor(equal_var)))+
  geom_line()+
  facet_grid(ratio~effect_size, labeller = label_both)+
  scale_y_continuous(labels = scales::percent)

结果

在此处输入图像描述

我可以复制一些结果,因为 Welch 检验在某些情况下似乎具有较小的功效,即使在满足假设的情况下也是如此。您可以将其视为n1/n2接近 1(即组大小相同)这两个测试或多或少是等效的。请注意,在所有情况下,曲线都应向右增加(效应大小 = 0 的情况除外)。但是,当样本量存在巨大差异时(如您的示例),t 检验具有更高的功效。当方差实际上相等时,功率是可比较的。

这里还有一些有趣的东西。看看effect_size:0专栏。在此列中,组之间确实没有差异(即它们具有相同的总体均值)。此列下的任何拒绝都是误报。理想情况下,t 检验和 welch t 检验的统计功效都应为 0,误报率为 0.05。您可以看到 t 检验在不应该拒绝 null 时拒绝了它。我认为这是因为样本量很小,因此均值具有很大的抽样方差,导致拒绝零。我认为这得到了进一步的支持,因为我们看到这些情况下的“力量”随着样本量的增加而降低。更多的样本意味着对平均值的更精确估计,这应该会导致更少的误报。

这很有趣,我明天将不得不回到这个,因为今天是情人节,我的女朋友不喜欢我做统计太晚。

受到@DemetriPananos 答案的启发,并为不同的比率创建了一个类似的图n1n2σ1σ2. 这些图在 x 轴上具有实际假阳性率,在 y 轴上具有两个测试的假阴性率。就统计功效而言,这两个测试几乎相同。

下面的情节代码是在这个要点:https://gist.github.com/ryu577/ed535a6457dc98672c39cfe47f1894b6

null 和alternate 之间的效果大小始终相同(3)。

在此处输入图像描述

此外,让我们看看类型 1 错误率(或显着性阈值)到误报率的配置文件。下图显示,其他答案表明 Welch 检验能够控制误报率,而对于等方差 t 检验,误报率偏离直线(意味着 p 值不均匀)。

在此处输入图像描述