我正在尝试构建一个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
如果我将[-i]条件移除到data = Data参数,则代码运行四次拟合,但不会删除每个人的数据。
就像一个FYI,我需要进一步扩展循环: 1)提取β系数,2)将它们应用于被保留的个体的X矩阵,最后,3)将预测值(在logit转换后)与观察值进行比较。由于每个IndID都需要所有步骤,我希望将它们构建到循环中。我提供了额外的细节,以防我计划的未来步骤告知更加令人生畏的留一模型问题。
一如既往地谢谢!
答案 0 :(得分:2)
您遇到的问题是因为Data[-i]
期望i
是整数索引。相反,i
可以是AAA
,BBB
,CCC
或DDD
。要修复循环,请设置
data = Data[Data$IndID != i, ]
你的模特身材。