Shapiro – Wilk est-il le meilleur test de normalité? Pourquoi pourrait-il être meilleur que d'autres tests comme Anderson-Darling?

24

J'ai lu quelque part dans la littérature que le test de Shapiro-Wilk est considéré comme le meilleur test de normalité car pour un niveau de signification donné, , la probabilité de rejeter l'hypothèse nulle si elle est fausse est plus élevée que dans le cas de l'autre tests de normalité.α

Pourriez-vous s'il vous plaît m'expliquer, en utilisant si possible des arguments mathématiques, comment cela fonctionne exactement par rapport à certains des autres tests de normalité (par exemple le test d'Anderson – Darling)?

syntagme
la source
4
Notez que la puissance dépend de la façon dont l'hypothèse nulle est fausse, ce qui pour un test de qualité de l'ajustement à usage général peut être une des innombrables façons. Sans avoir vérifié, je parierais toujours que chacun des tests de normalité communs est le plus puissant contre certaines alternatives.
Scortchi - Réintégrer Monica
5
Ce n'est peut-être pas la réponse que vous cherchez, mais je dirais que le meilleur test de normalité est un tracé de probabilité normal, c'est-à-dire un tracé quantile-quantile des valeurs observées par rapport aux quantiles normaux. Le test de Shapiro-Wilk est en effet souvent recommandé, mais il ne peut pas vous dire exactement en quoi vos données diffèrent d'une normale. Souvent, des différences sans importance sont signalées par le test, car elles sont qualifiées de significatives pour les grands échantillons, et le problème opposé peut également vous mordre.
Nick Cox

Réponses:

17

D'abord un commentaire général: Notez que le test d'Anderson-Darling est pour des distributions complètement spécifiées, tandis que le Shapiro-Wilk est pour des normales avec n'importe quelle moyenne et variance. Cependant, comme indiqué dans D'Agostino & Stephens Anderson-Darling s'adapte de manière très pratique au cas d'estimation, semblable à (mais converge plus rapidement et est modifié d'une manière qui est plus simple à gérer que le Test de Lilliefors pour l'affaire Kolmogorov-Smirnov). Plus précisément, à la normale, par , les tables de la valeur asymptotique de peut être utilisé (ne testez pas la qualité de l'ajustement pour n <5).[1]n=5UNE=UNE2(1+4n-25n2)

J'ai lu quelque part dans la littérature que le test de Shapiro – Wilk est considéré comme le meilleur test de normalité car pour un niveau de signification donné, α, la probabilité de rejeter l'hypothèse nulle si elle est fausse est plus élevée que dans le cas de l'autre normalité tests.

En règle générale, c'est faux.

Les tests de normalité qui sont «meilleurs» dépendent des classes d'alternatives qui vous intéressent. L'une des raisons pour lesquelles le Shapiro-Wilk est populaire est qu'il a tendance à avoir un très bon pouvoir dans une large gamme d'alternatives utiles. Il revient dans de nombreuses études sur le pouvoir et fonctionne généralement très bien, mais ce n'est pas universellement le meilleur.

Il est assez facile de trouver des alternatives sous lesquelles il est moins puissant.

Par exemple, contre des alternatives à queue légère, elle a souvent moins de puissance que la plage étudiée (comparez-les sur un test de normalité sur des données uniformes , par exemple - à , un test basé sur a une puissance d'environ 63% contre un peu plus de 38% pour le Shapiro Wilk).u=max(X)-min(X)s(X)n=30u

L'Anderson-Darling (ajusté pour l'estimation des paramètres) fait mieux à la double exponentielle. L'inclinaison du moment fait mieux contre certaines alternatives de biais.

Pourriez-vous s'il vous plaît m'expliquer, en utilisant si possible des arguments mathématiques, comment cela fonctionne exactement par rapport à certains des autres tests de normalité (par exemple le test d'Anderson – Darling)?

Je vais vous expliquer en termes généraux (si vous voulez des détails plus précis, les articles originaux et certains des articles ultérieurs qui en discutent seraient votre meilleur pari):

Considérons un test plus simple mais étroitement lié, le Shapiro-Francia; c'est en fait une fonction de la corrélation entre les statistiques de commande et les statistiques de commande attendues dans le cadre de la normalité (et en tant que telle, une mesure assez directe de la "droite de la ligne" dans le tracé QQ normal). Si je me souviens bien, le Shapiro-Wilk est plus puissant car il prend également en compte les covariances entre les statistiques d'ordre, produisant un meilleur estimateur linéaire de partir du tracé QQ, qui est ensuite mis à l'échelle par . Lorsque la distribution est loin d'être normale, le ratio n'est pas proche de 1.σs

En comparaison, l'Anderson-Darling, comme le Kolmogorov-Smirnov et le Cramér-von Mises, est basé sur le CDF empirique. Plus précisément, il est basé sur les écarts pondérés entre ECDF et ECDF théorique (la pondération pour la variance le rend plus sensible aux écarts dans la queue).

Le test de Shapiro et Chen (1995) (basé sur les espacements entre les statistiques d'ordre) montre souvent un peu plus de puissance que le Shapiro-Wilk (mais pas toujours); ils fonctionnent souvent de manière très similaire.[2]

-

Utilisez le Shapiro Wilk car il est souvent puissant, largement disponible et beaucoup de gens le connaissent (supprimant la nécessité d'expliquer en détail ce que c'est si vous l'utilisez dans un document) - ne l'utilisez pas sous l'illusion qu'il est "le meilleur test de normalité". Il n'y a pas de meilleur test de normalité.

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

[2]: Chen, L. et Shapiro, S. (1995)
"An Alternative test for normality based on normalized spacings."
Journal of Statistical Computation and Simulation 53 , 269-287.

Glen_b -Reinstate Monica
la source
Mon camarade de classe m'a dit: "Si la taille de l'échantillon> 50, vous devez utiliser Kolmogorov-Smirnov." Est-ce exact?
kittygirl
Non. À ma connaissance, l'article original de Shapiro et Wilk de 1965 ne donnait que les constantes requises ( ) utilisées dans l'estimation linéaire de pour jusqu'à mais c'était il y a plus d'un demi-siècle. Les choses ont un peu évolué depuis. Même sans cela, le Shapiro Francia ou l'Anderson-Darling (également ajusté pour l'estimation des paramètres) sont généralement de meilleurs choix; ceux-ci ont souvent une puissance considérablement inférieure par rapport aux alternatives généralement intéressantes. (& si vous estimez la moyenne et le sd à partir de l'échantillon, vous ne faites pas strictement un test de Kolmogorov-Smirnov, mais plutôt un test de Lilliefors)unejeσn50
Glen_b -Reinstate Monica
En bref, il y a eu une brève période de quelques années après 1967 (la publication initiale du travail de Lilliefors) où cela aurait pu être un conseil justifiable, mais pas depuis longtemps
Glen_b -Reinstate Monica
Lorsque la taille de l'échantillon> 5000, exécutez shapiro.testdans R obtiendra une erreur. sample size must be between 3 and 5000Ensuite, quel autre test devrait être utilisé?
kittygirl
1. Dans l'ensemble n, vous rejetterez presque toujours tout modèle de distribution simple (même s'il s'agit d'une approximation tout à fait appropriée); il peut être plus judicieux de faire autre chose (pourquoi testez-vous la normalité?) 2. Ce n'est pas vraiment une question de «devrait» à ce sujet; il n'y a pas une seule qualité de test qui soit toujours meilleure que n'importe quelle autre. Il se trouve que le Shapiro Wilk est assez bon. Cependant, une alternative appropriée dans son ensemble n est le test de Shapiro-Francia. Si vous pouvez trouver une implémentation du test Chen-Shapiro en général n (en supposant qu'il y ait une bonne raison de tester), considérez cela à la place.
Glen_b -Reinstate Monica
12

De toute évidence, la comparaison que vous avez lue ne comprenait pas SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ) car elle a la puissance la plus élevée possible parmi toutes les alternatives. Il devrait donc être considéré comme "meilleur" si le pouvoir est la seule considération (notez que mes opinions sont clairement biaisées, mais documentées dans le lien / la documentation).

Cependant, je suis d'accord avec le commentaire de Nick Cox selon lequel le meilleur test est un complot plutôt qu'un test formel puisque la question de "assez Normal" est beaucoup plus importante que "Exactement normal". Si vous voulez un test significatif, je suggère de combiner l'intrigue qq avec la méthodologie de cet article:

Buja, A., Cook, D.Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF et Wickham, H. (2009) Inférence statistique pour l'analyse des données exploratoires et le diagnostic des modèles Phil. Trans. R. Soc. A 2009367, 4361-4383 doi: 10.1098 / rsta.2009.0120

Une implémentation de cela est la vis.testfonction dans le package TeachingDemos pour R (même package que SnowsPenultimateNormalityTest).

Greg Snow
la source
1
Je suis d'accord avec le sentiment, mais regarder les parcelles QQ n'est pas vraiment une solution si l'on veut faire beaucoup de choses avec plus de 10-20 variables.
Andrew M
Nous imprimons des tracés QQ en plus des tests de normalité. Ce ne sont pas des outils exclusifs mais complémentaires.
Aksakal
2
@Andrew M Alors, à travers les résultats de 100 ou 1000 Shapiro-Wilk ou d'autres tests, qu'est-ce que vous préférez? Il n'est pas difficile d'automatiser la recherche des tracés QQ, disons 25 à la fois. Souvent, un coup d'œil suffit pour voir (littéralement) un vrai problème.
Nick Cox
10

Je suis en retard à la fête, mais je répondrai en faisant référence aux recherches publiées par des pairs. La raison pour laquelle je ne réponds pas Oui / Non à la question d'OP est que c'est plus compliqué qu'il n'y paraît. Il n'y a pas un seul test qui serait le plus puissant pour les échantillons provenant de n'importe quelle distribution avec ou sans valeurs aberrantes. Les valeurs aberrantes peuvent sérieusement diminuer la puissance d'un test et augmenter pour un autre. Certains tests fonctionnent mieux lorsque l'échantillon provient d'une distribution symétrique, etc.

  • Henry C. Thode, Testing for Normality , 2002 - Il s'agit du livre le plus complet sur le sujet. Si je devais me contenter d'une réponse simple, alors SW n'est pas plus puissant que AD dans tous les cas. Voici deux extraits pour votre plaisir de lecture.

De la section 7.1.5: Sur la base de la puissance, le choix du test est directement lié aux informations disponibles ou aux hypothèses émises concernant l'alternative. Plus l'alternative est spécifique, plus le test sera spécifique et puissant; cela se traduira également par les recommandations les plus fiables.

et

Ks2UNE2

  • Romao, Xavier, Raimundo Delgado et Anibal Costa. "Une comparaison empirique de la puissance des tests univariés de qualité de l'ajustement pour la normalité." Journal of Statistical Computation and Simulation 80.5 (2010): 545-591. Il s'agit de la recherche publiée la plus récente sur le sujet que je connaisse.

L'étude porte sur les performances de 33 tests de normalité, pour différentes tailles d'échantillon, compte tenu de plusieurs niveaux de signification et pour un certain nombre de distributions normales symétriques, asymétriques et modifiées. Les recommandations générales pour les tests de normalité résultant de l'étude sont définies en fonction de la nature de la non-normalité

Si vous voulez vraiment résumer leur recherche à oui / non, alors la réponse est OUI. Le test de Shapiro-Wilks semble être un peu plus puissant dans la plupart des cas que Anderson-Darling. Ils recommandent le test Shapiro Wilk lorsque vous n'avez pas en tête une distribution alternative particulière. Cependant, si vous êtes intéressé par ce sujet, le document mérite d'être lu. Regardez au moins les tableaux.

  • Edith Seier, Normality Tests: Power Comparison , dans International Encyclopedia of Statistical Science, 2014 - A survey of published research on the subject. Encore une fois, la réponse dépend de l'échantillon et de vos connaissances sur la distribution alternative, mais la réponse banalisée serait OUI, Shapiro-Wilk est généralement plus puissant, mais pas toujours.

  • Henry C. Thode, Normality Tests , dans International Encyclopedia of Statistical Science, 2014 - Description of popular normality tests. Sa recommandation:

UNE2

Maintenant, il s'agissait de tests univariés. Le Thode (2002) propose également des tests multivariés, des données censurées, des mélanges normaux, des tests en présence de valeurs aberrantes et bien plus encore.

Aksakal
la source
9

Une réponse plus sérieuse pour approfondir cette question et surtout l'intérêt continu de @ silverfish. Une approche pour répondre à des questions comme celle-ci consiste à effectuer des simulations pour comparer. Vous trouverez ci-dessous un code R qui simule les données sous diverses alternatives et effectue plusieurs tests de normalité et compare la puissance (et un intervalle de confiance sur la puissance, car la puissance est estimée par simulation). J'ai légèrement ajusté la taille des échantillons car ce n'était pas intéressant lorsque de nombreux pouvoirs étaient proches de 100% ou 5%, j'ai trouvé des nombres ronds qui donnaient des pouvoirs proches de 80%. Toute personne intéressée pourrait facilement prendre ce code et le modifier pour différentes hypothèses, différentes alternatives, etc.

Vous pouvez voir qu'il existe des alternatives pour lesquelles certains des tests font mieux et d'autres où ils font pire. La question importante est alors de savoir quelles alternatives sont les plus réalistes pour vos questions / domaines scientifiques. Cela devrait vraiment être suivi d'une simulation de l'effet des types de non-normalité d'intérêt sur d'autres tests en cours. Certains de ces types de non-normalité affectent grandement d'autres tests normaux, d'autres ne les affectent pas beaucoup.

> 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
Greg Snow
la source
Merci d'avoir ajouté cette réponse qui complète bien la précédente. Aucune dénigrement n'était destinée à votre autre réponse, qui est l'une de mes préférées sur SE!
Silverfish
1
J'ai pris la liberté de modifier votre code pour ajouter une mise en forme de code et ranger tout dans la fenêtre, Greg. Je pense que ce sera plus facile à lire de cette façon, mais si vous ne l'aimez pas, faites-le revenir en arrière avec mes excuses.
gung - Réintégrer Monica