0

我正在学习为具有多个季节性的时间序列创建预测模型。以下是我所指的数据集的子集。该数据集包括每小时数据点,我希望在我的 arima 模型中包括每天和每周的季节性。以下是数据集的子集:

data= c(4,4,1,2,6,21,105,257,291,172,72,10,35,42,77,72,133,192,122,59,29,25,24,5,7,3,3,0,7,15,91,230,284,147,67,53,54,55,63,73,114,154,137,57,27,31,25,11,4,4,4,2,7,18,68,218,251,131,71,43,55,62,63,80,120,144,107,42,27,11,10,16,8,10,7,1,4,3,12,17,58,59,68,76,91,95,89,115,107,107,41,40,25,18,14,15,6,12,2,4,1,6,9,14,43,67,67,94,100,129,126,122,132,118,68,26,19,12,9,5,4,2,5,1,3,16,89,233,304,174,53,55,53,52,59,92,117,214,139,73,37,28,15,11,8,1,2,5,4,22,103,258,317,163,58,29,37,46,54,62,95,197,152,58,32,30,17,9,8,1,3,1,3,16,109,245,302,156,53,34,47,46,54,65,102,155,116,51,30,24,17,10,7,4,8,0,11,0,2,225,282,141,4,87,44,60,52,74,135,157,113,57,44,26,29,17,8,7,4,4,2,10,57,125,182,100,33,27,41,39,35,50,69,92,66,30,11,10,11,9,6,5,10,4,1,7,9,17,24,21,29,28,48,38,30,21,26,25,35,10,9,4,4,4,3,5,4,4,4,3,5,10,16,28,47,63,40,49,28,22,18,27,18,10,5,8,7,3,2,2,4,1,4,19,59,167,235,130,57,45,46,42,40,49,64,96,54,27,17,18,15,7,6,2,3,1,2,21,88,187,253,130,77,47,49,48,53,77,109,147,109,45,41,35,16,13)

我尝试使用的代码如下:

tsdata = ts (data, frequency = 24)

aicvalstemp = NULL
aicvals= NULL

for (i in 1:5) {
  for (j in 1:5) {
    xreg1 = fourier(tsdata,i,24)
    xreg2 = fourier(tsdata,j,168)
    xregs = cbind(xreg1,xreg2)
    armodel = auto.arima(bike_TS_west, xreg = xregs)
    aicvalstemp = cbind(i,j,armodel$aic)
    aicvals = rbind(aicvals,aicvalstemp)
  }

}

上述命令中的 cbind 命令失败,因为 xreg1 和 xreg2 中的行数不同。我什至尝试在傅里叶函数中使用 1:length(data) 参数,但这也给了我一个错误。如果有人可以纠正上述代码中的错误,使用具有最小 AIC 值的 arima 模型生成未来 24 小时的预测,那将非常有帮助。此外,如果您可以通过创建训练和测试数据集在代码中包含数据拆分,那将是非常棒的。谢谢你的帮助。

4

1 回答 1

0

我不理解将每周“季节”拟合到这些数据的愿望,因为在您提供的数据子集中没有证据。此外,您应该真正对数据进行对数转换,因为它们并不能反映高斯过程。

所以,这里是你如何使用某种形式的每小时信号来拟合模型。

## the data are not normal, so log transform to meet assumption of Gaussian errors
ln_dat <- log(tsdata)
## number of hours to forecast
hrs_out <- 24
## max number of Fourier terms
max_F <- 5
## empty list for model fits
mod_res <- vector("list", max_F)
## fit models with increasing Fourier terms
for (i in 1:max_F) {
  xreg <- fourier(ln_dat,i)
  mod_res[[i]] <- auto.arima(tsdata, xreg = xreg)
}
## table of AIC results
aic_tbl <- data.frame(F=seq(max_F), AIC=sapply(mod_res, AIC))
## number of Fourier terms in best model
F_best <- which(aic_tbl$AIC==min(aic_tbl$AIC))
## forecast from best model
fore <- forecast(mod_res[[F_best]], xreg=fourierf(ln_dat,F_best,hrs_out))
于 2016-07-06T23:32:57.597 回答