Qual è la differenza tra l'utilizzo di aov () e lme () nell'analisi di un set di dati longitudinale?


13

Qualcuno può dirmi la differenza tra l'utilizzo aov()e l' lme()analisi dei dati longitudinali e come interpretare i risultati di questi due metodi?

Qui di seguito, analizzo lo stesso insieme di dati utilizzando aov()ed lme()e ottenuto 2 risultati diversi. Con aov(), ho ottenuto un risultato significativo nel tempo dall'interazione del trattamento, ma adattando un modello misto lineare, il tempo dall'interazione del trattamento è insignificante.

> UOP.kg.aov <- aov(UOP.kg~time*treat+Error(id), raw3.42)
> summary(UOP.kg.aov)

Error: id
          Df  Sum Sq Mean Sq F value Pr(>F)
treat      1   0.142  0.1421  0.0377 0.8471
Residuals 39 147.129  3.7725               

Error: Within
            Df  Sum Sq Mean Sq  F value  Pr(>F)    
time         1 194.087 194.087 534.3542 < 2e-16 ***
time:treat   1   2.077   2.077   5.7197 0.01792 *  
Residuals  162  58.841   0.363                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

> UOP.kg.lme <- lme(UOP.kg~time*treat, random=list(id=pdDiag(~time)), 
                    na.action=na.omit, raw3.42)
> summary(UOP.kg.lme)
Linear mixed-effects model fit by REML
 Data: raw3.42 
       AIC      BIC    logLik
  225.7806 248.9037 -105.8903

Random effects:
 Formula: ~time | id
 Structure: Diagonal
        (Intercept)      time  Residual
StdDev:   0.6817425 0.5121545 0.1780466

Fixed effects: UOP.kg ~ time + treat + time:treat 
                 Value Std.Error  DF   t-value p-value
(Intercept)  0.5901420 0.1480515 162  3.986059  0.0001
time         0.8623864 0.1104533 162  7.807701  0.0000
treat       -0.2144487 0.2174843  39 -0.986042  0.3302
time:treat   0.1979578 0.1622534 162  1.220053  0.2242
 Correlation: 
           (Intr) time   treat 
time       -0.023              
treat      -0.681  0.016       
time:treat  0.016 -0.681 -0.023

Standardized Within-Group Residuals:
         Min           Q1          Med           Q3          Max 
-3.198315285 -0.384858426  0.002705899  0.404637305  2.049705655 

Number of Observations: 205
Number of Groups: 41 

Risposte:


18

Sulla base della tua descrizione, sembra che tu abbia un modello di misure ripetute con un singolo fattore di trattamento. Dato che non ho accesso al set di dati ( raw3.42), userò i dati di Orthodont dal nlmepacchetto per illustrare cosa sta succedendo qui. La struttura dei dati è la stessa (misurazioni ripetute per due diversi gruppi - in questo caso, maschi e femmine).

Se si esegue il seguente codice:

library(nlme)
data(Orthodont)

res <- lme(distance ~ age*Sex, random = ~ 1 | Subject, data = Orthodont)
anova(res)

otterrai i seguenti risultati:

            numDF denDF  F-value p-value
(Intercept)     1    79 4123.156  <.0001
age             1    79  122.450  <.0001
Sex             1    25    9.292  0.0054
age:Sex         1    79    6.303  0.0141

Se corri:

res <- aov(distance ~ age*Sex + Error(Subject), data = Orthodont)
summary(res)

otterrete:

Error: Subject
          Df Sum Sq Mean Sq F value   Pr(>F)   
Sex        1 140.46 140.465  9.2921 0.005375 **
Residuals 25 377.91  15.117                    

Error: Within
          Df  Sum Sq Mean Sq  F value  Pr(>F)    
age        1 235.356 235.356 122.4502 < 2e-16 ***
age:Sex    1  12.114  12.114   6.3027 0.01410 *  
Residuals 79 151.842   1.922                     

Si noti che i test F sono esattamente identici.

Perché lme(), hai usato list(id=pdDiag(~time)), che non solo aggiunge un'intercettazione casuale al modello, ma anche una pendenza casuale. Inoltre, usando pdDiag, stai impostando la correlazione tra l'intercettazione casuale e la pendenza su zero. Questo è un modello diverso da quello che hai specificato tramite aov()e quindi ottieni risultati diversi.


Grazie @Wolfgang; la tua spiegazione aiuta molto. Una domanda di follow-up che ho quindi è questa. Sto davvero analizzando un modello di misure ripetute con un singolo fattore di trattamento. Ogni soggetto viene assegnato in modo casuale al trattamento A o B. Quindi vengono misurati a 0 minuti, 15 minuti, 30 minuti, 60 minuti, 120 minuti e 180 minuti. Da quanto ho capito, il tempo dovrebbe essere un fattore casuale perché sono solo dei campioni da 0 a 180 minuti. Quindi, dovrei fare: lme (UOP.kg ~ time * treat, random = ~ time | id, raw3.42)?
biostat_newbie,

Sì, ma la penserei così: essenzialmente permetti all'intercettazione e alla pendenza della linea di regressione (di UOP.kg in tempo) di differire (casualmente) tra i soggetti all'interno dello stesso gruppo di trattamento. Questo è ciò che farà random = ~ time | id. Ciò che il modello ti dirà quindi è la quantità stimata di variabilità nelle intercettazioni e nelle pendenze. Inoltre, il tempo: il termine di interazione trattamento indica se la pendenza media è diversa per A e B.
Wolfgang,

Grazie @ Wolfgang! Posso usare Error(Subject/age), dal momento che ho cercato un tutorial, dicendo che /agesignifica misure ripetute lungo quel fattore? È uguale al tuo Error(Subject)? Un'altra domanda è: per i dati non bilanciati aove lmepuò avere risultati diversi, giusto?
breezeintopl,

1

Vorrei solo aggiungere che potresti voler installare il carpacchetto e utilizzare Anova()questo pacchetto invece di anova()perché per aov()e lm()oggetti, la vaniglia anova()usa una somma sequenziale di quadrati, che dà il risultato sbagliato per dimensioni del campione disuguali mentre per lme()esso utilizza il tipo -Io la somma dei quadrati di tipo III a seconda typedell'argomento, ma la somma dei quadrati di tipo III viola la marginalità, ovvero tratta le interazioni non diversamente dagli effetti principali.

L'elenco R-help non ha nulla di buono da dire sulle somme di quadrati di tipo I e di tipo III, eppure queste sono le uniche opzioni! Vai a capire.

Modifica: In realtà, sembra che il tipo II non sia valido se esiste un termine di interazione significativo, e sembra che il meglio che chiunque possa fare sia usare il tipo III quando ci sono interazioni. Mi è stato dato una risposta a una mia domanda che a sua volta mi ha indicato questo post .


0

Mi sembra che tu abbia più misure per ogni ID alla volta. È necessario aggregare questi per l'aov perché aumenta ingiustamente il potere in quell'analisi. Non sto dicendo che fare l'aggregato renderà i risultati uguali ma dovrebbe renderli più simili.

dat.agg <- aggregate(UOP.kg ~ time + treat + id, raw3.42, mean)

Quindi eseguire il modello aov come prima di sostituire i dati con dat.agg.

Inoltre, credo che anova (lme) sia più ciò che vuoi fare per confrontare i risultati. La direzione e la grandezza di un effetto non sono le stesse del rapporto tra la varianza del modello e l'errore.

(A proposito, se fai l'analisi lme sui dati aggregati, cosa che non dovresti, e controlla anova (lme) otterrai quasi gli stessi risultati di aov)

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.