샤피로-윌크 검정은 주어진 유의 수준 에 대해 귀무 가설이 기각 될 경우 귀무 가설을 기각 할 확률이 다른 정규성보다 높기 때문에 Shapiro-Wilk 검정이 최상의 정규성 검정으로 간주된다는 문헌을 읽었습니다. 테스트.
가능한 경우 수학적 인수를 사용하여 다른 정규성 테스트 (Anderson–Darling 테스트)와 비교하여 어떻게 작동하는지 설명해 주시겠습니까?
샤피로-윌크 검정은 주어진 유의 수준 에 대해 귀무 가설이 기각 될 경우 귀무 가설을 기각 할 확률이 다른 정규성보다 높기 때문에 Shapiro-Wilk 검정이 최상의 정규성 검정으로 간주된다는 문헌을 읽었습니다. 테스트.
가능한 경우 수학적 인수를 사용하여 다른 정규성 테스트 (Anderson–Darling 테스트)와 비교하여 어떻게 작동하는지 설명해 주시겠습니까?
답변:
먼저 일반적인 의견 : Anderson-Darling 검정은 완전히 지정된 분포에 대한 것이고 Shapiro-Wilk는 모든 평균과 분산에 대한 법선에 대한 것입니다. 그러나 D' Agostino & Stephens [ 1 ] 에서 언급 한 바와 같이 Anderson-Darling은 추정 사례에 매우 편리한 방식으로 적응하지만 (더 빠르게 수렴하고 Lilliefors 테스트보다 다루기 쉬운 방식으로 수정됩니다) Kolmogorov-Smirnov 사례). 구체적으로, 정상시에 의해 N = 5 의 점근 값 테이블 * = 2 ( 1 + 4가 사용될 수있다 (n <5에 대한 적합도를 테스트하지 않음).
나는 주어진 유의 수준 α에 대해 귀무 가설을 기각 할 확률이 다른 정규성의 경우보다 높기 때문에 Shapiro-Wilk 검정이 최고의 정규성 검정으로 간주된다는 문헌을 읽었습니다. 테스트.
일반적인 진술로 이것은 거짓입니다.
어떤 정규성 테스트가 "더 나은"테스트를 원하는지에 따라 달라집니다. Shapiro-Wilk가 널리 사용되는 이유 중 하나는 광범위한 유용한 대안에서 강력한 성능을 발휘하기 때문입니다. 그것은 많은 힘의 연구에서 나타나며 일반적으로 아주 잘 수행되지만 보편적으로 최고는 아닙니다.
덜 강력한 대안을 찾기는 매우 쉽습니다.
예를 들어, 가벼운 꼬리 대안에 대해서는 종종 학생 범위 u = max ( x ) − min 보다 전력이 적습니다. (예 :n=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보다 약간 더 많은 힘을 보여줍니다 (항상 그런 것은 아님). 그들은 종종 매우 유사하게 수행합니다.
-
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.
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. 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.test
TeachingDemos 패키지의 R에 대한 기능입니다 (와 같은 패키지 SnowsPenultimateNormalityTest
).
나는 파티에 늦었지만 출판 된 동료 검토 연구에 대한 언급으로 대답 할 것입니다. OP의 질문에 예 / 아니요로 대답하지 않는 이유는 생각보다 복잡하기 때문입니다. 특이 치 유무에 관계없이 분포에서 추출 된 표본에 가장 강력한 테스트는 하나도 없습니다. 특이 치가 한 검정의 검정력을 심하게 약화시키고 다른 검정을 증가시킬 수 있습니다. 샘플이 대칭 분포 등에서 나올 때 일부 테스트가 더 잘 작동합니다.
섹션 7.1.5에서 : 전력에 기초하여, 시험 선택은 이용 가능한 정보 또는 대안에 관한 가정과 직접적으로 관련된다. 대안이 구체적 일수록 테스트는 일반적으로 더욱 구체적이고 강력합니다. 또한 가장 신뢰할 수있는 권장 사항이 생성됩니다.
과
이 연구는 몇 가지 유의 수준을 고려하고 다양한 대칭, 비대칭 및 수정 정규 분포에 대해 다양한 표본 크기에 대해 33 개의 정규성 검정의 성능을 다룹니다. 연구 결과 정규성 테스트에 대한 일반적인 권장 사항은 비정규 성의 특성에 따라 정의됩니다.
연구 결과를 예 / 아니오로 정리하고 싶다면 정답입니다. Shapiro-Wilks 테스트는 대부분의 경우 Anderson-Darling보다 약간 더 강력한 것으로 보입니다. 특정 대체 배포판이없는 경우 Shapiro Wilk 테스트를 권장합니다. 그러나이 주제에 관심이 있다면이 글을 읽을 가치가 있습니다. 최소한 테이블을 살펴보십시오.
Edith Seier, Normality Tests : Power Comparison , 2014 통계학 국제 백과 사전-주제에 대한 발표 된 연구 조사. 다시 말하지만, 그 대답은 표본과 대체 분포에 대한 지식에 달려 있지만 사소한 대답은 그렇습니다. Shapiro-Wilk는 일반적으로 더 강력하지만 항상 그런 것은 아닙니다.
Henry C. Thode, 통계 과학 국제 백과 사전의 정규성 테스트 , 2014- 인기있는 정규성 테스트에 대한 설명. 그의 추천 :
이제 이것은 일 변량 테스트에 관한 것입니다. 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