Jaka jest różnica między użyciem aov () i lme () w analizie podłużnego zestawu danych?

14

Czy ktoś może mi powiedzieć różnicę między używaniem aov()i lme()do analizy danych podłużnych a sposobem interpretacji wyników z tych dwóch metod?

Poniżej analizuję tego samego zestawu danych przy użyciu aov()i lme()otrzymał 2 różne wyniki. Z tym aov(), że uzyskałem znaczący wynik w czasie dzięki interakcji leczenia, ale dopasowując liniowy model mieszany, czas według interakcji leczenia jest nieznaczny.

> 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 
biostat_newbie
źródło

Odpowiedzi:

19

Na podstawie opisu wydaje się, że masz model wielokrotnych pomiarów z jednym czynnikiem leczenia. Ponieważ nie mam dostępu do zestawu danych ( raw3.42), użyję danych nlmepakietu Ortodont z pakietu, aby zilustrować, co się tutaj dzieje. Struktura danych jest taka sama (powtarzane pomiary dla dwóch różnych grup - w tym przypadku mężczyzn i kobiet).

Jeśli uruchomisz następujący kod:

library(nlme)
data(Orthodont)

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

otrzymasz następujące wyniki:

            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

Jeśli uruchomisz:

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

dostaniesz:

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                     

Zauważ, że testy F są dokładnie identyczne.

Dla lme()użyłeś list(id=pdDiag(~time)), która nie tylko dodaje losowo przechwycić do modelu, ale również losową stoku. Ponadto, używając pdDiag, ustawiasz korelację między losowym przechwytywaniem a nachyleniem na zero. Jest to inny model niż ten, który określiłeś za pomocą, aov()dzięki czemu otrzymujesz inne wyniki.

Wolfgang
źródło
Dzięki @Wolfgang; twoje wyjaśnienie bardzo pomaga. Pytanie, które mam wtedy, brzmi: Rzeczywiście analizuję model powtarzanych pomiarów z jednym czynnikiem leczenia. Każdy osobnik jest losowo przydzielany do leczenia A lub B. Następnie są mierzone po 0 minutach, 15 minutach, 30 minutach, 60 minutach, 120 minutach i 180 minutach. Z mojego zrozumienia, czas powinien być czynnikiem losowym, ponieważ są to tylko próbki od czasu od 0 do 180 minut. Więc powinienem zrobić: lme (UOP.kg ~ czas * Treat, random = ~ time | id, raw3.42)?
biostat_newbie
Tak, ale pomyślałbym o tym w ten sposób: Zasadniczo pozwalasz, aby przecięcie i nachylenie linii regresji (UOP.kg na czas) różniły się (losowo) między podmiotami w tej samej grupie leczenia. To właśnie zrobi random = ~ time | id. Model pokaże ci wtedy szacunkową zmienność punktów przecięcia i nachyleń. Ponadto termin interakcji czas: leczenie wskazuje, czy średnie nachylenie jest różne dla A i B.
Wolfgang
Dzięki @Wolfgang! Czy mogę użyć Error(Subject/age), skoro przejrzałem samouczek, mówiąc, że /ageoznacza to wielokrotne mierzenie tego współczynnika? Czy to to samo co twoje Error(Subject)? Kolejne pytanie brzmi: za niezrównoważonego danych, aovi lmemoże mieć różne wyniki, prawda?
breezeintopl
1

Chciałbym tylko dodać, że możesz chcieć zainstalować carpakiet i korzystać z Anova()tego, który zapewnia ten pakiet, anova()ponieważ zamiast dla aov()i lm()obiektów, wanilia anova()używa sekwencyjnej sumy kwadratów, co daje zły wynik dla nierównych rozmiarów próbek, podczas lme()gdy używa albo typu -I lub suma kwadratów typu III w zależności od typeargumentu, ale suma kwadratów typu III narusza marginesowość - tzn. Traktuje interakcje nie inaczej niż główne efekty.

Lista pomocy R nie ma nic dobrego do powiedzenia na temat sum kwadratów typu I i typu III, a jednak są to jedyne opcje! Domyśl.

Edycja: W rzeczywistości wygląda na to, że typ II nie jest ważny, jeśli istnieje znaczący termin interakcji, i wydaje się, że najlepiej, co każdy może zrobić, to użyć typu III, gdy występują interakcje. Dowiedziałem się od niego odpowiedzi na jedno z moich pytań, które z kolei skierowały mnie do tego postu .

f1r3br4nd
źródło
0

Wydaje mi się, że masz wiele miar dla każdego identyfikatora za każdym razem. Musisz je agregować dla aov, ponieważ niesprawiedliwie zwiększa moc w tej analizie. Nie twierdzę, że wykonanie agregacji sprawi, że wyniki będą takie same, ale powinno uczynić je bardziej podobnymi.

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

Następnie uruchom model aov jak przed zastąpieniem danych dat.agg.

Ponadto uważam, że anova (lme) to coś, co chcesz zrobić, aby porównać wyniki. Kierunek i wielkość efektu nie jest taki sam, jak stosunek wariancji modelu do błędu.

(BTW, jeśli wykonasz analizę danych zbiorczych, czego nie powinieneś, i sprawdzisz anova (lme), otrzymasz prawie takie same wyniki jak aov)

Jan
źródło