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 に答える