在`tryCatch()`中包装工作`forecast()`语句时没有结果

时间:2014-02-12 08:48:31

标签: r try-catch forecasting

我有大量的时间序列,我想为此生成预测。为了自动生成最佳预测,我想应用一些模型,如auto.arima,ets,(s)naive,神经网络等。不幸的是,当它循环通过时间序列时,某些模型会失败,从而停止执行R脚本。为了使这更加强大,我开始使用tryCatch();我的主要目标是我会让脚本继续没有必要捕获错误。执行代码时,forecast()中的tryCatch()无法生成正确的预测。

请在下面找到我遇到的错误的可重现示例。

历史时间序列:

ts <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 9, 10, 10, 16, 7, 13, 0, 9, 1, 11, 2, 11, 3, 
11, 4, 1, 20, 13, 13, 13, 9, 14, 16, 16, 18, 17, 20, 18, 19, 
16, 16, 16, 15, 14, 27, 24, 35, 8, 18, 21, 20, 19, 22, 18, 21, 
19, 24, 33, 23, 18, 26, 18, 17, 19, 19, 22, 19, 24, 29, 29, 18
), .Tsp = c(2025.25, 2032.16666666667, 12), class = "ts")

以下代码行会产生正确的预测:

fcast_arima <- forecast(auto.arima(ts),h=4)
fcast_arima
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Apr 2032       24.69032 18.57094 30.80971 15.33153 34.04911
May 2032       25.00539 18.84018 31.17061 15.57651 34.43428
Jun 2032       25.32046 19.10975 31.53118 15.82200 34.81893
Jul 2032       25.63554 19.37966 31.89141 16.06800 35.20307

当我将相同的代码包装到tryCatch行时,它无法生成预测,请参阅下面的示例:

fcast_arima <- tryCatch({ fcast_arima <- forecast(auto.arima(ts),h=4)}, warning = function(warningcondition) {message(warningcondition)}, error = function(errorcondition) {message(errorcondition)}, finally={})
p-value smaller than printed p-value
fcast_arima
NULL

有人可以解释为什么没有tryCatch()的情况下工作正常的代码无法在tryCatch()内运行吗?

1 个答案:

答案 0 :(得分:7)

我认为通过设置options(warn=-1)并生成警告来抑制警告。我可以模拟你在这里看到的行为。

创建一个生成警告的函数并返回99但警告被选项抑制:

> foo=function(){o=options()$warn; options(warn=-1);warning("Yikes!");options(warn=o);return(99)}

这似乎运行良好:

> foo()
[1] 99

我可以用一个简单的tryCatch

来运行它
> tryCatch(foo())
[1] 99

但是如果我添加warning子句,警告会被捕获:

> tryCatch(foo(),warning=function(w){message(w)})
Yikes!> 

虽然它似乎仍在没有警告的情况下运行:

> foo()
[1] 99

我不确定解决方案是什么......对不起......也许让任何编写代码的人试图压制警告以重写它以使用suppressWarnings代替:

> foo=function(){suppressWarnings({warning("Yikes!")}) ; return(99)}
> foo()
[1] 99
> tryCatch(foo(),warning=function(w){message(w)})
[1] 99