В чем разница между использованием aov () и lme () при анализе продольного набора данных?


13

Может кто-нибудь сказать мне разницу между использованием aov()и lme()для анализа продольных данных и как интерпретировать результаты этих двух методов?

Ниже я анализирую один и тот же набор данных aov()и получаю lme()2 разных результата. Таким образом aov(), я получил значительный результат во времени при взаимодействии с лечением, но при использовании линейной смешанной модели время при взаимодействии с лечением незначительно.

> 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 

Ответы:


18

Исходя из вашего описания, кажется, что у вас есть модель повторных измерений с одним фактором лечения. Поскольку у меня нет доступа к набору данных ( raw3.42), я буду использовать данные Orthodont из nlmeпакета, чтобы проиллюстрировать, что здесь происходит. Структура данных одинакова (повторные измерения для двух разных групп - в данном случае мужчин и женщин).

Если вы запустите следующий код:

library(nlme)
data(Orthodont)

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

вы получите следующие результаты:

            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

Если вы запускаете:

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

ты получишь:

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                     

Обратите внимание, что F-тесты абсолютно идентичны.

Для lme(), вы использовали list(id=pdDiag(~time)), которая не только добавляет случайный перехват к модели, но и случайный наклон. Кроме того, используя pdDiag, вы устанавливаете корреляцию между случайным перехватом и наклоном в ноль. Эта модель отличается от той, которую вы указали, aov()и, следовательно, вы получите другие результаты.


Спасибо @Wolfgang; Ваше объяснение очень помогает. У меня есть следующий вопрос: Я действительно анализирую модель повторных измерений с одним фактором лечения. Каждому субъекту случайным образом назначают лечение А или В. Затем его измеряют через 0 минут, 15 минут, 30 минут, 60 минут, 120 минут и 180 минут. Насколько я понимаю, время должно быть случайным фактором, потому что это просто выборки от 0 до 180 минут. Итак, я должен сделать: lme (UOP.kg ~ время * лечить, случайно = ~ время | идентификатор, raw3.42)?
biostat_newbie

Да, но я бы подумал об этом так: вы, по сути, позволяете перехвату и наклону линии регрессии (UOP.kg по времени) различаться (случайным образом) между субъектами в одной и той же группе лечения. Это то, что будет делать random = ~ time | id. Затем модель скажет вам о предполагаемой степени изменчивости в точках пересечения и на склонах. Более того, термин взаимодействия время: обработка указывает, отличается ли средний наклон для A и B.
Вольфганг

Спасибо @Wolfgang! Могу ли я использовать Error(Subject/age), так как я посмотрел какой-то учебник, говоря, что это /ageозначает повторное измерение по этому фактору? Это так же, как ваш Error(Subject)? Другой вопрос: для несбалансированных данных, aovи lmeможет иметь разные результаты, верно?
breezeintopl

1

Я хотел бы просто добавить, что вы можете установить carпакет и использовать его Anova(), а не anova()потому, что для объектов aov()и lm()объектов ваниль anova()использует последовательную сумму квадратов, что дает неверный результат для неравных размеров выборки, в то время как для lme()нее используется тип -I или сумма квадратов типа III в зависимости от typeаргумента, но сумма квадратов типа III нарушает маргинальность, т. Е. Обрабатывает взаимодействия не иначе, как основные эффекты.

В списке R-справки нет ничего хорошего о суммах квадратов типа I и типа III, и все же это единственные варианты! Пойди разберись.

Изменить: На самом деле, похоже, что тип II не является действительным, если существует значительный термин взаимодействия, и кажется, что лучшее, что можно сделать, это использовать тип III, когда есть взаимодействия. Я получил ответ на этот вопрос, ответив на один из моих собственных вопросов, которые, в свою очередь, указали мне на этот пост .


0

Мне кажется, у вас есть несколько мер для каждого идентификатора в каждый момент времени. Вам нужно объединить их для AOV, потому что это несправедливо увеличивает мощность в этом анализе. Я не говорю, что совокупный результат даст одинаковые результаты, но он должен сделать их более похожими.

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

Затем запустите вашу модель AOV, как и прежде, чем заменить данные на dat.agg.

Кроме того, я считаю, что anova (lme) - это больше, чем вы хотите сделать, чтобы сравнить результаты. Направление и величина эффекта не совпадают с отношением дисперсии модели к ошибке.

(Кстати, если вы выполните анализ lme для агрегированных данных, чего не следует делать, и отметите anova (lme), вы получите почти те же результаты, что и aov)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.