dự đoán () Hàm cho các mô hình hiệu ứng hỗn hợp lmer


27

Vấn đề:

Tôi đã đọc ở khác viết rằng predictkhông có sẵn cho các hiệu ứng hỗn hợp lmer{} lme4 mô hình trong [R].

Tôi đã thử khám phá chủ đề này với bộ dữ liệu đồ chơi ...

Lý lịch:

Bộ dữ liệu được điều chỉnh theo nguồn này và có sẵn dưới dạng ...

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

Đây là những hàng và tiêu đề đầu tiên:

> 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

Chúng tôi có một số quan sát lặp đi lặp lại ( Time) của một phép đo liên tục, cụ thể là Recalltốc độ của một số từ và một số biến giải thích, bao gồm các hiệu ứng ngẫu nhiên ( Auditoriumnơi thử nghiệm diễn ra; Subjecttên); và các hiệu ứng cố định , chẳng hạn như Education, Emotion(ý nghĩa cảm xúc của từ cần nhớ), hoặc mg.của Caffeineăn trước khi thử nghiệm.

Ý tưởng là dễ nhớ đối với các đối tượng có dây siêu caffein, nhưng khả năng giảm dần theo thời gian, có lẽ do mệt mỏi. Những từ có ý nghĩa tiêu cực khó nhớ hơn. Giáo dục có tác dụng có thể dự đoán được và thậm chí khán phòng cũng đóng một vai trò (có lẽ người ta ồn ào hơn, hoặc ít thoải mái hơn). Dưới đây là một vài âm mưu khám phá:


nhập mô tả hình ảnh ở đây

Sự khác biệt về tỷ lệ thu hồi là một chức năng của Emotional Tone, AuditoriumEducation:

nhập mô tả hình ảnh ở đây


Khi khớp các dòng trên đám mây dữ liệu cho cuộc gọi:

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

Tôi có được âm mưu này:

với đoạn mã sau (chú ý lệnh gọi <code> dự đoán (fit1) </ code> trong đó):

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)

trong khi mô hình sau:

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

kết hợp Timevà một mã song song có được một âm mưu đáng ngạc nhiên:

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

nhập mô tả hình ảnh ở đây


Câu hỏi:

Làm thế nào để predictchức năng hoạt động trong lmermô hình này ? Rõ ràng là nó đang xem xét Timebiến, dẫn đến sự phù hợp chặt chẽ hơn nhiều, và ngoằn ngoèo đang cố gắng hiển thị chiều thứ ba này Timeđược miêu tả trong cốt truyện đầu tiên.

Nếu tôi gọi predict(fit2)tôi nhận được 132.45609cho mục đầu tiên, tương ứng với điểm đầu tiên. Đây là headtập dữ liệu với đầu ra được predict(fit2)đính kèm dưới dạng cột cuối cùng:

> 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

Các hệ số cho fit2là:

$`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

Đặt cược tốt nhất của tôi là ...

> 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

Công thức để có được thay thế là 132.45609gì?


EDIT để truy cập nhanh ... Công thức tính giá trị dự đoán (theo câu trả lời được chấp nhận sẽ dựa trên ranef(fit2)đầu ra:

> 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

... cho điểm vào đầu tiên:

> 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

Mã cho bài viết này là ở đây .


3
Lưu ý rằng đã có một predictchức năng trong gói này kể từ Phiên bản 1.0-0, được phát hành 2013-08-01. Xem trang tin tức gói trong CRAN . Nếu không có, bạn sẽ không thể nhận được bất kỳ kết quả nào predict. Đừng quên rằng bạn có thể thấy mã R với lme4 ::: dự đoán.merMod tại dấu nhắc lệnh R và kiểm tra nguồn cho bất kỳ chức năng được biên dịch cơ bản nào trong gói nguồn cho lme4.
EdM

1
Cảm ơn, tôi thấy có chức năng với các hiệu ứng ngẫu nhiên bị bỏ qua hoặc bao gồm. Bạn có biết nơi tôi có thể tìm thấy nó được tính toán như thế nào không? Nếu tôi gõ ?predicttrên bảng điều khiển [r], tôi sẽ có được dự đoán cơ bản cho {stats} ...
Antoni Parellada

@EdM ... vâng, điều này là mới đối với tôi ... Cảm ơn bạn. predict.merModMặc dù vậy, tôi đã không gọi ... Như bạn có thể thấy trên OP, tôi gọi đơn giản là predict...
Antoni Parellada

1
Tải lme4gói, sau đó nhập lme4 ::: dự đoán.merMod để xem phiên bản dành riêng cho gói. Đầu ra từ lmerđược lưu trữ trong một đối tượng của lớp merMod.
EdM

4
Một trong những nét đẹp của R là một hàm như predictbiết phải làm gì tùy thuộc vào lớp của đối tượng mà nó được gọi để hành động. Bạn đang gọi predict.merMod, bạn không biết điều đó.
EdM

Câu trả lời:


25

Rất dễ bị nhầm lẫn bởi cách trình bày các hệ số khi bạn gọi coef(fit2). Nhìn vào bản tóm tắt của 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

Có một đánh chặn tổng thể là 61,92 cho mô hình, với hệ số caffeine là 0,212. Vì vậy, đối với caffeine = 95, bạn dự đoán thu hồi trung bình 82,06.

Thay vì sử dụng coef, hãy sử dụng ranefđể có được sự khác biệt của từng lần chặn hiệu ứng ngẫu nhiên từ đánh chặn trung bình ở cấp độ lồng cao hơn tiếp theo:

> 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

Các giá trị cho Jim tại Time = 0 sẽ khác với giá trị trung bình của 82,06 bằng tổng của cả ông Subject ông Time:Subjecthệ số:

82,06+17,39+33,04= =132,49

mà tôi nghĩ là trong phạm vi làm tròn của 132,46.

Các giá trị chặn được trả về coefdường như đại diện cho đánh chặn tổng thể cộng với Subjecthoặc Time:Subjectkhác biệt cụ thể, do đó khó khăn hơn để làm việc với các giá trị đó; nếu bạn đã cố gắng thực hiện phép tính ở trên với các coefgiá trị, bạn sẽ tính hai lần đánh chặn tổng thể.


Cảm ơn bạn! Điều này thật nổi bật! Tôi không nghĩ rằng có bất kỳ điểm nào trong rời khỏi nó mở ... Đây là những câu trả lời, phải không?
Antoni Parellada

Tôi có gợi ý về ranefviệc kiểm tra mã R trong lme4. Tôi đã làm rõ bài thuyết trình ở một vài nơi.
EdM

(+1) Lưu ý: hiệu ứng ngẫu nhiên thời gian được lồng trong người bằng cách nào đó trông kỳ lạ.
Michael M

@MichaelM: Có, dữ liệu như được trình bày dường như là một chéo (Thời gian x Chủ đề) chứ không phải là một thiết kế lồng nhau, nhưng đây là cách OP đưa ra câu hỏi về cách diễn giải lme4đầu ra. Ngoài ra, dữ liệu được trình bày dường như là để minh họa chứ không phải là một nghiên cứu thực sự được phân tích.
EdM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.