在tryCatch函数内使用while循环

4

我正在对置换数据运行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循环(是在error=function(err)内还是在for循环开始时?)。

非常感谢您的帮助。

2个回答

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
})

对于重复解决方案的热爱 - Garini

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]]<- ... 行),直到没有收敛错误。一旦成功运行模型,它被分配给第 i 个条目的 pglmm,然后循环继续到下一个索引,以此类推。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接