【发布时间】:2021-12-30 21:53:16
【问题描述】:
考虑 lme4 包中的 sleepstudy 数据,如下所示。包含 18 名受试者,在不同的日子重复测量反应。假设有一个额外的变量 Days2 如下:
library("lme4")
sleepstudy$Days2<- rep(10:18, rep(20,9))
sleepstudy
Reaction Days Subject Age Days2
1 249.5600 0 308 20 10
2 258.7047 1 308 20 10
3 250.8006 2 308 20 10
...
178 343.2199 7 372 28 18
179 369.1417 8 372 28 18
180 364.1236 9 372 28 18
此数据有 9 个不同的 Days2,即 10,11,...,18。制作9个数据子集如下:
- 子集数据 1 将包含 Days2 为 10 及以上的所有人,这只是整个数据集
- 子集数据 2 将包含 Days2 为 11 及以上的所有人
- ...
- 子集 9 将包含 Days2 为 18 岁及以上的所有人。
tt <- sort(unique(sleepstudy$Days2))
Subset1 <- sleepstudy[sleepstudy$Days2>=tt[1], ]
Subset2<-sleepstudy[sleepstudy$Days2>=tt[2], ]
...
Subset9<-sleepstudy[sleepstudy$Days2>=tt[length(tt)], ]
对 9 个数据子集执行具有随机截距的单独线性混合模型,然后在 Days=tt[i] 执行预测,如下所示:
fit1 = lmer(Reaction ~ Days + (1 | Subject), data = Subset1)
newSubset1 <- data.frame( Days = tt[1], Subject = unique(Subset1$Subject))
newSubset1$Predicted_Response <- predict(fit1, newdata = newSubset1)
fit2 = lmer(Reaction ~ Days + (1 | Subject), data = Subset2)
newSubset2 <- data.frame( Days = tt[2], Subject = unique(Subset2$Subject))
newSubset2$Predicted_Response <- predict(fit2, newdata = newSubset2)
...
fit9 = lmer(Reaction ~ Days + (1 | Subject), data = Subset9)
newSubset9 <- data.frame( Days = tt[9], Subject = unique(Subset9$Subject) )
newSubset9$Predicted_Response <- predict(fit9, newdata = newSubset9)
将输出合并到一个数据集的最后一步
FinalOutput<-rbind( newSubset1,newSubset2,...,newSubset9 )
FinalOutput
Days Subject Predicted_Response
10 308 396.8617
10 309 278.2284
10 310 292.9694
...
11 372 383.3525
...
18 371 434.8685
18 372 454.5697
以上步骤是手动的。如何使用步骤的概括获得 R 中的最终输出?可能是这样的:
for(i in length(tt)){
Subset[i]<-sleepstudy[sleepstudy$Days2>=tt[i], ]
fit[i]= lmer(Reaction ~ Days + (1 | Subject), data = Subset[i])
newSubset[i] <- data.frame( Days = tt[i], Subject = unique(Subset[i]$Subject) )
newSubset[i]$Predicted_Response <- predict(fit[i], newdata = newSubset[i])
...
【问题讨论】:
标签: r lme4 mixed-models