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 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, Auditoriumvà 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 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)
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 .
?predicttrên bảng điều khiển [r], tôi sẽ có được dự đoán cơ bản cho {stats} ...
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...
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.
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 đó.




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à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.