2015-05-17 2 views
3

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

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

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

Этой ошибка разбивают цикл.

Так что мне нужно что-то вроде «try»: если это может сделать функцию 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 
[[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'. См. Примеры в файлах справки функции. У SO есть несколько сообщений по этому вопросу. –

ответ

1

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

Мое решение, построенное на выборке.

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 иметь дело с другими исключениями, которые могут возникнуть.

Смежные вопросы