1) Что касается вашего первого вопроса, некоторые статистические данные были разработаны и обсуждены в литературе для проверки нулевой стационарности и нулевого единичного корня. Вот некоторые из многочисленных работ, написанных по этому вопросу:
Связанные с трендом:
- Дики, Д. и Фуллер, В. (1979a), Распределение оценок для авторегрессионных временных рядов с единичным корнем, Журнал Американской статистической ассоциации 74, 427-31.
- Дики, Д. и Фуллер, В. (1981), Статистика отношения правдоподобия для авторегрессионных временных рядов с единичным корнем, Econometrica 49, 1057-1071.
- Квятковский Д., Филлипс П., Шмидт П. и Шин Ю. (1992). Проверка нулевой гипотезы стационарности против альтернативы единичного корня: насколько мы уверены, что экономические временные ряды имеют единичный корень? , Журнал эконометрики 54, 159-178.
- Phillips, P. y Perron, P. (1988), Тестирование на единичный корень в регрессии временных рядов, Biometrika 75, 335-46.
- Durlauf, S. y Phillips, P. (1988), Тенденции против случайных блужданий в анализе временных рядов, Econometrica 56, 1333-54.
Связанные с сезонной составляющей:
- Хиллеберг С., Энгл Р., Грейнджер С. и Ю, Б. (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.
Учебник Банерджи, А., Доладо, Дж., Гэлбрейт, Дж. И Хендри, Д. (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")
Во-первых, вы можете применить тест Дики-Фуллера для нулевого единичного корня:
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 не отклоняется на уровне 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")
В этом случае наличие потенциальных выбросов не влияет на производительность моделей. Это подтверждается тестом Жарк-Бера на нормальность; ноль нормальности в остатках от исходных моделей ( 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