使用Fourier进行xreg和newxreg的分层时间序列预测

时间:2019-09-13 04:03:51

标签: r regression fft hierarchical-data arima

我想在分层时间序列中使用xreg = Fourier(ts,k,f)作为回归器。

我可以让回归器为单个系列工作。

我有一个分层的时间序列hts,它由与第一个相似的序列组成(相同的时间步长)。

hts参考:https://robjhyndman.com/publications/hierarchical-tourism/

使用相同的回归器,我从hts得到的预报有误。有什么问题吗?

train_ts:整个hts,格式为visnights。
top_ts:只是顶级时间序列

完成单个系列后,使用xreg和newxreg可以使top_ts有效。

KK <- 12
REG= fourier(top_ts,KK,52)

model <- auto.arima(top_ts, xreg=fourier(top_ts, K=KK))
fcstResult <- forecast(model, h=1, xreg= REG, newxreg=REG)

作品

当我对htnight的预测类似于隔夜时,train_ts,

train_ts <- window(vis_ts, c(2,1), end= c(3, 52))

fcstResult <- forecast(train_ts, h=1, fmethod="arima", method = "bu")

作品

当我在hts上使用相同的回归XREG时,它会出错:

fcstResult <- forecast(
  train_ts, h = 1, method = "bu", fmethod = "arima", xreg=REG, newxreg=REG)

OR

fcstResult <- forecast(
  train_ts, h = 1, method = "bu", fmethod = "arima", xreg=REG, newxreg=REG, lambda=0)



Error in model.frame.default(formula = x ~ xregg, drop.unused.levels = TRUE) :
  variable lengths differ (found for 'xregg')

(我将所有列都设为非零并添加了一个小的随机噪声,所以这不是问题)

1 个答案:

答案 0 :(得分:1)

在您的第一个代码块中,newxreg参数被忽略,h参数也被忽略。 REG的值被视为将来时间段的必需回归变量。如果您的训练数据的长度等于52的倍数,那么由于傅立叶项的周期性,这恰好是正确的,但是最好像这样明确:

library(hts)
vis_ts <- hts(fpp2::visnights, characters = c(3, 5))
train_ts <- window(vis_ts, end=c(2010,4))
test_ts <- window(vis_ts, start=c(2011,1))
train_top <- aggts(train_ts, level=0)
test_top <- aggts(test_ts, level=0)
train_reg <- fourier(train_top, K=2)
test_reg <- fourier(test_top, K=2)

model <- auto.arima(train_top, xreg=train_reg)
fcstResult <- forecast(model, xreg=test_reg)

使用分层方法时,需要根据训练和测试时间同时传递xregnewxreg参数。在此函数中,检查newxreg的行以确保它们与h的值匹配。这会导致错误。

以下代码将起作用

fcast_hts <- forecast(train_ts, method='bu', fmethod='arima', 
  xreg=train_reg, newxreg=test_reg)