2017-01-22 1 views
2

순열 된 데이터에 대해 GLMM을 실행 중이며 그 중 일부에서 수렴 오류 메시지가 나타납니다. 이것이 내 null 모델이므로이 특정 치환 데이터를 리샘플링하면됩니다. 그래서 R의 tryCatch 함수를 처리하려고 시도했지만 일부 오류가 발생했습니다. Perm 데이터는 데이터 프레임의 순열 데이터 세트이고 pglmm은 순차 데이터의 glmm 모델입니다.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 루프를 추가 할 곳을 정말로 모른다 (for error = function (err) 또는 for 루프를 시작할 때 있어야 하는가?).

도움을 주셔서 감사합니다. 다음 줄

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 함께

답변

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

어쩌면 뭔가가 NULL 값 가득 Perm와 같은 길이의 목록에 초기화된다. 목록의 각 요소를 검토하면서 수렴 오류가 없을 때까지 데이터 재 샘플링 및 모델 피팅 (pglmm[[i]]<- ... 행)을 반복 할 수 있습니다. 성공적인 모델 실행이 완료되면 i 번째 항목에 pglmm이 할당되고 루프가 다음 인덱스로 진행되는 식으로 진행됩니다.

관련 문제