我正在尝试构建一个 for() 循环,以使用 lme4 pkg 中的 lmer() 函数手动为 GLMM 拟合进行留一交叉验证。我需要删除一个人,拟合模型并使用 beta 系数来预测被扣留的个人的反应,然后对所有个人重复这个过程。
我创建了一些测试数据来解决第一步,即简单地将个人排除在外,拟合模型并在 for() 循环中对所有个人重复。
数据有一个二进制 (0,1) 响应、一个对 4 个个体进行分类的 IndID、一个时间变量和一个二进制变量。有 N = 100 个观察值。IndID 适合作为随机效应。
require(lme4)
#Make data
Response <- round(runif(100, 0, 1))
IndID <- as.character(rep(c("AAA", "BBB", "CCC", "DDD"),25))
Time <- round(runif(100, 2,50))
Binary <- round(runif(100, 0, 1))
#Make data.frame
Data <- data.frame(Response, IndID, Time, Binary)
Data <- Data[with(Data, order(IndID)), ] #**Edit**: Added code to sort by IndID
#Look at head()
head(Data)
Response IndID Time Binary
1 0 AAA 31 1
2 1 BBB 34 1
3 1 CCC 6 1
4 0 DDD 48 1
5 1 AAA 36 1
6 0 BBB 46 1
#Build model with all IndID's
fit <- lmer(Response ~ Time + Binary + (1|IndID ), data = Data,
family=binomial)
summary(fit)
如上所述,我希望得到四种模型拟合——一种在for()
循环中省略每个 IndID。这对我来说是一种新型的for()
命令应用程序,我很快就达到了我的编码能力。我的尝试如下。
fit <- list()
for (i in Data$IndID){
fit[[i]] <- lmer(Response ~ Time + Binary + (1|IndID), data = Data[-i],
family=binomial)
}
我不确定将模型拟合存储为列表是否是最佳选择,但我已经在其他一些帮助页面上看到了它。上述尝试导致错误:
Error in -i : invalid argument to unary operator
如果我删除以 data=Data 参数为条件的 [-i],则代码会运行四次拟合,但不会删除每个人的数据。
仅供参考,我需要进一步扩展循环以:1)提取 beta 系数,2)将它们应用于被保留的个体的 X 矩阵,最后,3)比较预测值(在 logit 转换之后) 到观测值。由于每个 IndID 都需要所有步骤,我希望将它们构建到循环中。我提供了额外的细节,以防我计划的未来步骤告知更可怕的留一模型拟合问题。
一如既往的感谢!