Як обробити неіснуючі або відсутні дані?


12

Я спробував метод прогнозування і хочу перевірити, чи правильний мій метод чи ні.

Моє дослідження порівнює різні види пайових фондів. Я хочу використовувати індекс GCC як орієнтир для одного з них, але проблема полягає в тому, що індекс GCC зупинився у вересні 2011 року, а моє дослідження - з січня 2003 по липень 2014 року. Таким чином, я спробував використати інший індекс - індекс MSCI, зробити лінійну регресію, але проблема полягає в тому, що в індексі MSCI відсутні дані з вересня 2010 року.

Щоб обійти це, я зробив наступне. Чи дійсні ці кроки?

  1. В індексі MSCI відсутні дані за вересень 2010 року по липень 2012 року. Я "надав" це, застосувавши ковзаючі середні показники для п’яти спостережень. Чи підходить цей підхід? Якщо так, то скільки спостережень слід використовувати?

  2. Оцінивши відсутні дані, я здійснив регресію індексу GCC (як залежної змінної) проти індексу MSCI (як незалежна змінна) за взаємно доступний період (з січня 2007 по вересень 2011 року), потім виправив модель з усіх проблем. Щомісяця я замінюю х на дані з індексу MSCI на період спокою. Чи дійсно це?

Нижче наведено дані у форматі значень, розділених комами, що містять роки за рядками та місяці за стовпцями. Дані також доступні за цим посиланням .

Серія 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

Серія 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

дані


Який х згаданий в останньому абзаці?
Нік Кокс

y - ціна закритого індексу gcc, а x - ціна близька для індексу msci
TG Zain

Вас може зацікавити цей пост , де показаний приклад того, як заповнювати прогалини у часових рядах за допомогою фільтра Калмана, застосованого в рамках моделі часового ряду ARIMA.
javlacalle

дякую javlacalle чи працює це з моїми відсутніми даними? ось мій файл про відсутні дані 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain

Не вдалося завантажити файл. Ви можете розміщувати дані, наприклад, показуючи роки за рядками та місяцями стовпцями та значеннями, розділеними комами.
javlacalle

Відповіді:


9

Моя пропозиція схожа на запропоновану вами пропозицію, за винятком того, що я використовував би модель часових рядів замість ковзаючих середніх. Рамка моделей ARIMA також підходить для отримання прогнозу, що включає не тільки серію MSCI як регресор, але й відставання серії GCC, які також можуть фіксувати динаміку даних.

По-перше, ви можете підібрати модель ARIMA для серії MSCI та інтерполювати відсутні дані спостереження в цій серії. Тоді ви можете встановити модель ARIMA для серії GCC з використанням MSCI як екзогенних регресорів та отримати прогнози для GCC на основі цієї моделі. Роблячи це, ви повинні бути обережними, розглядаючи перерви, які графічно спостерігаються у серії, які можуть спотворювати вибір та відповідність моделі ARIMA.


Ось що я отримую, роблячи цей аналіз R. Я використовую цю функцію forecast::auto.arimaдля вибору моделі ARIMA та tsoutliers::tsoдля виявлення можливих зрушень рівня (LS), тимчасових змін (TC) або адитивних вибухів (AO).

Це дані, щойно завантажені:

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")

Крок 1: Встановіть модель ARIMA до серії MSCI

Незважаючи на те, що графічні дані виявляють наявність деяких перерв, не виявлено жодних людей, що випадають tso. Це може бути пов’язано з тим, що в середині вибірки є кілька відсутніх спостережень. Ми можемо вирішити це в два етапи. По-перше, встановити модель ARIMA та використовувати її для інтерполяції відсутніх спостережень; по-друге, встановіть модель ARIMA для перевірки інтерпольованих рядів на можливі значення LS, TC, AO та уточніть інтерпольовані значення, якщо будуть знайдені зміни.

Виберіть модель ARIMA для серії 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

Заповніть пропущені спостереження, слідуючи підходу, обговореному у моїй відповіді на це повідомлення :

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]

Встановіть модель ARIMA до заповненої серії msci.filled. Зараз знайдені деякі люди, що пережили своє життя. Тим не менше, використовуючи альтернативні варіанти, були виявлені різні люди, що не переживають. Я збережу той, який був знайдений у більшості випадків, зміною рівня на жовтень 2008 року (спостереження 18). Ви можете спробувати, наприклад, ці та інші варіанти.

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"))

Обрана модель зараз:

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

Використовуйте попередню модель для уточнення інтерполяції відсутніх спостережень:

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]

Початкові та кінцеві інтерполяції можна порівняти на графіку (не показано тут для економії місця):

plot(msci.filled, col = "gray")
lines(msci.filled2)

Крок 2: Встановіть модель ARIMA в GCC, використовуючи msci.filled2 як екзогенний регресор

Я ігнорую пропущені спостереження на початку 2007 року msci.filled2. У цей момент я виявив деякі труднощі використовувати auto.arimaразом з tso, тому я спробував вручну кілька моделей ARIMA в tsoі , нарешті , вибрали 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

Сюжет GCC демонструє зміну на початку 2008 року. Однак, здається, він уже був захоплений регресором MSCI і ніяких аддитогенних регресорів не було включено, окрім добавки, що залишилася в листопаді 2008 року.

Сюжет залишків не передбачав будь-якої структури автокореляції, але сюжет передбачав зміну рівня в листопаді 2008 року та надмірне доповнення в лютому 2011 року. Однак, додавши відповідні втручання, діагностика моделі була гіршою. У цей момент може знадобитися подальший аналіз. Тут я продовжуватиму отримувати прогнози за останньою моделлю 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"))

результат


дуже дякую, javlacalle ,, я дуже вдячний за вашу допомогу, саме це я шукаю ,, мені дуже шкода, що я зайняв ваш час ,,, я збираюся зробити всі кроки на оглядах, тому що у мене немає програми R і я не знаю, як ним користуватися .... дякую ще раз дякую
TG Zain

Я радий бачити, що Ви вважаєте це корисним.
javlacalle

Я новачок у RI не зміг знайти відповідь у програмі Eviews ... тому я почав використовувати R і у мене виникають питання ,, як слід імпортувати дані .. Я маю на увазі всі дані з na vairables або просто для наявних даних для msci до R + є повідомлення про помилку про відсутність kalmansmooth або запуску знайдено Я вже завантажив пакети для фільтра kalman, що мені робити? .. дякую вам
Т. Г.

Питання, пов'язані з використанням програмного забезпечення, на цьому веб-сайті поза темою. Переповнення стека більше підходить для таких питань. Якщо це щось конкретне для моєї відповіді, ви можете надіслати мені електронний лист.
javlacalle

1
  1. Імпутація (тобто "надається" ковзною середньою) є дійсною, якщо значення відсутні випадково. Якщо це безперебійний період значної тривалості, це стає малоймовірним. Друга частина питання незрозуміла.
  2. Залежно від питання, вважається що-небудь від неоптимального до недійсного використовувати вашу модель для прогнозування за межами ваших даних: наприклад, що робити, якщо зв’язок між двома індексами зміниться у 2012-2014 роках? Ви можете використовувати значення, оцінені регресією (але не безпосередньо замінюючи неочищеними значеннями іншого індексу) для відсутніх точок даних, але це має сенс лише у випадку, якщо між цими двома індексами існує сильна взаємозв'язок, і критично важливо, щоб ці значення були чітко позначені як оцінки. А що ви маєте на увазі під "виправленою моделлю від усіх проблем"?

2
Деяка велика частка аналізу часових рядів присвячена передбаченню майбутнього. Для когось це головна причина статистики! Таким чином, №2 - це порада досконалості, що ділить боязко від синоптиків часових рядів.
Нік Кокс

Досить справедливо, я погоджуюсь / стою виправлено. Мені все ще цікаво, чи є більш доцільним вибрати предиктор із відсутніми значеннями в середині градієнта проти кінця градієнта. Якщо вони споріднені.
katya

Вибачте, що я намагався завантажити свій файл, але я не знав, як і де :( ... + я мав на увазі виправлену модель з гетероседастичності та серійної кореляції
TG Zain

ось мій файл про відсутні дані на excel 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain

1

2 Здається чудово. Я б пішов з цим.

Що стосується 1. Я б запропонував вам підготувати модель для прогнозування GCC з використанням усіх функцій, доступних у наборі даних (які не є NA протягом періоду вересня 2011 року) (надіньте рядки, які мають будь-яке значення NA до вересня 2011 року під час тренування). Модель повинна бути дуже хорошою (використовувати K-кратну перехресну перевірку). Тепер прогнозуйте GCC на період вересня 2011 року і далі.

Крім того, ви можете тренувати модель, яка прогнозує MSCI, і використовувати її для прогнозування відсутніх значень MSCI. Тепер підготуйте модель для прогнозування GCC за допомогою MSCI, а потім прогнозуйте GCC на період вересня 2011 року і далі


Дякую нар ... ваша відповідь спонукає мене задуматися про вар-модель ... це спрацювало б?
TG Zain

Теоретично модель VAR повинна працювати, але коли ви починаєте робити прогнози набагато пізно в майбутньому, накопичена помилка стає дуже великою. тобто якщо ви стоїте на y (t) і хочете значення y (t + 10), вам потрібно буде рекурсивно передбачити 10 разів. Спочатку ви передбачите y (t + 1), потім використовуйте передбачене для прогнозування y (t + 2) тощо.
show_stopper

Я вдячний за вашу допомогу ... так що ви маєте на увазі метод, який ви запропонували поїздом "Амодель" краще, ніж вар ... але я нічого не знаю про це ... чи можете ви, будь ласка, показати, як чи у вас є підручники та Яку модель потрібно використовувати?
Т. Г. Заїн

Добре. Тож тепер, коли я побачив ваш набір даних, зробіть наступне. Створіть просту модель, яка використовує MSCI для прогнозування GCC. Тепер прогнозуйте GCC на час серпня 2012 року і далі. Для періоду з жовтня 2011 по липень 2012 року для прогнозування значень GCC використовуйте VAR або просту модель AR
show_stopper

1
Під простою моделлю я маю на увазі лінійну чи логарифмічну регресійну модель. Перевірка в K-кратці проста. Розбийте загальний набір даних у k складаннях. k може бути будь-яке число. Навчіть модель, використовуючи розбивки k-1, протестуйте модель на останньому розділі. Повторюйте це, поки не буде перевірена кожна коса. Тепер обчисліть значення RMSE. Причиною цього є переконання, що обрана вами модель має хорошу прогнозовану силу
show_stopper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.