我有大量的时间序列,希望为其生成预测。为了自动生成最佳预测,我想应用许多模型,例如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()中不能工作吗?

最佳答案

我认为某些事情通过设置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

关于r - 在tryCatch()中包装有效的forecast()语句时没有结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21722791/

10-11 03:49