Testare l'assunzione di normalità per misure ripetute anova? (in R)


11

Supponendo quindi che sia utile testare l'assunto di normalità per anova (vedere 1 e 2 )

Come può essere testato in R?

Mi aspetterei di fare qualcosa del tipo:

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

Il che non funziona, poiché i "residui" non hanno un metodo (né prevedono, per quella materia) per il caso di misure ripetute anova.

Quindi cosa si dovrebbe fare in questo caso?

I residui possono essere semplicemente estratti dallo stesso modello di adattamento senza il termine Errore? Non ho abbastanza familiarità con la letteratura per sapere se questo è valido o meno, grazie in anticipo per qualsiasi suggerimento.

Risposte:


5

Potresti non ottenere una risposta semplice residuals(npk.aovE)ma ciò non significa che non ci siano residui in quell'oggetto. Fai stre vedi che all'interno dei livelli ci sono ancora dei residui. Immagino che tu fossi molto interessato al livello "Within"

> 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 

La mia formazione e la mia pratica non sono state quelle di usare i test di normalità, piuttosto di usare grafici QQ e test paralleli con metodi robusti.


Grazie Dwin. Mi chiedo quale dei diversi residui debba essere esplorato (oltre a quello all'interno). Saluti, Tal
Tal Galili

npk.aovE è un elenco di tre elementi. I primi due sono stime di parametri e la normalità non è presunta per loro, quindi non sembra appropriato testare nulla tranne $ Within. names(npk.aovE)restituisce `[1]" (Intercetta) "" blocco "" Entro "`
DWin

@Dwin, potresti controllare l'ultimo approccio pubblicato da trev (ultima risposta)? Usa una sorta di proiezione per calcolare i residui. È l'approccio più semplice per me al fine di tracciare un grafico con omogeneità delle varietà tra i gruppi.
toto_tico,

@Dwin, anche qqplot sembra accettare solo lm, e non aov.
toto_tico,

2

Un'altra opzione sarebbe quella di utilizzare la lmefunzione del nlmepacchetto (e quindi passare il modello ottenuto a anova). È possibile utilizzare residualssul suo output.


1

Penso che il presupposto della normalità possa essere valutato per ciascuna delle misure ripetute, prima di eseguire l'analisi. Modificherei il frame di dati in modo che ogni colonna corrisponda a una misura ripetuta e quindi eseguo un shapiro.test su ciascuna di quelle colonne.

apply(cast(melt(npk,measure.vars="yield"), ...~N+P+K)[-c(1:2)],2,function(x) shapiro.test(x)$p.value)

Grazie gd047 - la domanda è cosa facciamo quando abbiamo uno scenario più complesso di aov (rendimento ~ N P K + Errore (blocco / (N + K)), npk) il test che proponete funzionerebbe?
Tal Galili,

Saresti abbastanza gentile da spiegare la differenza tra gli scenari? Sfortunatamente non ho abbastanza familiarità con l'uso del termine Error nel modello (a proposito, puoi suggerire un buon libro su questo?). Quello che ho appena proposto è il modo SPSS di verificare il presupposto della normalità, come l'ho imparato. Vedi questo come esempio goo.gl/p45Bx
George Dontas l'

Ciao gd047. Grazie per il link. Le cose che so di questi modelli sono tutte collegate da qui: r-statistics.com/2010/04/… Se conoscerai altre risorse, mi piacerebbe conoscerle. Saluti, Tal
Tal Galili

1

Venables e Ripley spiegano come eseguire la diagnostica residua per un disegno a misure ripetute più avanti nel loro libro (p. 284), nella sezione sugli effetti casuali e misti.

La funzione (o residuo) dei residui è implementata per i risultati aov per ogni strato:

dal loro esempio: oats.aov <- aov(Y ~ N + V + Error(B/V), data=oats, qr=T)

Per ottenere i valori adattati o i residui:

"Così fitted(oats.aov[[4]])e resid(oats.aov[[4]])sono vettori di lunghezza 54 che rappresentano i valori adattati e i residui dell'ultimo strato."

È importante sottolineare che aggiungono:

"Non è possibile associarli in modo univoco alle trame dell'esperimento originale."

Per la diagnostica, usano una proiezione:

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

Mostrano anche che il modello può essere fatto usando lme, come postato da un altro utente.


secondo questo , dovrebbe essere [[3]] e non [[4]]. L'ho provato e funziona solo per [[3]]
toto_tico,

1

Ecco due opzioni, con aov e con lme (penso che il 2 ° sia preferito):

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)

L'esempio originale è arrivato senza l'interazione ( Lme.mod <- lme(Y ~ N * V, random = ~1 | B/V, data = oats)) ma sembra funzionare con esso (e produrre risultati diversi, quindi sta facendo qualcosa).

E questo è tutto ...

ma per completezza:

1 - I riassunti del modello

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

2 - Il test Tukey con ripetute misure anova (3 ore alla ricerca di questo !!).

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

3 - Le trame di normalità e omoscedasticità

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)

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.