2017-01-22 6 views
2

私は置換されたデータに対してGLMMを実行していますが、その中にはコンバージェンスのエラーメッセージがあります。 これは私のnullモデルなので、この特定の置換データを再サンプリングするだけで済みます。 これでRのtryCatch関数を処理しようとしましたが、何らかのエラーが発生しました。 私はデータフレームの置換データセットであるPermと、置換データのglmmモデルであるpglmmを持っています。while tryCatch関数内のループ

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ループを追加する場所は分かりません(エラーの内部= function(err)か、forループを開始するときにすべきでしょうか?)。

ご協力いただきありがとうございます。

答えて

5

事前に割り当てと記入し、成功時にイテレータをインクリメントするのではなくシーケンス

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 
}) 
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に沿って何かをNULL値で埋めPermと同じ長さのリストに初期化されます。リストの各要素を調べると、収束エラーがなくなるまでデータのリサンプリングとモデルフィッティング(これはpglmm[[i]]<- ...行です)を繰り返すことができます。成功したモデルの実行が達成されると、それはpglmmのi番目のエントリに割り当てられ、ループは次のインデックスに進みます。