我一直在研究一些不同的时间序列预测,并且我已经开始在我的分析中注意到一个趋势(请原谅双关语)。对于我迄今为止使用过的大约 5-7 个数据集,允许多个季节性时段以及假日假人选项会很有帮助。我尝试了各种方法并且通常坚持使用回归器tbats一直auto.arima()给我带来问题。至此,很明显我在 R 中工作。
在我走得太远之前,让我提供一些示例数据。希望以下链接有效:https ://gist.github.com/JaredRayWolf/c8cb601dd26ec72a64d0 。
该数据产生以下时间序列图:
大幅下降是在圣诞节和新年前后,但也有较小的下降在感恩节前后。在下面的代码中,我将此数据集命名为traindata。
现在,从长远来看, ets“平原”auto.arima看起来并不那么热,因为它们仅限于一个季节性时期(我选择每周)。然而,对于我的测试集,我认为它们在当月的数据中表现相当不错(劳动节周末除外)。话虽如此,预测一年将是理想的。
接下来我尝试tbats了每周和每年的季节性周期。这导致以下预测:

现在这看起来很不错。从肉眼来看,它在考虑每周和每年的季节性时段以及圣诞节和新年的影响方面看起来很棒(因为它们显然每年都在相同的日期)。如果我可以将假期(及其周围的日子)包括为虚拟变量,那将是最好的。因此,我尝试auto.arima使用xreg回归器。
对于带有回归量的 ARIMA,我遵循了 Hyndman 博士对傅立叶函数的建议(在此处给出:http ://robjhyndman.com/hyndsight/longseasonality/ )以及他对傅立叶项数量的选择(在此处给出:http ://robjhyndman.com/hyndsight/forecasting-weekly-data/)
我的代码如下:
fourier <- function(t,terms,period)
{
n <- length(t)
X <- matrix(,nrow=n,ncol=2*terms)
for(i in 1:terms)
{
X[,2*i-1] <- sin(2*pi*i*t/period)
X[,2*i] <- cos(2*pi*i*t/period)
}
colnames(X) <- paste(paste(c("S","C"),rep(1:terms,rep(2,terms)),sep=""),period,sep="_")
return(X)
}
fcdaysout<-365
m1<-7
m2<-30.4375
m3<-365.25
hol<-cbind(traindata$CPY_HOL, traindata$DAY_BEFORE_CPY_HOL, traindata$DAY_AFTER_CPY_HOL)
hol<-as.matrix(hol)
n <- nrow(traindata)
bestfit <- list(aicc=Inf)
bestk <- 0
for(i in 1:m1)
{
fake_xreg = cbind(fourier(1:n,i,m1), fourier(1:n,i,m3), hol)
fit <- auto.arima(traindata$ACTIVE_LOADS, xreg = fake_xreg, max.p=10, max.q=10, max.d=2, stepwise=FALSE, ic="aicc", allowdrift=TRUE)
if(fit$aicc < bestfit$aicc)
{
bestfit <- fit
bestk <- i
}
else
{
}
}
k <- bestk
k
##k<-3
xreg<-cbind(fourier(1:n,k,m1), fourier(1:n,k,m3), hol)
xreg<-as.matrix(xreg)
aacov_fit <- auto.arima(traindata$ACTIVE_LOADS, xreg = xreg, max.p=10, max.q=10, max.d=2, stepwise=FALSE, ic="aic", allowdrift=TRUE)
summary(aacov_fit)
我的问题出现在 for 循环内部,以确定k最小化 AIC 的傅立叶项数。k>3在我使用回归器对 ARIMA 进行的所有尝试中,它总是在(或者i>3如果我们在我的循环中谈论)时产生错误。错误是Error in solve.default(res$hessian * n.used, A) : system is computationally singular: reciprocal condition number = 1.39139e-34. 简单的设置k=3为我的测试集提供了一些不错的结果,但在接下来的一年里,它似乎没有充分捕捉到年底左右的急剧下降,并且比想象中的要平滑得多,正如这个预测所证明的那样:
我认为这种一般的平滑度是由于傅立叶对的数量很少。我的代码中是否存在疏忽,因为我只是在彻底搞砸 Hyndman 博士提供的程序?或者是否存在一个理论问题,我试图为我试图解释的多个季节找到超过 3 对傅立叶项?有没有更好的方法来包含多个季节性和虚拟变量?
任何帮助将这些协变量带入具有适当数量的傅立叶项的 arima 模型将不胜感激。如果没有,我至少想知道我正在尝试的东西是否可以通过更多的傅立叶对来实现。
