Saran saya mirip dengan apa yang Anda usulkan kecuali bahwa saya akan menggunakan model deret waktu daripada rata-rata bergerak. Kerangka model ARIMA juga cocok untuk mendapatkan perkiraan termasuk tidak hanya seri MSCI sebagai regressor tetapi juga kelambatan dari seri GCC yang juga dapat menangkap dinamika data.
Pertama, Anda mungkin cocok dengan model ARIMA untuk seri MSCI dan menginterpolasi pengamatan yang hilang dalam seri ini. Kemudian, Anda dapat mencocokkan model ARIMA untuk seri GCC menggunakan MSCI sebagai regresi eksogen dan mendapatkan prakiraan untuk GCC berdasarkan model ini. Dalam melakukan ini, Anda harus berhati-hati berurusan dengan jeda yang diamati secara grafis dalam seri dan yang dapat mendistorsi pemilihan dan kesesuaian model ARIMA.
Inilah yang saya lakukan dalam melakukan analisis ini R
. Saya menggunakan fungsi forecast::auto.arima
untuk membuat pemilihan model ARIMA dan tsoutliers::tso
untuk mendeteksi kemungkinan level shift (LS), perubahan sementara (TC) atau additive outliers (AO).
Ini adalah data yang pernah dimuat:
gcc <- structure(c(117.709, 120.176, 117.983, 120.913, 134.036, 145.829, 143.108, 149.712, 156.997, 162.158, 158.526, 166.42, 180.306, 185.367, 185.604, 200.433, 218.923, 226.493, 230.492, 249.953, 262.295, 275.088, 295.005, 328.197, 336.817, 346.721, 363.919, 423.232, 492.508, 519.074, 605.804, 581.975, 676.021, 692.077, 761.837, 863.65, 844.865, 947.402, 993.004, 909.894, 732.646, 598.877, 686.258, 634.835, 658.295, 672.233, 677.234, 491.163, 488.911, 440.237, 486.828, 456.164, 452.141, 495.19, 473.926,
492.782, 525.295, 519.081, 575.744, 599.984, 668.192, 626.203, 681.292, 616.841, 676.242, 657.467, 654.66, 635.478, 603.639, 527.326, 396.904, 338.696, 308.085, 279.706, 252.054, 272.082, 314.367, 340.354, 325.99, 326.46, 327.053, 354.192, 339.035, 329.668, 318.267, 309.847, 321.98, 345.594, 335.045, 311.363,
299.555, 310.802, 306.523, 315.496, 324.153, 323.256, 334.802, 331.133, 311.292, 323.08, 327.105, 320.258, 312.749, 305.073, 297.087, 298.671), .Tsp = c(2002.91666666667, 2011.66666666667, 12), class = "ts")
msci <- structure(c(1000, 958.645, 1016.085, 1049.468, 1033.775, 1118.854, 1142.347, 1298.223, 1197.656, 1282.557, 1164.874, 1248.42, 1227.061, 1221.049, 1161.246, 1112.582, 929.379, 680.086, 516.511, 521.127, 487.562, 450.331, 478.255, 560.667, 605.143, 598.611, 609.559, 615.73, 662.891, 655.639, 628.404, 602.14, 601.1, 622.624, 661.875, 644.751, 588.526, 587.4, 615.008, 606.133,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 609.51, 598.428, 595.622, 582.905, 599.447, 627.561, 619.581, 636.284, 632.099, 651.995, 651.39, 687.194, 676.76, 694.575, 704.806, 727.625, 739.842, 759.036, 787.057, 817.067, 824.313, 857.055, 805.31, 873.619), .Tsp = c(2007.33333333333, 2014.5, 12), class = "ts")
Langkah 1: Pasang model ARIMA ke seri MSCI
Meskipun grafik menunjukkan adanya beberapa jeda, tidak ada outlier yang terdeteksi tso
. Ini mungkin disebabkan oleh fakta bahwa ada beberapa pengamatan yang hilang di tengah sampel. Kita dapat menangani ini dalam dua langkah. Pertama, paskan model ARIMA dan gunakan untuk menginterpolasi observasi yang hilang; kedua, paskan model ARIMA untuk seri berinterpolasi yang memeriksa kemungkinan LS, TC, AO, dan sempurnakan nilai interpolasi jika ada perubahan.
Pilih model ARIMA untuk seri MSCI:
require("forecast")
fit1 <- auto.arima(msci)
fit1
# ARIMA(1,1,2) with drift
# Coefficients:
# ar1 ma1 ma2 drift
# -0.6935 1.1286 0.7906 -1.4606
# s.e. 0.1204 0.1040 0.1059 9.2071
# sigma^2 estimated as 2482: log likelihood=-328.05
# AIC=666.11 AICc=666.86 BIC=678.38
Isi pengamatan yang hilang dengan mengikuti pendekatan yang dibahas dalam jawaban saya untuk posting ini
:
kr <- KalmanSmooth(msci, fit1$model)
tmp <- which(fit1$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
id.na <- which(is.na(msci))
msci.filled <- msci
msci.filled[id.na] <- kr$smooth[id.na,id]
Pasangkan model ARIMA untuk seri yang diisi msci.filled
. Sekarang beberapa outlier ditemukan. Namun demikian, menggunakan opsi alternatif berbagai pencilan terdeteksi. Saya akan menyimpan satu yang ditemukan dalam kebanyakan kasus, perubahan level pada Oktober 2008 (pengamatan 18). Anda dapat mencoba misalnya ini dan opsi lainnya.
require("tsoutliers")
tso(msci.filled, remove.method = "bottom-up", tsmethod = "arima",
args.tsmethod = list(order = c(1,1,1)))
tso(msci.filled, remove.method = "bottom-up", args.tsmethod = list(ic = "bic"))
Model yang dipilih sekarang:
mo <- outliers("LS", 18)
ls <- outliers.effects(mo, length(msci))
fit2 <- auto.arima(msci, xreg = ls)
fit2
# ARIMA(2,1,0)
# Coefficients:
# ar1 ar2 LS18
# -0.1006 0.4857 -246.5287
# s.e. 0.1139 0.1093 45.3951
# sigma^2 estimated as 2127: log likelihood=-321.78
# AIC=651.57 AICc=652.06 BIC=661.39
Gunakan model sebelumnya untuk memperbaiki interpolasi dari pengamatan yang hilang:
kr <- KalmanSmooth(msci, fit2$model)
tmp <- which(fit2$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
msci.filled2 <- msci
msci.filled2[id.na] <- kr$smooth[id.na,id]
Interpolasi awal dan akhir dapat dibandingkan dalam plot (tidak ditampilkan di sini untuk menghemat ruang):
plot(msci.filled, col = "gray")
lines(msci.filled2)
Langkah 2: Paskan model ARIMA ke GCC menggunakan msci.filled2 sebagai reogen eksogen
Saya mengabaikan pengamatan yang hilang di awal msci.filled2
. Pada titik ini saya menemukan beberapa kesulitan untuk digunakan auto.arima
bersama tso
, jadi saya mencoba dengan tangan beberapa model ARIMA tso
dan akhirnya memilih ARIMA (1,1,0).
xreg <- window(cbind(gcc, msci.filled2)[,2], end = end(gcc))
fit3 <- tso(gcc, remove.method = "bottom-up", tsmethod = "arima",
args.tsmethod = list(order = c(1,1,0), xreg = data.frame(msci=xreg)))
fit3
# ARIMA(1,1,0)
# Coefficients:
# ar1 msci AO72
# -0.1701 0.5131 30.2092
# s.e. 0.1377 0.0173 6.7387
# sigma^2 estimated as 71.1: log likelihood=-180.62
# AIC=369.24 AICc=369.64 BIC=379.85
# Outliers:
# type ind time coefhat tstat
# 1 AO 72 2008:11 30.21 4.483
Plot GCC menunjukkan pergeseran pada awal 2008. Namun, tampaknya sudah ditangkap oleh regressor MSCI dan tidak ada regressor tambahan dimasukkan kecuali aditif outlier pada November 2008.
Plot residu tidak menunjukkan struktur autokorelasi tetapi plot menunjukkan pergeseran level pada November 2008 dan outlier aditif pada Februari 2011. Namun, menambahkan intervensi yang sesuai, diagnostik model lebih buruk. Analisis lebih lanjut mungkin diperlukan pada saat ini. Di sini, saya akan terus mendapatkan prakiraan berdasarkan model terakhir fit3
.
95%
newxreg <- data.frame(msci=window(msci.filled2, start = c(2011, 10)), AO72=rep(0, 34))
p <- predict(fit3$fit, n.ahead = 34, newxreg = newxreg)
head(p$pred)
# [1] 298.3544 298.2753 298.0958 298.0641 297.6829 297.7412
par(mar = c(3,3.5,2.5,2), las = 1)
plot(cbind(gcc, msci), xaxt = "n", xlab = "", ylab = "", plot.type = "single", type = "n")
grid()
lines(gcc, col = "blue", lwd = 2)
lines(msci, col = "green3", lwd = 2)
lines(window(msci.filled2, start = c(2010, 9), end = c(2012, 7)), col = "green", lwd = 2)
lines(p$pred, col = "red", lwd = 2)
lines(p$pred + 1.96 * p$se, col = "red", lty = 2)
lines(p$pred - 1.96 * p$se, col = "red", lty = 2)
xaxis1 <- seq(2003, 2014)
axis(side = 1, at = xaxis1, labels = xaxis1)
legend("topleft", col = c("blue", "green3", "green", "red", "red"), lwd = 2, bty = "n", lty = c(1,1,1,1,2), legend = c("GCC", "MSCI", "Interpolated values", "Forecasts", "95% confidence interval"))