【问题标题】:How do you forecast ARIMA with multiple regressors?您如何预测具有多个回归变量的 ARIMA?
【发布时间】:2019-10-01 14:01:40
【问题描述】:

我的问题的完整 R 数据和代码在这里:https://pastebin.com/QtG6A7ZX

我是 R 新手,在时间序列分析方面还是初学者,所以请原谅我的无知。

我正在尝试使用 2 个虚拟编码回归器对一些注册数据进行建模和预测。我已经使用auto.arima 来拟合模型:

model <- auto.arima(enroll, xreg=x)

在使用此模型进行预测之前,我试图通过仅选择时间序列的一部分(1:102 而不是 1:112)以及回归量的部分列表来测试其准确性。

基于auto.arima,我拟合部分模型如下:

model_par <-arima((enroll_partial), c(1, 1, 1),seasonal = list(order = c(1, 0, 0), period = 5), xreg=x_par)

我尝试了三种不同的方法来预测并得到基本相同的错误:

fcast_par <- forecast(model_par, h=10) #error fcast_par <- forecast(model_par, h=10, xreg=x_par) #error fcast_par <- forecast(model_par, h=10, xreg=forecast(x_par,h=10)) #error

'xreg' 和 'newxreg' 的列数不同

我已经使用auto.arima 对部分数据进行了测试。这行得通,但给了我一个不同的模型,虽然我指定了 10 个预测,但我得到了超过 50 个:

model_par2 <- auto.arima(enroll_partial, xreg=x_par) fcast_par <- forecast(model_par2, h=12, xreg=x_par) fcast_par

所以,我的主要问题是,我如何指定一个精确的模型并根据我的数据使用超过 1 个回归量进行预测(请参阅上面的粘贴 Bin 链接)?

【问题讨论】:

    标签: r time-series forecasting arima


    【解决方案1】:

    forecast() 函数来自预测包,可与来自该包的模型函数一起使用。这就是为什么可以使用forecast(model_par2,xreg=x_fcst)auto.arima() 生成预测的原因。

    arima() 函数来自 stats 包,因此不能保证它可以与 forecast() 一起使用。要指定您自己的 ARIMA 模型,您可以使用 Arima() 函数,它的行为与 arima() 非常相似,但您可以使用 forecast(model_par2,xreg=x_fcst) 从中生成预测。

    【讨论】:

    • 谢谢!这样可行。我做了以下事情:model_partial &lt;- Arima((enroll_partial), c(1, 1, 1),seasonal = list(order = c(1, 0, 0), period = 5), xreg=x_par)forecast(model_partial, h=10, xreg=x_par)。虽然我指定了 10 个预测,但我得到了超过 50 个点的预测。此外,该模型不是很准确,因此我必须添加更多回归量或尝试对其进行改装。再次感谢!
    【解决方案2】:

    你有两个问题。其中之一是 R 中的各种预测功能让您(故意?)变得困难。

    第一个问题是您需要为预测期间定义回归量的值。使用window()x中提取相关数据:

    x_fcst <- window(x,start=c(2017,4))
    

    第二个问题是forecast()(发送到forecast.Arima())在这里是一个红鲱鱼。您需要使用predict()(发送到predict.Arima() - 请注意两种情况下的大写!):

    predict(model_par,newxreg=x_fcst,h=nrow(x_fcst))
    

    产生

    $pred
    Time Series:
    Start = c(2017, 3) 
    End = c(2019, 1) 
    Frequency = 5 
    [1] 52.00451 52.00451 52.00451 52.00451 52.00451 52.00451 52.00451 52.00451
    [9] 52.00451
    
    $se
    Time Series:
    Start = c(2017, 3) 
    End = c(2017, 3) 
    Frequency = 5 
    [1] 17.13345
    

    您也可以使用auto.arima()。令人困惑的是,这一次 forecast()(仍然发送到 forecast.Arima()确实工作:

    model_par2 <- auto.arima(enroll_partial, xreg=x_par)
    forecast(model_par2,xreg=x_fcst)
    

    产生

            Point Forecast     Lo 80     Hi 80      Lo 95     Hi 95
    2017.40       39.91035 17.612358  62.20834   5.808514  74.01219
    2017.60       59.51003 32.783451  86.23661  18.635254 100.38481
    2017.80       69.81000 39.290834 100.32917  23.134962 116.48505
    2018.00       57.49140 23.601444  91.38136   5.661183 109.32162
    2018.20       55.45759 18.503034  92.41214  -1.059524 111.97470
    2018.40       34.57866 -7.306747  76.46406 -29.479541  98.63686
    2018.60       52.30199  6.702068  97.90192 -17.437074 122.04106
    2018.80       61.61591 12.582055 110.64977 -13.374900 136.60672
    2019.00       50.47661 -1.765945 102.71917 -29.421485 130.37471
    

    是的,你确实得到了五倍的预测。第一列是期望预测,其他列给出预测区间。这些由level 参数控制到forecast()

    【讨论】:

    • 而且,要继续整个时间序列(而不是部分时间序列),我是否必须预测我的回归量?我实际上知道未来的值(假设它是虚拟的并且条件不会改变),所以我应该简单地加载具有所需数据量的新数据吗?
    • 您需要为您希望预测的期间指定回归值。我不完全确定您所说的“继续整个时间序列”是什么意思,您的意思是样本内拟合吗?然后,您需要相应的样本内周期的回归量值。对于未来,您将需要提供已知值,或预测回归量本身。 (实际上是一回事。)
    • 谢谢。这确实有道理。回到最初的问题,有没有办法将forecast 与自定义模型一起使用而不是auto.arima?指定的模型是 (1,1,1)(1,0,0)[5] 用于注册(不是注册部分)。我想将该模型用于部分数据。上面的代码使用predict 适用于这种情况,但与auto.arima 结果相比,predict 似乎并不准确,后者更接近实际结果。但是,带有enroll_partial 的auto.arima 提供了不同的模型。
    • 我对您到底在寻找什么感到有点困惑。你的意思是什么定制模型? “使用”模型是什么意思 - 用模型形式重新拟合系数保持不变,或者只是应用它而不重新拟合新数据?或许可以考虑用一个清晰​​的最小工作示例提出一个新问题,并准确解释您在寻找什么。
    • 很抱歉给您带来了困惑。我指的是原始时间序列数据(1997-2019)的原始 ARIMA 模型的系数,并将它们应用于截断数据(1997-2017),以测试模型预测的准确性。我现在从 Mitchell O'Hara-Wild 的 cmets 中看到,我应该使用大写字母 A Arima() 来指定自定义模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2016-06-02
    • 2022-08-24
    • 2023-01-31
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多