Si noti che Shapiro-Wilk è un potente test di normalità.
L'approccio migliore è davvero avere una buona idea di quanto sia delicata ogni procedura che si desidera utilizzare nei confronti di vari tipi di non normalità (quanto gravemente non normale deve essere in quel modo affinché influisca sulla propria inferenza più di te può accettare).
Un approccio informale per guardare i grafici sarebbe quello di generare un numero di set di dati che sono effettivamente normali della stessa dimensione del campione di quello che hai - (ad esempio, diciamo 24 di essi). Traccia i tuoi dati reali in una griglia di tali grafici (5x5 nel caso di 24 set casuali). Se non è particolarmente insolito (il peggiore, diciamo), è ragionevolmente coerente con la normalità.
A mio avviso, il set di dati "Z" al centro appare approssimativamente alla pari di "o" e "v" e forse anche "h", mentre "d" e "f" sembrano leggermente peggiori. "Z" è il dato reale. Anche se non credo per un momento che sia effettivamente normale, non è particolarmente insolito quando lo confronti con i dati normali.
[Modifica: ho appena condotto un sondaggio casuale - beh, ho chiesto a mia figlia, ma in un momento abbastanza casuale - e la sua scelta per il minimo come una linea retta è stata "d". Quindi il 100% degli intervistati pensava che "d" fosse la più strana.]
Un approccio più formale sarebbe quello di fare un test di Shapiro-Francia (che si basa effettivamente sulla correlazione nel diagramma QQ), ma (a) non è nemmeno potente come il test di Shapiro Wilk, e (b) il test formale risponde a domanda (a volte) a cui dovresti già conoscere la risposta (la distribuzione da cui i tuoi dati sono stati estratti non è esattamente normale), invece della domanda a cui devi rispondere (quanto conta davvero?).
Come richiesto, codice per il display sopra. Niente di speciale:
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)
Si noti che questo era solo a scopo illustrativo; Volevo un piccolo set di dati che sembrava leggermente non normale, motivo per cui ho usato i residui di una regressione lineare sui dati delle auto (il modello non è del tutto appropriato). Tuttavia, se in realtà stavo generando un tale display per un set di residui per una regressione, regredirei a tutti e 25 i set di dati sugli stessi del modello e visualizzerei i grafici QQ dei loro residui, poiché i residui hanno alcuni struttura non presente in normali numeri casuali.X
(Ho creato serie di trame come questa almeno dalla metà degli anni '80. Come si possono interpretare le trame se non si ha familiarità con il modo in cui si comportano quando le ipotesi valgono - e quando non lo fanno?)
Vedi altro:
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