避免在 R 中的 for 循环中使用 "optimization failure"
Avoid "optimization failure" in for loop in R
我正在尝试使用 R 中的 HoltWinters 函数进行大量时间序列预测。
为此,我使用 for 循环并在内部调用该函数,并将预测保存在 data.frame.
中
问题是 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)
}
其中i <- 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
提前致谢。
前几天我 运行 遇到了与 HoltWinters 相同的问题,并通过使用 tryCatch
采纳了 Roman 的建议。根据文档实现并不是最直观的,但我发现这个 link 对理解它很有帮助:How to write trycatch in 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
等其他错误处理参数来处理可能出现的其他异常。
我正在尝试使用 R 中的 HoltWinters 函数进行大量时间序列预测。 为此,我使用 for 循环并在内部调用该函数,并将预测保存在 data.frame.
中问题是 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)
}
其中i <- 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
提前致谢。
前几天我 运行 遇到了与 HoltWinters 相同的问题,并通过使用 tryCatch
采纳了 Roman 的建议。根据文档实现并不是最直观的,但我发现这个 link 对理解它很有帮助:How to write trycatch in 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
等其他错误处理参数来处理可能出现的其他异常。