R中SARIMA模型的多重和长期季节性

机器算法验证 r 回归 有马 傅里叶变换 多重季节性
2022-03-28 16:59:15

在处理由 10 分钟信息点组成的大数据集时 - 即144每天、1008每周和52560每年的点数 - 我在 R 中遇到了一些问题。这些信息涉及一年中源变电站的电力负荷。

多重季节性:

该数据集清楚地显示了多个季节性,即每日、每周和每年。那里我了解到 R 不处理 ARIMA 建模函数中的多个季节性。不过,我真的很想使用 ARIMA 模型,因为我以前的工作是基于 ARIMA 模型的,而且我大致知道如何将模型转换为方程。

长季节性:

每个季节性都具有很高的价值,最短的一个是 144 的每日季节性。不幸的是,从 SARIMA 的一般方程是 我猜给定模型的最大滞后
ϕ(B)Φ(Bs)Wt=θ(B)Θ(Bs)Zt
SARIMA(p,d,q)(P,D,Q)144
max((p+P144),(q+Q144))

我真的很想尝试拟合 P 和/或 Q 值大于 1 的模型,但 R 不允许我,因为maximum supported lag = 350. 为此,我发现这个链接非常有趣,并导致了 M. Hyndman 预测包中的新功能,fourierfourierf可以在此处找到。但由于我不是预测专家,也不是统计学专家,所以我很难理解如何完成这项工作。


问题是我认为整个傅立叶回归包可以帮助我很多。据我了解,我可以用它来模拟我的数据集的长期季节性,也许用它来模拟多个季节性,甚至更多地它可以让我引入外生变量——即temperature和(public holiday + sundays)。
我还尝试按照此示例进行一些回归,但我无法使其工作,因为:

Error in forecast.Arima(bestfit, xreg = fourierf(gas, K = 12, h = 1008)) : 
Number of regressors does not match fitted model

我真的希望有人可以帮助我更好地了解这些功能。谢谢。

编辑:所以我用这里给出的傅立叶例子尽我所能,但不知道它是如何处理拟合的。这是代码(我复制粘贴了 M. Hyndman 一个并适应了我的数据集 - 不成功):

n <- 50000
m <- 144
y <- read.table("auch.txt", skip=1)
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(c("S","C"),rep(1:terms,rep(2,terms)),sep="")
  return(X)
}

library(forecast)
fit <- Arima(y[1:n,1], order=c(2,1,5), seasonal=c(1,2,8), xreg=cbind(fourier(1:n,4,m),fourier(1:n,4,1008)))
plot(forecast(fit, h=14*m, xreg=cbind(fourier(n+1:(14*m),4,m), fourier(n+1:(14*m),4,1008))))

所以我想将模型“强制”为 a SARIMA(2,1,5)(1,2,8)[144],但是当我键入时,arimod这是 Arima 拟合的结果:

> fit  
Series: y[1:n, 1] , 
ARIMA(2,1,5)                  

sigma^2 estimated as 696895:  log likelihood=-407290.2  
AIC=814628.3   AICc=814628.3   BIC=814840

它甚至没有考虑模型的季节性部分,而且我对 AIC 值可以采用的范围知之甚少,但它似乎太高了,无法成为一个很好的拟合模型。我认为这一切都归结为我对使用傅立叶项作为回归量的误解,但我不知道为什么。

编辑 2:我似乎也无法向 Arima 函数添​​加另一个外生变量。我需要使用temperature- 可能作为引导 - 来适应SARIMAX模型,但是一旦我写下这个:

fit <- Arima(y[1:n,1], order=c(2,1,5), seasonal=c(1,2,8), xreg=cbind(fourier(1:n,4,m),fourier(1:n,4,1008), tmp[1:n]))
plot(forecast(fit, h=14*m, xreg=cbind(fourier(n+1:(14*m),4,m),fourier(n+1:(14*m),4,1008), tmp[n+1:(14*m)])))

除了初始数据集外,没有绘制任何内容。没有预测就没有预测,tmp因为xreg我仍然得到一些结果。

1个回答

将您的数据结构化为msts(多季节性时间序列),您可以在其中指定

msts(your_data, start=2010, seasonal.periods=c(144,1008,52560)).

然后,在拟合季节性傅立叶项时,您必须在傅立叶函数上指定三个季节性周期:

reg <- fourier(your_data, K=c(i,n,j)),这将在每个季节期间寻找傅立叶项。

您可以循环通过线性回归,其中解释变量是傅立叶项以获得最佳拟合,然后将它们作为回归量放入 ARIMA 模型中。这些将是等价的,因为带有回归量的 ARIMA 实际上是带有 ARIMA 错误的回归。

auto.arima(your_data, xreg= as.matrix(reg), seasonal= F)

不要忘记指定seasonal=F以避免最大支持lag = 350