memprediksi () Fungsi untuk Model Efek Campuran ringan

27

Masalah:

Saya telah membaca di posting lain yang predicttidak tersedia untuk lmermodel efek campuran {lme4} di [R].

Saya mencoba menjelajahi subjek ini dengan dataset mainan ...

Latar Belakang:

Dataset diadaptasi dari sumber ini , dan tersedia sebagai ...

require(gsheet)
data <- read.csv(text = 
     gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
        format ='csv'))

Ini adalah baris dan header pertama:

> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall
1     Jim          A        HS    0 Negative       95 125.80
2     Jim          A        HS    0  Neutral       86 123.60
3     Jim          A        HS    0 Positive      180 204.00
4     Jim          A        HS    1 Negative      200  95.72
5     Jim          A        HS    1  Neutral       40  75.80
6     Jim          A        HS    1 Positive       30  84.56

Kami memiliki beberapa pengamatan berulang ( Time) dari pengukuran kontinu, yaitu Recalllaju beberapa kata, dan beberapa variabel penjelas, termasuk efek acak (di Auditoriummana tes berlangsung; Subjectnama); dan memperbaiki efek , seperti Education, Emotion(konotasi emosional dari kata yang harus diingat), atau dari dicerna sebelum ujian.mgs.Caffeine

Idenya adalah mudah diingat untuk subjek berkabel hyper-caffeinated, tetapi kemampuannya menurun seiring waktu, mungkin karena kelelahan. Kata-kata dengan konotasi negatif lebih sulit untuk diingat. Pendidikan memiliki efek yang dapat diprediksi, dan bahkan auditorium memainkan peran (mungkin orang lebih berisik, atau kurang nyaman). Inilah beberapa plot eksplorasi:


masukkan deskripsi gambar di sini

Perbedaan dalam tingkat mengingat sebagai fungsi dari Emotional Tone, Auditoriumdan Education:

masukkan deskripsi gambar di sini


Saat memasang garis pada cloud data untuk panggilan:

fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)

Saya mendapatkan plot ini:

dengan kode berikut (perhatikan panggilan untuk <code> prediksi (fit1) </code> di dalamnya):

library(ggplot2)
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit1)),size=1) 
print(p)

sedangkan model berikut:

fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)

menggabungkan Timedan kode paralel mendapat plot mengejutkan:

p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit2)),size=1) 
print(p)

masukkan deskripsi gambar di sini


Pertanyaan:

Bagaimana predictfungsi beroperasi dalam lmermodel ini ? Jelas itu mempertimbangkan Timevariabel, menghasilkan kesesuaian yang lebih ketat, dan zig-zag yang mencoba menampilkan dimensi ketiga ini Timedigambarkan dalam plot pertama.

Jika saya menelepon predict(fit2)saya mendapatkan 132.45609entri pertama, yang sesuai dengan poin pertama. Berikut adalah headdataset dengan output predict(fit2)terlampir sebagai kolom terakhir:

> data$predict = predict(fit2)
> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall   predict
1     Jim          A        HS    0 Negative       95 125.80 132.45609
2     Jim          A        HS    0  Neutral       86 123.60 130.55145
3     Jim          A        HS    0 Positive      180 204.00 150.44439
4     Jim          A        HS    1 Negative      200  95.72 112.37045
5     Jim          A        HS    1  Neutral       40  75.80  78.51012
6     Jim          A        HS    1 Positive       30  84.56  76.39385

Koefisien untuk fit2adalah:

$`Time:Subject`
         (Intercept)  Caffeine
0:Jason     75.03040 0.2116271
0:Jim       94.96442 0.2116271
0:Ron       58.72037 0.2116271
0:Tina      70.81225 0.2116271
0:Victor    86.31101 0.2116271
1:Jason     59.85016 0.2116271
1:Jim       52.65793 0.2116271
1:Ron       57.48987 0.2116271
1:Tina      68.43393 0.2116271
1:Victor    79.18386 0.2116271
2:Jason     43.71483 0.2116271
2:Jim       42.08250 0.2116271
2:Ron       58.44521 0.2116271
2:Tina      44.73748 0.2116271
2:Victor    36.33979 0.2116271

$Subject
       (Intercept)  Caffeine
Jason     30.40435 0.2116271
Jim       79.30537 0.2116271
Ron       13.06175 0.2116271
Tina      54.12216 0.2116271
Victor   132.69770 0.2116271

Taruhan terbaik saya adalah ...

> coef(fit2)[[1]][2,1]
[1] 94.96442
> coef(fit2)[[2]][2,1]
[1] 79.30537
> coef(fit2)[[1]][2,2]
[1] 0.2116271
> data$Caffeine[1]
[1] 95
> coef(fit2)[[1]][2,1] + coef(fit2)[[2]][2,1] + coef(fit2)[[1]][2,2] * data$Caffeine[1]
[1] 194.3744

Apa rumus untuk mendapatkan sebagai gantinya 132.45609?


EDIT untuk akses cepat ... Rumus untuk menghitung nilai prediksi (sesuai dengan jawaban yang diterima akan didasarkan pada ranef(fit2)output:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477

$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

... untuk titik masuk pertama:

> summary(fit2)$coef[1]
[1] 61.91827             # Overall intercept for Fixed Effects 
> ranef(fit2)[[1]][2,]   
[1] 33.04615             # Time:Subject random intercept for Jim
> ranef(fit2)[[2]][2,]
[1] 17.3871              # Subject random intercept for Jim
> summary(fit2)$coef[2]
[1] 0.2116271            # Fixed effect slope
> data$Caffeine[1]
[1] 95                   # Value of caffeine

summary(fit2)$coef[1] + ranef(fit2)[[1]][2,] + ranef(fit2)[[2]][2,] + 
                    summary(fit2)$coef[2] * data$Caffeine[1]
[1] 132.4561

Kode untuk posting ini ada di sini .

Antoni Parellada
sumber
3
Perhatikan bahwa telah ada predictfungsi dalam paket ini sejak Versi 1.0-0, dirilis 2013-08-01. Lihat halaman berita paket di CRAN . Jika tidak ada, Anda tidak akan bisa mendapatkan hasil apa pun predict. Jangan lupa bahwa Anda dapat melihat kode R dengan lme4 ::: predict.merMod pada prompt perintah R, dan periksa sumber untuk mengetahui fungsi kompilasi yang mendasarinya dalam paket source lme4.
EdM
1
Terima kasih, saya melihat ada fungsi dengan efek acak yang diabaikan atau disertakan. Apakah Anda tahu di mana saya dapat menemukan cara menghitungnya? Jika saya mengetik ?predictdi konsol [r], saya mendapatkan prediksi dasar untuk {stats} ...
Antoni Parellada
@ EDM ... ya, ini baru bagi saya ... Terima kasih. Tapi saya belum menelepon predict.merMod... Seperti yang Anda lihat di OP, saya hanya menelepon predict...
Antoni Parellada
1
Muat lme4paket, lalu ketik lme4 ::: predict.merMod untuk melihat versi khusus paket. Output dari lmerdisimpan dalam objek kelas merMod.
EdM
4
Salah satu keindahan R adalah bahwa fungsi seperti predicttahu apa yang harus dilakukan tergantung pada kelas objek yang dipanggil untuk ditindaklanjuti. Anda menelepon predict.merMod, Anda tidak tahu itu.
EdM

Jawaban:

25

Sangat mudah untuk bingung dengan presentasi koefisien saat Anda menelepon coef(fit2). Lihatlah ringkasan fit2:

> summary(fit2)
Linear mixed model fit by REML ['lmerMod']
Formula: Recall ~ (1 | Subject/Time) + Caffeine
   Data: data
REML criterion at convergence: 444.5

Scaled residuals: 
 Min       1Q   Median       3Q      Max 
-1.88657 -0.46382 -0.06054  0.31430  2.16244 

Random effects:
 Groups       Name        Variance Std.Dev.
 Time:Subject (Intercept)  558.4   23.63   
 Subject      (Intercept) 2458.0   49.58   
 Residual                  675.0   25.98   
Number of obs: 45, groups:  Time:Subject, 15; Subject, 5

Fixed effects:
Estimate Std. Error t value
(Intercept) 61.91827   25.04930   2.472
Caffeine     0.21163    0.07439   2.845

Correlation of Fixed Effects:
 (Intr)
Caffeine -0.365

Ada penyadapan keseluruhan 61,92 untuk model, dengan koefisien kafein 0,212. Jadi untuk kafein = 95 Anda memperkirakan penarikan rata-rata 82,06.

Alih-alih menggunakan coef, gunakan ranefuntuk mendapatkan perbedaan dari setiap intersep efek-acak dari intersep rata-rata pada level berikutnya yang lebih tinggi dari sarang:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477
$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

Nilai untuk Jim di Time = 0 akan berbeda dari yang nilai rata-rata 82,06 dengan jumlah dari kedua nya Subject dan nya Time:Subjectkoefisien:

82.06+17.39+33.04=132.49

yang saya pikir dalam kesalahan pembulatan 132,46.

Nilai intersep yang dikembalikan coeftampaknya mewakili keseluruhan intersep plus Subjectatau Time:Subjectperbedaan spesifik, sehingga lebih sulit untuk bekerja dengan mereka; jika Anda mencoba melakukan perhitungan di atas dengan coefnilai - nilai Anda akan menghitung ganda intersep keseluruhan.

EdM
sumber
Terima kasih! Ini luar biasa! Saya tidak berpikir ada gunanya meninggalkan itu terbuka ... ini adalah yang jawabannya, bukan?
Antoni Parellada
Saya mendapat petunjuk tentang ranefmemeriksa kode R di lme4. Saya mengklarifikasi presentasi di beberapa tempat.
EdM
(+1) Catatan: efek acak waktu yang bersarang di dalam seseorang entah bagaimana terlihat aneh.
Michael M
@MichaelM: Ya, data yang disajikan tampaknya lebih disilang (Waktu x Subjek) daripada desain bersarang, tetapi ini adalah cara OP mengangkat pertanyaan tentang bagaimana menafsirkan lme4output. Selain itu, data yang disajikan tampaknya hanya untuk ilustrasi dan bukan sebagai studi nyata untuk dianalisis.
EdM