使用R中的for()循环手动对GLMM进行一次性交叉验证

时间:2013-11-08 18:29:38

标签: r

我正在尝试构建一个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都需要所有步骤,我希望将它们构建到循环中。我提供了额外的细节,以防我计划的未来步骤告知更加令人生畏的留一模型问题。

一如既往地谢谢!

1 个答案:

答案 0 :(得分:2)

您遇到的问题是因为Data[-i]期望i是整数索引。相反,i可以是AAABBBCCCDDD。要修复循环,请设置

data = Data[Data$IndID != i, ]

你的模特身材。