问题:
我读过其他文章,这些文章predict
不适用于lmer
[R]中的混合效果{lme4}模型。
我尝试通过玩具数据集探索这个主题...
背景:
数据集是根据此来源改编的,可作为...
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]控制台上键入,我将得到{stats}的基本预测...
predict.merMod
,但是...正如您在OP上看到的,我只是打了电话predict
...
lme4
软件包,然后键入lme4 ::: predict.merMod以查看特定于软件包的版本。的输出lmer
存储在class的对象中merMod
。
predict
根据调用它所作用的对象的类知道该做什么。您正在打电话predict.merMod
,只是不知道。
predict
自2013年1月1日发布的1.0-0版以来,此程序包中已有一个功能。请参阅CRAN中的软件包新闻页面。如果没有,您将无法通过获得任何结果predict
。不要忘记,您可以在R命令提示符下看到带有lme4 ::: predict.merMod的R代码,并在源代码包中检查的源代码中是否有任何底层编译函数lme4
。