Bagaimana cara saya menangani data yang tidak ada atau hilang?

12

Saya mencoba metode peramalan dan ingin memeriksa apakah metode saya benar atau tidak.

Studi saya membandingkan berbagai jenis reksa dana. Saya ingin menggunakan indeks GCC sebagai patokan untuk salah satu dari mereka tetapi masalahnya adalah bahwa indeks GCC berhenti pada September 2011 dan studi saya adalah dari Januari 2003 hingga Juli 2014. Jadi, saya mencoba menggunakan indeks lain, indeks MSCI, untuk membuat regresi linier, tetapi masalahnya adalah bahwa indeks MSCI kehilangan data dari September 2010.

Untuk menyiasati ini, saya melakukan yang berikut. Apakah langkah-langkah ini valid?

  1. Indeks MSCI adalah data yang hilang untuk September 2010 hingga Juli 2012. Saya "menyediakan" itu dengan menerapkan rata-rata bergerak untuk lima pengamatan. Apakah pendekatan ini valid? Jika demikian, berapa banyak pengamatan yang harus saya gunakan?

  2. Setelah memperkirakan data yang hilang, saya melakukan regresi pada indeks GCC (sebagai variabel dependen) versus indeks MSCI (sebagai variabel independen) untuk periode yang tersedia bersama (dari Januari 2007 hingga September 2011), kemudian mengoreksi model dari semua masalah. Untuk setiap bulan, saya mengganti x dengan data dari indeks MSCI untuk periode istirahat. Apakah ini valid?

Di bawah ini adalah data dalam format Comma-Separated-Values ​​yang berisi tahun dengan baris dan bulan dengan kolom. Data juga tersedia melalui tautan ini .

Seri GCC:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2002,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,117.709
2003,120.176,117.983,120.913,134.036,145.829,143.108,149.712,156.997,162.158,158.526,166.42,180.306
2004,185.367,185.604,200.433,218.923,226.493,230.492,249.953,262.295,275.088,295.005,328.197,336.817
2005,346.721,363.919,423.232,492.508,519.074,605.804,581.975,676.021,692.077,761.837,863.65,844.865
2006,947.402,993.004,909.894,732.646,598.877,686.258,634.835,658.295,672.233,677.234,491.163,488.911
2007,440.237,486.828,456.164,452.141,495.19,473.926,492.782,525.295,519.081,575.744,599.984,668.192
2008,626.203,681.292,616.841,676.242,657.467,654.66,635.478,603.639,527.326,396.904,338.696,308.085
2009,279.706,252.054,272.082,314.367,340.354,325.99,326.46,327.053,354.192,339.035,329.668,318.267
2010,309.847,321.98,345.594,335.045,311.363,299.555,310.802,306.523,315.496,324.153,323.256,334.802
2011,331.133,311.292,323.08,327.105,320.258,312.749,305.073,297.087,298.671,NA,NA,NA

Seri MSCI:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2007,NA,NA,NA,NA,1000,958.645,1016.085,1049.468,1033.775,1118.854,1142.347,1298.223
2008,1197.656,1282.557,1164.874,1248.42,1227.061,1221.049,1161.246,1112.582,929.379,680.086,516.511,521.127
2009,487.562,450.331,478.255,560.667,605.143,598.611,609.559,615.73,662.891,655.639,628.404,602.14
2010,601.1,622.624,661.875,644.751,588.526,587.4,615.008,606.133,NA,NA,NA,NA
2011,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
2012,NA,NA,NA,NA,NA,NA,NA,609.51,598.428,595.622,582.905,599.447
2013,627.561,619.581,636.284,632.099,651.995,651.39,687.194,676.76,694.575,704.806,727.625,739.842
2014,759.036,787.057,817.067,824.313,857.055,805.31,873.619,NA,NA,NA,NA,NA

data

TG Zain
sumber
Apa x yang disebutkan dalam paragraf terakhir?
Nick Cox
y adalah harga tutup indeks gcc dan x adalah harga tutup untuk indeks msci
TG Zain
Anda mungkin tertarik pada posting ini , yang menunjukkan contoh tentang bagaimana mengisi kesenjangan dalam rangkaian waktu melalui filter Kalman yang diterapkan dalam kerangka model seri waktu ARIMA.
javlacalle
terima kasih javlacalle apakah itu berfungsi dengan data saya yang hilang? di sini adalah file saya untuk data yang hilang 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain
Saya tidak bisa mengunduh file. Anda dapat memposting data, misalnya menampilkan tahun dengan baris dan bulan dengan kolom dan nilai yang dipisahkan oleh koma.
javlacalle

Jawaban:

9

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.arimauntuk membuat pemilihan model ARIMA dan tsoutliers::tsountuk 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.arimabersama tso, jadi saya mencoba dengan tangan beberapa model ARIMA tsodan 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"))

hasil

javlacalle
sumber
terima kasih banyak javlacalle ,, saya sangat menghargai bantuan Anda itulah yang saya cari ,, maaf telah meluangkan waktu Anda ,,, saya akan melakukan semua langkah pada eviews karena saya tidak memiliki program R dan saya tidak tahu bagaimana menggunakannya .... terima kasih terima kasih lagi
TG Zain
Saya senang melihat Anda menganggapnya berguna.
javlacalle
Saya baru untuk RI tidak dapat menemukan jawabannya di Eviews ... jadi saya mulai menggunakan R dan saya punya beberapa pertanyaan ,, bagaimana saya harus mengimpor data .. Maksud saya semua data dengan na vairables atau hanya untuk data yang tersedia untuk msci ke R + ada pesan kesalahan tentang tidak ada kalmansmooth atau run ditemukan saya sudah mengunduh paket untuk kalman filter apa yang harus saya lakukan? ..Terima kasih
TG Zain
Pertanyaan yang terkait dengan penggunaan perangkat lunak di luar topik di situs ini. Stack Overflow lebih cocok untuk pertanyaan semacam ini. Jika itu adalah sesuatu yang spesifik untuk jawaban saya, Anda dapat mengirim saya email.
javlacalle
1
  1. Imputasi (yaitu 'disediakan' oleh moving average ') valid jika nilai-nilai hilang secara acak. Jika itu adalah periode panjang yang tidak diintervensi, ini menjadi tidak mungkin. Bagian kedua dari pertanyaan tidak jelas.
  2. Bergantung pada pertanyaan, dianggap apa saja dari suboptimal hingga tidak valid untuk menggunakan model Anda untuk memperkirakan di luar ruang lingkup data Anda: misalnya bagaimana jika hubungan antara dua indeks berubah pada 2012-2014? Anda bisa menggunakan nilai estimasi regresi (tetapi tidak secara langsung menggantikan dengan nilai mentah indeks lain) untuk titik data yang hilang, tetapi ini hanya akan masuk akal jika ada hubungan yang kuat antara kedua indeks, dan sangat penting bahwa nilai-nilai ini adalah ditandai dengan jelas sebagai taksiran. Dan apa yang Anda maksud dengan "mengoreksi model dari semua masalah"?
katya
sumber
2
Sebagian besar dari analisis deret waktu didedikasikan untuk memprediksi masa depan. Bagi sebagian orang, itu adalah alasan utama statistik! Dengan demikian # 2 adalah nasihat kesempurnaan yang membagi pemalu dari peramal deret waktu.
Nick Cox
Cukup adil, saya setuju / berdiri dikoreksi. Saya masih bertanya-tanya apakah lebih bijaksana untuk memilih prediktor dengan nilai-nilai yang hilang di pertengahan-gradien vs akhir gradien. Jika mereka terkait.
katya
saya minta maaf saya mencoba untuk mengunggah file saya tetapi saya tidak tahu bagaimana atau di mana :( ... + saya berarti mengoreksi model dari heteroskedastisitas dan korelasi serial
TG Zain
di sini adalah file saya untuk data yang hilang pada excel 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain
1

2 sepertinya baik-baik saja. Saya akan pergi dengan itu.

Adapun 1. Saya akan menyarankan Anda untuk melatih model untuk memprediksi GCC menggunakan semua fitur yang tersedia dalam dataset (yang bukan NA selama periode September 2011 dan seterusnya) (misalkan baris yang memiliki nilai NA sebelum sep2011 saat pelatihan). Model harus sangat baik (gunakan validasi K-fold cross). Sekarang perkirakan GCC untuk periode September 2011 dan seterusnya.

Atau, Anda dapat melatih model yang memprediksi MSCI, menggunakannya untuk memprediksi nilai MSCI yang hilang. Sekarang latih model untuk memprediksi GCC menggunakan MSCI dan kemudian memprediksi GCC untuk periode September 2011 dan seterusnya

show_stopper
sumber
Terima kasih nar .. jawaban Anda membuat saya berpikir tentang model var ... apakah akan berhasil?
TG Zain
Secara teori, model VAR harus bekerja, tetapi ketika Anda mulai membuat perkiraan jauh di masa depan, kesalahan yang terakumulasi menjadi sangat tinggi. yaitu jika Anda berdiri pada y (t) dan Anda menginginkan nilai y (t + 10), Anda perlu memprediksi secara rekursif 10 kali. Pertama, Anda akan memprediksi y (t + 1), kemudian menggunakan prediksi untuk memprediksi y (t + 2) dan seterusnya.
show_stopper
Saya menghargai bantuan Anda ... jadi maksud Anda metode yang Anda sarankan dengan melatih amodel lebih baik daripada var ... tapi saya tidak tahu apa-apa tentang itu ... bisakah Anda tunjukkan bagaimana atau Anda punya tutorial dan model apa yang harus saya gunakan?
TG Zain
Baik. Jadi sekarang saya telah melihat dataset Anda, lakukan hal berikut. Desain model sederhana yang menggunakan MSCI untuk memprediksi GCC. Sekarang, perkirakan GCC untuk Agustus 2012 dan seterusnya. Untuk periode waktu Oktober 2011 hingga Juli 2012 menggunakan VAR atau model AR sederhana untuk memprediksi nilai GCC
show_stopper
1
Dengan model sederhana yang saya maksud, model regresi linier atau log-linear. Validasi K-fold sederhana. Pisahkan dataset total dalam k lipatan. k bisa berupa angka berapa saja. Latih model menggunakan split k-1, uji model pada split terakhir. Ulangi ini, sampai setiap ludah telah diuji. Sekarang hitung nilai RMSE. Alasan untuk melakukan hal di atas adalah untuk memastikan bahwa model yang Anda pilih memiliki daya prediksi yang baik
show_stopper