2017-01-22 2 views
2

Я запускаю GLMM для перестановочных данных, а для некоторых из них у меня есть сообщение об ошибке конвергенции. Поскольку это моя нулевая модель, мне просто нужно выполнить повторную выборку этих конкретных перестановленных данных. Я попытался обработать функцию tryCatch для R, но у меня есть сбой. У меня есть Perm, который является моим перестановочным набором данных данных и pglmm, который является glmm-моделью для перестановленных данных. Таким образом, у меня есть следующая структура:while loop in функция 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 (внутри error = 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 инициализируется списком такой же длины, как Perm, наполненной NULL значениями. Проходя через каждый элемент списка, вы можете повторить повторную выборку данных и установку модели (это линия pglmm[[i]]<- ...), пока не будет ошибки конвергенции. Как только успешный запуск модели был достигнут, он присваивается i-й записи pglmm, и цикл затем переходит к следующему индексу и так далее.