ทำนาย () ฟังก์ชั่นสำหรับ lmer Mixed Effects Models


27

ปัญหา:

ฉันได้อ่านในโพสต์อื่น ๆซึ่ง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(ความหมายของคำว่าอารมณ์ที่จะจำ) หรือของกินก่อนที่จะมีการทดสอบmgs.Caffeine

แนวคิดก็คือมันง่ายต่อการจำสำหรับวิชาแบบมีสายที่มีคาเฟอีนมาก แต่ความสามารถลดลงเมื่อเวลาผ่านไปอาจเป็นเพราะความเหนื่อยล้า คำที่มีความหมายแฝงในเชิงลบยากที่จะจดจำได้มากขึ้น การศึกษามีผลกระทบที่คาดการณ์ได้และแม้กระทั่งห้องประชุมก็มีบทบาท (บางทีอาจมีเสียงดังหรือสบายกว่า) นี่คือสองสามแปลงสำรวจ:


ป้อนคำอธิบายรูปภาพที่นี่

ความแตกต่างในอัตราการเรียกคืนเป็นหน้าที่ของEmotional Tone, AuditoriumและEducation:

ป้อนคำอธิบายรูปภาพที่นี่


เมื่อติดตั้งสายบนคลาวด์ข้อมูลสำหรับการโทร:

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

ฉันได้พล็อตนี้:

ด้วยรหัสต่อไปนี้ (สังเกตการโทรสำหรับ <code> ทำนาย (พอดี 1) </code> ในรหัส):

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

สำหรับโพสต์นี้ก็คือที่นี่


3
โปรดทราบว่ามีpredictฟังก์ชั่นในแพ็คเกจนี้ตั้งแต่เวอร์ชั่น 1.0-0 ที่วางจำหน่าย 2013-08-01 ดูข่าวหน้าแพคเกจใน CRAN หากไม่เคยมีมาก่อนคุณจะไม่สามารถรับผลลัพธ์ใด ๆpredictได้ อย่าลืมว่าคุณสามารถดูรหัส R กับ lme4 ::: predict.merMod ที่ R lme4คำสั่งพรอมต์และตรวจสอบแหล่งที่มาสำหรับฟังก์ชั่นที่รวบรวมใดพื้นฐานในแพคเกจที่มาสำหรับ
EdM

1
ขอบคุณฉันเห็นว่ามีฟังก์ชั่นที่มีเอฟเฟกต์แบบสุ่มไม่สนใจหรือรวมอยู่ด้วย คุณรู้หรือไม่ว่าฉันจะหาวิธีคำนวณได้จากที่ใด ถ้าผมพิมพ์?predictบน [r] คอนโซลฉันได้รับพื้นฐานการคาดการณ์สำหรับ {} สถิติ ...
อันโต Parellada

@EdM ... ใช่นี่คือสิ่งใหม่สำหรับฉัน ... ขอบคุณ ฉันไม่ได้เรียกpredict.merModแต่ ... อย่างที่คุณเห็นบน OP ฉันเรียกง่ายๆpredict...
Antoni Parellada

1
โหลดlme4แพ็คเกจจากนั้นพิมพ์ lme4 ::: guess.merMod เพื่อดูรุ่นเฉพาะแพ็คเกจ เอาท์พุทจากถูกเก็บไว้ในวัตถุของคลาสlmer merMod
EdM

4
หนึ่งในความงามของ R คือฟังก์ชั่นที่ชอบpredictรู้ว่าจะทำอย่างไรขึ้นอยู่กับคลาสของวัตถุที่มันถูกเรียกให้ทำ คุณกำลังโทรหาpredict.merModคุณก็ไม่รู้
EdM

คำตอบ:


25

coef(fit2)มันเป็นเรื่องง่ายที่จะได้รับสับสนโดยการนำเสนอของสัมประสิทธิ์เมื่อคุณเรียก ดูข้อมูลสรุปของ 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

มีการสกัดกั้นโดยรวม 61.92 สำหรับโมเดลโดยมีค่าคาเฟอีนเท่ากับ 0.212 ดังนั้นสำหรับคาเฟอีน = 95 คุณคาดการณ์การเรียกคืนเฉลี่ย 82.06

แทนที่จะใช้coefให้ใช้ranefเพื่อให้ได้ความแตกต่างของการสกัดกั้นแบบสุ่มเอฟเฟกต์แต่ละอันจากการสกัดกั้นค่าเฉลี่ยในระดับที่สูงขึ้นของการซ้อน

> 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

ค่าสำหรับ Jim ที่เวลา = 0 จะแตกต่างจากค่าเฉลี่ยนั้น 82.06 โดยผลรวมของทั้งเขาSubject และTime:Subjectสัมประสิทธิ์ของเขา:

82.06+17.39+33.04=132.49

ซึ่งฉันคิดว่าเป็นข้อผิดพลาดในการปัดเศษที่ 132.46

ค่าดักจับที่ส่งคืนโดยcoefดูเหมือนจะเป็นตัวแทนของการสกัดกั้นโดยรวมรวมถึงSubjectหรือTime:Subjectความแตกต่างที่เฉพาะเจาะจงดังนั้นจึงยากที่จะทำงานกับค่าเหล่านั้น หากคุณพยายามทำการคำนวณข้างต้นด้วยcoefค่าคุณจะนับการสกัดกั้นโดยรวมเป็นสองเท่า


ขอขอบคุณ! นี่มันยอดเยี่ยมมาก! ฉันไม่คิดว่ามีจุดใด ๆ ในการปล่อยให้มันเปิด ... นี้เป็นคำตอบไม่ได้หรือไม่
Antoni Parellada

ผมได้คำแนะนำเกี่ยวกับranefจากการตรวจสอบรหัส R lme4ใน ฉันชี้แจงงานนำเสนอในสองแห่ง
EdM

(+1) หมายเหตุ: เอฟเฟกต์แบบสุ่มเวลาซ้อนกันภายในบุคคลอย่างใดที่ดูแปลก
Michael M

@MichaelM: ใช่ข้อมูลที่นำเสนอดูเหมือนจะเป็นแบบไขว้ (Time x Subject) แทนที่จะเป็นแบบซ้อน แต่นี่เป็นวิธีที่ OP ทำให้เกิดคำถามเกี่ยวกับวิธีตีความlme4ผลลัพธ์ นอกจากนี้ข้อมูลที่นำเสนอดูเหมือนจะเป็นภาพประกอบมากกว่าการศึกษาจริงเพื่อวิเคราะห์
EdM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.