Benim önerim, ortalamaları hareket ettirmek yerine bir zaman serisi modeli kullanmam dışında önerdiğinize benzer. ARIMA modellerinin çerçevesi, sadece regresör olarak MSCI serisini değil, aynı zamanda verilerin dinamiklerini de yakalayabilen GCC serisinin gecikmelerini içeren tahmin elde etmek için de uygundur.
İlk olarak, MSCI serisi için bir ARIMA modeline uyabilir ve bu serideki eksik gözlemleri enterpolasyonlayabilirsiniz. Daha sonra, eksojen regresörler olarak MSCI kullanarak GCC serisi için bir ARIMA modeli sığdırabilir ve bu modele dayanarak GCC için tahminler alabilirsiniz. Bunu yaparken, seride grafiksel olarak gözlemlenen ve ARIMA modelinin seçimini ve uyumunu bozabilecek molalarla uğraşırken dikkatli olmalısınız.
İşte bu analizi yaptığım şey R
. Bu işlevi forecast::auto.arima
ARIMA modelinin seçimini yapmak ve tsoutliers::tso
olası seviye değişimlerini (LS), geçici değişiklikleri (TC) veya ilave aykırı değerleri (AO) tespit etmek için kullanıyorum.
Bunlar yüklendikten sonra verilerdir:
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")
Adım 1: Bir ARIMA modelini MSCI serisine takın
Grafik bazı kırılmaların varlığını ortaya koymasına rağmen, hiçbir aykırı değer tespit edilmedi tso
. Bunun nedeni, numunenin ortasında birkaç eksik gözlem olması olabilir. Bununla iki adımda baş edebiliriz. İlk olarak, bir ARIMA modeli takın ve eksik gözlemleri enterpolasyonda kullanmak için kullanın; ikincisi, olası LS, TC, AO kontrolü için enterpolasyonlu seri için bir ARIMA modeli takın ve değişiklikler bulunursa enterpolasyonlu değerleri düzeltin.
MSCI serisi için ARIMA modelini seçin:
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
Bu cevabım tartışılan bir yaklaşım aşağıdaki eksik gözlemler Dolgu
sonrası :
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]
Dolu serilere bir ARIMA modeli takın msci.filled
. Şimdi bazı aykırı değerler bulundu. Bununla birlikte, alternatif seçenekler kullanılarak farklı aykırı değerler tespit edilmiştir. Çoğu durumda bulunan olanı Ekim 2008'de bir seviye değişikliği tutacağım (gözlem 18). Örneğin bunları ve diğer seçenekleri deneyebilirsiniz.
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"))
Seçilen model şimdi:
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
Eksik gözlemlerin enterpolasyonunu düzeltmek için önceki modeli kullanın:
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]
İlk ve son enterpolasyonlar bir grafikte karşılaştırılabilir (yerden tasarruf etmek için burada gösterilmez):
plot(msci.filled, col = "gray")
lines(msci.filled2)
Adım 2: Eksojen regresör olarak msci.filled2 kullanarak bir ARIMA modelini GCC'ye takın
Başlangıçtaki eksik gözlemleri görmezden geliyorum msci.filled2
. Bu noktada bazı zorluklar kullanmak bulundu auto.arima
beraber tso
ben elle birkaç ARIMA modeli denedik yüzden, tso
ve son olarak ARIMA (1,1,0) seçti.
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
GCC'nin planı 2008'in başında bir kayma gösteriyor. Bununla birlikte, zaten regresyon MSCI tarafından yakalanmış gibi görünüyor ve Kasım 2008'deki bir katkı maddesi hariç hiçbir ilave regresör dahil edilmedi.
Kalıntıların grafiği herhangi bir otokorelasyon yapısı önermedi, ancak grafik Kasım 2008'de bir seviye değişikliği ve Şubat 2011'de bir eklenti aykırı değer önerdi. Bununla birlikte, ilgili müdahaleleri modelin teşhisi daha kötü oldu. Bu noktada daha fazla analize ihtiyaç duyulabilir. Burada, son modele dayalı tahminleri almaya devam edeceğim fit3
.
Tahminler kolayca elde edilebilir. Aşağıdaki grafik orijinal serileri, MSCI için enterpolasyonlu değerleri ve tahmini
GCC için güven aralıklarıyla birlikte göstermektedir. Konfederasyon aralıkları, MSCA'da enterpole edilen değerlerin belirsizliğini açıklamaz.% 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"))