每日时间序列分析

机器算法验证 r 时间序列 季节性 多重季节性 tbats
2022-02-10 12:03:11

我正在尝试进行时间序列分析,并且是该领域的新手。我每天计算 2006-2009 年的一个事件,我想为它拟合一个时间序列模型。这是我取得的进展:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

我得到的结果是:

时间序列图

为了验证数据中是否存在季节性和趋势,我按照本文中提到的步骤进行操作

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

在 Rob J Hyndman 的博客中:

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

这两种情况都表明没有季节性。

当我绘制该系列的 ACF 和 PACF 时,我得到的是:

ACF PACF

我的问题是:

  1. 这是处理每日时间序列数据的方式吗?这个页面建议我应该同时查看每周和每年的模式,但我不清楚这种方法。

  2. 有了 ACF 和 PACF 图后,我不知道该怎么做。

  3. 我可以简单地使用 auto.arima 功能吗?

    适合 <- arima(myts, order=c(p, d, q)

*****更新 Auto.Arima 结果******

当我根据 Rob Hyndman在此处的评论将数据的频率更改为 7 时,auto.arima 会选择一个季节性 ARIMA 模型并输出:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

******更新的季节性检查******

当我以频率 7 测试季节性时,它输出 True,但季节性 365.25 时,它输出 false。这足以得出缺乏年度季节性的结论吗?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

返回:

True

尽管

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

返回:

False
3个回答

您的 ACF 和 PACF 表明您至少有每周的季节性,这由滞后 7、14、21 等处的峰值显示。

您可能还具有年度季节性,尽管从您的时间序列中并不明显。

考虑到潜在的多个季节性,你最好的选择可能是一个tbats模型,它明确地模拟了多种类型的季节性。加载forecast包:

library(forecast)

您的输出str(x)表明x尚未包含有关可能具有多个季节性的信息。查看?tbats并比较 的输出str(taylor)分配季节性:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

现在您可以拟合tbats模型了。(请耐心等待,这可能需要一段时间。)

model <- tbats(x.msts)

最后,您可以预测和绘制:

plot(forecast(model,h=100))

您不应该使用arima()or auto.arima(),因为它们只能处理单一类型的季节性:每周每年不要问我会对你的数据做什么。它可能会选择其中一种季节性,也可能完全忽略它们。auto.arima()


编辑以回答评论中的其他问题:

  1. 如何检查数据是否具有年度季节性?我可以每月创建另一个系列的事件总数并使用其 ACF 来决定吗?

计算每月数据的模型可能是可能的。然后,您可以例如比较具有和不具有季节性的模型之间的 AIC。

但是,我宁愿使用保留样本来评估预测模型。保留最后 100 个数据点。将具有年度每周季节性的模型拟合到其余数据(如上),然后拟合仅具有每周季节性的模型,例如,auto.arima()在 a 上使用tswith frequency=7使用这两种模型预测到保持期。使用 MAE、MSE 或与您的损失函数最相关的任何方法检查哪个误差较小。如果误差之间差别不大,则使用更简单的模型;否则,使用误差较小的那个。

布丁的证明在吃,时间序列模型的证明在预测。

为了改善问题,不要使用单个保留样本(这可能会产生误导,考虑到您的系列结束时的上升趋势),而是使用滚动原点预测,这也称为“时间序列交叉验证”(我非常推荐整本免费的在线预测教科书

  1. 那么季节性 ARIMA 模型通常不能处理多个季节性?它是模型本身的属性还是只是 R 中函数的编写方式?

标准 ARIMA 模型通过季节性差异处理季节性。对于季节性月度数据,您不会对原始时间序列建模,而是对 2015 年 3 月和 2014 年 3 月之间、2015 年 2 月和 2014 年 2 月之间的时间序列等进行建模。(要获得原始规模的预测,您当然需要再次取消差异。)

没有直接明显的方法可以将这个想法扩展到多个季节性。

当然,您可以使用 ARIMAX 做一些事情,例如,通过包含每月虚拟变量来对年度季节性进行建模,然后使用每周季节性 ARIMA 对残差进行建模。如果您想在 R 中执行此操作,请使用ts(x,frequency=7),创建一个每月虚拟变量矩阵并将其输入到 的xreg参数中auto.arima()

我不记得有任何出版物专门将 ARIMA 扩展到多个季节性,尽管我确信有人已经按照我上一段中的思路做了一些事情。

使用现有 R 包分解季节性数据的最佳方法是 Rlibeemd 中的 ceemdan()。该技术提取多个时期的季节性。默认值运行良好。它使用希尔伯特-黄变换而不是傅里叶变换。傅里叶变换有一个严重的缺点,它只能在大多数感兴趣的序列都不是时处理静止的线性数据。例如,随机游走 y_t = y_{t-1} + e_t 是最简单的随机游走并且经常遇到。其他方法在实际中经常变化时保持季节性变化的幅度固定。

您提出的问题已在R 时间序列预测:关于我的输出的问题中得到处理。请仔细查看我的详细答案和讨论中的所有评论,包括对原始问题的评论,因为我相信它们与您的问题有关。您实际上可能会将帖子中提供的数据用作自己的教学时刻。使用整个讨论作为你应该做什么的入门。