我在一些文献中已经读过,Shapiro-Wilk检验被认为是最好的正态性检验,因为对于给定的显着性水平,如果无效假设被否定,则拒绝原假设的概率高于其他假设。正常性测试。
您能否在可能的情况下使用数学参数向我解释,与其他一些正态性检验(例如安德森–达林检验)相比,它的工作原理如何?
我在一些文献中已经读过,Shapiro-Wilk检验被认为是最好的正态性检验,因为对于给定的显着性水平,如果无效假设被否定,则拒绝原假设的概率高于其他假设。正常性测试。
您能否在可能的情况下使用数学参数向我解释,与其他一些正态性检验(例如安德森–达林检验)相比,它的工作原理如何?
Answers:
首先是一个一般性评论:请注意,Anderson-Darling检验适用于完全指定的分布,而Shapiro-Wilk检验适用于具有任何均值和方差的法线。然而,正如D'Agostino和Stephens [ 1 ]所指出的那样,Anderson-Darling以非常方便的方式适应估计情况,类似于(但收敛速度更快,并且以比Lilliefors测试更容易处理的方式进行了修改)。 (Kolmogorov-Smirnov案)。具体来说,在正常情况下,n = 5时,A ∗ = A 2 ( 1 + 4可以使用 n 2)(不要测试n <5的拟合优度)。
我在一些文献中已经读过,Shapiro-Wilk检验被认为是最好的正态性检验,因为对于给定的显着性水平α,如果无效假设被拒绝,则拒绝零假设的概率高于其他正态性。测试。
一般来说,这是错误的。
哪种正态性测试“更好”取决于您感兴趣的替代品类别。Shapiro-Wilk受欢迎的原因之一是,它在多种有用的替代品中往往具有很好的能力。它在许多功率研究中都出现了,并且通常表现很好,但是并不是普遍最佳的。
寻找功能较弱的替代品非常容易。
例如,对于轻尾的替代品,其功率通常小于学习范围(例如,在统一数据的正态性检验中进行比较-例如,在n=30时,基于u的检验的功效约为63%,而Shapiro Wilk的功效为38%多一点)。
Anderson-Darling(针对参数估计进行了调整)在双指数下表现更好。相对于某些偏斜替代方案,矩偏斜效果更好。
您能否在可能的情况下使用数学参数向我解释,与其他一些正态性检验(例如安德森–达林检验)相比,它的工作原理如何?
我将以笼统的方式进行解释(如果您想要更具体的细节,那么最好的选择是原始论文和一些以后的讨论它们的论文):
考虑一个更简单但密切相关的测试:Shapiro-Francia;它实际上是正常状态下订单统计信息和预期订单统计信息之间相关性的函数(因此,这是对正常QQ图中“直线的直线度”的直接测量)。我记得,Shapiro-Wilk功能更强大,因为它还考虑了阶次统计量之间的协方差,从而从QQ图生成了的最佳线性估计量,然后将其按s进行缩放。当分布远离正态分布时,该比率不接近1。
相比之下,像Kolmogorov-Smirnov和Cramér-vonMises这样的Anderson-Darling都是基于经验CDF。具体来说,它基于ECDF与理论ECDF之间的加权偏差(方差加权使它对尾部偏差更敏感)。
Shapiro和Chen [ 2 ](1995)的检验(基于顺序统计之间的间隔)通常显示出比Shapiro-Wilk略强的能力(但并非总是如此)。他们的表现通常非常相似。
-
使用Shapiro Wilk是因为它通常功能强大,使用广泛并且很多人都熟悉它(无需在论文中详细解释它的含义)–只是不要以为它是错觉就不要使用它“最佳正态性检验”。没有最好的正态性检验。
[1]:达戈斯蒂诺,RB和斯蒂芬斯,MA(1986)
拟合技术的善良,
马塞尔·德克尔,纽约。
[2]:Chen,L.和Shapiro,S.(1995)
“基于归一化间距的正态性的替代检验。”
杂志统计计算和模拟的 53,269-287。
shapiro.test
在R中运行会出错,sample size must be between 3 and 5000
然后还应该使用其他测试?
显然,您阅读的比较不包括SnowsPenultimateNormalityTest
(http://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.test
R的TeachingDemos软件包中的功能(与相同的软件包SnowsPenultimateNormalityTest
)。
我来晚了,但是会参考已发表的经过同行评审的研究结果。我对OP的问题未回答“是/否”的原因是,它比看起来更复杂。对于来自任何分布的有无异常值的样本,没有一种测试是最强大的。离群值可能会严重降低一种测试的功效,而增加另一种测试的功效。当样品来自对称分布等时,某些测试会更好地工作。
从第7.1.5节开始:基于能力,测试的选择与可获得的信息或有关替代方法的假设直接相关。替代方案越具体,测试通常就越具体,功能越强大;这也将产生最可靠的建议。
和
关节偏斜度和峰度测试,例如 与安德森·达林(Anderson-Darling)一样,可提供强大的动力来应对多种替代方案 。与其他测试相比,Wilk-Shapiro W在偏斜和短尾对称替代方案中显示出相对较高的功效,而长尾对称替代方案则具有可观的功效。
该研究针对33种正态性检验的性能,针对各种样本量,考虑了多个显着性水平以及许多对称,不对称和修正的正态分布。研究得出的有关正常性测试的一般建议是根据非正常性的性质定义的
如果您真的想将他们的研究归纳为是/否,那么答案是肯定的。在大多数情况下,Shapiro-Wilks检验似乎比Anderson-Darling更有力。当您没有特定的替代发行版时,他们建议使用Shapiro Wilk测试。但是,如果您对此主题感兴趣,则值得一读。至少看看桌子。
伊迪丝·赛尔(Edith Seier),《常态检验:能力比较》,在《国际统计科学百科全书》中,2014年-有关该主题的已发表研究的调查。同样,答案取决于样本以及您对替代分布的了解,但简单的答案是肯定的,Shapiro-Wilk通常功能更强大,但并非总是如此。
Henry C. Thode,常态检验,《国际统计科学大全》,2014年-流行的正态检验的说明。他的建议:
如前所述,正常性测试的数量很大,对于其中的大多数测试而言,都太大了。总的来说,最好的测试是当下测试,Shapiro–Wilk W,Anderson–Darling(请参阅安德森-达因拟合度检验)和Jarque-Bera检验。关于这些和许多其他正态性检验及其特征的详细信息,可以在Thode(2002)中找到,也可以在D'Agostino和Stephens(1986)中找到包括正态性检验在内的一般问题。
现在,这一切都与单变量测试有关。Thode(2002)还具有多变量测试,检查数据,正常混合,在异常值存在下的测试等等。
一个更严肃的答案,进一步解决了这个问题,尤其是@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