夏皮罗-威尔克是最好的正态性检验吗?为什么它可能比 Anderson-Darling 等其他测试更好?

机器算法验证 假设检验 正态分布 正态假设
2022-02-08 08:45:30

我在文献中的某处读到,Shapiro-Wilk 检验被认为是最好的正态性检验,因为对于给定的显着性水平,如果原假设为假,则拒绝原假设的概率高于其他情况正态性检验。α

您能否向我解释一下,如果可能的话,使用数学论证,与其他一些正态性检验(比如安德森-达林检验)相比,它的工作原理是什么?

4个回答

首先是一般性评论:请注意,Anderson-Darling 检验适用于完全指定的分布,而 Shapiro-Wilk 适用于具有任何均值和方差的正态分布。然而,正如 D'Agostino & Stephens中所指出的,Anderson-Darling 以一种非常方便的方式适应估计情况,类似于(但收敛速度更快,并且以一种更易于处理的方式进行修改) Kolmogorov-Smirnov 案的 Lilliefors 检验。具体来说,在正常情况下,通过可以使用(不要测试 n<5 的拟合优度)。[1]n=5A=A2(1+4n25n2)

我在文献中的某处读到,Shapiro-Wilk 检验被认为是最好的正态性检验,因为对于给定的显着性水平 α,如果原假设为假,则拒绝原假设的概率高于其他正态性的情况测试。

作为一般性陈述,这是错误的。

哪种正态性检验“更好”取决于您对哪些类别的替代品感兴趣。Shapiro-Wilk 受欢迎的一个原因是它在广泛的有用替代品下往往具有非常好的能力。它出现在许多关于权力的研究中,并且通常表现得非常好,但它并不是普遍最好的。

很容易找到它不那么强大的替代方案。

例如,对于轻尾替代方案,它的功率通常低于学生化范围(在统一数据的正态性检验中比较它们,例如 - 在时,基于的测试的功效约为 63%,而 Shapiro Wilk 的功效略高于 38%)。u=max(x)min(x)sd(x)n=30u

Anderson-Darling(针对参数估计进行了调整)在双指数方面表现更好。Moment-skewness 对一些偏斜的替代方案做得更好。

您能否向我解释一下,如果可能的话,使用数学论证,与其他一些正态性检验(比如安德森-达林检验)相比,它的工作原理是什么?

我将笼统地解释(如果您想要更具体的细节,原始论文和一些后来讨论它们的论文将是您最好的选择):

考虑一个更简单但密切相关的测试,Shapiro-Francia;它实际上是正态下订单统计和预期订单统计之间相关性的函数(因此,在正常 QQ 图中,“直线有多直”的一个非常直接的衡量标准)。我记得,Shapiro-Wilk 更强大,因为它还考虑了顺序统计之间的协方差,从 QQ 图中产生了的最佳线性估计量,然后按缩放。当分布远离正态分布时,该比率不接近 1。σs

相比之下,Anderson-Darling 与 Kolmogorov-Smirnov 和 Cramer-von Mises 一样,都是基于经验 CDF。具体来说,它基于 ECDF 和理论 ECDF 之间的加权偏差(方差加权使其对尾部偏差更敏感)。

Shapiro 和 Chen (1995) 的测试(基于顺序统计之间的间距)通常显示出比 Shapiro-Wilk 略强的功效(但并非总是如此);它们的表现通常非常相似。[2]

--

使用夏皮罗威尔克,因为它通常功能强大、广泛可用并且许多人都熟悉它(如果你在论文中使用它,就不需要详细解释它是什么)——只是不要在它的错觉下使用它“最佳正态性检验”。没有一种最好的正态性检验。

[1]:D'Agostino, RB 和 Stephens, MA (1986)
合身技术优度
Marcel Dekker,纽约。

[2]:Chen, L. 和 Shapiro, S. (1995)
“基于归一化间距的正态性替代测试”。
统计计算与模拟杂志 53 , 269-287。

显然,您阅读的比较不包括SnowsPenultimateNormalityTesthttp://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf),因为它在所有替代方案中具有最高的权力。因此,如果权力是唯一的考虑因素,则应将其视为“最佳”(请注意,我的意见显然有偏见,但在链接/文档中记录了)。

但是,我同意尼克考克斯的评论,即最好的测试是情节而不是正式的测试,因为“足够正常”的问题比“完全正常”的问题重要得多。如果您想要一个有意义的测试,那么我建议将 qq 图与本文中的方法相结合:

Buja, A.、Cook, D. Hofmann, H.、Lawrence, M. Lee, E.-K.、Swayne, DF 和 Wickham, H. (2009) 探索性数据分析和模型诊断的统计推断 Phil。反式。R. Soc。A 2009 367, 4361-4383 doi: 10.1098/rsta.2009.0120

一种实现是vis.testR 的 TeachingDemos 包中的函数(与 相同的包SnowsPenultimateNormalityTest)。

进一步回答这个问题,尤其是@silverfish 的持续兴趣。回答此类问题的一种方法是运行一些模拟进行比较。下面是一些 R 代码,用于模拟各种备选方案下的数据,并进行若干正态性检验并比较功效(以及功效的置信区间,因为功效是通过模拟估算的)。我稍微调整了样本量,因为当许多幂接近 100% 或 5% 时它并不有趣,我发现整数的幂接近 80%。任何有兴趣的人都可以轻松获取此代码并针对不同的假设、不同的替代方案等进行修改。

您可以看到有一些替代方案,其中一些测试做得更好,而另一些测试做得更差。那么重要的问题是哪些替代方案对您的科学问题/领域最现实。这实际上应该模拟感兴趣的非正态性类型对正在进行的其他测试的影响。其中一些类型的非正态性极大地影响了其他基于正态的测试,而另一些则对它们影响不大。

> library(nortest)
> 
> simfun1 <- function(fun=function(n) rnorm(n), n=250) {
+   x <- fun(n)
+   c(sw=shapiro.test(x)$p.value, sf=sf.test(x)$p.value, ad=ad.test(x)$p.value,
+     cvm=cvm.test(x)$p.value, lillie=lillie.test(x)$p.value, 
+     pearson=pearson.test(x)$p.value, snow=0)
+ }
> 
> ### Test size using null hypothesis near true
> 
> out1 <- replicate(10000, simfun1())
> apply(out1, 1, function(x) mean(x<=0.05))
     sw      sf      ad     cvm  lillie pearson    snow 
 0.0490  0.0520  0.0521  0.0509  0.0531  0.0538  1.0000 
> apply(out1, 1, function(x) prop.test(sum(x<=0.05),length(x))$conf.int)  #$
             sw         sf         ad        cvm     lillie    pearson      snow
[1,] 0.04489158 0.04776981 0.04786582 0.04671398 0.04882619 0.04949870 0.9995213
[2,] 0.05345887 0.05657820 0.05668211 0.05543493 0.05772093 0.05844785 1.0000000
> 
> ### Test again with mean and sd different
> 
> out2 <- replicate(10000, simfun1(fun=function(n) rnorm(n,100,5)))
> apply(out2, 1, function(x) mean(x<=0.05))
     sw      sf      ad     cvm  lillie pearson    snow 
 0.0482  0.0513  0.0461  0.0477  0.0515  0.0506  1.0000 
> apply(out2, 1, function(x) prop.test(sum(x<=0.05),length(x))$conf.int)  #$
             sw         sf         ad        cvm     lillie    pearson      snow
[1,] 0.04412478 0.04709785 0.04211345 0.04364569 0.04728982 0.04642612 0.9995213
[2,] 0.05262633 0.05585073 0.05043938 0.05210583 0.05605860 0.05512303 1.0000000
> 
> #### now for the power under different forms of non-normality
> 
> ## heavy tails, t(3)
> rt3 <- function(n) rt(n, df=3)
> 
> out3 <- replicate(10000, simfun1(fun=rt3, n=75))
There were 50 or more warnings (use warnings() to see the first 50)
> round(apply(out3, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.788   0.831   0.756   0.726   0.624   0.440   1.000 
> round(apply(out3, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.780 0.824 0.748 0.717  0.614   0.431    1
[2,] 0.796 0.838 0.765 0.734  0.633   0.450    1
> 
> 
> ## light tails, uniform
> u <- function(n) runif(n)
> 
> out4 <- replicate(10000, simfun1(fun=u, n=65))
> round(apply(out4, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.906   0.712   0.745   0.591   0.362   0.270   1.000 
> round(apply(out4, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.900 0.703 0.737 0.581  0.353   0.261    1
[2,] 0.911 0.720 0.754 0.600  0.372   0.279    1
> 
> ## double exponential, Laplace
> de <- function(n) sample(c(-1,1), n, replace=TRUE) * rexp(n)
> 
> out5 <- replicate(10000, simfun1(fun=de, n=100))
> round(apply(out5, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.796   0.844   0.824   0.820   0.706   0.477   1.000 
> round(apply(out5, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.788 0.837 0.817 0.813  0.697   0.467    1
[2,] 0.804 0.851 0.832 0.828  0.715   0.486    1
> 
> ## skewed, gamma(2,2)
> g22 <- function(n) rgamma(n,2,2)
> 
> out6 <- replicate(10000, simfun1(fun=g22, n=50))
Warning message:
In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out6, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.954   0.930   0.893   0.835   0.695   0.656   1.000 
> round(apply(out6, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.950 0.925 0.886 0.827  0.686   0.646    1
[2,] 0.958 0.935 0.899 0.842  0.704   0.665    1
> 
> ## skewed, gamma(2,2)
> g99 <- function(n) rgamma(n,9,9)
> 
> out7 <- replicate(10000, simfun1(fun=g99, n=150))
> round(apply(out7, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.844   0.818   0.724   0.651   0.526   0.286   1.000 
> round(apply(out7, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.836 0.810 0.715 0.642  0.516   0.277    1
[2,] 0.851 0.826 0.732 0.660  0.536   0.294    1
> 
> ## tails normal, middle not
> mid <- function(n) {
+   x <- rnorm(n)
+   x[ x > -0.5 & x < 0.5 ] <- 0
+   x
+ }
> 
> out9 <- replicate(10000, simfun1(fun=mid, n=30))
Warning messages:
1: In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
2: In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out9, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.374   0.371   0.624   0.739   0.884   0.948   1.000 
> round(apply(out9, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.365 0.362 0.614 0.730  0.878   0.943    1
[2,] 0.384 0.381 0.633 0.747  0.890   0.952    1
> 
> ## mixture on variance
> mv <- function(n, p=0.1, sd=3) {
+   rnorm(n,0, ifelse(runif(n)<p, sd, 1))
+ }
> 
> out10 <- replicate(10000, simfun1(fun=mv, n=100))
Warning message:
In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out10, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.800   0.844   0.682   0.609   0.487   0.287   1.000 
> round(apply(out10, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.792 0.837 0.673 0.599  0.477   0.278    1
[2,] 0.808 0.851 0.691 0.619  0.497   0.296    1
> 
> ## mixture on mean
> mm <- function(n, p=0.3, mu=2) {
+   rnorm(n, ifelse(runif(n)<p, mu, 0), 1)
+ }
> 
> out11 <- replicate(10000, simfun1(fun=mm, n=400))
> round(apply(out11, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.776   0.710   0.808   0.788   0.669   0.354   1.000 
> round(apply(out11, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.768 0.701 0.801 0.780  0.659   0.344    1
[2,] 0.784 0.719 0.816 0.796  0.678   0.363    1

我迟到了,但会参考已发表的同行评审研究来回答。我不对 OP 的问题回答是/否的原因是它比看起来更复杂。对于来自任何有或没有异常值的分布的样本,没有一种测试是最强大的。异常值可能会严重降低一项测试的功效并增加另一项测试的功效。当样本来自对称分布等时,一些测试效果更好。

  • Henry C. Thode,Testing for Normality,2002 - 这是一本关于该主题的最全面的书。如果我不得不把它简化为一个简单的答案,那么在所有情况下,SW 并不比 AD 更强大。这里摘录两段,供您阅读。

从第 7.1.5 节开始:在功效的基础上,测试的选择与可用信息或对替代方案所做的假设直接相关。替代方案越具体,测试通常就越具体和强大;这也将产生最可靠的建议。

诸如之类的联合偏度和峰度测试提供了针对各种替代方案的强大功效,Anderson-Darling 也是如此。与其他测试相比,Wilk-Shapiro W 在偏斜和短尾对称替代方案中显示出相对较高的功效,而在长尾对称替代方案中表现出可观的功效。Ks2A2

  • 罗马奥、泽维尔、雷蒙多·德尔加多和阿尼巴尔·科斯塔。“单变量拟合优度正态性检验的经验功效比较。” 统计计算与模拟杂志 80.5 (2010): 545-591。是我所知道的关于该主题的最新发表的研究。

该研究针对各种样本大小,考虑了几个显着性水平以及许多对称、不对称和修正的正态分布,解决了 33 种正态性检验的性能。研究得出的正态性检验的一般建议是根据非正态性的性质定义的

如果您真的想将他们的研究归结为是/否,那么答案是肯定的。在大多数情况下,Shapiro-Wilks 测试似乎比 Anderson-Darling 更强大一些。当您没有考虑特定的替代发行版时,他们建议进行 Shapiro Wilk 测试。但是,如果您对这个主题感兴趣,那么这篇论文值得一读。至少看看表格。

  • Edith Seier, Normality Tests: Power Comparison , in International Encyclopedia of Statistical Science, 2014 - 对该主题已发表研究的调查。同样,答案取决于样本和您对替代分布的了解,但简单的答案是肯定的,Shapiro-Wilk 通常更强大,但并非总是如此。

  • Henry C. Thode,正态性检验,国际统计科学百科全书,2014 - 流行正态性检验的描述。他的建议:

如前所述,正态性检验的数量很大,甚至大部分都无法在此提及。总体而言,最好的检验似乎是矩检验、Shapiro-Wilk W、Anderson-Darling(参见 Anderson-Darling 拟合优度检验)和 Jarque-Bera 检验。这些和许多其他正态性检验及其特征的细节可以在 Thode (2002) 中找到,在 D'Agostino 和 Stephens (1986) 中可以找到关于 t 问题的一般优度,包括正态性检验。A2

现在,这都是关于单变量测试的。Thode (2002) 还具有多变量检验、删失数据、正态混合、存在异常值的检验等等。