1) In Bezug auf Ihre erste Frage wurden einige Teststatistiken entwickelt und in der Literatur diskutiert, um die Null der Stationarität und die Null einer Einheitswurzel zu testen. Einige der vielen Artikel, die zu diesem Thema verfasst wurden, sind die folgenden:
Bezogen auf den Trend:
- Dickey, D. y. Fuller, W. (1979a), Verteilung der Schätzer für autoregressive Zeitreihen mit einer Einheitswurzel, Journal of the American Statistical Association 74, 427-31.
- Dickey, D. y. Fuller, W. (1981), Wahrscheinlichkeitsverhältnisstatistik für autoregressive Zeitreihen mit einer Einheitswurzel, Econometrica 49, 1057-1071.
- Kwiatkowski, D., Phillips, P., Schmidt, P. und Shin, Y. (1992), Testen der Nullhypothese der Stationarität gegen die Alternative einer Einheitswurzel: Wie sicher sind wir uns, dass ökonomische Zeitreihen eine Einheitswurzel haben? , Journal of Econometrics 54, 159 & ndash; 178.
- Phillips, P. und Perron, P. (1988), Testing for a unit root in time series regression, Biometrika 75, 335-46.
- Durlauf, S. und Phillips, P. (1988), Trends versus random walkes in time series analysis, Econometrica 56, 1333-54.
Bezogen auf die saisonale Komponente:
- Hylleberg, S., Engle, R., Granger, C. und Yoo, B. (1990), Seasonal Integration and Cointegration, Journal of Econometrics 44, 215-38.
- Canova, F. y Hansen, BE (1995), Sind saisonale Muster über die Zeit konstant? ein Test für die saisonale Stabilität, Journal of Business and Economic Statistics 13, 237-252.
- Franses, P. (1990), Testen auf saisonale Einheitswurzeln in monatlichen Daten, Technical Report 9032, Econometric Institute.
- Ghysels, E., Lee, H. und Noh, J. (1994), Testen auf Einheitswurzeln in saisonalen Zeitreihen. Einige theoretische Erweiterungen und eine Monte-Carlo-Untersuchung, Journal of Econometrics 62, 415-442.
Das Lehrbuch Banerjee, A., Dolado, J., Galbraith, J. und Hendry, D. (1993), Co-Integration, Fehlerkorrektur und die ökonometrische Analyse instationärer Daten, Advanced Texts in Econometrics. Oxford University Press ist auch eine gute Referenz.
2) Ihr zweites Anliegen ist in der Literatur begründet. Wenn es einen Einheitswurzeltest gibt, folgt die herkömmliche t-Statistik, die Sie für einen linearen Trend anwenden würden, nicht der Standardverteilung. Siehe zum Beispiel Phillips, P. (1987), Zeitreihenregression mit Einheitswurzel, Econometrica 55 (2), 277-301.
Wenn eine Einheitswurzel existiert und ignoriert wird, verringert sich die Wahrscheinlichkeit, dass der Koeffizient eines linearen Trends Null ist, wenn die Null zurückgewiesen wird. Das heißt, wir würden am Ende zu oft einen deterministischen linearen Trend für ein bestimmtes Signifikanzniveau modellieren. Bei Vorhandensein einer Einheitswurzel sollten wir stattdessen die Daten transformieren, indem wir regelmäßig Unterschiede zu den Daten vornehmen.
3) Wenn Sie zur Veranschaulichung R verwenden, können Sie mit Ihren Daten die folgende Analyse durchführen.
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")
Zunächst können Sie den Dickey-Fuller-Test für die Null einer Unit-Root anwenden:
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
und der KPSS-Test für die Reverse-Null-Hypothese, Stationarität gegen die Alternative der Stationarität um einen linearen Trend:
kpss.test(x, null = "Trend", lshort = TRUE)
# KPSS Test for Trend Stationarity
# KPSS Trend = 0.2691, Truncation lag parameter = 1, p-value = 0.01
Ergebnisse: ADF-Test, bei dem 5% Signifikanzniveau wird eine Einheitswurzel nicht verworfen; Beim KPSS-Test wird der Nullpunkt der Stationarität zugunsten eines Modells mit linearem Trend verworfen.
Nebenbei bemerkt: Die Verwendung lshort=FALSE
der Null des KPSS-Tests wird bei 5% nicht abgelehnt, wählt jedoch 5 Verzögerungen aus. Eine weitere Untersuchung, die hier nicht gezeigt wird, legt nahe, dass die Auswahl von 1-3 Verzögerungen für die Daten geeignet ist und dazu führt, dass die Nullhypothese verworfen wird.
Grundsätzlich sollten wir uns an dem Test orientieren, für den wir die Nullhypothese ablehnen konnten (und nicht an dem Test, für den wir die Null nicht abgelehnt (akzeptiert) haben). Eine Regression der ursprünglichen Reihe auf einen linearen Trend erweist sich jedoch als nicht zuverlässig. Einerseits ist das R-Quadrat hoch (über 90%), was in der Literatur als Indikator für eine falsche Regression angeführt wird.
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
Andererseits werden die Residuen automatisch korreliert:
acf(residuals(fit)) # not displayed to save space
Darüber hinaus kann die Null einer Einheitswurzel in den Residuen nicht verworfen werden.
adf.test(residuals(fit))
# Augmented Dickey-Fuller Test
#Dickey-Fuller = -2.0685, Lag order = 3, p-value = 0.547
#alternative hypothesis: stationary
An dieser Stelle können Sie ein Modell auswählen, das zum Abrufen von Vorhersagen verwendet werden soll. Beispielsweise können Vorhersagen, die auf einem strukturellen Zeitreihenmodell und einem ARIMA-Modell basieren, wie folgt erhalten werden.
# 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
Ein Plot der Vorhersagen:
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)
Die Prognosen sind in beiden Fällen ähnlich und sehen vernünftig aus. Beachten Sie, dass die Prognosen einem relativ deterministischen Muster folgen, das einem linearen Trend ähnelt, aber wir haben keinen linearen Trend explizit modelliert. Der Grund ist folgender: i) In dem lokalen Trendmodell wird die Varianz der Steigungskomponente als Null geschätzt. Dies verwandelt die Trendkomponente in eine Drift, die den Effekt eines linearen Trends hat. ii) ARIMA (0,1,1), ein Modell mit einer Drift wird in einem Modell für die differenzierte Reihe ausgewählt. Die Auswirkung des konstanten Terms auf eine differenzierte Reihe ist ein linearer Trend. Dies wird in diesem Beitrag besprochen .
Sie können überprüfen, ob bei Auswahl eines lokalen Modells oder eines ARIMA (0,1,0) ohne Drift die Prognosen eine gerade horizontale Linie sind und daher keine Ähnlichkeit mit der beobachteten Dynamik der Daten aufweisen. Nun, dies ist Teil des Puzzles von Unit-Root-Tests und deterministischen Komponenten.
Edit 1 (Prüfung von Residuen):
Die Autokorrelation und die partielle ACF lassen keine Struktur in den Residuen erkennen.
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")
Wie von IrishStat vorgeschlagen, ist es auch ratsam, nach Ausreißern zu suchen. Mit dem Paket werden zwei additive Ausreißer erkannt 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
Betrachtet man den ACF, so kann man sagen, dass die Residuen bei einem Signifikanzniveau von 5% auch in diesem Modell zufällig sind.
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")
In diesem Fall scheint das Vorhandensein potenzieller Ausreißer die Leistung der Modelle nicht zu verzerren. Dies wird durch den Jarque-Bera-Test für Normalität unterstützt; Die Normalitätsnull in den Residuen aus den Anfangsmodellen ( fit1
, fit2
) wird bei einem Signifikanzniveau von 5% nicht verworfen.
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
Edit 2 (Plot der Residuen und ihrer Werte)
So sehen die Residuen aus:
Und dies sind ihre Werte in einem CSV-Format:
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