1) Per quanto riguarda la tua prima domanda, alcune statistiche di test sono state sviluppate e discusse in letteratura per testare il null di stazionarietà e il null di una radice unitaria. Alcuni dei numerosi articoli scritti su questo numero sono i seguenti:
Correlato alla tendenza:
- Dickey, D. y Fuller, W. (1979a), Distribuzione degli stimatori per serie temporali autoregressive con radice unitaria, Journal of American Statistical Association 74, 427-31.
- Dickey, D. y Fuller, W. (1981), Statistiche del rapporto di verosimiglianza per serie temporali autoregressive con radice unitaria, Econometrica 49, 1057-1071.
- Kwiatkowski, D., Phillips, P., Schmidt, P. y Shin, Y. (1992), Testare l'ipotesi nulla di stazionarietà contro l'alternativa di una radice unitaria: Quanto siamo sicuri che quelle serie temporali economiche abbiano una radice unitaria? , Journal of Econometrics 54, 159-178.
- Phillips, P. y Perron, P. (1988), Test per una radice unitaria nella regressione delle serie storiche, Biometrika 75, 335-46.
- Durlauf, S. y Phillips, P. (1988), Tendenze contro passeggiate casuali nell'analisi delle serie temporali, Econometrica 56, 1333-54.
Relativo al componente stagionale:
- Hylleberg, S., Engle, R., Granger, C. y Yoo, B. (1990), Integrazione stagionale e cointegrazione, Journal of Econometrics 44, 215-38.
- Canova, F. y Hansen, BE (1995), Gli schemi stagionali sono costanti nel tempo? un test per la stabilità stagionale, Journal of Business and Economic Statistics 13, 237-252.
- Franses, P. (1990), Test per radici unitarie stagionali in dati mensili, Rapporto tecnico 9032, Istituto econometrico.
- Ghysels, E., Lee, H. y Noh, J. (1994), Test per radici unitarie in serie storiche stagionali. alcune estensioni teoriche e un'indagine di Monte Carlo, Journal of Econometrics 62, 415-442.
Il libro di testo Banerjee, A., Dolado, J., Galbraith, J. y Hendry, D. (1993), Co-integrazione, Correzione errori e analisi econometrica di dati non stazionari, Advanced Texts in Econometrics. Oxford University Press è anche un buon riferimento.
2) La tua seconda preoccupazione è giustificata dalla letteratura. Se esiste un test radice unitario, la statistica t tradizionale che si applica su una tendenza lineare non segue la distribuzione standard. Vedere ad esempio Phillips, P. (1987), regressione di serie temporali con radice unitaria, Econometrica 55 (2), 277-301.
Se esiste una radice unitaria e viene ignorata, viene ridotta la probabilità di rifiutare il valore zero del coefficiente di una tendenza lineare. Cioè, finiremmo per modellare una tendenza lineare deterministica troppo spesso per un dato livello di significatività. In presenza di una radice unitaria dovremmo invece trasformare i dati prendendo differenze regolari con i dati.
3) A scopo illustrativo, se si utilizza R è possibile eseguire la seguente analisi con i propri dati.
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")
Innanzitutto, puoi applicare il test Dickey-Fuller per il null di una radice unità:
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
e il test KPSS per l'ipotesi nulla inversa, la stazionarietà contro l'alternativa della stazionarietà attorno a una tendenza lineare:
kpss.test(x, null = "Trend", lshort = TRUE)
# KPSS Test for Trend Stationarity
# KPSS Trend = 0.2691, Truncation lag parameter = 1, p-value = 0.01
Risultati: test ADF, a livello di significatività del 5% una radice unitaria non viene respinta; Test KPSS, il nulla di stazionarietà viene rifiutato a favore di un modello con una tendenza lineare.
A parte la nota: l'utilizzo lshort=FALSE
del null del test KPSS non viene rifiutato al livello del 5%, tuttavia seleziona 5 ritardi; un'ulteriore ispezione non mostrata qui ha suggerito che la scelta di 1-3 ritardi è appropriata per i dati e porta a respingere l'ipotesi nulla.
In linea di principio, dovremmo guidare noi stessi dal test per il quale siamo stati in grado di rifiutare l'ipotesi nulla (piuttosto che dal test per il quale non abbiamo rifiutato (abbiamo accettato) il null). Tuttavia, una regressione della serie originale su una tendenza lineare risulta non affidabile. Da un lato, il R-quadrato è alto (oltre il 90%) che è indicato in letteratura come un indicatore di regressione spuria.
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
D'altra parte, i residui sono autocorrelati:
acf(residuals(fit)) # not displayed to save space
Inoltre, il valore nullo di una radice unitaria nei residui non può essere respinto.
adf.test(residuals(fit))
# Augmented Dickey-Fuller Test
#Dickey-Fuller = -2.0685, Lag order = 3, p-value = 0.547
#alternative hypothesis: stationary
A questo punto, puoi scegliere un modello da utilizzare per ottenere previsioni. Ad esempio, le previsioni basate su un modello strutturale di serie storiche e su un modello ARIMA possono essere ottenute come segue.
# 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
Un diagramma delle previsioni:
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)
Le previsioni sono simili in entrambi i casi e sembrano ragionevoli. Si noti che le previsioni seguono un modello relativamente deterministico simile a una tendenza lineare, ma non abbiamo modellato esplicitamente una tendenza lineare. Il motivo è il seguente: i) nel modello di tendenza locale, la varianza della componente di pendenza è stimata come zero. Ciò trasforma la componente tendenza in una deriva che ha l'effetto di una tendenza lineare. ii) ARIMA (0,1,1), un modello con deriva viene selezionato in un modello per le serie differenziate. L'effetto del termine costante su una serie differenziata è una tendenza lineare. Questo è discusso in questo post .
È possibile verificare che se si sceglie un modello locale o un ARIMA (0,1,0) senza deriva, le previsioni sono una linea orizzontale diritta e, quindi, non avrebbero alcuna somiglianza con la dinamica osservata dei dati. Bene, questo fa parte del puzzle dei test unitari e dei componenti deterministici.
Modifica 1 (ispezione dei residui):
l'autocorrelazione e l'ACF parziale non suggeriscono una struttura nei residui.
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")
Come ha suggerito IrishStat, è consigliabile anche verificare la presenza di valori anomali. Vengono rilevati due valori anomali additivi utilizzando il pacchetto 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
Osservando l'ACF, possiamo dire che, al livello di significatività del 5%, i residui sono casuali anche in questo modello.
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 questo caso, la presenza di potenziali valori anomali non sembra distorcere le prestazioni dei modelli. Ciò è supportato dal test di Jarque-Bera per la normalità; il valore nullo della normalità nei residui dai modelli iniziali ( fit1
, fit2
) non viene rifiutato al livello di significatività del 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
Modifica 2 (grafico dei residui e dei loro valori)
Ecco come appaiono i residui:
E questi sono i loro valori in formato 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