ปัญหา:
ฉันได้อ่านในโพสต์อื่น ๆซึ่งpredict
ไม่สามารถใช้ได้กับเอ็ฟเฟ็กต์แบบผสมlmer
{lme4} ใน [R]
ฉันพยายามสำรวจเรื่องนี้ด้วยชุดของเล่น ...
พื้นหลัง:
ชุดข้อมูลถูกดัดแปลงจากแหล่งที่มานี้และมีให้ในรูปแบบ ...
require(gsheet)
data <- read.csv(text =
gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
format ='csv'))
นี่คือแถวและส่วนหัวแรก:
> 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
เรามีการสังเกตTime
อย่างต่อเนื่อง( ) ของการวัดต่อเนื่องกล่าวคือRecall
อัตราของคำบางคำและตัวแปรอธิบายหลายอย่างรวมถึงเอฟเฟกต์แบบสุ่ม ( Auditorium
ที่การทดสอบเกิดขึ้นSubject
ชื่อ); และผลกระทบที่ได้รับการแก้ไขเช่นEducation
, Emotion
(ความหมายของคำว่าอารมณ์ที่จะจำ) หรือของกินก่อนที่จะมีการทดสอบCaffeine
แนวคิดก็คือมันง่ายต่อการจำสำหรับวิชาแบบมีสายที่มีคาเฟอีนมาก แต่ความสามารถลดลงเมื่อเวลาผ่านไปอาจเป็นเพราะความเหนื่อยล้า คำที่มีความหมายแฝงในเชิงลบยากที่จะจดจำได้มากขึ้น การศึกษามีผลกระทบที่คาดการณ์ได้และแม้กระทั่งห้องประชุมก็มีบทบาท (บางทีอาจมีเสียงดังหรือสบายกว่า) นี่คือสองสามแปลงสำรวจ:
ความแตกต่างในอัตราการเรียกคืนเป็นหน้าที่ของEmotional Tone
, Auditorium
และEducation
:
เมื่อติดตั้งสายบนคลาวด์ข้อมูลสำหรับการโทร:
fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)
ฉันได้พล็อตนี้:
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)
ในขณะที่รุ่นต่อไปนี้:
fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)
การรวมเข้าด้วยกันTime
และรหัสขนานจะได้รับพล็อตที่น่าแปลกใจ:
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
geom_point(size=3) +
geom_line(aes(y = predict(fit2)),size=1)
print(p)
คำถาม:
ไม่วิธีpredict
ฟังก์ชั่นการทำงานในครั้งนี้lmer
รูปแบบ? เห็นได้ชัดว่ามันคำนึงถึงTime
ตัวแปรทำให้เกิดความกระชับและซิกแซกที่พยายามแสดงมิติที่สามของTime
ภาพในพล็อตแรก
ถ้าฉันเรียกว่าpredict(fit2)
ฉันจะได้รับ132.45609
สำหรับรายการแรกซึ่งสอดคล้องกับจุดแรก นี่คือhead
ชุดข้อมูลที่มีเอาต์พุตของสิ่งที่predict(fit2)
แนบมาเป็นคอลัมน์สุดท้าย:
> 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
ค่าสัมประสิทธิ์สำหรับfit2
:
$`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
ทางออกที่ดีที่สุดของฉันคือ ...
> 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
สูตรที่จะได้รับแทน132.45609
คืออะไร?
แก้ไขสำหรับการเข้าถึงที่รวดเร็ว ... สูตรการคำนวณค่าที่ทำนาย (ตามคำตอบที่ยอมรับจะขึ้นอยู่กับranef(fit2)
ผลลัพธ์:
> 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
... สำหรับจุดเริ่มต้นแรก:
> 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
?predict
บน [r] คอนโซลฉันได้รับพื้นฐานการคาดการณ์สำหรับ {} สถิติ ...
predict.merMod
แต่ ... อย่างที่คุณเห็นบน OP ฉันเรียกง่ายๆpredict
...
lme4
แพ็คเกจจากนั้นพิมพ์ lme4 ::: guess.merMod เพื่อดูรุ่นเฉพาะแพ็คเกจ เอาท์พุทจากถูกเก็บไว้ในวัตถุของคลาสlmer
merMod
predict
รู้ว่าจะทำอย่างไรขึ้นอยู่กับคลาสของวัตถุที่มันถูกเรียกให้ทำ คุณกำลังโทรหาpredict.merMod
คุณก็ไม่รู้
predict
ฟังก์ชั่นในแพ็คเกจนี้ตั้งแต่เวอร์ชั่น 1.0-0 ที่วางจำหน่าย 2013-08-01 ดูข่าวหน้าแพคเกจใน CRAN หากไม่เคยมีมาก่อนคุณจะไม่สามารถรับผลลัพธ์ใด ๆpredict
ได้ อย่าลืมว่าคุณสามารถดูรหัส R กับ lme4 ::: predict.merMod ที่ Rlme4
คำสั่งพรอมต์และตรวจสอบแหล่งที่มาสำหรับฟังก์ชั่นที่รวบรวมใดพื้นฐานในแพคเกจที่มาสำหรับ