用非常小的样本量(例如,n = 6)检验正态性是否有意义?

机器算法验证 假设检验 正态假设 kolmogorov-smirnov 测试 统计能力
2022-02-11 06:38:36

我的样本量为 6。在这种情况下,使用 Kolmogorov-Smirnov 检验来检验正态性是否有意义?我用过SPSS。我的样本量非常小,因为获取每个样本都需要时间。如果没有意义,有多少样本是测试有意义的最低数量?

注意: 我做了一些与源代码相关的实验。该样本是在一个软件版本(版本 A)中编码所花费的时间 实际上,我有另一个样本大小为 6,这是在另一个软件版本(版本 B)中编码所花费的时间

我想使用单样本t检验进行假设检验,以测试代码版本A所花费的时间是否与代码版本B所花费的时间不同(这是我的H1)。单样本t检验的前提是要检验的数据必须服从正态分布。这就是为什么我需要测试正常性。

3个回答

是的。

所有假设检验都有两个显着属性:它们的大小(或“显着性水平”),一个与置信度和预期假阳性率直接相关的数字,以及它们的功效它表示假阴性的可能性。当样本量很小并且您继续坚持小样本(高置信度)时,功效会变差。这意味着小样本测试通常无法检测到小的或中等的差异。 但它们还是有意义的

KS 检验评估样本是否似乎来自正态分布。六个值的样本必须看起来非常不正常才能通过此测试。但是,如果确实如此,您可以完全按照您对更高样本量的解释来解释对 null 的拒绝。另一方面,如果测试未能拒绝零假设,那么由于假阴性率很高,这告诉您的信息很少。特别是,假设基础分布是正态分布会相对冒险。

这里还要注意一件事:一些软件使用近似值从测试统计中计算 p 值。通常,这些近似值适用于大样本量,但不适用于非常小的样本量。在这种情况下,您不能相信 p 值已正确计算,这意味着您无法确定是否已达到所需的测试大小。有关详细信息,请参阅您的软件文档。

一些建议: KS 测试在测试正态性方面的功能远不如其他专门为此目的构建的测试。其中最好的可能是Shapiro-Wilk测试,但其他常用且几乎同样强大的是Shapiro-FranciaAnderson-Darling

此图显示了 Kolmogorov-Smirnov 检验统计量在六个正态分布变量的 10,000 个样本中的分布:

KS 统计量的直方图

基于 100,000 个额外的样本,上 95 个百分位(估计该统计量的临界值以进行大小检验α=5%) 为 0.520。通过此测试的样本示例是数据集

0.000, 0.001, 0.002, 1.000, 1.001, 1000000

检验统计量为 0.5(小于临界值)。使用其他正态性检验将拒绝此类样本。

正如@whuber 在评论中所问的那样,对我的分类 NO 进行了验证。编辑:使用 shapiro 测试,因为单样本 ks 测试实际上被错误地使用。Whiber 是正确的:为了正确使用 Kolmogorov-Smirnov 检验,您必须指定分布参数,而不是从数据中提取它们。然而,这是在 SPSS 等统计软件包中针对单样本 KS 测试所做的。

您尝试对分布发表一些看法,并想检查是否可以应用 t 检验。因此,进行此测试是为了确认数据没有明显偏离正态性,足以使分析的基本假设无效。因此,您对 I 型错误不感兴趣,而对 II 型错误感兴趣。

现在必须定义“显着不同”才能计算可接受功率的最小 n(例如 0.8)。对于分布,这并不容易定义。因此,我没有回答这个问题,因为除了我使用的经验法则之外我无法给出合理的答案:n > 15 和 n < 50。基于什么?基本上是直觉,所以除了经验我无法为这个选择辩护。

但我确实知道,只有 6 个值,您的 II 型错误肯定几乎为 1,使您的功效接近 0。有了 6 个观察值,夏皮罗检验无法区分正态分布、泊松分布、均匀分布甚至指数分布。II 型错误几乎为 1,您的测试结果毫无意义。

用 shapiro-test 说明正态性检验:

shapiro.test(rnorm(6)) # test a the normal distribution
shapiro.test(rpois(6,4)) # test a poisson distribution
shapiro.test(runif(6,1,10)) # test a uniform distribution
shapiro.test(rexp(6,2)) # test a exponential distribution
shapiro.test(rlnorm(6)) # test a log-normal distribution

只有大约一半的值小于 0.05,是最后一个。这也是最极端的情况。


如果您想通过 shapiro 测试找出让您获得您喜欢的力量的最小 n 是多少,可以进行如下模拟:

results <- sapply(5:50,function(i){
  p.value <- replicate(100,{
    y <- rexp(i,2)
    shapiro.test(y)$p.value
  })
  pow <- sum(p.value < 0.05)/100
  c(i,pow)
})

它为您提供了这样的功率分析:

在此处输入图像描述

从中我得出的结论是,在 80% 的情况下,您需要大约至少 20 个值来区分指数分布和正态分布。

代码图:

plot(lowess(results[2,]~results[1,],f=1/6),type="l",col="red",
    main="Power simulation for exponential distribution",
    xlab="n",
    ylab="power"
)

这里提出的问题有一些误解,即为什么样本量为 6 需要进行正态性检查。这里的主要目标是“测试代码版本 A 花费的时间是否与代码版本 B 花费的时间不同(这是我的 H1)”。当使用“不同”这个词时,它是一个尾部测试吗?然而,正常性测试是第二步。第一步是检查给定样本量的测试的预定(1-β)功效是否足够,当功效非常差时,那么正态性条件的检验有什么用?正态性条件检查将帮助我们决定是进行参数测试还是非参数测试?如果您的样本量没有足够的功效,为什么要考虑进行正态性测试?