Как мне справиться с несуществующими или отсутствующими данными?

12

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

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

Чтобы обойти это, я сделал следующее. Эти шаги действительны?

  1. В индексе MSCI отсутствуют данные за сентябрь 2010 года по июль 2012 года. Я «предоставил» его, применив скользящие средние для пяти наблюдений. Этот подход действителен? Если да, сколько наблюдений я должен использовать?

  2. После оценки отсутствующих данных я выполнил регрессию индекса GCC (как зависимой переменной) по сравнению с индексом MSCI (как независимой переменной) для взаимно доступного периода (с января 2007 года по сентябрь 2011 года), затем исправил модель из всех проблем. Для каждого месяца я заменяю x данными из индекса MSCI за период отдыха. Это действительно?

Ниже приведены данные в формате Comma-Separated-Values, содержащие годы по строкам и месяцы по столбцам. Данные также доступны по этой ссылке .

Серия 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 в качестве экзогенного регрессора

Я игнорирую отсутствующие наблюдения в начале 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
источник
большое спасибо javlacalle, я действительно ценю вашу помощь, это именно то, что я ищу, я прошу прощения за то, что вы нашли время, я собираюсь сделать все шаги на eview, потому что у меня нет программы R и я не знаю, как его использовать .... спасибо еще раз спасибо
TG Zain
Я рад, что вы нашли это полезным.
Javlacalle
Я новичок в RI. Я не смог найти ответ в Eviews ... поэтому я начал использовать R, и у меня возникли вопросы: как мне импортировать данные? Я имею в виду все данные с переменными na или только для доступных данных для MSI на R + появляется сообщение об ошибке о kalmansmooth или не найден запустить Я уже загрузил пакеты для фильтра kalman, что мне делать? .. спасибо
TG Zain
Вопросы, связанные с использованием программного обеспечения, не по теме на этом сайте. Stack Overflow больше подходит для такого рода вопросов. Если это что-то конкретное в моем ответе, вы можете отправить мне электронное письмо.
javlacalle
1
  1. Импутация (т. Е. «Обеспеченная» скользящей средней) действительна, если значения отсутствуют случайно. Если это непрерывный период значительной продолжительности, это становится маловероятным. Вторая часть вопроса неясна.
  2. В зависимости от вопроса, использование вашей модели для прогнозирования выходит за рамки ваших данных: от неоптимального до недействительного: например, что если отношения между двумя индексами изменятся в 2012-2014 годах? Вы можете использовать оценочные значения регрессии (но не напрямую заменять необработанными значениями другого индекса) для отсутствующих точек данных, но это будет иметь смысл, только если между этими двумя индексами существует сильная связь, и важно, чтобы эти значения были четко обозначены как оценки. А что вы подразумеваете под "исправленной моделью от всех проблем"?
катя
источник
2
Некоторая большая часть анализа временных рядов посвящена прогнозированию будущего. Для некоторых это главная причина статистики! Таким образом, № 2 - это совет совершенства, отделяющий робких от предсказателей временных рядов.
Ник Кокс
Справедливо, я согласен / стою исправлено. Я все еще задаюсь вопросом, более разумно ли выбирать предиктор с отсутствующими значениями в среднем градиенте по сравнению с концом градиента. Если они связаны.
Катя
извините, я пытался загрузить свой файл, но я не знал, как и где :( ... + я имел в виду исправил модель из гетероскедастичности и последовательной корреляции
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 года и далее.

show_stopper
источник
Спасибо, нар .. твой ответ побудил меня задуматься о вар модели ... это сработает?
TG Zain
Теоретически, модель VAR должна работать, но когда вы начинаете делать прогнозы значительно позже в будущем, накопленная ошибка становится очень высокой. т.е. если вы стоите в точке y (t) и хотите получить значение y (t + 10), вам нужно будет выполнить рекурсивный прогноз 10 раз. Сначала вы будете предсказывать y (t + 1), затем использовать предсказанное для предсказания y (t + 2) и так далее.
show_stopper
Я ценю вашу помощь ... так что вы имеете в виду метод, который вы предложили поездом Amodel лучше, чем VAR ... но я ничего не знаю об этом ... не могли бы вы показать, как или у вас есть какие-либо учебники и какую модель мне использовать?
TG Zain
Хорошо. Итак, теперь, когда я увидел ваш набор данных, сделайте следующее. Разработайте простую модель, которая использует MSCI для прогнозирования GCC. Теперь прогнозируем GCC на время августа 2012 года и далее. Для периода времени с октября 2011 года по июль 2012 года используйте VAR или простую модель AR для прогнозирования значений GCC
show_stopper
1
Под простой моделью я подразумеваю модель линейной или логарифмической регрессии. K-кратная проверка проста. Разделите общий набор данных на k сгибов. К может быть любое число. Обучите модель, используя k-1 сплиты, протестируйте модель на последнем сплите. Повторяйте это, пока каждый вертел не будет проверен. Теперь вычислите среднеквадратичные значения. Причина для того, чтобы сделать вышеупомянутое, состоит в том, чтобы убедиться, что выбранная вами модель обладает хорошей предсказательной силой
show_stopper