Apa perbedaan antara menggunakan aov () dan lme () dalam menganalisis dataset longitudinal?

13

Adakah yang bisa memberi tahu saya perbedaan antara menggunakan aov()dan lme()untuk menganalisis data longitudinal dan bagaimana menafsirkan hasil dari kedua metode ini?

Di bawah ini, saya menganalisis dataset yang sama menggunakan aov()dan lme()dan mendapatkan 2 hasil yang berbeda. Dengan aov(), saya mendapat hasil yang signifikan dalam waktu dengan interaksi pengobatan, tetapi pas dengan model campuran linier, waktu dengan interaksi pengobatan tidak signifikan.

> 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
sumber

Jawaban:

18

Berdasarkan uraian Anda, tampaknya Anda memiliki model tindakan berulang dengan satu faktor perawatan. Karena saya tidak memiliki akses ke dataset (raw3.42 ), saya akan menggunakan data Orthodont dari nlmepaket untuk menggambarkan apa yang terjadi di sini. Struktur datanya sama (pengukuran berulang untuk dua kelompok berbeda - dalam hal ini, pria dan wanita).

Jika Anda menjalankan kode berikut:

library(nlme)
data(Orthodont)

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

Anda akan mendapatkan hasil berikut:

            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

Jika Anda menjalankan:

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

kamu akan mendapatkan:

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                     

Perhatikan bahwa uji-F persis sama.

Sebab lme(), Anda menggunakan list(id=pdDiag(~time)), yang tidak hanya menambahkan intersepsi acak ke model, tetapi juga kemiringan acak. Selain itu, dengan menggunakan pdDiag, Anda mengatur korelasi antara intersep acak dan kemiringan ke nol. Ini adalah model yang berbeda dari yang Anda tentukan melalui aov()dan karenanya Anda mendapatkan hasil yang berbeda.

Wolfgang
sumber
Terima kasih @ Wolfgang; penjelasan Anda sangat membantu. Pertanyaan lanjutan yang saya miliki adalah ini. Saya memang menganalisis model tindakan berulang dengan satu faktor pengobatan. Setiap subjek secara acak ditugaskan untuk pengobatan A atau B. Kemudian mereka diukur pada 0 menit, 15 menit, 30 menit, 60 menit, 120 menit dan 180 menit. Dari pemahaman saya, waktu harus menjadi faktor acak karena hanya sampel dari waktu 0 hingga 180 menit. Jadi, yang harus saya lakukan: lme (UOP.kg ~ time * treat, random = ~ time | id, raw3.42)?
biostat_newbie
Ya, tapi saya akan memikirkannya seperti ini: Anda pada dasarnya membiarkan intersepsi dan kemiringan garis regresi (dari UOP.kg tepat waktu) berbeda (secara acak) antara subjek dalam kelompok perlakuan yang sama. Inilah yang akan dilakukan acak = ~ waktu | id. Apa yang model akan katakan kepada Anda adalah perkiraan jumlah variabilitas dalam intersep dan lereng. Selain itu, istilah interaksi waktu: perlakukan menunjukkan apakah kemiringan rata - rata berbeda untuk A dan B.
Wolfgang
Terima kasih @ Wolfgang! Dapatkah saya menggunakan Error(Subject/age), karena saya mencari beberapa tutorial, mengatakan itu /ageberarti ukuran berulang di sepanjang faktor itu? Apakah ini sama dengan Anda Error(Subject)? Pertanyaan lain adalah: untuk data yang tidak seimbang, aovdan lmemungkin memiliki hasil yang berbeda, bukan?
breezeintopl
1

Saya hanya ingin menambahkan bahwa Anda mungkin ingin menginstal carpaket dan menggunakan Anova()bahwa paket ini menyediakan bukan anova()karena untuk aov()dan lm()objek, vanilla anova()menggunakan jumlah kueri berurutan, yang memberikan hasil yang salah untuk ukuran sampel yang tidak sama sedangkan untuk lme()itu menggunakan salah satu jenis -I atau tipe-III jumlah kuadrat tergantung pada typeargumen, tetapi tipe-III jumlah kuadrat melanggar marginalitas - yaitu memperlakukan interaksi tidak berbeda dari efek utama.

Daftar bantuan R tidak ada yang bisa dikatakan tentang tipe-I dan tipe-III jumlah kuadrat, namun ini adalah satu-satunya pilihan! Sosok pergi.

Sunting: Sebenarnya, sepertinya tipe-II tidak valid jika ada istilah interaksi yang signifikan, dan sepertinya yang terbaik yang bisa dilakukan siapa pun adalah menggunakan tipe-III ketika ada interaksi. Saya mendapat tip dari itu dengan jawaban untuk salah satu pertanyaan saya sendiri yang pada gilirannya mengarahkan saya ke posting ini .

f1r3br4nd
sumber
0

Menurut saya, Anda memiliki beberapa ukuran untuk setiap id pada setiap waktu. Anda perlu menggabungkan ini untuk aov karena aov secara tidak adil meningkatkan daya dalam analisis itu. Saya tidak mengatakan melakukan agregat akan membuat hasil yang sama tetapi harus membuat mereka lebih mirip.

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

Kemudian jalankan model aov Anda seperti sebelum mengganti data dengan dat.agg.

Juga, saya percaya anova (lme) lebih dari apa yang ingin Anda lakukan untuk membandingkan hasilnya. Arah dan besarnya efek tidak sama dengan rasio varians model terhadap kesalahan.

(BTW, jika Anda melakukan analisis lme pada data agregat, yang seharusnya tidak Anda lakukan, dan memeriksa anova (lme) Anda akan mendapatkan hasil yang hampir sama dengan aov)

John
sumber