Тестирование предположения нормальности для повторных измерений anova? (в R)

11

Таким образом, предполагая, что есть смысл проверить допущение нормальности для ановы (см. 1 и 2 )

Как это можно проверить в R?

Я ожидал бы сделать что-то вроде:

## From Venables and Ripley (2002) p.165.
utils::data(npk, package="MASS")
npk.aovE <- aov(yield ~  N*P*K + Error(block), npk)
residuals(npk.aovE)
qqnorm(residuals(npk.aov))

Что не работает, так как «остатки» не имеют метода (и не предсказывают, в этом отношении) для случая повторных измерений anova.

Так что же делать в этом случае?

Могут ли остатки просто быть извлечены из одной и той же подходящей модели без условия ошибки? Я недостаточно знаком с литературой, чтобы знать, действительно ли это так или нет, заранее спасибо за любые предложения.

Таль Галили
источник

Ответы:

5

Вы можете не получить простой ответ, residuals(npk.aovE)но это не означает, что в этом объекте нет остатков. Сделайте strи убедитесь, что на уровнях все еще есть остатки. Я полагаю, что вас больше всего интересует уровень "Внутри"

> residuals(npk.aovE$Within)
          7           8           9          10          11          12 
 4.68058815  2.84725482  1.56432584 -5.46900749 -1.16900749 -3.90234083 
         13          14          15          16          17          18 
 5.08903669  1.28903669  0.35570336 -3.27762998 -4.19422371  1.80577629 
         19          20          21          22          23          24 
-3.12755705  0.03910962  2.60396981  1.13730314  2.77063648  4.63730314 

Мои собственные тренировки и практика не состояли в том, чтобы использовать тестирование нормальности, вместо этого использовать графики QQ и параллельное тестирование с надежными методами.

Dwin
источник
Спасибо, Двин. Интересно, какой из различных остатков следует исследовать (кроме одного). Приветствия, Тал
Тал Галили
npk.aovE - это список из трех элементов. Первые два являются оценками параметров, и для них нормальность не предполагается, поэтому было бы неуместно проверять что-либо, кроме $ Within. names(npk.aovE)возвращает `[1]" (Intercept) "" block "" Within "`
DWin
@Dwin, не могли бы вы проверить последний подход, который опубликовал Трев (последний ответ)? Он использует своего рода проекцию для расчета остатков. Для меня это самый простой подход для построения графика с однородностью различий между группами.
toto_tico
@Dwin, также qqplot, кажется, принимает только lm, а не aov.
toto_tico
2

Другой вариант - использовать lmeфункцию nlmeпакета (а затем передать полученную модель anova). Вы можете использовать residualsна его выходе.

Nico
источник
1

Я думаю, что допущение нормальности можно оценить для каждого из повторных измерений, прежде чем проводить анализ. Я бы изменил структуру данных таким образом, чтобы каждый столбец соответствовал повторяемой мере, а затем выполнил shapiro.test для каждого из этих столбцов.

apply(cast(melt(npk,measure.vars="yield"), ...~N+P+K)[-c(1:2)],2,function(x) shapiro.test(x)$p.value)
Джордж Донтас
источник
Спасибо gd047 - вопрос в том, что нам делать, когда у нас есть более сложный сценарий aov (yield ~ N P K + Error (block / (N + K)), npk). Будет ли тест, который вы предлагаете, работать?
Тал Галили
Будете ли вы любезны объяснить разницу между сценариями? К сожалению, я недостаточно знаком с использованием термина «ошибка» в модели (кстати, можете ли вы предложить хорошую книгу по этому вопросу?). Я только что предложил SPSS способ проверки предположения о нормальности, как я его узнал. Посмотрите на это в качестве примера goo.gl/p45Bx
Джордж Донтас
Привет gd047. Спасибо за ссылку. Все, что я знаю об этих моделях, связано здесь: r-statistics.com/2010/04/… Если вы узнаете о других ресурсах - я хотел бы узнать о них. Приветствия, Тал
Тал Галили
1

Венейблс и Рипли объясняют, как проводить остаточную диагностику для схемы повторных измерений, позже в своей книге (стр. 284), в разделе о случайных и смешанных эффектах.

Функция остатков (или остаток) реализована для результатов aov для каждого слоя:

из их примера: oats.aov <- aov(Y ~ N + V + Error(B/V), data=oats, qr=T)

Чтобы получить установленные значения или остатки:

«Таким образом, fitted(oats.aov[[4]])и resid(oats.aov[[4]])являются векторами длины 54, представляющими установленные значения и остатки от последней страты».

Важно отметить, что они добавляют:

«Невозможно связать их однозначно с сюжетами оригинального эксперимента».

Для диагностики они используют проекцию:

plot(fitted(oats.aov[[4]]), studres(oats.aov[[4]]))
abline(h=0, lty=2)
oats.pr <- proj(oats.aov)
qqnorm(oats.pr[[4]][, "Residuals"], ylab = "Stratum 4 residuals")
qqline(oats.pr[[4]][, "Residuals"])

Они также показывают, что модель может быть выполнена с использованием lme, как написал другой пользователь.

Trev
источник
в соответствии с этим должно быть [[3]], а не [[4]]. Я проверил это, и оно просто работает для [[3]]
toto_tico
1

Вот два варианта, с aov и с lme (я думаю, что второй предпочтительнее):

require(MASS) ## for oats data set
require(nlme) ## for lme()
require(multcomp) ## for multiple comparison stuff

Aov.mod <- aov(Y ~ N * V + Error(B/V), data = oats)
the_residuals <- aov.out.pr[[3]][, "Residuals"]

Lme.mod <- lme(Y ~ N * V, random = ~1 | B/V, data = oats)
the_residuals <- residuals(Lme.mod)

Исходный пример был получен без взаимодействия ( Lme.mod <- lme(Y ~ N * V, random = ~1 | B/V, data = oats)), но, похоже, он работает с ним (и дает разные результаты, поэтому он что-то делает).

Вот и все...

но для полноты:

1 - Краткое изложение модели

summary(Aov.mod)
anova(Lme.mod)

2 - тест Тьюки с повторными измерениями anova (3 часа в поисках этого !!).

summary(Lme.mod)
summary(glht(Lme.mod, linfct=mcp(V="Tukey")))

3 - Графики нормальности и гомоскедастичности

par(mfrow=c(1,2)) #add room for the rotated labels
aov.out.pr <- proj(aov.mod)                                            
#oats$resi <- aov.out.pr[[3]][, "Residuals"]
oats$resi <- residuals(Lme.mod)
qqnorm(oats$resi, main="Normal Q-Q") # A quantile normal plot - good for checking normality
qqline(oats$resi)
boxplot(resi ~ interaction(N,V), main="Homoscedasticity", 
        xlab = "Code Categories", ylab = "Residuals", border = "white", 
        data=oats)
points(resi ~ interaction(N,V), pch = 1, 
       main="Homoscedasticity",  data=oats)

введите описание изображения здесь

toto_tico
источник