高度离散和偏斜变量可能会在其 t 统计量中表现出一些特殊问题:
例如,考虑这样的事情:
(它在右边有更多的尾巴,已经被切断了,到 90 岁左右)
大小为 50 的样本的双样本 t 统计量分布如下所示:
特别是,在 0 处有一些短尾和明显的尖峰。
诸如此类的问题表明,可能需要从看起来像您的样本的分布进行模拟来判断样本量是否“足够大”
你的数据似乎比我上面的例子有更多的尾巴,但你的样本量要大得多(我希望有一个频率表之类的东西)。可能没问题,但是您可以模拟样本分布附近的一些模型(或者您可以重新采样您的数据),以了解这些样本量是否足以将您的测试统计量的分布视为近似。t
模拟研究 A - t.test 显着性水平(基于提供的频率表)
在这里,我重新采样了您的频率表,以了解您对 t 检验推断的分布的影响。我做了两次模拟,都使用了您的 UsersX 和 UsersY 组的样本大小,但在第一个实例中从两者的 X 数据中采样,在第二个实例中从两者的 Y 数据中采样(以获得 H0 真实情况)
结果非常相似(考虑到形状相似,这并不奇怪):
p 值的分布应该看起来像均匀分布。原因可能与我们看到我之前绘制的 t 统计量的直方图中出现峰值的原因相同——虽然总体形状还可以,但很可能均值差恰好为零。这个峰值夸大了 1 类错误率——将 5% 的显着性水平提升到大约 7.5% 或 8%:
> sum(tpres1<.05)/length(tpres1)
[1] 0.0769
> sum(tpres2<.05)/length(tpres2)
[1] 0.0801
这不一定是问题——如果你知道的话。例如,您可以(a)“按原样”进行测试,记住您将获得更高的 I 类错误率;或 (b) 将标称的 I 类错误率降低一半左右(甚至更多,因为它对较小的显着性水平的影响相对较大)。
我的建议——如果你想进行 t 检验——将改为使用 t 统计量,而是进行基于重采样的测试(进行排列/随机化测试,或者,如果你愿意,可以进行引导测试)。
--
模拟研究 B - Mann-Whitney 检验显着性水平(基于提供的频率表)
令我惊讶的是,相比之下,Mann-Whitney 在这个样本量下相当稳健。这与我看到的几组已发布的建议相矛盾(诚然,它们是在较小的样本量下进行的)。
> sum(mwpres1<.05)/length(mwpres1)
[1] 0.0509
> sum(mwpres2<.05)/length(mwpres2)
[1] 0.0482
(这种情况的直方图看起来是一致的,所以这在其他典型的显着性水平上应该类似)
4.8% 和 5.1% 的显着性水平(标准误差为 0.22%)非常适合此类分布。
在此基础上,我会说——至少在显着性水平上——曼·惠特尼的表现相当不错。我们必须进行功率研究才能看到对功率的影响,但我认为与 t 检验相比,它的效果不会太差(如果我们调整一些东西,使它们处于大致相同的实际显着性水平)。
所以我不得不吃掉我之前的话——在这个样本量下,我对 Mann-Whitney 的谨慎似乎是不必要的。
我在频率表中阅读的 R 代码
#metric1 sample1
UsersX=data.frame(
count=c(182L, 119L, 41L, 11L, 7L, 5L, 5L, 3L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
value=c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 12L, 17L, 18L, 20L, 29L, 35L, 42L)
)
#metric 1 sample2
UsersY=data.frame(
count=c(5098L, 2231L, 629L, 288L, 147L, 104L, 50L, 39L, 28L, 22L, 12L, 14L, 8L, 8L,
9L, 5L, 2L, 5L, 5L, 4L, 1L, 3L, 2L, 1L, 1L, 4L, 1L, 4L, 1L, 1L, 1L, 1L, 1L, 1L),
value=c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L,
17L, 18L, 19L, 20L, 21L, 22L, 25L, 26L, 27L, 28L, 31L, 33L, 37L, 40L, 44L, 50L, 76L)
我的 R 代码进行模拟
resample=function(tbl,n=sum(tbl$count)) #$
sample(tbl$value,size=n,replace=TRUE,prob=tbl$count) #$
n1=sum(UsersX$count) #$
n2=sum(UsersY$count) #$
tpres1=replicate(10000,t.test(resample(UsersX),resample(UsersX,n2))$p.value) #$
tpres2=replicate(10000,t.test(resample(UsersY,n1),resample(UsersY))$p.value) #$
mwpres1=replicate(10000,wilcox.test(resample(UsersX),resample(UsersX,n2))$p.value)#$
mwpres2=replicate(10000,wilcox.test(resample(UsersY,n1),resample(UsersY))$p.value)#$
# "#$" at end of each line avoids minor issue with rendering R code containing "$"