Избегайте "сбоя оптимизации" в цикле 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)
}
Где я <- 2 Проблема генерируется.
Что мне нужно, так это то, что в этом примере список "Outputs" выглядит следующим образом:
> Outputs
[[1]]
LastReal Forecast
1 0.5657129 -2.274507
[[2]]
LastReal Forecast
1 error error
[[3]]
LastReal Forecast
1 0.4039783 -0.9556881
Заранее спасибо.
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
иметь дело с другими исключениями, которые могут возникнуть.