Избегайте ошибок оптимизации в цикле for в R

Я пытаюсь сделать много прогнозов временных рядов, используя функцию HoltWinters в R. Для этой цели я использую цикл for и внутри я вызываю функцию и сохраняю прогноз в data.frame.

Проблема в том, что некоторые результаты функции HoltWinters дают ошибки, в частности ошибки оптимизации:

Error en HoltWinters(TS[[i]]) : optimization failure

Эта ошибка прерывает цикл.

Итак, мне нужно что-то вроде «попробовать»: если он может выполнить функцию HoltWinters, он сохраняет прогноз, в противном случае он сохраняет ошибку.

Код ниже повторяет проблему:

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)
}

Где i ‹- 2 Проблема генерируется.

Мне нужно, чтобы в этом примере список «Выходы» выглядел следующим образом:

> Outputs
[[1]]
   LastReal  Forecast
1 0.5657129 -2.274507

[[2]]
  LastReal Forecast
1    error    error

[[3]]
   LastReal   Forecast
1 0.4039783 -0.9556881

Заранее спасибо.


person faaabyan    schedule 17.05.2015    source источник
comment
Оберните вызов функции HoltWinters в tryCatch. См. примеры в справочных файлах функции. У SO также есть несколько сообщений на эту тему.   -  person Roman Luštrik    schedule 17.05.2015


Ответы (1)


На днях я столкнулся с той же проблемой с HoltWinters и воспользовался советом Романа, используя tryCatch. Это не самая интуитивная реализация на основе документации, но я нашел эту ссылку очень полезной для ее понимания: Как написать trycatch на R

Мое решение построено на основе образца.

    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()
result <- list()

for (i in 1:3) {
  Outputs[[i]] <- tryCatch({
    #You can enter messages to see where the loop is
    #message(paste("Computing", i))
    TS[[i]] <- ts(data[[i]], start = 1, frequency = 12)
    Function <- HoltWinters(TS[[i]])
    TSpredict <- predict(Function, n.ahead = 1)[1]
    result[[i]] <-
      data.frame(LastReal = TS[[i]][length(TS[[i]])], Forecast = TSpredict)
  },
  error = function(cond) {
    #message(paste("ERROR: Cannot process for time series:", i))
    msg <- data.frame(LastReal = "error", Forecast = "error")
    return(msg)
  })
}

И для выходов

> Outputs
[[1]]
   LastReal  Forecast
1 0.4733632 0.5469373

[[2]]
  LastReal Forecast
1    error    error

[[3]]
   LastReal   Forecast
1 0.8984626 -0.5168826

Вы можете использовать другие параметры обработки ошибок, такие как finally и warning, для обработки других исключений, которые могут возникнуть.

person hubbs5    schedule 04.02.2016