Shapiro–Wilk가 최고의 정규성 검정입니까? Anderson-Darling과 같은 다른 테스트보다 더 나은 이유는 무엇입니까?


24

샤피로-윌크 검정은 주어진 유의 수준 α 에 대해 귀무 가설이 기각 될 경우 귀무 가설을 기각 할 확률이 다른 정규성보다 높기 때문에 Shapiro-Wilk 검정이 최상의 정규성 검정으로 간주된다는 문헌을 읽었습니다. 테스트.

가능한 경우 수학적 인수를 사용하여 다른 정규성 테스트 (Anderson–Darling 테스트)와 비교하여 어떻게 작동하는지 설명해 주시겠습니까?


4
검정력은 귀무 가설이 거짓 인 방식에 따라 달라지며, 범용 적합도 검정의 경우 무수히 많은 방법이 될 수 있습니다. 확인하지 않고 나는 각각의 일반적인 정규성 테스트가 특정 대안에 대해 가장 강력하다고 확신합니다.
Scortchi-Monica Monica 복원

5
아마도 당신이 추구하는 대답은 아니지만 최선의 정규성 테스트는 정규 확률도, 즉 관측 값과 정규 양자 수의 양자 양자 그림입니다. Shapiro-Wilk 테스트는 실제로 자주 권장되지만 데이터가 정상과 어떻게 다른지 정확히 알 수는 없습니다. 중요하지 않은 차이는 큰 표본 크기에 대해 중요한 것으로 간주되기 때문에 테스트에서 플래그가 지정되는 경우가 많으며 반대의 문제로 인해 문제가 발생할 수도 있습니다.
Nick Cox

답변:


17

먼저 일반적인 의견 : Anderson-Darling 검정은 완전히 지정된 분포에 대한 것이고 Shapiro-Wilk는 모든 평균과 분산에 대한 법선에 대한 것입니다. 그러나 D' Agostino & Stephens [ 1 ] 에서 언급 한 바와 같이 Anderson-Darling은 추정 사례에 매우 편리한 방식으로 적응하지만 (더 빠르게 수렴하고 Lilliefors 테스트보다 다루기 쉬운 방식으로 수정됩니다) Kolmogorov-Smirnov 사례). 구체적으로, 정상시에 의해 N = 5 의 점근 값 테이블 * = 2 ( 1 + 4[1]n=5가 사용될 수있다 (n <5에 대한 적합도를 테스트하지 않음).A=A2(1+4n25n2)

나는 주어진 유의 수준 α에 대해 귀무 가설을 기각 할 확률이 다른 정규성의 경우보다 높기 때문에 Shapiro-Wilk 검정이 최고의 정규성 검정으로 간주된다는 문헌을 읽었습니다. 테스트.

일반적인 진술로 이것은 거짓입니다.

어떤 정규성 테스트가 "더 나은"테스트를 원하는지에 따라 달라집니다. Shapiro-Wilk가 널리 사용되는 이유 중 하나는 광범위한 유용한 대안에서 강력한 성능을 발휘하기 때문입니다. 그것은 많은 힘의 연구에서 나타나며 일반적으로 아주 잘 수행되지만 보편적으로 최고는 아닙니다.

덜 강력한 대안을 찾기는 매우 쉽습니다.

예를 들어, 가벼운 꼬리 대안에 대해서는 종종 학생 범위 u = max ( x ) min 보다 전력이 적습니다. (예 :n=30 일때 균일 한 데이터의 정규성 검정에서 비교 )u=max(x)min(x)sd(x)=30 에서 를 기반으로 한 검정 은 Shapiro Wilk의 경우 38 % 이상의 비트에 비해 약 63 %의 검정력을 가짐).

Anderson-Darling (모수 추정값으로 조정)은 이중 지수에서 더 좋습니다. 모멘트 왜곡은 일부 스큐 대안에 대해 더 좋습니다.

가능한 경우 수학적 인수를 사용하여 다른 정규성 테스트 (Anderson–Darling 테스트)와 비교하여 어떻게 작동하는지 설명해 주시겠습니까?

나는 일반적인 용어로 설명 할 것입니다 (원본과 자세한 내용을 원한다면 그 이후의 논문이 최선의 방법이 될 것입니다).

더 간단하지만 밀접하게 관련된 테스트 인 Shapiro-Francia를 고려하십시오. 이것은 정규성 하에서 주문 통계와 예상 주문 통계 사이의 상관 관계의 함수입니다 (정상 QQ 플롯에서 "직선이 얼마나 직선"인지에 대한 직접적인 측정). 내가 기억 하듯이 Shapiro-Wilk는 주문 통계 간의 공분산을 고려 하여 QQ 플롯에서 의 최고의 선형 추정량을 생성하고 s 로 스케일링 하기 때문에 더 강력합니다 . 분포가 정규와 거리가 멀면 비율이 1에 가깝지 않습니다.σ에스

Kolmogorov-Smirnov 및 Cramér-von Mises와 같은 Anderson-Darling은 경험적 CDF를 기반으로합니다. 특히 ECDF와 이론적 ECDF 간의 가중치 편차를 기반으로합니다 (분산 가중치는 꼬리 편차에 더 민감합니다).

Shapiro와 Chen [ 2 ] (1995) 의 테스트 (주문 통계 사이의 간격을 기준으로 한)는 종종 Shapiro-Wilk보다 약간 더 많은 힘을 보여줍니다 (항상 그런 것은 아님). 그들은 종종 매우 유사하게 수행합니다.[2]

-

Shapiro Wilk는 강력하고 널리 사용 가능하며 많은 사람들이 익숙하기 때문에 사용합니다 (종이에 사용하는 경우 내용을 자세히 설명 할 필요가 없음). "최고의 정규성 테스트". 최고의 정규성 검정은 없습니다.

[1] : D' Agostino, RB and Stephens, MA (1986)
Goodness of Fit Techniques ,
Marcel Dekker, New York.

[2] : Chen, L. and Shapiro, S. (1995)
"정규화 된 간격에 기초한 정규성에 대한 대체 시험."
통계 계산 및 시뮬레이션 저널 53 , 269-287.


내 반 친구가 "샘플 크기가 50보다 크면 Kolmogorov-Smirnov를 사용해야합니다."라고 말했습니다. 그 맞습니까?
kittygirl

에이나는σ50

간단히 말해, 1967 년 이후 몇 년의 짧은 기간 (릴리 포르 스 (Lillyefors)의 첫 출판)이 있었지만 그 이후로 그만한 조언이 있었지만 그 이후로 오랫동안 지속되지는 않았습니다.
Glen_b -Reinstate Monica April

샘플 크기가 5000 보다 크면 shapiro.testR 에서 실행 하면 오류가 발생 sample size must be between 3 and 5000합니다. 그런 다음 다른 테스트를 사용해야합니까?
kittygirl

1. n이 크면 간단한 분포 모델을 거의 항상 거부합니다 (아주 적합한 근사치 일지라도). 다른 것을하는 것이 더 바람직 할 수 있습니다 (정상 성을 테스트하는 이유는 무엇입니까?). 2. 실제로 "반드시"문제가 아닙니다. 항상 다른 어떤 것보다 나은 단일 테스트의 장점은 없습니다. Shapiro Wilk가 합리적으로 좋습니다. 그러나 큰 n에서의 적절한 대안은 Shapiro-Francia 테스트입니다. 큰 n에서 Chen-Shapiro 테스트 구현을 찾을 수 있다면 (테스트 할만한 이유가 있다고 가정) 대신에 고려하십시오.
Glen_b-복지국 Monica

12

분명히 당신이 읽은 비교에는 모든 대안에 대해 가능한 가장 강력한 힘이 있기 때문에 SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ) 포함하지 않았습니다 . 따라서 권력이 유일한 고려 사항이라면 "최고"로 간주되어야합니다 (내 의견은 명확하게 편향되어 있지만 링크 / 문서에 문서화되어 있음).

그러나 "정상적으로 정상"이라는 질문이 "정확히 정상"보다 훨씬 중요하기 때문에 최선의 테스트는 공식 테스트가 아니라 플롯이라는 Nick Cox의 의견에 동의합니다. 의미있는 테스트를 원한다면이 백서의 방법론과 qq 플롯을 결합하는 것이 좋습니다.

Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF and Wickham, H. (2009) 탐색 적 데이터 분석 및 모델 진단을위한 통계적 추론 Phil. 트랜스 R. Soc. A 2009 367, 4361-4383 doi : 10.1098 / rsta.2009.0120

이것의 한 가지 구현은 vis.testTeachingDemos 패키지의 R에 대한 기능입니다 (와 같은 패키지 SnowsPenultimateNormalityTest).


1
나는 정서에 동의하지만 QQ 플롯을 바라 보는 것이 10-20 개 이상의 변수로 많은 것을 원한다면 큰 해결책이 아닙니다.
Andrew M

정규성 테스트와 함께 QQ 플롯을 인쇄합니다. 독점적이지 않고 보완 도구입니다.
Aksakal

2
@Andrew M 그렇다면 100 또는 1000 정도의 결과를 통해 Shapiro-Wilk 또는 다른 테스트를 원하십니까? QQ 플롯을 한 번에 25 개씩보고 자동화하는 것은 어렵지 않습니다. 종종 한 눈에 (문학적으로) 실제 문제를 볼 수 있습니다.
Nick Cox

10

나는 파티에 늦었지만 출판 된 동료 검토 연구에 대한 언급으로 대답 할 것입니다. OP의 질문에 예 / 아니요로 대답하지 않는 이유는 생각보다 복잡하기 때문입니다. 특이 치 유무에 관계없이 분포에서 추출 된 표본에 가장 강력한 테스트는 하나도 없습니다. 특이 치가 한 검정의 검정력을 심하게 약화시키고 다른 검정을 증가시킬 수 있습니다. 샘플이 대칭 분포 등에서 나올 때 일부 테스트가 더 잘 작동합니다.

  • Henry C. Thode, 정규성 테스트 , 2002-이 주제에 관한 가장 포괄적 인 책입니다. 간단한 대답으로 바보 짓을해야한다면 SW는 모든 경우에 AD보다 강력하지 않습니다. 다음은 독서의 즐거움을위한 두 가지 발췌문입니다.

섹션 7.1.5에서 : 전력에 기초하여, 시험 선택은 이용 가능한 정보 또는 대안에 관한 가정과 직접적으로 관련된다. 대안이 구체적 일수록 테스트는 일반적으로 더욱 구체적이고 강력합니다. 또한 가장 신뢰할 수있는 권장 사항이 생성됩니다.

케이에스2에이2

  • Romao, Xavier, Raimundo Delgado 및 Anibal Costa. "일 변량 적합도 검정의 실험적 검정력 비교." 통계 계산 및 시뮬레이션 저널 80.5 (2010) : 545-591. 이것은 내가 아는 주제에 관한 가장 최근에 발표 된 연구입니다.

이 연구는 몇 가지 유의 수준을 고려하고 다양한 대칭, 비대칭 및 수정 정규 분포에 대해 다양한 표본 크기에 대해 33 개의 정규성 검정의 성능을 다룹니다. 연구 결과 정규성 테스트에 대한 일반적인 권장 사항은 비정규 성의 특성에 따라 정의됩니다.

연구 결과를 예 / 아니오로 정리하고 싶다면 정답입니다. Shapiro-Wilks 테스트는 대부분의 경우 Anderson-Darling보다 약간 더 강력한 것으로 보입니다. 특정 대체 배포판이없는 경우 Shapiro Wilk 테스트를 권장합니다. 그러나이 주제에 관심이 있다면이 글을 읽을 가치가 있습니다. 최소한 테이블을 살펴보십시오.

  • Edith Seier, Normality Tests : Power Comparison , 2014 통계학 국제 백과 사전-주제에 대한 발표 된 연구 조사. 다시 말하지만, 그 대답은 표본과 대체 분포에 대한 지식에 달려 있지만 사소한 대답은 그렇습니다. Shapiro-Wilk는 일반적으로 더 강력하지만 항상 그런 것은 아닙니다.

  • Henry C. Thode, 통계 과학 국제 백과 사전의 정규성 테스트 , 2014- 인기있는 정규성 테스트에 대한 설명. 그의 추천 :

에이2

이제 이것은 일 변량 테스트에 관한 것입니다. 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-복직 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.