Shapiro-Wilk è il miglior test di normalità? Perché potrebbe essere migliore di altri test come Anderson-Darling?


24

Ho letto da qualche parte in letteratura che il test di Shapiro-Wilk è considerato il miglior test di normalità perché per un dato livello di significatività, , la probabilità di rifiutare l'ipotesi nulla se è falsa è più alta che nel caso dell'altra test di normalità.α

Potresti spiegarmi, usando gli argomenti matematici se possibile, come funziona esattamente rispetto ad alcuni degli altri test di normalità (ad esempio il test Anderson-Darling)?


4
Si noti che il potere dipende dal modo in cui l'ipotesi nulla è falsa, che per un test di bontà di adattamento per scopi generici può essere uno qualsiasi di innumerevoli modi. Senza aver verificato, scommetterei comunque che ciascuno dei test di normalità comuni è più efficace contro alcune alternative.
Scortchi - Ripristina Monica

5
Forse non la risposta che cerchi, ma direi che il miglior test di normalità è un normale diagramma di probabilità, cioè un diagramma quantile-quantile di valori osservati rispetto a normali quantili. Il test Shapiro-Wilk è in effetti spesso encomiabile, ma non può dire esattamente in che modo i tuoi dati differiscono da un normale. Spesso le differenze non importanti sono contrassegnate dal test, perché si qualificano come significative per campioni di grandi dimensioni e il problema opposto può anche morderti.
Nick Cox,

Risposte:


17

Innanzitutto un commento generale: si noti che il test Anderson-Darling è per distribuzioni completamente specificate, mentre Shapiro-Wilk è per normali con qualsiasi media e varianza. Tuttavia, come osservato in D'Agostino & Stephens [1] Anderson-Darling si adatta in modo molto conveniente al caso di stima, affine a (ma converge più velocemente e viene modificato in un modo più semplice da gestire rispetto al Test di Lilliefors per il caso Kolmogorov-Smirnov). In particolare, al normale, per n=5 , tabelle del valore asintotico di UN*=UN2(1+4n-25n2) può essere utilizzato (non testare la bontà di adattamento per n <5).

Ho letto da qualche parte in letteratura che il test di Shapiro-Wilk è considerato il miglior test di normalità perché per un dato livello di significatività, α, la probabilità di rifiutare l'ipotesi nulla se è falsa è più alta che nel caso dell'altra normalità test.

Come affermazione generale, questo è falso.

Quali test di normalità sono "migliori" dipende da quali classi di alternative ti interessano. Una delle ragioni per cui lo Shapiro-Wilk è popolare è che tende ad avere un ottimo potere in una vasta gamma di alternative utili. Viene fuori in molti studi di potere e di solito si comporta molto bene, ma non è universalmente il migliore.

È abbastanza facile trovare alternative in base alle quali è meno potente.

Ad esempio, rispetto alle alternative a coda leggera spesso ha meno potenza dell'intervallo studentizzato (confrontali su un test di normalità su dati uniformi , ad esempio - a , un test basato su ha una potenza di circa il 63% rispetto a un po 'più del 38% per lo Shapiro Wilk).u=max(X)-min(X)Sd(X)n=30u

Anderson-Darling (adattato per la stima dei parametri) fa meglio al doppio esponenziale. L'asimmetria del momento fa meglio contro alcune alternative distorte.

Potresti spiegarmi, usando gli argomenti matematici se possibile, come funziona esattamente rispetto ad alcuni degli altri test di normalità (ad esempio il test Anderson-Darling)?

Spiegherò in termini generali (se desideri dettagli più specifici, gli articoli originali e alcuni degli articoli successivi che li discutono sarebbe la soluzione migliore):

Considera un test più semplice ma strettamente correlato, lo Shapiro-Francia; è effettivamente una funzione della correlazione tra le statistiche degli ordini e le statistiche degli ordini attese in condizioni normali (e come tale, una misura abbastanza diretta di "quanto è dritta la linea" nel normale diagramma QQ). Come ricordo, Shapiro-Wilk è più potente perché tiene conto anche delle covarianze tra le statistiche dell'ordine, producendo un miglior stimatore lineare di dal diagramma QQ, che viene poi ridimensionato da . Quando la distribuzione è tutt'altro che normale, il rapporto non è vicino a 1.σS

In confronto l'Anderson-Darling, come il Kolmogorov-Smirnov e il Cramér-von Mises, si basa sul CDF empirico. In particolare, si basa su deviazioni ponderate tra ECDF e ECDF teorico (la ponderazione per varianza lo rende più sensibile alle deviazioni nella coda).

Il test di Shapiro e Chen (1995) (basato sulle spaziature tra le statistiche degli ordini) mostra spesso un po 'più di potenza dello Shapiro-Wilk (ma non sempre); spesso si esibiscono in modo molto simile.[2]

-

Usa Shapiro Wilk perché è spesso potente, ampiamente disponibile e molte persone lo conoscono (eliminando la necessità di spiegare in dettaglio cosa è se lo usi in un documento) - non usarlo sotto l'illusione che sia "il miglior test di normalità". Non esiste un miglior test di normalità.

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

[2]: Chen, L. e Shapiro, S. (1995)
"Un test alternativo per la normalità basato su spaziature normalizzate."
Giornale di calcolo statistico e simulazione 53 , 269-287.


Il mio compagno di classe mi ha detto: "Se la dimensione del campione> 50, dovresti usare Kolmogorov-Smirnov." È corretto?
kittygirl

No. A mio ricordo, l'originale del 1965 di Shapiro e Wilk forniva solo le costanti richieste ( ) usate nella stima lineare di per fino a ma che era avvenuta oltre mezzo secolo fa. Le cose sono cambiate un po 'da allora. Anche senza quello, lo Shapiro Francia o l'Anderson-Darling (anch'essi adeguati alla stima dei parametri) sono di solito scelte migliori; spesso hanno un potere notevolmente inferiore rispetto a alternative tipicamente interessanti. (E se stai valutando la media e la sd dal campione, non stai facendo rigorosamente un Kolmogorov-Smirnov, ma piuttosto un test di Lilliefors)un'ioσn50
Glen_b -Restate Monica

In breve, ci fu un breve periodo di alcuni anni dopo il 1967 (la pubblicazione iniziale dell'opera di Lilliefors) in cui avrebbe potuto essere un consiglio giustificabile, ma non per molto tempo da quando
Glen_b -Restate Monica

Quando la dimensione del campione> 5000, viene eseguita shapiro.testin R, verrà visualizzato l'errore. sample size must be between 3 and 5000Quindi, quale altro test dovrebbe essere utilizzato?
kittygirl

1. Alla grande n respingerai quasi sempre qualsiasi modello distributivo semplice (anche quando è un'approssimazione abbastanza adatta); potrebbe essere più consigliabile fare qualcos'altro (perché stai testando la normalità?) 2. In realtà non è una questione di "dovrebbe" al riguardo; non esiste una singola bontà del test che sia sempre migliore di qualsiasi altra. Accade solo che lo Shapiro Wilk sia abbastanza buono. Tuttavia, un'alternativa adatta alla grande n è il test Shapiro-Francia. Se riesci a trovare un'implementazione del test Chen-Shapiro in grande n (supponendo che ci sia una buona ragione per testarlo), consideralo invece.
Glen_b

12

Chiaramente il confronto che hai letto non includeva SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ) poiché ha la massima potenza possibile tra tutte le alternative. Quindi dovrebbe essere considerato "Il migliore" se il potere è l'unica considerazione (nota che le mie opinioni sono chiaramente distorte, ma documentate nel link / documentazione).

Tuttavia, concordo con il commento di Nick Cox sul fatto che il test migliore sia una trama piuttosto che un test formale poiché la domanda di "Abbastanza normale" è molto più importante di "Esattamente normale". Se vuoi un test significativo, suggerirei di combinare la trama qq con la metodologia in questo documento:

Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF e Wickham, H. (2009) Inferenza statistica per analisi di dati esplorativi e diagnostica dei modelli Phil. Trans. R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120

Un'implementazione di ciò è la vis.testfunzione nel pacchetto TeachingDemos per R (stesso pacchetto di SnowsPenultimateNormalityTest).


1
Sono d'accordo con il sentimento, ma osservare i grafici QQ non è molto una soluzione se si vuole fare molto di tutto con più di 10-20 variabili.
Andrew M,

Stampiamo grafici QQ oltre ai test di normalità. Non sono strumenti esclusivi, ma complementari.
Aksakal,

2
@Andrew M Quindi, guardando attraverso i risultati di circa 100 o 1000 Shapiro-Wilk o altri test, cosa preferisci? Non è difficile automatizzare la visualizzazione dei grafici QQ, diciamo 25 alla volta. Spesso basta uno sguardo per vedere (letteralmente) un vero problema.
Nick Cox,

10

Sono in ritardo alla festa, ma risponderò con riferimenti alla ricerca pubblicata tra pari. Il motivo per cui non rispondo Sì / No alla domanda di OP è che è più complicato di quanto possa sembrare. Non esiste un test che sia il più potente per i campioni provenienti da qualsiasi distribuzione con o senza valori anomali. I valori anomali possono ridurre notevolmente la potenza di un test e aumentare per un altro. Alcuni test funzionano meglio quando il campione proviene da una distribuzione simmetrica ecc.

  • Henry C. Thode, Testing for Normality , 2002 - Questo è il libro più completo sull'argomento. Se dovessi smorzare fino a una semplice risposta, allora SW non è più potente di AD in tutti i casi. Ecco due estratti per il tuo piacere di leggere.

Dalla sezione 7.1.5: Sulla base della potenza, la scelta del test è direttamente correlata alle informazioni disponibili o alle ipotesi formulate in merito all'alternativa. Più specifica è l'alternativa, più specifica e più potente sarà la prova; questo comporterà anche le raccomandazioni più affidabili.

e

Un test congiunto di asimmetria e kurtosi come fornisce un'alta potenza contro una vasta gamma di alternative, così come l'Anderson-Darling . Wilk-Shapiro W ha mostrato una potenza relativamente elevata tra le alternative simmetriche inclinate e a coda corta rispetto ad altri test e una potenza rispettabile per le alternative simmetriche a coda lunga. A 2KS2UN2

  • Romao, Xavier, Raimundo Delgado e Anibal Costa. "Un confronto empirico di potenza di test univoci di bontà di adattamento per la normalità." Journal of Statistical Computation and Simulation 80.5 (2010): 545-591. Questa è la ricerca pubblicata più recente sull'argomento che conosco.

Lo studio si occupa dell'esecuzione di 33 test di normalità, per varie dimensioni di campione, considerando diversi livelli di significatività e per un numero di distribuzioni normali simmetriche, asimmetriche e modificate. Le raccomandazioni generali per i test di normalità risultanti dallo studio sono definite in base alla natura della non normalità

Se vuoi davvero ridurre la loro ricerca a sì / no, allora la risposta è SÌ. Il test di Shapiro-Wilks sembra essere un po 'più potente nella maggior parte dei casi rispetto ad Anderson-Darling. Raccomandano il test Shapiro Wilk quando non si ha in mente una particolare distribuzione alternativa. Tuttavia, se sei interessato a questo argomento, vale la pena leggere l'articolo. Almeno guarda i tavoli.

  • Edith Seier, Normality Tests: Power Comparison , in International Encyclopedia of Statistical Science, 2014 - Un sondaggio di ricerche pubblicate sull'argomento. Ancora una volta, la risposta dipende dal campione e dalla tua conoscenza della distribuzione alternativa, ma la risposta banalizzata sarebbe SÌ, Shapiro-Wilk è di solito più potente, ma non sempre.

  • Henry C. Thode, Normality Test , in International Encyclopedia of Statistical Science, 2014 - Descrizione di test di normalità popolari. La sua raccomandazione:

Come indicato in precedenza, il numero di test di normalità è elevato, troppo grande perché anche la maggior parte di essi possa essere menzionata qui. Nel complesso, i test migliori sembrano essere i test del momento, Shapiro – Wilk W, Anderson – Darling (vedi Anderson-Darling Tests of Goodness-of-Fit) e il test Jarque – Bera. I dettagli su questi e molti altri test di normalità e sulle loro caratteristiche sono reperibili in Thode (2002) e sulla bontà generale dei problemi di t, compresi i test di normalità, in D'Agostino e Stephens (1986).UN2

Ora, tutto riguardava i test univariati. The Thode (2002) ha anche test multivariati, dati censurati, miscele normali, test in presenza di valori anomali e molto altro.


9

Una risposta più seria per approfondire questa domanda e soprattutto il continuo interesse di @ silverfish. Un approccio per rispondere a domande come questa è eseguire alcune simulazioni da confrontare. Di seguito è riportato un codice R che simula i dati in varie alternative e esegue diversi test di normalità e confronta la potenza (e un intervallo di confidenza sulla potenza poiché la potenza viene stimata tramite simulazione). Ho modificato leggermente le dimensioni del campione perché non era interessante quando molti dei poteri erano vicini al 100% o al 5%, ho trovato numeri rotondi che davano poteri vicini all'80%. Chiunque fosse interessato potrebbe facilmente prendere questo codice e modificarlo per ipotesi diverse, alternative diverse, ecc.

Puoi vedere che ci sono alternative per le quali alcuni dei test fanno meglio e altri dove fanno peggio. La domanda importante è quindi quali alternative sono più realistiche per le vostre domande / aree scientifiche. Questo dovrebbe davvero essere seguito con una simulazione dell'effetto dei tipi di non normalità di interesse su altri test in corso. Alcuni di questi tipi di non normalità influiscono notevolmente su altri test a base normale, altri non li influenzano molto.

> 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

Grazie per aver aggiunto questa risposta che è un bel complemento alla tua precedente. Nessuna disprezzo era destinata alla tua altra risposta, che è una delle mie preferite su SE!
Silverfish,

1
Mi sono preso la libertà di modificare il tuo codice per aggiungere la formattazione del codice e adattare tutto all'interno della finestra, Greg. Penso che sarà più facile leggere in questo modo, ma se non ti piace, torna indietro con le mie scuse.
gung - Ripristina Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.