Wie gehe ich mit nicht vorhandenen oder fehlenden Daten um?

12

Ich habe eine Prognosemethode ausprobiert und möchte überprüfen, ob meine Methode korrekt ist oder nicht.

Meine Studie vergleicht verschiedene Arten von Investmentfonds. Ich möchte den GCC-Index als Benchmark für einen von ihnen verwenden, aber das Problem ist, dass der GCC-Index im September 2011 gestoppt wurde und meine Studie von Januar 2003 bis Juli 2014 ist. Daher habe ich versucht, einen anderen Index zu verwenden, den MSCI-Index. eine lineare Regression durchzuführen, aber das Problem ist, dass dem MSCI-Index Daten von September 2010 fehlen.

Um dies zu umgehen, habe ich Folgendes getan. Sind diese Schritte gültig?

  1. Dem MSCI-Index fehlen Daten für September 2010 bis Juli 2012. Ich habe sie "bereitgestellt", indem ich für fünf Beobachtungen gleitende Durchschnitte angewendet habe. Ist dieser Ansatz gültig? Wenn ja, wie viele Beobachtungen sollte ich verwenden?

  2. Nachdem ich die fehlenden Daten geschätzt hatte, führte ich eine Regression des GCC-Index (als abhängige Variable) gegenüber dem MSCI-Index (als unabhängige Variable) für den für beide Seiten verfügbaren Zeitraum (von Januar 2007 bis September 2011) durch und korrigierte dann das Modell von allen Problemen. Für jeden Monat ersetze ich das x durch die Daten aus dem MSCI-Index für die Ruhezeit. Ist das gültig?

Unten finden Sie die Daten im Format "Kommagetrennte Werte", die die Jahre nach Zeilen und die Monate nach Spalten enthalten. Die Daten sind auch über diesen Link verfügbar .

Serie 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

Serie 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

Daten

TG Zain
quelle
Was ist das im letzten Absatz erwähnte x?
Nick Cox
das y ist der Preisschluss des gcc-Index und das x ist der Preisschluss des msci-Index
TG Zain
Dieser Beitrag könnte Sie interessieren. Er zeigt ein Beispiel zum Füllen von Lücken in einer Zeitreihe mithilfe des Kalman-Filters, der im Rahmen eines ARIMA-Zeitreihenmodells angewendet wird.
Javlacalle
danke javlacalle funktioniert es mit meinen fehlenden daten? Hier ist meine Datei für fehlende Daten 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain
Ich konnte die Datei nicht herunterladen. Sie können die Daten veröffentlichen, z. B. Jahre durch Zeilen und Monate durch Spalten und durch Kommas getrennte Werte anzeigen.
Javlacalle

Antworten:

9

Mein Vorschlag ähnelt dem, was Sie vorschlagen, außer dass ich ein Zeitreihenmodell anstelle von gleitenden Durchschnitten verwenden würde. Das Framework von ARIMA-Modellen ist auch geeignet, um Prognosen zu erhalten, die nicht nur die Serie MSCI als Regressor enthalten, sondern auch Verzögerungen der GCC-Serie, die möglicherweise auch die Dynamik der Daten erfassen.

Zunächst können Sie ein ARIMA-Modell für die Serie MSCI anpassen und die fehlenden Beobachtungen in dieser Serie interpolieren. Anschließend können Sie ein ARIMA-Modell für die Serie GCC unter Verwendung von MSCI als exogene Regressoren anpassen und die Prognosen für GCC basierend auf diesem Modell erhalten. Dabei müssen Sie vorsichtig mit den Brüchen umgehen, die in der Serie grafisch beobachtet werden und die Auswahl und Anpassung des ARIMA-Modells verzerren können.


Hier ist, was ich bei dieser Analyse bekomme R. Ich benutze die Funktion forecast::auto.arima, um das ARIMA-Modell auszuwählen und tsoutliers::tsomögliche Pegelverschiebungen (LS), temporäre Änderungen (TC) oder additive Ausreißer (AO) zu erkennen.

Dies sind die einmal geladenen Daten:

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

Schritt 1: Passen Sie ein ARIMA-Modell an die Serie MSCI an

Obwohl die Grafik das Vorhandensein einiger Unterbrechungen zeigt, wurden von keine Ausreißer erkannt tso. Dies kann auf die Tatsache zurückzuführen sein, dass in der Mitte der Stichprobe mehrere Beobachtungen fehlen. Wir können dies in zwei Schritten erledigen. Passen Sie zunächst ein ARIMA-Modell an und verwenden Sie es, um fehlende Beobachtungen zu interpolieren. Passen Sie zweitens ein ARIMA-Modell für die interpolierte Serie an, um mögliche LS, TC, AO zu überprüfen, und verfeinern Sie die interpolierten Werte, wenn Änderungen gefunden werden.

Wählen Sie das ARIMA-Modell für die Serie 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

Füllen Sie fehlende Beobachtungen nach dem in meiner Antwort auf diesen Beitrag beschriebenen Ansatz aus :

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]

Passen Sie ein ARIMA-Modell an die gefüllte Serie an msci.filled. Nun werden einige Ausreißer gefunden. Bei Verwendung alternativer Optionen wurden jedoch unterschiedliche Ausreißer festgestellt. Ich werde die in den meisten Fällen festgestellte Verschiebung des Niveaus im Oktober 2008 beibehalten (Beobachtung 18). Sie können zum Beispiel diese und andere Optionen ausprobieren.

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

Das gewählte Modell ist jetzt:

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

Verwenden Sie das vorherige Modell, um die Interpolation fehlender Beobachtungen zu verfeinern:

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]

Die anfängliche und die endgültige Interpolation können in einem Diagramm verglichen werden (hier nicht gezeigt, um Platz zu sparen):

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

Schritt 2: Passen Sie ein ARIMA-Modell mit msci.filled2 als exogenem Regressor an GCC an

Ich ignoriere die fehlenden Beobachtungen zu Beginn von msci.filled2. An dieser Stelle fand ich einige Schwierigkeiten zu verwenden , auto.arimamit entlang tso, so dass ich von Hand mehr ARIMA - Modelle in ausprobiert tsound schließlich entscheiden sie die 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

Die Darstellung von GCC zeigt eine Verschiebung zu Beginn des Jahres 2008. Es scheint jedoch, dass sie bereits vom Regressor MSCI erfasst wurde und keine zusätzlichen Regressoren enthalten waren, außer einem additiven Ausreißer im November 2008.

Die Darstellung der Residuen deutete nicht auf eine Autokorrelationsstruktur hin, aber die Darstellung deutete auf eine Pegelverschiebung im November 2008 und einen additiven Ausreißer im Februar 2011 hin. Durch Hinzufügen der entsprechenden Interventionen war die Diagnose des Modells jedoch schlechter. Zu diesem Zeitpunkt ist möglicherweise eine weitere Analyse erforderlich. Hier werde ich weiterhin die Prognosen basierend auf dem letzten Modell erhalten 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"))

Ergebnis

javlacalle
quelle
vielen dank javlacalle ,, ich schätze deine hilfe sehr, das ist genau das, wonach ich suche ,, es tut mir leid, dass ich mir die zeit genommen habe ,,, ich werde alle schritte auf eviews machen, weil ich das programm r nicht habe und ich weiß nicht, wie man es benutzt ... danke nochmals vielen Dank
TG Zain
Ich bin froh zu sehen, dass Sie es nützlich fanden.
Javlacalle
Ich bin neu für RI. Ich konnte die Antwort in Eviews nicht finden. Also habe ich angefangen, R zu verwenden, und ich habe einige Fragen. Wie soll ich die Daten importieren? Ich meine alle Daten mit na vairables oder nur für verfügbare Daten für msci zu R + gibt es Fehlermeldung über kein kalmansmooth oder run gefunden Ich habe bereits die Pakete für kalman filter heruntergeladen was soll ich tun? ..danke
TG Zain
Fragen zur Software-Nutzung sind auf dieser Website nicht zum Thema. Der Stapelüberlauf eignet sich besser für diese Art von Fragen. Wenn es etwas Bestimmtes für meine Antwort ist, können Sie mir eine E-Mail senden.
Javlacalle
1
  1. Die Imputation (dh "durch gleitenden Durchschnitt bereitgestellt") ist gültig, wenn zufällige Werte fehlen. Wenn es sich um eine ununterbrochene Periode von beträchtlicher Länge handelt, wird dies unwahrscheinlich. Der zweite Teil der Frage ist unklar.
  2. Abhängig von der Frage wird es als suboptimal bis ungültig angesehen, Ihr Modell für Prognosen zu verwenden, die über den Umfang Ihrer Daten hinausgehen: Was ist beispielsweise, wenn sich die Beziehung zwischen den beiden Indizes in den Jahren 2012 bis 2014 ändert? Sie könnten für die fehlenden Datenpunkte durch Regression geschätzte Werte verwenden (diese jedoch nicht direkt durch die Rohwerte eines anderen Index ersetzen). Dies ist jedoch nur dann sinnvoll, wenn eine starke Beziehung zwischen den beiden Indizes besteht und es wichtig ist, dass diese Werte vorhanden sind deutlich als Schätzungen gekennzeichnet. Und was meinst du mit "das Modell von allen Problemen korrigiert"?
Katya
quelle
2
Ein großer Teil der Zeitreihenanalyse ist der Vorhersage der Zukunft gewidmet. Für einige ist es der Hauptgrund für Statistiken! # 2 ist somit ein Ratschlag zur Perfektion, der die schüchternen von den Zeitreihen-Prognostikern trennt.
Nick Cox
Fair genug, ich stimme zu / stehe korrigiert. Ich frage mich immer noch, ob es klüger ist, einen Prädiktor mit fehlenden Werten in der Mitte des Gradienten gegenüber dem Ende des Gradienten zu wählen. Wenn sie verwandt sind.
Katya
Es tut mir leid, dass ich versucht habe, meine Datei hochzuladen, aber ich wusste nicht, wie oder wo :( ... + ich meinte, das Modell von Heteroskedastizität und serieller Korrelation zu korrigieren
TG Zain
Hier ist meine Datei für fehlende Daten auf Excel 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain
1

2 Scheint in Ordnung zu sein. Ich würde damit gehen.

Zu 1. Ich würde Ihnen empfehlen, ein Modell zu trainieren, um GCC unter Verwendung aller im Datensatz verfügbaren Funktionen vorherzusagen (die ab September 2011 keine NA sind) (lassen Sie die Zeilen, die vor dem September 2011 einen NA-Wert haben, während des Trainings aus). Das Modell sollte sehr gut sein (verwenden Sie die K-fache Kreuzvalidierung). Prognostizieren Sie nun den GCC für den Zeitraum ab September 2011.

Alternativ können Sie ein Modell trainieren, das MSCI vorhersagt, und es verwenden, um die fehlenden MSCI-Werte vorherzusagen. Trainieren Sie nun ein Modell, um GCC mithilfe von MSCI vorherzusagen, und prognostizieren Sie dann GCC für den Zeitraum September 2011 und danach

show_stopper
quelle
Vielen Dank nar .. Ihre Antwort hat mich dazu gebracht, über var model nachzudenken ... würde es funktionieren?
TG Zain
Theoretisch sollte das VAR-Modell funktionieren, aber wenn Sie viel später mit Prognosen beginnen, wird der akkumulierte Fehler sehr hoch. dh wenn Sie bei y (t) stehen und den Wert von y (t + 10) möchten, müssen Sie 10-mal rekursiv vorhersagen. Zuerst werden Sie y (t + 1) vorhersagen, dann das vorhergesagte verwenden, um y (t + 2) vorherzusagen und so weiter.
Show_stopper
Ich schätze Ihre Hilfe ... also meinen Sie die Methode, die Sie von train amodel vorgeschlagen haben, besser als var ... aber ich weiß nichts darüber ... könnten Sie bitte zeigen, wie oder haben Sie Tutorials und Was für ein Modell soll ich verwenden?
TG Zain
Okay. Nachdem ich Ihren Datensatz gesehen habe, gehen Sie wie folgt vor. Entwerfen Sie ein einfaches Modell, das MSCI verwendet, um GCC vorherzusagen. Sagen Sie jetzt GCC für die Zeit ab August 2012 voraus. Verwenden Sie für den Zeitraum Oktober 2011 bis Juli 2012 einen VAR oder ein einfaches AR-Modell, um GCC-Werte vorherzusagen
show_stopper
1
Mit einfachem Modell meine ich ein lineares oder logarithmisch lineares Regressionsmodell. Die K-fache Validierung ist einfach. Teilen Sie den gesamten Datensatz in k Falten. k kann eine beliebige Zahl sein. Trainieren Sie das Modell mit k-1-Teilungen und testen Sie das Modell bei der letzten Teilung. Wiederholen Sie diesen Vorgang, bis jeder Spieß getestet wurde. Berechnen Sie nun die RMSE-Werte. Der Grund dafür ist, sicherzustellen, dass das von Ihnen ausgewählte Modell eine gute Vorhersagekraft hat
show_stopper