Обратите внимание, что Шапиро-Уилк является мощным тестом нормальности.
На самом деле лучший подход - это иметь хорошее представление о том, насколько чувствительна любая процедура, которую вы хотите использовать, к различным видам ненормальности (насколько она ненормальна, чтобы она влияла на ваш вывод больше, чем вы могу принять).
Неформальный подход к просмотру графиков состоял бы в том, чтобы сгенерировать несколько наборов данных, которые на самом деле являются нормальными, того же размера выборки, что и у вас - (например, скажем, 24 из них). Разместите ваши реальные данные среди сетки таких графиков (5x5 в случае 24 случайных наборов). Если это не особенно необычный вид (скажем, худший), то он вполне соответствует нормам.
На мой взгляд, набор данных «Z» в центре выглядит примерно наравне с «o» и «v» и, возможно, даже «h», тогда как «d» и «f» выглядят несколько хуже. «Z» - это реальные данные. Хотя я на мгновение не верю, что это на самом деле нормально, это не особенно необычно, когда вы сравниваете это с обычными данными.
[Редактировать: я только что провел случайный опрос - ну, я спросил свою дочь, но в довольно случайное время - и ее выбор для наименее, как прямая линия была "d". Так что 100% опрошенных думали, что «д» был самым странным.]
Более формальным подходом было бы сделать тест Шапиро-Франсии (который эффективно основан на корреляции в графике QQ), но (а) он даже не такой мощный, как тест Шапиро-Вилка, и (б) формальное тестирование отвечает вопрос (иногда), что вы уже должны знать ответ на какой-либо вопрос (распределение, из которого были получены ваши данные, не совсем нормальный), вместо того, чтобы ответить на вопрос, на который вам нужно ответить (насколько это важно?).
По запросу, код для вышеуказанного дисплея. Ничего сложного:
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)
x
(По крайней мере, с середины 80-х годов я делал наборы подобных графиков. Как вы можете интерпретировать графики, если вы не знакомы с тем, как они ведут себя, когда предположения верны - а когда нет?)
Узнать больше:
Буя, А., Кук, Д. Хофманн, Х., Лоуренс, М. Ли, Э.-К., Суэйн, Д.Ф. и Уикхем, Х. (2009) Статистический вывод для анализа поисковых данных и диагностики моделей Фил. Сделка R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120