Shapiro–Wilk是最好的正态性检验吗?为什么它会比Anderson-Darling等其他测试更好?


24

我在一些文献中已经读过,Shapiro-Wilk检验被认为是最好的正态性检验,因为对于给定的显着性水平,如果无效假设被否定,则拒绝原假设的概率高于其他假设。正常性测试。α

您能否在可能的情况下使用数学参数向我解释,与其他一些正态性检验(例如安德森–达林检验)相比,它的工作原理如何?


4
请注意,功效取决于零假设为假的方式,对于通用拟合优度检验,这可以是无数种方式。如果没有进行检查,我仍然敢打赌,每种常见的正态性测试对某些替代方案来说都是最强大的。
Scortchi-恢复莫妮卡

5
也许不是您寻求的答案,但是我想说,最好的正态性检验是一个正态概率图,即观测值与正常分位数的分位数-分位数图。确实经常赞扬Shapiro-Wilk测试,但是它无法准确告诉您数据与正常数据有何不同。测试通常会标记出不重要的差异,因为对于大样本量而言,它们确实具有显着意义,而相反的问题也可能对您造成影响。
Nick Cox

Answers:


17

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

我在一些文献中已经读过,Shapiro-Wilk检验被认为是最好的正态性检验,因为对于给定的显着性水平α,如果无效假设被拒绝,则拒绝零假设的概率高于其他正态性。测试。

一般来说,这是错误的。

哪种正态性测试“更好”取决于您感兴趣的替代品类别。Shapiro-Wilk受欢迎的原因之一是,它在多种有用的替代品中往往具有很好的能力。它在许多功率研究中都出现了,并且通常表现很好,但是并不是普遍最佳的。

寻找功能较弱的替代品非常容易。

例如,对于轻尾的替代品,其功率通常小于学习范围(例如,在统一数据的正态性检验中进行比较-例如,在n=30时,基于u的检验的功效约为63%,而Shapiro Wilk的功效为38%多一点)。u=max(x)min(x)sd(x)n=30u

Anderson-Darling(针对参数估计进行了调整)在双指数下表现更好。相对于某些偏斜替代方案,矩偏斜效果更好。

您能否在可能的情况下使用数学参数向我解释,与其他一些正态性检验(例如安德森–达林检验)相比,它的工作原理如何?

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

考虑一个更简单但密切相关的测试:Shapiro-Francia;它实际上是正常状态下订单统计信息和预期订单统计信息之间相关性的函数(因此,这是对正常QQ图中“直线的直线度”的直接测量)。我记得,Shapiro-Wilk功能更强大,因为它还考虑了阶次统计量之间的协方差,从而从QQ图生成了的最佳线性估计量,然后将其按s进行缩放。当分布远离正态分布时,该比率不接近1。σs

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

Shapiro和Chen [ 2 ](1995)的检验(基于顺序统计之间的间隔)通常显示出比Shapiro-Wilk略强的能力(但并非总是如此)。他们的表现通常非常相似。[2]

-

使用Shapiro Wilk是因为它通常功能强大,使用广泛并且很多人都熟悉它(无需在论文中详细解释它的含义)–只是不要以为它是错觉就不要使用它“最佳正态性检验”。没有最好的正态性检验。

[1]:达戈斯蒂诺,RB和斯蒂芬斯,MA(1986)
拟合技术的善良
马塞尔·德克尔,纽约。

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


我的同学告诉我:“如果样本量> 50,则应使用Kolmogorov-Smirnov。” 那是对的吗?
kittygirl

号根据我的记忆原来的1965年纸夏皮罗和威尔克只给出所需的常量(在的线性估计使用)σñ高达50但那是半个多世纪前。从那时起,事情发生了一点进展。即便如此,Shapiro Francia或Anderson-Darling(也针对参数估计进行了调整)通常是更好的选择。与通常有趣的替代方案相比,这些方案通常具有较低的功率。(&&如果您从样本中估计均值和sd,则不是严格执行Kolmogorov-Smirnov,而是进行Lilliefors检验)一种一世σn50
Glen_b -Reinstate Monica

简而言之,在1967年后的短短几年内(Liliefors的著作首次发表),这可能是一个合理的建议,但是很长一段时间以来
Glen_b -Reinstate Monica

当样本大小> 5000时,shapiro.test在R中运行会出错,sample size must be between 3 and 5000然后还应该使用其他测试?
kittygirl

1.一般而言,您几乎总是会拒绝任何简单的分布模型(即使是非常合适的近似值);最好做些其他的事情(为什么要测试正常性?)2.这实际上不是“应该”的事;没有任何一项测试总比其他任何产品更好。恰恰是Shapiro Wilk相当不错。但是,在大n处合适的替代方法是Shapiro-Francia检验。如果您可以在n处找到Chen-Shapiro测试的实现(假设有充分的理由进行测试),请考虑使用。
Glen_b-恢复莫妮卡

12

显然,您阅读的比较不包括SnowsPenultimateNormalityTesthttp://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf),因为它在所有替代方法中都具有最高的功效。因此,如果仅考虑功率,则应将其视为“最佳”(请注意,我的观点明显有偏见,但记录在链接/文档中)。

但是,我同意尼克·考克斯(Nick Cox)的评论,最好的测试是情节而不是形式测试,因为“足够正常”的问题比“完全正常”的问题重要得多。如果您想进行有意义的测试,则建议将qq图与本文的方法结合起来:

Buja,A.,Cook,D. 反式 R. Soc。A 2009 367,4361-4383 doi:10.1098 / rsta.2009.0120

一种实现是vis.testR的TeachingDemos软件包中的功能(与相同的软件包SnowsPenultimateNormalityTest)。


1
我同意这种观点,但是如果人们想用超过10到20个变量来做很多事情,那么凝视QQ情节并不是一个解决方案。
安德鲁M

除正常性检验外,我们还打印QQ绘图。它们不是排他性的,而是互补的工具。
Aksakal 2014年

2
@Andrew M那么,您是否希望通过100或1000左右的Shapiro-Wilk或其他测试的结果?自动查看QQ图并不困难,一次说25次。通常,一眼就足以看出(从字面上看)一个真正的问题。
尼克·考克斯

10

我来晚了,但是会参考已发表的经过同行评审的研究结果。我对OP的问题未回答“是/否”的原因是,它比看起来更复杂。对于来自任何分布的有无异常值的样本,没有一种测试是最强大的。离群值可能会严重降低一种测试的功效,而增加另一种测试的功效。当样品来自对称分布等时,某些测试会更好地工作。

  • Henry C. Thode,《正常性测试》,2002年-这是一本关于该主题的最全面的书。如果我不得不简单地回答一个简单的答案,那么在所有情况下,SW都不比AD强大。这是您的阅读乐趣的两个摘录。

从第7.1.5节开始:基于能力,测试的选择与可获得的信息或有关替代方法的假设直接相关。替代方案越具体,测试通常就越具体,功能越强大;这也将产生最可靠的建议。

关节偏斜度和峰度测试,例如 ķs2 与安德森·达林(Anderson-Darling)一样,可提供强大的动力来应对多种替代方案 一种2。与其他测试相比,Wilk-Shapiro W在偏斜和短尾对称替代方案中显示出相对较高的功效,而长尾对称替代方案则具有可观的功效。

  • Romao,Xavier,Raimundo Delgado和Anibal Costa。“对正态性的单变量拟合优度检验的经验功效比较。” 统计计算与仿真杂志80.5(2010):545-591。是我所知道的关于该主题的最新发表的研究。

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

如果您真的想将他们的研究归纳为是/否,那么答案是肯定的。在大多数情况下,Shapiro-Wilks检验似乎比Anderson-Darling更有力。当您没有特定的替代发行版时,他们建议使用Shapiro Wilk测试。但是,如果您对此主题感兴趣,则值得一读。至少看看桌子。

  • 伊迪丝·赛尔(Edith Seier),《常态检验:能力比较》,在《国际统计科学百科全书》中,2014年-有关该主题的已发表研究的调查。同样,答案取决于样本以及您对替代分布的了解,但简单的答案是肯定的,Shapiro-Wilk通常功能更强大,但并非总是如此。

  • Henry C. Thode,常态检验,《国际统计科学大全》,2014年-流行的正态检验的说明。他的建议:

如前所述,正常性测试的数量很大,对于其中的大多数测试而言,都太大了。总的来说,最好的测试是当下测试,Shapiro–Wilk W,Anderson–Darling一种2(请参阅安德森-达因拟合度检验)和Jarque-Bera检验。关于这些和许多其他正态性检验及其特征的详细信息,可以在Thode(2002)中找到,也可以在D'Agostino和Stephens(1986)中找到包括正态性检验在内的一般问题。

现在,这一切都与单变量测试有关。Thode(2002)还具有多变量测试,检查数据,正常混合,在异常值存在下的测试等等。


9

一个更严肃的答案,进一步解决了这个问题,尤其是@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

感谢您添加此答案,它是对您之前的答案的很好的补充。您的其他答案没有贬低之意,这是我在SE上的最爱之一!
银鱼

1
我可以自由地编辑代码以添加代码格式并适合窗口中的所有内容,Greg。我认为这样阅读会更容易,但是如果您不喜欢它,请回击并道歉。
gung-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.