Notez que le Shapiro-Wilk est un puissant test de normalité.
La meilleure approche consiste vraiment à avoir une bonne idée de la sensibilité de toute procédure que vous souhaitez utiliser à divers types de non-normalité (à quel point faut-il que la non-normale soit de cette manière pour qu'elle affecte votre inférence plus que vous Peut accepter).
Une approche informelle pour examiner les tracés consiste à générer un certain nombre d'ensembles de données qui sont en fait normaux et de la même taille d'échantillon que celui que vous avez (par exemple, 24 d'entre eux). Tracez vos données réelles dans une grille de ces tracés (5x5 pour 24 ensembles aléatoires). Si ce n’est pas particulièrement inhabituel (par exemple le pire), c’est raisonnablement conforme à la normalité.
À mes yeux, le jeu de données "Z" au centre ressemble à peu près à "o" et "v" et peut-être même à "h", tandis que "d" et "f" semblent légèrement pires. "Z" est la vraie donnée. Bien que je ne crois pas un instant que ce soit en fait normal, ce n'est pas particulièrement inhabituel lorsque vous le comparez à des données normales.
[Edit: Je viens de mener un sondage aléatoire - eh bien, j'ai demandé à ma fille, mais à un moment assez aléatoire - et son choix pour le moins comme une ligne droite était "d". Donc, 100% des personnes interrogées pensent que "d" est le plus étrange.]
Une approche plus formelle consisterait à faire un test Shapiro-Francia (qui est effectivement basé sur la corrélation dans le graphique QQ), mais (a) il n’est même pas aussi puissant que le test de Shapiro Wilk et (b) question (parfois) à laquelle vous devriez déjà connaître la réponse (la distribution à partir de laquelle vos données ont été tirées n’est pas tout à fait normale), à la place de la question à laquelle vous souhaitez une réponse (dans quelle mesure est-ce important?).
Comme demandé, code pour l'affichage ci-dessus. Rien de compliqué impliqué:
z = lm(dist~speed,cars)$residual
n = length(z)
xz = cbind(matrix(rnorm(12*n),nr=n),z,matrix(rnorm(12*n),nr=n))
colnames(xz) = c(letters[1:12],"Z",letters[13:24])
opar = par()
par(mfrow=c(5,5));
par(mar=c(0.5,0.5,0.5,0.5))
par(oma=c(1,1,1,1));
ytpos = (apply(xz,2,min)+3*apply(xz,2,max))/4
cn = colnames(xz)
for(i in 1:25) {
qqnorm(xz[,i],axes=FALSE,ylab= colnames(xz)[i],xlab="",main="")
qqline(xz[,i],col=2,lty=2)
box("figure", col="darkgreen")
text(-1.5,ytpos[i],cn[i])
}
par(opar)
Notez que c'était juste à des fins d'illustration; Je voulais un petit ensemble de données qui semblait légèrement anormal. C'est pourquoi j'ai utilisé les résidus d'une régression linéaire sur les données de la voiture (le modèle n'est pas tout à fait approprié). Cependant, si je produisais réellement un tel affichage pour un ensemble de résidus pour une régression, je régresserais les 25 ensembles de données sur les mêmes que dans le modèle et afficherais des diagrammes QQ de leurs résidus, car les résidus ont une certaine valeur. structure non présente dans les nombres aléatoires normaux.x
(Je fais des séries de parcelles comme celle-ci depuis le milieu des années 80 au moins. Comment pouvez-vous interpréter les parcelles si vous ne connaissez pas leur comportement lorsque les hypothèses sont vérifiées - et quand elles ne le sont pas?)
Voir plus:
Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF et Wickham, H. (2009) Inférence statistique pour l'analyse exploratoire de données et le diagnostic par modèle Phil. Trans. R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120