«Ошибка оптимизации» в цикле R - PullRequest
0 голосов
/ 24 октября 2019

У меня есть цикл for, в котором мне нужно выполнить прогноз для различных значений, передаваемых параметром i, когда в прогнозе Холтвинтерса есть ошибки, часто сбой оптимизации, цикл прерывается. Как я могу сделать свой код просто пропустить ошибки и перейти к следующему я и продолжить операции в цикле. Например, если я запускаю приведенный ниже код, цикл будет прерван, когда i = 2 из-за ошибки: Ошибка в HoltWinters (TS [[i]]): ошибка оптимизации

Что мне нужно, это когда ошибканайден, он автоматически переходит к i = 3 и продолжает операции, а не прерывается, как "continue" в C ++

Может кто-нибудь, пожалуйста, помогите с этим?

Спасибо.

data <- list()
data[[1]] <- rnorm(36)
data[[2]] <-
  c(
    24,24,28,24,28,22,18,20,19,22,28,28,28,26,24,
    20,24,20,18,17,21,21,21,28,26,32,26,22,20,20,
    20,22,24,24,20,26
  )
data[[3]] <- rnorm(36)

TS <- list()
Outputs <- list()

for (i in 1:3) {
  TS[[i]] <- ts(data[[i]], start = 1, frequency = 12)
  Function <- HoltWinters(TS[[i]])
  TSpredict <- predict(Function, n.ahead = 1)[1]
  Outputs[[i]] <-
    data.frame(LastReal = TS[[i]][length(TS[[i]])], Forecast = TSpredict)
}

1 Ответ

0 голосов
/ 24 октября 2019

Вы можете использовать tryCatch , чтобы пропустить итерацию с ошибкой.

for (i in 1:3) 
tryCatch({
 TS[[i]] <- ts(data[[i]], start = 1, frequency = 12)
  Function <- HoltWinters(TS[[i]])
  TSpredict <- predict(Function, n.ahead = 1)[1]
  Outputs[[i]] <-
 data.frame(LastReal = TS[[i]][length(TS[[i]])], Forecast = TSpredict)
}, error=function(e){})

Если вы хотите отобразить сообщение об ошибке во время неудачной итерации и запустить весь код, который вы можете использовать:

  for (i in 1:3) 
    tryCatch({
     TS[[i]] <- ts(data[[i]], start = 1, frequency = 12)
      Function <- HoltWinters(TS[[i]])
      TSpredict <- predict(Function, n.ahead = 1)[1]
      Outputs[[i]] <-
     data.frame(LastReal = TS[[i]][length(TS[[i]])], Forecast = TSpredict)
    }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
...