R

时间:2016-06-29 06:40:58

标签: r time-series autoregressive-models

我正在学习为具有多个季节性的时间序列创建预测模型。以下是我所参考的数据集子集。该数据集包括每小时数据点,我希望在我的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小时的预测,那将非常有帮助。此外,如果您可以通过创建培训和测试数据集在代码中包含数据分析,那将非常棒。谢谢你的帮助。

1 个答案:

答案 0 :(得分: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))