Zauważ, że Shapiro-Wilk to potężny test normalności.
Najlepszym podejściem jest naprawdę dobre wyobrażenie o tym, jak wrażliwa jest jakakolwiek procedura, której chcesz użyć, na różnego rodzaju nienormalności (jak bardzo nietypowa musi być w ten sposób, aby wpływała na twoje wnioskowanie bardziej niż ty Mogę zaakceptować).
Nieformalnym podejściem do patrzenia na wykresy byłoby wygenerowanie szeregu zestawów danych, które w rzeczywistości są normalne, o tej samej wielkości próbki, co masz - (na przykład powiedzmy 24 z nich). Wykreśl swoje rzeczywiste dane w siatce takich wykresów (5x5 w przypadku 24 losowych zestawów). Jeśli nie jest to szczególnie nietypowy wygląd (powiedzmy najgorzej wyglądający), jest dość zgodny z normalnością.
Moim zdaniem zestaw danych „Z” w środku wygląda mniej więcej na równi z „o” i „v”, a może nawet „h”, podczas gdy „d” i „f” wyglądają nieco gorzej. „Z” to prawdziwe dane. Chociaż przez chwilę nie wierzę, że jest to normalne, nie jest to szczególnie niezwykłe, gdy porównasz to z normalnymi danymi.
[Edycja: Właśnie przeprowadziłem losową ankietę - cóż, zapytałem córkę, ale w dość losowym czasie - a jej wybór na najmniej jak linię prostą był „d”. 100% ankietowanych uważało, że „d” jest najbardziej dziwne.]
Bardziej formalnym podejściem byłoby wykonanie testu Shapiro-Francii (który jest efektywnie oparty na korelacji w wykresie QQ), ale (a) nie jest nawet tak potężny jak test Shapiro Wilka i (b) testy formalne odpowiadają pytanie (czasem), na które powinieneś już znać odpowiedź (rozkład, z którego pochodzą Twoje dane, nie jest dokładnie normalne), zamiast pytania, na które musisz odpowiedzieć (jak bardzo to ma znaczenie?).
Zgodnie z życzeniem, kod powyższego wyświetlacza. Nie ma w tym nic wymyślnego:
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)
Zauważ, że było to wyłącznie w celach ilustracyjnych; Chciałem mieć mały zestaw danych, który wyglądałby nieco nienormalnie, dlatego wykorzystałem resztki z regresji liniowej na danych samochodów (model nie jest całkiem odpowiedni). Jednakże, jeśli faktycznie generowałem taki wyświetlacz dla zestawu reszt dla regresji, zrestartowałbym wszystkie 25 zestawów danych na tych samych jak w modelu i wyświetliłem wykresy QQ ich reszt, ponieważ reszty mają pewne struktura nie występuje w normalnych liczbach losowych.x
(Robię takie zestawy wykresów przynajmniej od połowy lat 80. Jak możesz interpretować wykresy, jeśli nie wiesz, jak się zachowują, gdy założenia się utrzymują - a kiedy nie?)
Zobacz więcej:
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