【问题标题】:Using tryCatch() to catch a bootstrap loop使用 tryCatch() 捕获引导循环
【发布时间】:2013-04-02 14:40:25
【问题描述】:

我对@9​​87654322@ 的使用知之甚少,但在正在进行的讨论中很难找到一个好的解决方案。

我有一个返回对象的自编程函数。它实际上是一个列表对象,但为简单起见,假设它是一个标量。我正在使用for() 循环来引导这个函数。我的循环是以下形式:

boot<-1000
for(i in 1:boot){
  bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
  out[i]<-myfunction(bootstrap_data,X,...)
}

myfunction() 有时会返回错误消息,因为它使用lm() 在数据子集上拟合模型,然后从不同子集预测新数据。然后可能会发生某些因素,某些水平偶然不会出现在用于拟合的数据中,但它们确实出现在预测子集中。这确实很少发生(例如,大约每 15,000 次迭代),但确实会发生(我需要引导 myfunction() 很多次)。

我想使用tryCatch() 或类似的函数来捕获我的引导循环。此外,我想定义一个索引来计算循环tryCatch() 必须捕获该函数的频率。最后,我想有一个常数boot,不管错误发生了多少次。

R 返回以下消息:

    Error in model.frame.default(Terms,newdata,na.action=na.action,
xlev=object$xlevels) : factor X has new levels 2

Xlm() 中用户指定的预测器。我不确定 2 代表什么,我猜是新关卡的数量(?)。

【问题讨论】:

  • 当我需要这样做时,我会在列表中捕获警告和错误,然后进行处理。见stackoverflow.com/q/4948361/210673。如果您需要多次执行此操作,对您来说可能会太慢,但可能有助于为您提供一些有用的想法。

标签: r loops try-catch statistics-bootstrap


【解决方案1】:

这是一个有时会失败的函数

f <- function() {
    r <- rnorm(1)
    if (r > 1)
        stop("oops")
    r
}

我们分配一个结果向量并设置一个计数器来更新第 i 个元素

out <- numeric(100)
i <- 0

然后反复尝试调用该函数。如果有错误,我们不增加 i 或记录结果,而是直接进入下一次迭代

while (i < length(out)) {
    tryCatch({
        out[[i + 1]] <- f()
        i <- i + 1
    }, error=function(...) NULL)
}

【讨论】:

  • 在您的示例中是否也可以使用 try 而不是 tryCatch?
  • 你的回答和kith的很相似。谢谢。
  • @tomka ok 删除了您之前要求的尝试插图。
【解决方案2】:

包装有时会在“尝试”中引发错误的函数通常对我有用。

boot<-1000
for(i in 1:boot){
  bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
  out[i] = NA  #
  try({      
    out[i]<-myfunction(bootstrap_data,X,...)
  }, silent=T)
}

如果你想计算抛出的错误数,你可以总结 NA 的输入输出。

sum(is.na(out))

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多