nls в for останавливает цикл из-за ошибки в nlsModel - PullRequest
0 голосов
/ 11 октября 2018

Если я запускаю цикл for, выполняющийся несколько раз, nlsLM () иногда из-за бесполезных данных Rstudio останавливается и показывает следующее сообщение об ошибке: «Ошибка в nlsModel (формула, mf, start, wts): единичная матрица градиента при начальных оценках параметров"

Так что я знаю, что не для каждого набора данных можно подобрать подходящие параметры, но я не хочу, чтобы вся процедура остановилась.

Если ошибки неткоэффициенты хранятся в result[x] - поэтому сейчас я много пробовал для цели, если подгонка невозможна, чтобы NA сохранялся в result[x] - но безуспешно.

xx <- c(1:10)
result <- vector("numeric")
width<- vector("numeric")
for(x in xx){
  temp <- long[ which(long$NR== x), ]
  Ytemp <- temp$Yield
  Ttemp <- temp$Treatment
  M <- nlsLM(Ytemp ~ (maximum + (minimum - maximum)/(1+exp((Ttemp- 
x0)/dx))), 
             start=list(x0=-10, dx=1))
  print(summary(M))
  result[x] <- coef(M)[1]
  width[x] <- coef(M)[2]
}

round(result, digits = 1)
round(width, digits = 2)
mean <- mean(result)
sd <- sd(result)

Я был быочень рад за подсказку!

Матиас

1 Ответ

0 голосов
/ 11 октября 2018

Рассмотрим tryCatch, чтобы присвоить NA вашим векторам для любых ошибок в вызове вашей модели:

xx <- c(1:10)
result <- vector("numeric")
width<- vector("numeric")

for(x in xx) {
  temp <- long[which(long$NR== x),]
  Ytemp <- temp$Yield
  Ttemp <- temp$Treatment

  tryCatch({
     M <- nlsLM(Ytemp ~ (maximum + (minimum - maximum)/(1+exp((Ttemp-x0)/dx))), 
                start=list(x0=-10, dx=1))
     print(summary(M))             # PRINT MODEL SUMMARY
     result[x] <- coef(M)[1]       # ASSIGN COEF
     width[x] <- coef(M)[2]        # ASSIGN COEF

  }, error = function(e) {
     print(e)                      # PRINT ERROR MESSAGE
     result[x] <- NA               # ASSIGN NA
     width[x] <- NA                # ASSIGN NA
  })

}

round(result, digits = 1)
round(width, digits = 2)
mean <- mean(result, na.rm=TRUE)   # REMOVE NA
sd <- sd(result, na.rm=TRUE)       # REMOVE NA
...