Perché lme e aov restituiscono risultati diversi per le misure ripetute ANOVA in R?


24

Sto cercando di passare dall'uso del ezpacchetto a lmemisure ripetute ANOVA (poiché spero di poter usare contrasti personalizzati con lme).

Seguendo i consigli di questo post sul blog sono stato in grado di impostare lo stesso modello usando entrambi aov(come fa ez, quando richiesto) e lme. Tuttavia, mentre nell'esempio riportato in quel post i valori F concordano perfettamente tra aove lme(l'ho verificato e lo fanno), questo non è il caso dei miei dati. Sebbene i valori F siano simili, non sono gli stessi.

aovrestituisce un valore f di 1.3399, lmerestituisce 1.36264. Sono disposto ad accettare il aovrisultato come "corretto" in quanto questo è anche ciò che SPSS restituisce (e questo è ciò che conta per il mio campo / supervisore).

Domande:

  1. Sarebbe bello se qualcuno potesse spiegare perché esiste questa differenza e come posso usare lmeper fornire risultati credibili. (Sarei anche disposto a utilizzare lmerinvece che lmeper questo tipo di cose, se dà il risultato "corretto". Tuttavia, non l'ho usato finora.)

  2. Dopo aver risolto questo problema, vorrei eseguire un'analisi del contrasto. In particolare, sarei interessato al contrasto della messa in comune dei primi due livelli di fattore (cioè, c("MP", "MT")) e confrontarlo con il terzo livello di fattore (cioè, "AC"). Inoltre, testando il terzo contro il quarto livello di fattore (cioè "AC"contro "DA").

Dati:

tau.base <- structure(list(id = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
22L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
19L, 20L, 21L, 22L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L), .Label = c("A18K", 
"D21C", "F25E", "G25D", "H05M", "H07A", "H08H", "H25C", "H28E", 
"H30D", "J10G", "J22J", "K20U", "M09M", "P20E", "P26G", "P28G", 
"R03C", "U21S", "W08A", "W15V", "W18R"), class = "factor"), factor = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("MP", "MT", "AC", "DA"
), class = "factor"), value = c(0.9648092876, 0.2128662077, 1, 
0.0607615485, 0.9912814024, 3.22e-08, 0.8073856412, 0.1465590332, 
0.9981672618, 1, 1, 1, 0.9794401938, 0.6102546108, 0.428651501, 
1, 0.1710644881, 1, 0.7639763913, 1, 0.5298989196, 1, 1, 0.7162733447, 
0.7871177434, 1, 1, 1, 0.8560509327, 0.3096989662, 1, 8.51e-08, 
0.3278862311, 0.0953598576, 1, 1.38e-08, 1.07e-08, 0.545290432, 
0.1305621416, 2.61e-08, 1, 0.9834051136, 0.8044114935, 0.7938839461, 
0.9910112678, 2.58e-08, 0.5762677121, 0.4750002288, 1e-08, 0.8584252623, 
1, 1, 0.6020385797, 8.51e-08, 0.7964935271, 0.2238374288, 0.263377904, 
1, 1.07e-08, 0.3160751898, 5.8e-08, 0.3460325565, 0.6842217296, 
1.01e-08, 0.9438301877, 0.5578367224, 2.18e-08, 1, 0.9161424562, 
0.2924856039, 1e-08, 0.8672987992, 0.9266688748, 0.8356425464, 
0.9988463913, 0.2960361777, 0.0285680426, 0.0969063841, 0.6947998266, 
0.0138254805, 1, 0.3494775301, 1, 2.61e-08, 1.52e-08, 0.5393467752, 
1, 0.9069223275)), .Names = c("id", "factor", "value"), class = "data.frame", row.names = c(1L, 
6L, 10L, 13L, 16L, 17L, 18L, 22L, 23L, 24L, 27L, 29L, 31L, 33L, 
42L, 43L, 44L, 45L, 54L, 56L, 58L, 61L, 64L, 69L, 73L, 76L, 79L, 
80L, 81L, 85L, 86L, 87L, 90L, 92L, 94L, 96L, 105L, 106L, 107L, 
108L, 117L, 119L, 121L, 124L, 127L, 132L, 136L, 139L, 142L, 143L, 
144L, 148L, 149L, 150L, 153L, 155L, 157L, 159L, 168L, 169L, 170L, 
171L, 180L, 182L, 184L, 187L, 190L, 195L, 199L, 202L, 205L, 206L, 
207L, 211L, 212L, 213L, 216L, 218L, 220L, 222L, 231L, 232L, 233L, 
234L, 243L, 245L, 247L, 250L))

E il codice:

require(nlme)

summary(aov(value ~ factor+Error(id/factor), data = tau.base))

anova(lme(value ~ factor, data = tau.base, random = ~1|id))

Sembra che tu abbia appena risposto alla parte dei contrasti nella tua risposta qui ; in caso contrario, modifica questa domanda in modo da sapere quale difficoltà rimane.
Aaron - Ripristina Monica l'

2
@Aaron, purché ci siano differenze nei lmerisultati del libro di testo standard ANOVA (fornito da aov, ed è quello di cui ho bisogno), questa non è un'opzione per me. Nel mio articolo voglio segnalare un ANOVA, non qualcosa di simile a un ANOVA. È interessante notare che Venables & Ripley (2002, p. 285) mostrano che entrambi gli approcci portano a stime identiche. Ma le differenze nei valori F mi lasciano una brutta sensazione. Inoltre, Anova()(da car) restituisce solo valori Chi² per gli lmeoggetti. Pertanto per me la mia prima domanda non ha ancora ricevuto risposta.
Henrik,

Capisco (ma non condivido) la tua diffidenza nei confronti di lme; ma per i contrasti, glhtfunziona anche con gli lmadattamenti, non solo lmecon quelli. (Inoltre, i lmerisultati sono anche risultati da manuale standard.)
Aaron - Ripristina Monica l'

Purtroppo non è possibile specificare lmun'analisi di misura ripetuta. aovPuò solo gestire misure ripetute, ma restituirà un oggetto di classe aovlistche purtroppo non è gestito da glht.
Henrik,

3
lmusa l'errore residuo come termine di errore per tutti gli effetti; quando ci sono effetti che dovrebbero usare un termine di errore diverso, aovè necessario (o invece, usando i risultati di lmper calcolare manualmente le statistiche F). Nel tuo esempio, il termine di errore per factorè l' id:factorinterazione, che è il termine di errore residuo in un modello additivo. Confronta i tuoi risultati con anova(lm(value~factor+id)).
Aaron - Ripristina Monica il

Risposte:


28

Sono diversi perché il modello lme sta forzando la componente di varianza di idessere maggiore di zero. Osservando la tabella anova grezza per tutti i termini, vediamo che l'errore quadratico medio per id è inferiore a quello per i residui.

> anova(lm1 <- lm(value~ factor+id, data=tau.base))

          Df  Sum Sq Mean Sq F value Pr(>F)
factor     3  0.6484 0.21614  1.3399 0.2694
id        21  3.1609 0.15052  0.9331 0.5526
Residuals 63 10.1628 0.16131   

Quando calcoliamo i componenti della varianza, ciò significa che la varianza dovuta a id sarà negativa. La mia memoria della memoria dei quadrati medi attesi è traballante, ma il calcolo è qualcosa di simile

(0.15052-0.16131)/3 = -0.003597.

Sembra strano ma può succedere. Ciò significa che le medie per ciascun ID sono più vicine tra loro di quanto ci si aspetterebbe l'un l'altro, data la quantità di variazione residua nel modello.

Al contrario, l'uso di lme forza questa varianza a essere maggiore di zero.

> summary(lme1 <- lme(value ~ factor, data = tau.base, random = ~1|id))
...
Random effects:
 Formula: ~1 | id
        (Intercept)  Residual
StdDev: 3.09076e-05 0.3982667

Questo riporta deviazioni standard, quadratura per ottenere i rendimenti di varianza 9.553e-10per la varianza id e 0.1586164per la varianza residua.

Ora, dovresti sapere che l'utilizzo aovper misure ripetute è appropriato solo se ritieni che la correlazione tra tutte le coppie di misure ripetute sia identica; questo si chiama simmetria composta. (Tecnicamente, sfericità è necessaria ma questo è sufficiente per ora.) Una ragione per usare lmesopra aovè che può gestire diversi tipi di strutture di correlazione.

In questo particolare set di dati, la stima per questa correlazione è negativa; questo aiuta a spiegare come l'errore al quadrato medio per id fosse inferiore all'errore al quadrato residuo. Una correlazione negativa significa che se la prima misurazione di un individuo fosse inferiore alla media, in media, la seconda sarebbe superiore alla media, rendendo le medie totali per gli individui meno variabili di quanto ci aspetteremmo se ci fosse una correlazione zero o una correlazione positiva.

L'uso lmecon un effetto casuale equivale a un modello di simmetria composto in cui tale correlazione è forzata a non essere negativa; possiamo adattare un modello in cui la correlazione può essere negativa usando gls:

> anova(gls1 <- gls(value ~ factor, correlation=corCompSymm(form=~1|id),
                    data=tau.base))
Denom. DF: 84 
            numDF   F-value p-value
(Intercept)     1 199.55223  <.0001
factor          3   1.33985   0.267

Questo tavolo ANOVA concorda con il tavolo dalla aovvestibilità e dalla lmvestibilità.

OK, e allora? Bene, se ritieni che la varianza ide la correlazione tra le osservazioni debbano essere non negative, l' lmeadattamento è in realtà più appropriato dell'adattamento usando aovo lmpoiché la sua stima della varianza residua è leggermente migliore. Tuttavia, se ritieni che la correlazione tra le osservazioni potrebbe essere negativa aovo lmo glssia migliore.

Potresti anche essere interessato ad esplorare ulteriormente la struttura di correlazione; per guardare una struttura di correlazione generale, faresti qualcosa di simile

gls2 <- gls(value ~ factor, correlation=corSymm(form=~unclass(factor)|id),
data=tau.base)

Qui limito solo l'output alla struttura di correlazione. I valori da 1 a 4 rappresentano i quattro livelli di factor; vediamo che il fattore 1 e il fattore 4 hanno una correlazione negativa abbastanza forte:

> summary(gls2)
...
Correlation Structure: General
 Formula: ~unclass(factor) | id 
 Parameter estimate(s):
 Correlation: 
  1      2      3     
2  0.049              
3 -0.127  0.208       
4 -0.400  0.146 -0.024

Un modo per scegliere tra questi modelli è con un test del rapporto di verosimiglianza; ciò dimostra che il modello di effetti casuali e il modello di struttura di correlazione generale non sono statisticamente significativamente diversi; quando ciò accade, di solito si preferisce il modello più semplice.

> anova(lme1, gls2)
     Model df      AIC      BIC    logLik   Test  L.Ratio p-value
lme1     1  6 108.0794 122.6643 -48.03972                        
gls2     2 11 111.9787 138.7177 -44.98936 1 vs 2 6.100725  0.2965

2
È effettivamente possibile utilizzare la simmetria composta con lmeper ottenere gli stessi risultati di aov(e quindi abilitare lmetutti gli ANOVA), in particolare utilizzando l'argomento di correlazione nella chiamata a lme:anova(lme(value ~ factor, data = tau.base, random = ~1|id, correlation = corCompSymm(form = ~1|id)))
Henrik

1
Bella scoperta. Ma non esiste un parametro aggiuntivo in quella misura? Ha tre parametri di varianza; varianza per id, varianza residua e correlazione, mentre gls ha solo una varianza residua e una correlazione.
Aaron - Ripristina Monica il

1
Il tuo argomento sembra plausibile, tuttavia, i risultati non sono d'accordo. Tutte le tabelle anova ( aov, lmesenza simmetria composta e lmecon simmetria composta) hanno esattamente lo stesso numero di dfs.
Henrik,

1
Dovrai convincermi che quei tre parametri sono davvero una iperparametrizzazione dei primi due. Hai capito come sono correlati?
Aaron - Ripristina Monica l'

1
No. Mi fido dell'output di anova.lme(). Dalla tua risposta ho capito che la relazione tra ANOVA e i modelli misti sta nella loro struttura di correlazione. Ho quindi letto che l'imposizione di una struttura di correlazione simmetrica completa porta all'uguaglianza tra i due approcci. Quindi l'ho imposto. Non ho idea se questo divora un altro df. L'output tuttavia non è d'accordo con questa interpretazione.
Henrik,

2

aov()si adatta al modello lm()usando il minimo numero di quadrati, si lmeadatta alla massima probabilità. Quella differenza nel modo in cui i parametri del modello lineare sono stimati probabilmente spiega la (molto piccola) differenza nei valori f.

In pratica (ad esempio per il test delle ipotesi) queste stime sono le stesse, quindi non vedo come uno possa essere considerato "più credibile" dell'altro. Provengono da diversi paradigmi di adattamento del modello.

Per i contrasti, devi impostare una matrice di contrasto per i tuoi fattori. Venebles e Ripley mostrano come farlo a p 143, p.146 e p.293-294 della 4a edizione.


Hmm, ma allora perché a volte ci sono differenze e talvolta i risultati sono esattamente uguali? Inoltre, sembra impossibile usare lmeo lmerper calcolare un ANOVA (in senso stretto) in quanto utilizza un metodo simile ma non identico. Quindi non c'è modo di calcolare i contrasti per ANOVA di misura ripetuta in R?
Henrik

Se il sistema in uso è veramente lineare rispetto ai minimi quadrati e ML dovrebbe fornire la stessa statistica f. È solo quando esiste un'altra struttura nei dati che i due metodi daranno risultati diversi. Pinheiro e Bates lo descrivono nel loro libro sui modelli a effetti misti. Inoltre, probabilmente non sono "esattamente" uguali, se dovessi andare abbastanza lontano nelle cifre dei segni, sono sicuro che troverai qualche differenza. Ma per tutti gli scopi pratici sono gli stessi.
Chris,
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.