Vấn đề:
Tôi đã đọc ở khác viết rằng predict
khô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à Recall
tố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 ( Auditorium
nơi thử nghiệm diễn ra; Subject
tê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 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á:
Sự khác biệt về tỷ lệ thu hồi là một chức năng của Emotional Tone
, Auditorium
và Education
:
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:
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 Time
và 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)
Câu hỏi:
Làm thế nào để predict
chức năng hoạt động trong lmer
mô hình này ? Rõ ràng là nó đang xem xét Time
biế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.45609
cho mục đầu tiên, tương ứng với điểm đầu tiên. Đây là head
tậ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 fit2
là:
$`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.45609
gì?
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 .
?predict
trên bảng điều khiển [r], tôi sẽ có được dự đoán cơ bản cho {stats} ...
predict.merMod
Mặ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
...
lme4
gó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
.
predict
biế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 đó.
predict
chứ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àopredict
. Đừ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 cholme4
.