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=FALSE
KPSS 测试的 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")
正如 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