t检验死亡的报道是否被大大夸大了?

机器算法验证 假设检验 t检验 置换检验 wilcoxon-mann-whitney 检验
2022-01-20 12:21:02

通读 CV 历来经典,我发现了一个我想澄清的声明。这是帖子,我的问题指的是结束语:“我必须指出,我刚刚传授的所有知识都有些过时了;现在我们有了计算机,我们可以做得比 t-tests 更好。正如弗兰克所说,你可能想在你被教导运行 t 检验的任何地方使用 Wilcoxon 检验。”

无需担心假设样本均值的分布是否足够正常以运行t 检验是否合理,这显然是一个巨大的优势。而且我看到计算机可以轻而易举地对两个数据向量之间的一长串差异列表进行排序……我记得很多年前是手动完成的,但我离题了……

那么,t检验真的已成为过去吗?置换测试呢?在通常需要编写几行代码的意义上,它们是否过于临时?

1个回答

我不会说经典的单样本(包括配对)和双样本等方差 t 检验完全过时,但是有许多具有出色性能的替代方案,在许多情况下应该使用它们。

我也不会说在大样本上快速执行 Wilcoxon-Mann-Whitney 检验(甚至是置换检验)的能力是最近才出现的,我在 30 多年前作为学生时经常做这两件事,而且这样做的能力是可用的很长一段时间。

虽然编写置换测试(甚至从头开始)比以前容易得多,即使在那时也不难(如果你有代码做一次,在不同的情况下进行修改 - 不同的统计数据,不同的数据等 - 很简单,通常不需要编程背景)。

所以这里有一些替代方案,以及为什么它们可以提供帮助:

  1. Welch-Satterthwaite – 当您不确定方差是否接近相等时(如果样本量相同,等方差假设并不重要)

  2. Wilcoxon-Mann-Whitney – 如果尾巴正常或比正常重,特别是在接近对称的情况下。如果尾部趋向于接近正常值,则对均值的置换测试将提供稍微更多的功率。

  3. 稳健的 t 检验——其中有多种在正常情况下具有良好的功率,但在较重的尾部或有些偏斜的替代方案下也能很好地工作(并保持良好的功率)。

  4. GLM——例如对计数或连续右偏情况(例如伽马)有用;旨在处理方差与均值相关的情况。

  5. 在存在特定形式的依赖的情况下,随机效应或时间序列模型可能很有用

  6. 贝叶斯方法、自举和大量其他重要技术可以提供与上述想法类似的优势。例如,使用贝叶斯方法,很可能有一个模型可以同时解释污染过程、处理计数或倾斜数据以及处理特定形式的依赖关系

虽然存在大量方便的替代方案,但只要总体与正常情况相差不远(例如非常重的尾巴/skew),我们几乎是独立的。

在我们可能对普通 t 检验没有那么自信的许多情况下,这些替代方案很有用……但是,当满足或接近满足 t 检验的假设时,它们通常表现良好。

如果分布往往不会偏离正常太远(更大的样本允许更多的回旋余地),那么 Welch 是一个明智的默认值。

虽然置换检验非常出色,与假设成立时的 t 检验相比没有损失功率(以及直接推断感兴趣的数量的有用好处),但 Wilcoxon-Mann-Whitney 可以说是更好的选择,如果尾巴可能很重;通过一个小的附加假设,WMW 可以得出与均值偏移相关的结论。(与排列测试相比,人们可能更喜欢它还有其他原因)

[如果你知道你正在处理说计数、等待时间或类似类型的数据,那么 GLM 路线通常是明智的。如果您对潜在的依赖形式有所了解,那也很容易处理,并且应该考虑潜在的依赖。]

因此,虽然 t 检验肯定不会成为过去,但当它适用时,您几乎总是可以做得一样好或几乎一样好,并且在它不适用时,通过使用其中一种替代方法可能会获得很大的收益. 也就是说,我大致同意那篇文章中与 t 检验有关的观点……很多时候,你可能应该在收集数据之前考虑你的假设,如果其中任何一个可能不会真的被期望持有向上,通过 t 检验,通常几乎没有什么可失去的因为替代方案通常工作得很好。

如果一个人在收集数据方面遇到了很大的麻烦,那么肯定没有理由不花一点时间真诚地考虑处理推理的最佳方法。

请注意,我通常建议不要对假设进行显式测试——它不仅会回答错误的问题,而且这样做然后根据假设的拒绝或不拒绝选择分析会影响两种测试选择的属性;如果您不能合理安全地做出假设(或者因为您对过程了解得足够好以至于可以假设,或者因为程序在您的情况下对它不敏感),一般来说您最好使用该程序那不假设它。


如今,它是如此简单,以至于微不足道。这是一个完整的枚举排列测试,也是一个基于对 R 中均值的两个样本比较的排列分布(带替换)进行采样的测试:

# set up some data
x <- c(53.4, 59.0, 40.4, 51.9, 43.8, 43.0, 57.6)
y <- c(49.1, 57.9, 74.8, 46.8, 48.8, 43.7)
xyv <- stack(list(x=x,y=y))$values
nx  <- length(x)

# do sample-x mean for all combinations for permutation test
permmean = combn(xyv,nx,mean)

# do the equivalent resampling for a randomization test
randmean <- replicate(100000,mean(sample(xyv,nx)))

# find p-value for permutation test
left  = mean(permmean<=mean(x))
# for the other tail, "at least as extreme" being as far above as the sample
# was below
right = mean(permmean>=(mean(xyv)*2-mean(x)))
pvalue_perm = left+right
"Permutation test p-value"; pvalue_perm

# this is easier: 
#      pvalue = mean(abs(permmean-mean(xyv))>=abs(mean(x)-mean(xyv))) 
# but I'd keep left and right above for adapting to other tests

# find p-value for randomization test
left  = mean(randmean<=mean(x))
right = mean(randmean>=(mean(xyv)*2-mean(x)))
pvalue_rand = left+right
"Randomization test p-value"; pvalue_rand

(得到的 p 值分别为 0.538 和 0.539;相应的普通二样本 t 检验的 p 值为 0.504,Welch-Satterthwaite t 检验的 p 值为 0.522。)

请注意,在每种情况下,用于排列测试的组合的计算代码都是 1 行,p 值也可以在 1 行中完成。

将其应用于执行置换测试或随机化测试并像 t 测试一样产生输出的函数将是一件小事。

这是结果的显示:

在此处输入图像描述

# Draw a display to show distn & p-value region for both 
opar <- par()
par(mfrow=c(2,1))
hist(permmean, n=100, xlim=c(45,58))
abline(v=mean(x), col=3)
abline(v=mean(xyv)*2-mean(x), col=3, lty=2)
abline(v=mean(xyv), col=4)
hist(randmean, n=100, xlim=c(45,58))
abline(v=mean(x), col=3)
abline(v=mean(xyv)*2-mean(x), col=3, lty=2)
abline(v=mean(xyv), col=4)

par(opar)