while循环里面的tryCatch函数

时间:2017-01-22 12:40:43

标签: r while-loop try-catch

我在置换数据上运行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循环时?)。

提前感谢您的帮助。

2 个答案:

答案 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个条目,然后循环进入下一个索引,依此类推。