带假期的每周预报

Weekly forecasts with holidays

我使用 Hyndman 的 forecast 包来生成比较准确的 tbats 每周级别的预测,但我在节假日有明显的错误。如何在模型中包含假期?此外,Arima 已被证明不适合我的每周数据。所以必须以非华宇的方式添加假期。

我见过两种解决方法。一个 https://robjhyndman.com/hyndsight/dailydata/ 展示了如何将假期添加为具有傅立叶项的虚拟变量。问题是虚拟变量采用 1 或 0 的形式。我知道不同的假期有不同的效果,而 1 或 0 无法捕获。比如黑色星期五,就跟农历新年有很大的不同。

另一个解决方案是在这里 https://robjhyndman.com/hyndsight/forecast7-part-2/,其中协变量 nnetr 变化被用作 auto.arima 与季节性虚拟变量的替代。问题是我不知道如何编写 R 代码来输入我的假期。一个例子会很有用。

官方统计机构使用的时间序列建模基准是美国人口普查局x13-arima-seats。它处理季节性影响以及 "parametric" 假期,例如中国新年和复活节。

R 中的功能可通过安装并使用底层 x13-arima-seats 二进制文件的 seasonal 包获得。

还有一个完整的功能 interactive website 可以访问大多数(如果不是全部的话)功能。

您是否了解 Facebook 的 prophet 套餐?

还没有使用过它,但从阅读文档来看,它似乎是一个快速的实现,也考虑了假期:

https://cran.r-project.org/web/packages/prophet/prophet.pdf

Implements a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly and weekly seasonality, plus holidays [...]

https://cran.r-project.org/web/packages/prophet/vignettes/quick_start.html

下面做了我需要它做的一切。

k=23
#forecast holidays
#bool list of future holidays
holidayf <- c(0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0)
h <- length(holidayf)

#given holidays
holiday <- df[,2] 
y <- ts(df[,1],start = 2011,frequency = 52)
z <- fourier(y, K=k)
zf <- fourier(y, K=k, h=h)
fit <- auto.arima(y, xreg=cbind(z,holiday), seasonal=FALSE)
fc <- forecast(fit, xreg=cbind(zf,holidayf), h=h)
fc %>% autoplot()
summary(fit)

为了解决不同假期效果不同的问题,我简单地增加了额外的假期虚拟变量。例如,您可以创建一个包含好假期的向量和一个包含坏假期的向量,然后将它们 cbind 放入 xreg 中。我没有在上面的代码中显示这一点,但它很简单。