时间序列预测中的随机与确定性趋势/季节性

机器算法验证 时间序列 预测 有马 随机过程
2022-01-18 11:39:04

我在时间序列预测方面有中等背景。我看过几本预测书籍,但我没有看到其中任何一本解决了以下问题。

我有两个问题:

  1. 如果给定的时间序列具有以下内容,我将如何客观地确定(通过统计测试):

    • 随机季节性或确定性季节性
    • 随机趋势或确定性趋势
  2. 如果我将时间序列建模为确定性趋势/季节性,而该序列具有明显的随机分量,会发生什么情况?

任何解决这些问题的帮助将不胜感激。

趋势数据示例:

7,657
5,451
10,883
9,554
9,519
10,047
10,663
10,864
11,447
12,710
15,169
16,205
14,507
15,400
16,800
19,000
20,198
18,573
19,375
21,032
23,250
25,219
28,549
29,759
28,262
28,506
33,885
34,776
35,347
34,628
33,043
30,214
31,013
31,496
34,115
33,433
34,198
35,863
37,789
34,561
36,434
34,371
33,307
33,295
36,514
36,593
38,311
42,773
45,000
46,000
42,000
47,000
47,500
48,000
48,500
47,000
48,900
2个回答

1)关于您的第一个问题,文献中已经开发和讨论了一些检验统计数据,以检验平稳性的空值和单位根的空值。关于这个问题的许多论文中的一些如下:

与趋势相关:

  • Dickey, D. y Fuller, W. (1979a),具有单位根的自回归时间序列的估计量分布,美国统计协会杂志 74, 427-31。
  • Dickey, D. y Fuller, W. (1981),具有单位根的自回归时间序列的似然比统计,Econometrica 49, 1057-1071。
  • Kwiatkowski, D., Phillips, P., Schmidt, P. y Shin, Y. (1992),针对替代单位根检验平稳性的零假设:我们有多确定经济时间序列有单位根? , 计量经济学杂志 54, 159-178。
  • Phillips, P. y Perron, P. (1988),时间序列回归中的单位根检验,Biometrika 75, 335-46。
  • Durlauf, S. y Phillips, P. (1988),时间序列分析中的趋势与随机游走,计量经济学 56, 1333-54。

与季节性成分相关:

  • Hylleberg, S.、Engle, R.、Granger, C. y Yoo, B. (1990),季节性整合和协整,计量经济学杂志 44, 215-38。
  • Canova, F. y Hansen, BE (1995),季节性模式是否随时间保持不变?季节性稳定性测试,商业和经济统计杂志 13, 237-252。
  • Franses, P. (1990),测试月度数据中的季节性单位根,技术报告 9032,计量经济学研究所。
  • Ghysels, E., Lee, H. y Noh, J. (1994),季节性时间序列中的单位根检验。一些理论扩展和蒙特卡罗调查,计量经济学杂志 62, 415-442。

教科书 Banerjee, A.、Dolado, J.、Galbraith, J. y Hendry, D. (1993),协整、纠错和非平稳数据的计量经济学分析,计量经济学高级文本。牛津大学出版社也是一个很好的参考。

2)文献证明您的第二个担忧是合理的。如果存在单位根检验,那么您将应用于线性趋势的传统 t 统计量不遵循标准分布。例如,参见 Phillips, P. (1987), Time series regression with unit root, Econometrica 55(2), 277-301。

如果单位根存在并被忽略,则拒绝线性趋势系数为零的零点的概率降低。也就是说,对于给定的显着性水平,我们最终会过于频繁地对确定性线性趋势进行建模。在存在单位根的情况下,我们应该通过对数据进行常规差异来转换数据。

3)为了说明,如果您使用 R,您可以对您的数据进行以下分析。

x <- structure(c(7657, 5451, 10883, 9554, 9519, 10047, 10663, 10864, 
  11447, 12710, 15169, 16205, 14507, 15400, 16800, 19000, 20198, 
  18573, 19375, 21032, 23250, 25219, 28549, 29759, 28262, 28506, 
  33885, 34776, 35347, 34628, 33043, 30214, 31013, 31496, 34115, 
  33433, 34198, 35863, 37789, 34561, 36434, 34371, 33307, 33295, 
  36514, 36593, 38311, 42773, 45000, 46000, 42000, 47000, 47500, 
  48000, 48500, 47000, 48900), .Tsp = c(1, 57, 1), class = "ts")

首先,您可以对单位根的空值应用 Dikey-Fuller 检验:

require(tseries)
adf.test(x, alternative = "explosive")
#   Augmented Dickey-Fuller Test
#   Dickey-Fuller = -2.0685, Lag order = 3, p-value = 0.453
#   alternative hypothesis: explosive

以及反向零假设的 KPSS 检验,平稳性与线性趋势周围的平稳性替代:

kpss.test(x, null = "Trend", lshort = TRUE)
#   KPSS Test for Trend Stationarity
#   KPSS Trend = 0.2691, Truncation lag parameter = 1, p-value = 0.01

结果:ADF 检验,在 5% 显着性水平,单位根未被拒绝;KPSS 检验,平稳性的零点被拒绝,有利于具有线性趋势的模型。

旁注:使用lshort=FALSEKPSS 测试的 null 在 5% 的水平上不会被拒绝,但是,它选择了 5 个滞后;此处未显示的进一步检查表明,选择 1-3 滞后适合数据并导致拒绝原假设。

原则上,我们应该通过能够拒绝原假设的检验来指导自己(而不是通过我们没有拒绝(我们接受)原假设的检验)。但是,原始序列对线性趋势的回归结果证明是不可靠的。一方面,R 平方很高(超过 90%),这在文献中被指出为虚假回归的指标。

fit <- lm(x ~ 1 + poly(c(time(x))))
summary(fit)
#Coefficients:
#                 Estimate Std. Error t value Pr(>|t|)    
#(Intercept)       28499.3      381.6   74.69   <2e-16 ***
#poly(c(time(x)))  91387.5     2880.9   31.72   <2e-16 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 2881 on 55 degrees of freedom
#Multiple R-squared:  0.9482,   Adjusted R-squared:  0.9472 
#F-statistic:  1006 on 1 and 55 DF,  p-value: < 2.2e-16

另一方面,残差是自相关的:

acf(residuals(fit)) # not displayed to save space

此外,不能拒绝残差中单位根的空值。

adf.test(residuals(fit))
#   Augmented Dickey-Fuller Test
#Dickey-Fuller = -2.0685, Lag order = 3, p-value = 0.547
#alternative hypothesis: stationary

此时,您可以选择用于获取预测的模型。例如,基于结构时间序列模型和 ARIMA 模型的预测可以如下获得。

# StructTS
fit1 <- StructTS(x, type = "trend")
fit1
#Variances:
# level    slope  epsilon  
#2982955        0   487180 
# 
# forecasts
p1 <- predict(fit1, 10, main = "Local trend model")
p1$pred
# [1] 49466.53 50150.56 50834.59 51518.62 52202.65 52886.68 53570.70 54254.73
# [9] 54938.76 55622.79

# ARIMA
require(forecast)
fit2 <- auto.arima(x, ic="bic", allowdrift = TRUE)
fit2
#ARIMA(0,1,0) with drift         
#Coefficients:
#         drift
#      736.4821
#s.e.  267.0055
#sigma^2 estimated as 3992341:  log likelihood=-495.54
#AIC=995.09   AICc=995.31   BIC=999.14
#
# forecasts
p2 <- forecast(fit2, 10, main = "ARIMA model")
p2$mean
# [1] 49636.48 50372.96 51109.45 51845.93 52582.41 53318.89 54055.37 54791.86
# [9] 55528.34 56264.82

预测图:

par(mfrow = c(2, 1), mar = c(2.5,2.2,2,2))
plot((cbind(x, p1$pred)), plot.type = "single", type = "n", 
  ylim = range(c(x, p1$pred + 1.96 * p1$se)), main = "Local trend model")
grid()
lines(x)
lines(p1$pred, col = "blue")
lines(p1$pred + 1.96 * p1$se, col = "red", lty = 2)
lines(p1$pred - 1.96 * p1$se, col = "red", lty = 2)
legend("topleft", legend = c("forecasts", "95% confidence interval"), 
  lty = c(1,2), col = c("blue", "red"), bty = "n")
plot((cbind(x, p2$mean)), plot.type = "single", type = "n", 
  ylim = range(c(x, p2$upper)), main = "ARIMA (0,1,0) with drift")
grid()
lines(x)
lines(p2$mean, col = "blue")
lines(ts(p2$lower[,2], start = end(x)[1] + 1), col = "red", lty = 2)
lines(ts(p2$upper[,2], start = end(x)[1] + 1), col = "red", lty = 2)

趋势预测

两种情况下的预测相似并且看起来合理。请注意,预测遵循类似于线性趋势的相对确定性模式,但我们没有明确建模线性趋势。原因如下: i) 在局部趋势模型中,斜率分量的方差估计为零。这会将趋势分量变成具有线性趋势效果的漂移。ii) ARIMA(0,1,1),在差分序列的模型中选择有漂移的模型。常数项对差分序列的影响是线性趋势。这在这篇文章中进行了讨论。

您可以检查如果选择了本地模型或没有漂移的 ARIMA(0,1,0),则预测是一条水平直线,因此与观察到的数据动态没有相似之处。嗯,这是单位根测试和确定性组件之谜的一部分。

编辑 1(残差检查): 自相关和部分 ACF 不建议残差中的结构。

resid1 <- residuals(fit1)
resid2 <- residuals(fit2)
par(mfrow = c(2, 2))
acf(resid1, lag.max = 20, main = "ACF residuals. Local trend model")
pacf(resid1, lag.max = 20, main = "PACF residuals. Local trend model")
acf(resid2, lag.max = 20, main = "ACF residuals. ARIMA(0,1,0) with drift")
pacf(resid2, lag.max = 20, main = "PACF residuals. ARIMA(0,1,0) with drift")

ACF-PACF

正如 IrishStat 建议的那样,检查异常值的存在也是可取的。使用包检测到两个附加异常值tsoutliers

require(tsoutliers)
resol <- tsoutliers(x, types = c("AO", "LS", "TC"), 
  remove.method = "bottom-up", 
  args.tsmethod = list(ic="bic", allowdrift=TRUE))
resol
#ARIMA(0,1,0) with drift         
#Coefficients:
#         drift        AO2       AO51
#      736.4821  -3819.000  -4500.000
#s.e.  220.6171   1167.396   1167.397
#sigma^2 estimated as 2725622:  log likelihood=-485.05
#AIC=978.09   AICc=978.88   BIC=986.2
#Outliers:
#  type ind time coefhat  tstat
#1   AO   2    2   -3819 -3.271
#2   AO  51   51   -4500 -3.855

查看 ACF,我们可以说,在 5% 的显着性水平上,该模型中的残差也是随机的。

par(mfrow = c(2, 1))
acf(residuals(resol$fit), lag.max = 20, main = "ACF residuals. ARIMA with additive outliers")
pacf(residuals(resol$fit), lag.max = 20, main = "PACF residuals. ARIMA with additive outliers")

在此处输入图像描述

在这种情况下,潜在异常值的存在似乎不会扭曲模型的性能。这得到了 Jarque-Bera 正态性​​检验的支持;fit1初始模型 ( , )的残差中的零正态fit2性不会在 5% 显着性水平上被拒绝。

jarque.bera.test(resid1)[[1]]
# X-squared = 0.3221, df = 2, p-value = 0.8513
jarque.bera.test(resid2)[[1]]
#X-squared = 0.426, df = 2, p-value = 0.8082

编辑 2(残差图及其值) 残差如下所示:

残差

这些是 csv 格式的值:

0;6.9205
-0.9571;-2942.4821
2.6108;4695.5179
-0.5453;-2065.4821
-0.2026;-771.4821
0.1242;-208.4821
0.1909;-120.4821
-0.0179;-535.4821
0.1449;-153.4821
0.484;526.5179
1.0748;1722.5179
0.3818;299.5179
-1.061;-2434.4821
0.0996;156.5179
0.4805;663.5179
0.8969;1463.5179
0.4111;461.5179
-1.0595;-2361.4821
0.0098;65.5179
0.5605;920.5179
0.8835;1481.5179
0.7669;1232.5179
1.4024;2593.5179
0.3785;473.5179
-1.1032;-2233.4821
-0.3813;-492.4821
2.2745;4642.5179
0.2935;154.5179
-0.1138;-165.4821
-0.8035;-1455.4821
-1.2982;-2321.4821
-1.9463;-3565.4821
-0.1648;62.5179
-0.1022;-253.4821
0.9755;1882.5179
-0.5662;-1418.4821
-0.0176;28.5179
0.5;928.5179
0.6831;1189.5179
-1.8889;-3964.4821
0.3896;1136.5179
-1.3113;-2799.4821
-0.9934;-1800.4821
-0.4085;-748.4821
1.2902;2482.5179
-0.0996;-657.4821
0.5539;981.5179
2.0007;3725.5179
1.0227;1490.5179
0.27;263.5179
-2.336;-4736.4821
1.8994;4263.5179
0.1301;-236.4821
-0.0892;-236.4821
-0.1148;-236.4821
-1.1207;-2236.4821
0.4801;1163.5179

关于您的非季节性数据...趋势可以有两种形式 y(t)=y(t−1)+θ0 (A) 随机趋势或 Y(t)=a+bx1+cx2 (B) 确定性趋势等,其中 x1=1,2,3,4....t 和 x2=0,0,0,0,0,1,2,3,4 因此一个趋势适用于观察 1−t 和第二个趋势适用于观察 6 到 t。

您的非季节性系列包含 29 个值。我使用了 AUTOBOX 一个我帮助开发的完全自动化的软件。AUTOBOX 是一个透明的过程,因为它详细说明了建模过程中的每个步骤。此处显示了系列/拟合值/预测的图表在此处输入图像描述使用AUTOBOX形成A型模型导致如下在此处输入图像描述这里再次给出方程在此处输入图像描述,模型的统计量为在此处输入图像描述残差图在这里在此处输入图像描述,而预测值表在这里在此处输入图像描述将 AUTOBOX 限制为 B 型模型导致 AUTOBOX 在第 14 期检测到增加的趋势:。在此处输入图像描述 在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述

在比较模型方面:由于拟合观察的数量不同(分别为 26 和 29),因此不可能使用标准度量(即 r-square、error standard dev、AIC 等)来确定优势,尽管在这种情况下点头会转到 A。由于 AR(2) 结构,A 的残差更好。B 的预测有点激进,而 A 的预测模式更直观。可以保留说 4 次观察并评估来自 4 个不同来源(25、26、27 和 28)的 1 期预测的预测准确性。