Prueba de la suposición de normalidad para medidas repetidas anova? (en R)

11

Asumiendo que hay un punto en probar el supuesto de normalidad para anova (ver 1 y 2 )

¿Cómo se puede probar en R?

Esperaría hacer algo como:

## 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))

Lo que no funciona, ya que los "residuos" no tienen un método (ni predicen, para el caso) para el caso de medidas repetidas anova.

Entonces, ¿qué se debe hacer en este caso?

¿Se pueden extraer los residuos del mismo modelo de ajuste sin el término Error? No estoy lo suficientemente familiarizado con la literatura para saber si esto es válido o no, gracias de antemano por cualquier sugerencia.

Tal Galili
fuente

Respuestas:

5

Es posible que no obtenga una respuesta simple, residuals(npk.aovE)pero eso no significa que no haya residuos en ese objeto. Hacer stry ver que dentro de los niveles todavía hay residuos. Me imagino que estabas más interesado en el nivel "Dentro"

> 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 

Mi propio entrenamiento y práctica no ha sido usar pruebas de normalidad, sino trazar QQ y pruebas paralelas con métodos robustos.

DWin
fuente
Gracias Dwin Me pregunto cuál de los diferentes residuos debería explorarse (además del Dentro). Cheers, Tal
Tal Galili
npk.aovE es una lista de tres elementos. Los dos primeros son estimaciones de parámetros y no se asume la normalidad para ellos, por lo que no parece apropiado probar nada excepto $ Within. names(npk.aovE)devuelve `[1]" (Intercepción) "" bloque "" Dentro ""
DWin
@Dwin, ¿podría verificar el último enfoque que publicó trev (última respuesta)? Utiliza una especie de proyección para calcular los residuos. Es el enfoque más fácil para mí para trazar un gráfico con homogeneidad de variedades entre los grupos.
toto_tico
@Dwin, también qqplot parece aceptar solo lm, y no aov.
toto_tico
2

Otra opción sería utilizar la lmefunción del nlmepaquete (y luego pasar el modelo obtenido a anova). Se puede usar residualsen su salida.

nico
fuente
1

Creo que el supuesto de normalidad se puede evaluar para cada una de las medidas repetidas, antes de realizar el análisis. Cambiaría la forma del marco de datos para que cada columna corresponda a una medida repetida, y luego realice una prueba shapiro.test para cada una de esas columnas.

apply(cast(melt(npk,measure.vars="yield"), ...~N+P+K)[-c(1:2)],2,function(x) shapiro.test(x)$p.value)
George Dontas
fuente
Gracias gd047: la pregunta es ¿qué hacemos cuando tenemos un escenario más complejo de aov (rendimiento ~ N P K + Error (bloque / (N + K)), npk) ¿la prueba que propones hace el trabajo?
Tal Galili
¿Sería tan amable de explicar la diferencia entre los escenarios? Desafortunadamente, no estoy lo suficientemente familiarizado con el uso del término Error en el modelo (por cierto, ¿puede sugerir un buen libro sobre eso?). Lo que acabo de proponer es la forma SPSS de verificar el supuesto de normalidad, tal como lo he aprendido. Vea esto como un ejemplo goo.gl/p45Bx
George Dontas
Hola gd047 Gracias por el enlace. Todo lo que sé sobre estos modelos está vinculado desde aquí: r-statistics.com/2010/04/… Si conoce otros recursos, me encantaría saber sobre ellos. Saludos, Tal
Tal Galili
1

Venables y Ripley explican cómo hacer diagnósticos residuales para un diseño de medidas repetidas más adelante en su libro (p. 284), en la sección sobre efectos aleatorios y mixtos.

La función de residuos (o residuos) se implementa para los resultados de aov para cada estrato:

de su ejemplo: oats.aov <- aov(Y ~ N + V + Error(B/V), data=oats, qr=T)

Para obtener los valores ajustados o residuales:

"Por lo tanto fitted(oats.aov[[4]])y resid(oats.aov[[4]])son vectores de longitud 54 que representan los valores ajustados y los residuos desde el último estrato."

Es importante destacar que agregan:

"No es posible asociarlos únicamente con las tramas del experimento original".

Para el diagnóstico, usan una proyección:

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"])

También muestran que el modelo se puede hacer usando lme, como lo publicó otro usuario.

trev
fuente
de acuerdo con esto , debería ser [[3]] y no [[4]]. Lo probé y simplemente funciona para [[3]]
toto_tico
1

Aquí hay dos opciones, con aov y con lme (creo que se prefiere la segunda):

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)

El ejemplo original vino sin la interacción ( Lme.mod <- lme(Y ~ N * V, random = ~1 | B/V, data = oats)) pero parece estar trabajando con él (y está produciendo resultados diferentes, por lo que está haciendo algo).

Y eso es...

pero para completar:

1 - Los resúmenes del modelo

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

2 - La prueba de Tukey con medidas repetidas anova (¡3 horas buscando esto!).

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

3 - Las tramas de normalidad y homocedasticidad

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)

ingrese la descripción de la imagen aquí

toto_tico
fuente