lmer 混合效应模型的 predict() 函数

机器算法验证 r 混合模式 lme4-nlme
2022-02-13 23:30:46

问题:

我在其他文章中读到了 [R] 中的混合效果 {lme4} 模型predict不可用的文章。lmer

我尝试用玩具数据集探索这个主题......

背景:

数据集改编自此来源,可作为...

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测量的重复观察结果固定效果,例如(要记住的单词的情感内涵),或测试摄入的RecallAuditoriumSubjectEducationEmotionmgs.Caffeine

这个想法是,对于高咖啡因的有线受试者来说很容易记住,但随着时间的推移,这种能力会下降,可能是因为疲劳。带有负面含义的词更难记住。教育具有可预测的效果,甚至礼堂也发挥了作用(可能更嘈杂,或更不舒适)。这里有几个探索性的情节:


在此处输入图像描述

召回率的差异作为 和函数Emotional ToneAuditoriumEducation

在此处输入图像描述


在数据云上为呼叫拟合线路时:

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

我得到这个情节:

使用以下代码(注意其中对 <code>predict(fit1)</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

这篇文章的代码在这里

1个回答

当您调用 时,很容易对系数的表示感到困惑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 在 Time=0 时的值与平均值 82.06 的差异是他Subject 他的Time:Subject系数之和:

82.06+17.39+33.04=132.49

我认为在 132.46 的舍入误差内。

返回的截距值coef似乎代表了整体截距加上SubjectTime:Subject特定的差异,因此很难使用它们;如果您尝试使用这些coef值进行上述计算,您将重复计算总截距。