2

我正在运行嵌套在 for() 函数中的 glm() 函数。glm 的输出被输入到一个矩阵中。对于某些周期有一个警告,但我只在所有周期结束时才收到所有警告,所以我不知道哪个周期是坏的。我想知道每次 glm 计算后是否有警告,这样我就可以告诉脚本不要将此循环结果输入到矩阵中。任何想法如何做到这一点?例子:

   m<-matrix(nc=1,nr=100)
   for(i in 1:100){      
   fit<-glm(y~x+v1+v2+v3,data=data)
   if("there is a warning???"){
   m[i,1]<-NA
   }
   else{
   m[i,1]<-fit$coefficients[2,1]
   }
    "reset warning???"
    }

谢谢

4

2 回答 2

2

这是一个有时会发出警告但总是返回值的函数

f <- function() {
    r <- runif(1)
    if (r > 1) warning("high")
    Sys.sleep(.1)  # 'expensive' calculation after warning
    r
}

以下循环旨在x[i]使用返回的值进行更新f()。捕获的警告被替换为 NA;f警告之后的部分不被评估。我们对处理警告消息不感兴趣,因此我们忽略提供给警告处理程序的参数。

x <- numeric(10)
for (i in seq_along(x)) {
    x[i] <- tryCatch(f(), warning=function(...) NA)
}

所以例如

> set.seed(123)
> system.time(x <- replicate(100, tryCatch(f(), warning=function(...) NA)))
   user  system elapsed 
  0.052   0.000   8.364 
> table(is.na(x))

FALSE  TRUE 
   83    17 

很难重现您的特定问题,因为data未提供。我想你想做

m <- matrix(ncol=1, nrow=100)
for(i in 1:100) {
    m[i,1] <- tryCatch({
        fit <- glm(y~x+v1+v2+v3, data=data)
        fit$coefficients[2, 1]
    }, warning=function(...) NA)
}
于 2013-04-08T20:53:54.323 回答
1

除了 eddi 在上面的评论中给出的精彩链接之外,您还可以尝试结合对错误发出警告并在出现错误时跳转到函数:

options(warn = 2) # will turn warnings into errors
options(error = recover) # will allow you to browser() at the error.

根据您问题的大小,上面链接中给出的选项可能会更好。但是我的解决方案很容易实现。

于 2013-04-08T20:37:22.823 回答