【问题标题】:while loop inside tryCatch functiontryCatch 函数中的 while 循环
【发布时间】:2017-06-07 01:22:03
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

    标签: r while-loop try-catch


    【解决方案1】:

    大概是这样的

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

    【讨论】:

      【解决方案2】:

      预分配和填充,成功时增加迭代器而不是迭代序列

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

      【讨论】:

      • 喜欢重复解决方案
      猜你喜欢
      • 2015-12-28
      • 2018-10-02
      • 2021-12-03
      • 2021-01-14
      • 1970-01-01
      • 2020-03-23
      • 2018-05-31
      • 2021-03-08
      相关资源
      最近更新 更多