我在置换数据上运行GLMM,对于其中一些我有收敛错误信息。 由于这是我的空模型,我只需重新采样这个特定的置换数据。 因此我试图处理R的tryCatch函数,但我有一些失败。 我有Perm,这是我的数据帧和pglmm的置换数据集,它是置换数据的glmm模型。所以我有以下结构:
pglmm<-NULL
for (i in seq_along(Perm)){
pglmm[[i]]<-summary(lme("My GLMM model"))
}
为了处理错误我尝试了这个结构
pglmm<-NULL
for (i in seq_along(Perm)){
pglmm[[i]]<- tryCatch(summary(lme()),
error=function(err){
pglmm[[i]]<- summary(lme("My GLMM model on resample data"))
return(pglmm[[i]])
}
}
现在它正在工作,但即使重新采样一旦我有错误的数据我可能会出现收敛问题,所以我需要添加一个while循环以重新采样,直到这个收敛错误不再出现。但是我真的不知道在while循环中添加这个位置(内部错误=函数(错误),还是应该在启动for循环时?)。
提前感谢您的帮助。
答案 0 :(得分:6)
预分配和填充,在成功时递增迭代器而不是迭代序列
pglmm <- vector("list", length(Perm))
i <- 1
while (i <= length(Perm)) {
pglmm[[i]] = tryCatch(summary(lme(...)), error=identity)
if (!is(pglmm[[i]], "error"))
i <- i + 1
}
或避免使用
管理内存pglmm <- replicate(length(Perm), {
repeat {
result <- tryCatch(summary(lme(...)), error=identity)
if (!is(result, "error"))
break
}
result
})
答案 1 :(得分:2)
可能是以下几行
pglmm <- vector("list", length(Perm))
for (i in seq_along(pglmm)){
while(is.null(pglmm[[i]])) {
tryCatch(
pglmm[[i]] <- summary(lme(...)),
error = function(e) {print(e); print("retrying...")}
)
}
}
pglmm
初始化为与Perm
长度相同的列表,其中填充了NULL
个值。通过列表的每个元素,您可以重复数据重新采样和模型拟合(这是pglmm[[i]]<- ...
行),直到没有收敛错误。一旦成功运行模型,就会将其分配给pglmm
的第i个条目,然后循环进入下一个索引,依此类推。