Observe que o Shapiro-Wilk é um poderoso teste de normalidade.
A melhor abordagem é realmente ter uma boa idéia de quão sensível qualquer procedimento que você deseja usar é para vários tipos de não-normalidade (quão ruim não-normal é que deve ser dessa maneira para afetar sua inferência mais do que você pode aceitar).
Uma abordagem informal para analisar os gráficos seria gerar um número de conjuntos de dados que são realmente normais do mesmo tamanho de amostra que você possui - (por exemplo, digamos 24 deles). Plote seus dados reais em uma grade de tais gráficos (5x5 no caso de 24 conjuntos aleatórios). Se não é uma aparência especialmente incomum (por exemplo, a de pior aparência), é razoavelmente consistente com a normalidade.
A meu ver, o conjunto de dados "Z" no centro se parece aproximadamente com "o" e "v" e talvez até "h", enquanto "d" e "f" parecem um pouco piores. "Z" são os dados reais. Embora eu não acredite por um momento que seja realmente normal, não é particularmente incomum quando você o compara com dados normais.
[Editar: Acabei de realizar uma pesquisa aleatória - bem, perguntei à minha filha, mas em um período bastante aleatório - e sua escolha pelo menos como uma linha reta foi "d". Portanto, 100% dos pesquisados consideraram "d" o mais estranho.]
Uma abordagem mais formal seria fazer um teste de Shapiro-Francia (que é efetivamente baseado na correlação no gráfico QQ), mas (a) não é tão poderoso quanto o teste de Shapiro Wilk e (b) o teste formal responde a pergunta (às vezes) para a qual você já deve saber a resposta (a distribuição da qual seus dados foram extraídos não é exatamente normal), em vez da pergunta que você precisa responder (o quanto isso importa?).
Conforme solicitado, codifique para a exibição acima. Nada sofisticado envolvido:
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)
Observe que isso foi apenas para fins de ilustração; Eu queria um pequeno conjunto de dados que parecesse levemente normal, e é por isso que usei os resíduos de uma regressão linear nos dados dos carros (o modelo não é muito apropriado). No entanto, se eu estivesse realmente gerando uma exibição desse tipo para um conjunto de resíduos para uma regressão, regrediria todos os 25 conjuntos de dados com os mesmos 's do modelo e exibia gráficos QQ de seus resíduos, pois os resíduos têm alguns estrutura não presente em números aleatórios normais.x
(Eu tenho feito conjuntos de parcelas como essa desde pelo menos os anos 80. Como você pode interpretar parcelas se não estiver familiarizado com o modo como elas se comportam quando as suposições são válidas - e quando não?)
Ver mais:
Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF e Wickham, H. (2009) Inferência Estatística para análise exploratória de dados e diagnóstico de modelos Phil. Trans. R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120