Czy Shapiro – Wilk jest najlepszym testem normalności? Dlaczego może być lepszy niż inne testy, takie jak Anderson-Darling?


24

Czytałem gdzieś w literaturze, że test Shapiro – Wilka jest uważany za najlepszy test normalności, ponieważ dla danego poziomu istotności, , prawdopodobieństwo odrzucenia hipotezy zerowej, jeśli jest fałszywe, jest wyższe niż w przypadku drugiej testy normalności.α

Czy mógłbyś mi wyjaśnić, używając matematycznych argumentów, jeśli to możliwe, jak dokładnie działa w porównaniu z innymi testami normalności (powiedzmy test Andersona – Darlinga)?


4
Zauważ, że moc zależy od sposobu, w jaki hipoteza zerowa jest fałszywa, co w przypadku ogólnego testu dobroci dopasowania może być dowolnym z niezliczonych sposobów. Bez sprawdzania nadal założę się, że każdy z powszechnych testów normalności jest najskuteczniejszy w porównaniu z pewnymi alternatywami.
Scortchi - Przywróć Monikę

5
Być może nie jest to odpowiedź, której szukasz, ale powiedziałbym, że najlepszym testem normalności jest wykres prawdopodobieństwa normalnego, tj. Wykres kwantylowo-kwantylowy obserwowanych wartości w porównaniu do kwantyli normalnych. Test Shapiro-Wilka jest rzeczywiście często chwalony, ale nie może dokładnie powiedzieć, jak różnią się twoje dane od normalnego. Często nieistotne różnice są oznaczane przez test, ponieważ kwalifikują się jako znaczące dla dużych próbek, a odwrotny problem może cię również ugryźć.
Nick Cox

Odpowiedzi:


17

Najpierw komentarz ogólny: Zauważ, że test Andersona-Darlinga jest dla całkowicie określonych rozkładów, podczas gdy Shapiro-Wilk jest dla normalnych o dowolnej średniej i wariancji. Jednak, jak zauważono w D'Agostino i Stephens [ 1 ], Anderson-Darling dostosowuje się w bardzo wygodny sposób do przypadku oszacowania, podobnie jak (ale zbiega się szybciej i jest modyfikowany w sposób, który jest łatwiejszy do opanowania niż test Lilliefors dla sprawa Kołmogorowa-Smirnowa). W szczególności, w normalnym, przy n = 5 , tabel wartości asymptotycznej A * = 2 ( 1 + 4[1]n=5może być użyte (nie sprawdzaj poprawności dopasowania dla n <5).ZA=ZA2)(1+4n-25n2))

Czytałem gdzieś w literaturze, że test Shapiro – Wilka jest uważany za najlepszy test normalności, ponieważ dla danego poziomu istotności α prawdopodobieństwo odrzucenia hipotezy zerowej, jeśli jest fałszywe, jest wyższe niż w przypadku innej normalności testy.

Ogólnie rzecz biorąc, jest to nieprawda.

To, które testy normalności są „lepsze”, zależy od tego, które klasy alternatyw Cię interesują. Jednym z powodów popularności Shapiro-Wilk jest to, że ma on bardzo dobrą moc w szerokim zakresie przydatnych alternatyw. Pojawia się w wielu badaniach nad mocą i zwykle działa bardzo dobrze, ale nie jest to ogólnie najlepsza.

Łatwo jest znaleźć alternatywy, w których jest mniej wydajny.

u=max(x)-min(x)sre(x)n=30u

Anderson-Darling (skorygowany o oszacowanie parametrów) radzi sobie lepiej przy podwójnym wykładniczym. Moment-skośność działa lepiej w porównaniu z niektórymi alternatywami skosu.

Czy mógłbyś mi wyjaśnić, używając matematycznych argumentów, jeśli to możliwe, jak dokładnie działa w porównaniu z innymi testami normalności (powiedzmy test Andersona – Darlinga)?

Wyjaśnię ogólnie (jeśli chcesz uzyskać bardziej szczegółowe informacje na temat oryginalnych artykułów i niektórych późniejszych artykułów, które je omawiają, byłbyś najlepszym wyborem):

Rozważ prostszy, ale ściśle powiązany test, Shapiro-Francia; w rzeczywistości jest to funkcja korelacji między statystykami zamówień a oczekiwanymi statystykami zamówień w normalności (i jako taka, całkiem bezpośrednią miarą „jak prosta jest linia” na normalnym wykresie QQ). O ile pamiętam, Shapiro-Wilk jest mocniejszy, ponieważ bierze również pod uwagę kowariancje między statystykami rzędu, tworząc najlepszy liniowy estymator z wykresu QQ, który jest następnie skalowany przez . Kiedy rozkład jest daleki od normalnego, stosunek nie jest bliski 1.σs

Dla porównania Anderson-Darling, podobnie jak Kolmogorov-Smirnov i Cramér-von Mises, opiera się na empirycznym CDF. W szczególności opiera się na ważonych odchyleniach między ECDF i teoretycznym ECDF (ważenie dla wariancji czyni go bardziej wrażliwym na odchylenia w ogonie).

Test Shapiro i Chena (1995) (oparty na odstępach między statystykami zamówień) często wykazuje nieco większą moc niż Shapiro-Wilk (ale nie zawsze); często działają bardzo podobnie.[2)]

-

Użyj Shapiro Wilk, ponieważ jest często potężny, szeroko dostępny i wiele osób go zna (eliminując potrzebę szczegółowego wyjaśnienia, co to jest, jeśli używasz go w gazecie) - po prostu nie używaj go pod złudzeniem, że jest to „najlepszy test normalności”. Nie ma jednego najlepszego testu normalności.

[1]: D'Agostino, RB i Stephens, MA (1986)
Goodness of Fit Techniques ,
Marcel Dekker, Nowy Jork.

[2]: Chen, L. i Shapiro, S. (1995)
„Alternatywny test normalności oparty na znormalizowanych odstępach”.
Journal of Statistics Computation and Simulation 53 , 269-287.


Mój kolega z klasy powiedział mi: „Jeśli wielkość próbki> 50, powinieneś użyć Kołmogorowa-Smirnowa”. Czy to jest poprawne?
Kittygirl

Nie. Pamiętam, że oryginalny artykuł Shapiro i Wilka z 1965 r. Podał tylko wymagane stałe ( ) użyte w liniowym oszacowaniu dla do ale to było ponad pół wieku temu. Od tego czasu sprawy trochę się potoczyły. Nawet bez tego Shapiro Francia lub Anderson-Darling (również dostosowane do oceny parametrów) są zwykle lepszymi wyborami; często mają one znacznie niższą moc w porównaniu z typowo interesującymi alternatywami. (a jeśli szacujesz średnią i odchylenie standardowe z próbki, nie robisz ściśle testu Kołmogorowa-Smirnowa, ale test Lillieforsa)zajaσn50
Glen_b

Krótko mówiąc, nastąpił krótki okres kilku lat po 1967 r. (Pierwsza publikacja pracy Lilliefors), w którym mogła to być uzasadniona rada, ale od dłuższego czasu
Glen_b

Gdy wielkość próbki> 5000, uruchom shapiro.testw R pojawi się błąd. sample size must be between 3 and 5000Co jeszcze należy zastosować test?
Kittygirl

1. Na ogół n prawie zawsze odrzucasz każdy prosty model dystrybucyjny (nawet jeśli jest to całkiem odpowiednie przybliżenie); bardziej wskazane może być zrobienie czegoś innego (dlaczego testujesz normalność?) 2. W rzeczywistości nie jest to kwestia „powinna”; nie ma jednej dobroci testu, która byłaby zawsze lepsza niż jakakolwiek inna. Tak się składa, że ​​Shapiro Wilk jest całkiem dobry. Jednak odpowiednią alternatywą dla dużej liczby n jest test Shapiro-Francia. Jeśli możesz znaleźć implementację testu Chen-Shapiro w dużej liczbie n (zakładając, że istnieje dobry powód, aby w ogóle przetestować), rozważ to.
Glen_b

12

Oczywiście porównanie, które przeczytałeś, nie obejmowało SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ), ponieważ ma najwyższą możliwą moc spośród wszystkich alternatyw. Należy więc uznać to za „najlepsze”, jeśli jedynym czynnikiem jest moc (zauważ, że moje opinie są wyraźnie stronnicze, ale udokumentowane w linku / dokumentacji).

Zgadzam się jednak z komentarzem Nicka Coxa, że ​​najlepszym testem jest raczej fabuła niż test formalny, ponieważ pytanie „wystarczająco normalne” jest o wiele ważniejsze niż „dokładnie normalne”. Jeśli chcesz sensownego testu, sugerowałbym połączenie wykresu qq z metodologią przedstawioną w tym artykule:

Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF and Wickham, H. (2009) Wnioskowanie statystyczne dla eksploracyjnej analizy danych i diagnostyki modeli Phil. Trans. R. Soc. A 2009 367, 4361–4383 doi: 10.1098 / rsta.2009.0120

Jedną z implementacji tego jest vis.testfunkcja w pakiecie TeachingDemos dla R (ten sam pakiet co SnowsPenultimateNormalityTest).


1
Zgadzam się z tym sentymentem, ale patrzenie na wykresy QQ nie jest zbyt dobrym rozwiązaniem, jeśli ktoś chce zrobić wiele z więcej niż 10-20 zmiennych.
Andrew M,

Oprócz testów normalności drukujemy wykresy QQ. Nie są to wyłączne, ale uzupełniające się narzędzia.
Aksakal,

2
@Andrew M Tak, czy przeglądasz wyniki 100 lub 1000 Shapiro-Wilk lub innych testów, co wolisz? Zautomatyzowanie patrzenia na wykresy QQ nie jest trudne, powiedzmy 25 na raz. Często wystarczy rzut oka, aby zobaczyć (dosłownie) prawdziwy problem.
Nick Cox,

10

Jestem spóźniony na imprezę, ale odpowiem referencjami do opublikowanych badań recenzowanych. Powodem, dla którego nie odpowiadam na pytanie OP tak / nie, jest to, że jest ono bardziej skomplikowane, niż mogłoby się wydawać. Nie ma jednego testu, który byłby najsilniejszy dla próbek pochodzących z dowolnej dystrybucji z wartościami odstającymi lub bez wartości odstających. Wartości odstające mogą poważnie zmniejszyć moc jednego testu i zwiększyć się w innym. Niektóre testy działają lepiej, gdy próbka pochodzi z symetrycznego rozkładu itp.

  • Henry C. Thode, Testing for Normality , 2002 - To najbardziej wszechstronna książka na ten temat. Gdybym musiał sprowadzić to do prostej odpowiedzi, SW nie jest we wszystkich przypadkach mocniejszy niż AD. Oto dwa fragmenty twojej przyjemności z czytania.

Z sekcji 7.1.5: Na podstawie mocy wybór testu jest bezpośrednio związany z dostępnymi informacjami lub założeniami dotyczącymi alternatywy. Im bardziej konkretna alternatywa, tym bardziej konkretny i potężniejszy będzie zwykle test; zaowocuje to również najbardziej wiarygodnymi zaleceniami.

i

K.s2)ZA2)

  • Romao, Xavier, Raimundo Delgado i Anibal Costa. „Empiryczne porównanie mocy jednoznacznych testów dobroci dopasowania do normalności”. Journal of Statistics Computation and Simulation 80.5 (2010): 545-591. To są najnowsze opublikowane badania na ten temat, który znam.

Badanie dotyczy wydajności 33 testów normalności dla różnych wielkości próby, z uwzględnieniem kilku poziomów istotności oraz szeregu symetrycznych, asymetrycznych i zmodyfikowanych rozkładów normalnych. Ogólne zalecenia dotyczące testowania normalności wynikające z badania są określone zgodnie z charakterem nienormalności

Jeśli naprawdę chcesz sprowadzić swoje badania do tak / nie, odpowiedź brzmi TAK. Test Shapiro-Wilksa wydaje się być w większości przypadków nieco bardziej wydajny niż Anderson-Darling. Polecają test Shapiro Wilk, gdy nie masz na myśli szczególnej alternatywnej dystrybucji. Jeśli jednak jesteś zainteresowany tym tematem, papier warto przeczytać. Przynajmniej spójrz na tabele.

  • Edith Seier, Testy normalności: porównanie mocy , w Międzynarodowej Encyklopedii Nauk Statystycznych, 2014 - Badanie opublikowanych badań na ten temat. Ponownie, odpowiedź zależy od próbki i twojej wiedzy o alternatywnym rozkładzie, ale trywialna odpowiedź brzmi TAK, Shapiro-Wilk jest zwykle silniejszy, ale nie zawsze.

  • Henry C. Thode, Testy normalności , w Międzynarodowej Encyklopedii Nauk Statystycznych, 2014 - Opis popularnych testów normalności. Jego zalecenie:

ZA2)

Teraz chodziło o testy jednowymiarowe. Thode (2002) ma również test wielowymiarowy, dane cenzurowane, normalne mieszaniny, testy w obecności wartości odstających i wiele więcej.


9

Poważniejsza odpowiedź na dalsze pytania, a zwłaszcza ciągłe zainteresowanie @ silverfish. Jednym z podejść do odpowiedzi na takie pytania jest uruchomienie symulacji w celu porównania. Poniżej znajduje się kod R, który symuluje dane w ramach różnych alternatyw oraz wykonuje kilka testów normalności i porównuje moc (oraz przedział ufności dla mocy, ponieważ moc jest szacowana za pomocą symulacji). Poprawiłem nieco rozmiary próbek, ponieważ nie było interesujące, gdy wiele mocy było zbliżonych do 100% lub 5%, znalazłem okrągłe liczby, które dawały moc blisko 80%. Każdy zainteresowany może łatwo pobrać ten kod i zmodyfikować go dla różnych założeń, różnych alternatyw itp.

Widać, że istnieją alternatywy, w przypadku których niektóre testy wypadają lepiej, a inne w gorszych. Ważnym pytaniem jest zatem, które alternatywy są najbardziej realistyczne dla twoich pytań naukowych / dziedziny. Naprawdę należy to uzupełnić symulacją wpływu rodzajów nienormalności będących przedmiotem zainteresowania na inne wykonywane testy. Niektóre z tych rodzajów nienormalności znacznie wpływają na inne testy oparte na normalnych, inne nie mają na nie większego wpływu.

> 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

Dziękujemy za dodanie tej odpowiedzi, która stanowi miłe uzupełnienie wcześniejszej. Żadna odmiana nie była przeznaczona na twoją drugą odpowiedź, która jest jedną z moich ulubionych na SE!
Silverfish,

1
Pozwoliłem sobie na edycję kodu, aby dodać formatowanie kodu i dopasować wszystko do okna, Greg. Myślę, że łatwiej będzie czytać w ten sposób, ale jeśli ci się nie podoba, cofnij go z moimi przeprosinami.
gung - Przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.