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


16

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

我有两个问题:

  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

有四种自然状态。由于模型样本空间相对不受限制,因此对这个问题没有任何分析方法。为了凭经验回答这个令人烦恼的问题,我帮助开发了AUTOBOX autobox.com/cms。AUTOBOX举办了一场比赛,检查了所有这4种情况,并根据必要性和充分性评估了4种最终模型的质量。您为什么不发布示例时间序列的示例,我将发布4个结果,说明如何解决此问题。
IrishStat 2014年

Answers:


15

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),具有单位根的时间序列回归,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")

首先,您可以对单元根的null进行Dickey-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=FALSE一句:在5%的水平上不会拒绝使用KPSS测试的空值,但是,它选择了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")

太平洋空军

正如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测试支持正态性;在5%的显着性水平上fit1,初始模型(,fit2)的残差的正态性无效。

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

1
您是否验证了模型中的残差是随机的,即没有异常值或ARIMA结构,而这对于检验估计的系数的意义是否有意义是必需的。请注意,如果残差中有离群值,则ACF毫无意义,因为膨胀的误差方差会导致ACF被低估。您能否提供证明/建议随机性的误差图,否则您对残差不相关的结论可能是错误的。
IrishStat 2014年

绝对地,完整的分析需要检查残差。我仅在答案中列出了一些工具,这些工具可用于应用“预报员”正在询问并说明其用法的测试。很高兴看到您对更多详细信息感兴趣,我已对问题进行了编辑。
javlacalle 2014年

我曾要求提供残差的时间图。您可以提供它们,也可以自己提供残差吗,所以我可以用AUTOBOX处理它们以确认它们没有明显的结构。在测试数据集中的脉冲,电平偏移,季节性脉冲和/或本地时间趋势时,JB测试不是首选,尽管这些类型的结构的存在可能会触发对正态性假设的拒绝。如果不拒绝null就是证明它可以被接受的想法可能很危险。请参阅unc.edu/~jbhill/tsay.pdf
IrishStat

1
谢谢。我提交了57个残差,其中5个被临时标记为例外。按重要性顺序(51、3、27、52和48)。您的图形在视觉上支持这些观点。由此产生的错误不会表现出对随机性的侵犯,因此不会出现明显的ACF。要调整观测值以适应异常检测,请使用以下命令:+ [X1(T)] [(-4494.5)]:PULSE 51 + [X2(T)] [(+ 4937.5)]:PULSE 3 + [X3 (T)] [(+ 4884.5)]:PULSE 27 + [X4(T)] [(+ 4505.5)]:PULSE 52 + [X5(T)] [(+ 3967.5)]:PULSE 48
IrishStat

1
@B_Miner通常,您将从查看残差的自相关函数开始。如果自相关显着且对于大阶数较大(即ACF不会指数衰减至零),则可以考虑对残差应用单位根检验。如果对残差的分析表明存在单位根,则意味着您可能应该对原始数据进行两次首次差异处理(即在差异化序列中再次进行差异化处理)。
javlacalle 2014年

4

关于您的非季节数据...趋势可以是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平方,误差标准dev,AIC等)来确定优势,尽管在这种情况下,点头会转到A。由于AR(2)结构,A的残差更好。B的预测有点激进,而A的预测模式则更直观。可以隐瞒4个观察值,并评估来自4个不同来源(25、26、27和28)的1个时期的预报的预报准确性。


2爱尔兰统计数据表现出色。我已经读过一些,我们将把yt = y(t-1)+ a + bt = ct的随机趋势和确定性趋势结合起来吗?这会有所帮助吗?
天气预报员

如果将phi表示为[1-B],则模型形式y(t)= B0 + B1 * t + a(t)θ/ phi会崩溃,因为清除分数本质上会区别t变量,从而产生与B0的常数碰撞。换句话说,ARIMA结构与时间指示器结合在一起会造成严重破坏。您指定的模型是可估计的,但绝对不是首选方法(也许缺乏内生性!)。其他人可以对此发表评论可能对此有所帮助。这不是一个传递函数的真子集i.imgur.com/dv4bAts.png
IrishStat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.