0

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

一如既往的感谢!

4

1 回答 1

2

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

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

在你的模型适合。

于 2013-11-08T19:30:29.433 回答