在使用带有model扩展名的寓言包时如何在ARIMA模型估计中添加外生变量

问题描述

我正在尝试估算100个不同系列的ARIMA模型。因此,我采用了fabletools::model()方法fable::ARIMA()函数来完成这项工作。但是我无法在模型估计中使用外生变量。

我的系列有3个不同的列,第一个ID标签标识第一个出口,然后是Date.Time标签,最后是Sales。除了这些变量外,我还有一个虚拟变量,分别代表一天中的小时和一天中的一周。

Dummy Variables

按照下面给出的代码,我将包含我的内胚层和外源变量的数据框转换为tstibble。

ts_forecast <- df11  %>% select(-Date) %>%
  mutate(ID = factor(ID)) %>% group_by(ID) %>% as_tsibble(index=Date.Time,key=ID)%>%tsibble::fill_gaps(Sales=0) %>%
  fabletools::model(Arima = ARIMA(Sales,stepwise = TRUE,xreg=df12))

使用此代码,我尝试为多个ID标识的网点预测同一date.time间隔的值。但是,该代码返回以下错误

>     Could not find an appropriate ARIMA model.
>     This is likely because automatic selection does not select models with characteristic roots that may be numerically unstable.
>     For more details,refer to https://otexts.com/fpp3/arima-r.html#plotting-the-characteristic-roots

销售是我的内生目标var,而df12包含表示小时和日期的虚拟变量。有些商店在特定时间内没有创造销售,因此对于所有观察而言,它们代表01:00 AM的虚拟对象可能等于零。但是,我认为寓言使用逐步方法不会有问题。我想,当代码看到变量为0时,可以排除它们

我不确定是什么问题。我是在使用有问题的方式将xreg添加到模型中(在ARIMA的页面中,它说xreg =像以前的预测包一样可以)还是问题与我提到的第二个问题有关,所有观察都包括“ 0”。如果是第二个变量,则可能有解决方案可以排除所有常数为0的变量。

如果您能帮助我,我会很高兴。

谢谢

解决方法

这里是使用每小时行人计数数据的示例。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter,lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect,setdiff,setequal,union
library(tsibble)
library(fable)
#> Loading required package: fabletools

# tsibble with hourly data
df <- pedestrian %>%
  mutate(dow = lubridate::wday(Date,label=TRUE))
# Training data
train <- df %>% 
  filter(Date <= "2015-01-31")
# Fit models
fit <- train %>%
  model(arima = ARIMA(Count ~ season("day") + dow + pdq(2,0) + PDQ(0,0)))
# Forecast period
fcast_xregs <- df %>%
  filter(Date > "2015-01-31",Date <= "2015-02-07") 
# Forecasts
fit %>% 
  forecast(fcast_xregs)
#> # A fable: 504 x 8 [1h] <Australia/Melbourne>
#> # Key:     Sensor,.model [3]
#>    Sensor .model Date_Time                     Count  .mean Date        Time
#>    <chr>  <chr>  <dttm>                       <dist>  <dbl> <date>     <int>
#>  1 Birra… arima  2015-02-01 00:00:00  N(-67,174024)  -67.1 2015-02-01     0
#>  2 Birra… arima  2015-02-01 01:00:00 N(-270,250881) -270.  2015-02-01     1
#>  3 Birra… arima  2015-02-01 02:00:00 N(-286,310672) -286.  2015-02-01     2
#>  4 Birra… arima  2015-02-01 03:00:00 N(-283,351704) -283.  2015-02-01     3
#>  5 Birra… arima  2015-02-01 04:00:00 N(-264,380588) -264.  2015-02-01     4
#>  6 Birra… arima  2015-02-01 05:00:00  N(-244,4e+05) -244.  2015-02-01     5
#>  7 Birra… arima  2015-02-01 06:00:00 N(-137,414993) -137.  2015-02-01     6
#>  8 Birra… arima  2015-02-01 07:00:00   N(93,424929)   93.0 2015-02-01     7
#>  9 Birra… arima  2015-02-01 08:00:00  N(292,431894)  292.  2015-02-01     8
#> 10 Birra… arima  2015-02-01 09:00:00  N(225,436775)  225.  2015-02-01     9
#> # … with 494 more rows,and 1 more variable: dow <ord>

reprex package(v0.3.0)于2020-10-09创建

注意:

  • 您不需要在R中创建虚拟变量。Formula接口将适当地处理分类变量。
  • season("day")中的ARIMA特殊项将生成相应的季节性分类变量,相当于23个每小时的虚拟变量。
  • 我指定了一个特定的ARIMA模型以节省计算时间。但是请省略pdq特殊项以自动选择最佳模型。
  • 保留PDQ(0,0)特殊项,因为在使用外生变量进行季节性处理时,不需要ARIMA模型来处理季节性。