Come gestisco i dati inesistenti o mancanti?


12

Ho provato un metodo di previsione e voglio verificare se il mio metodo è corretto o meno.

Il mio studio sta confrontando diversi tipi di fondi comuni di investimento. Voglio utilizzare l'indice GCC come punto di riferimento per uno di essi, ma il problema è che l'indice GCC si è interrotto a settembre 2011 e il mio studio è stato condotto da gennaio 2003 a luglio 2014. Pertanto, ho cercato di utilizzare un altro indice, l'indice MSCI, per fare una regressione lineare, ma il problema è che nell'indice MSCI mancano i dati di settembre 2010.

Per aggirare questo, ho fatto quanto segue. Questi passaggi sono validi?

  1. Nell'indice MSCI mancano i dati per settembre 2010 fino a luglio 2012. L'ho "fornito" applicando medie mobili per cinque osservazioni. Questo approccio è valido? In tal caso, quante osservazioni dovrei usare?

  2. Dopo aver stimato i dati mancanti, ho eseguito una regressione sull'indice GCC (come variabile dipendente) rispetto all'indice MSCI (come variabile indipendente) per il periodo reciprocamente disponibile (da gennaio 2007 a settembre 2011), quindi ho corretto il modello da tutti i problemi. Per ogni mese, sostituisco la x con i dati dell'indice MSCI per il periodo di riposo. È valido?

Di seguito sono riportati i dati in formato Comma-Separated-Values ​​contenenti gli anni per righe e i mesi per colonne. I dati sono disponibili anche tramite questo link .

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

dati


Qual è la x menzionata nell'ultimo paragrafo?
Nick Cox,

y è la chiusura del prezzo dell'indice gcc e x è la chiusura del prezzo per l'indice msci
TG Zain,

Potresti essere interessato a questo post , che mostra un esempio su come colmare le lacune in una serie temporale per mezzo del filtro Kalman applicato nel quadro di un modello di serie storiche ARIMA.
javlacalle,

grazie javlacalle funziona con i miei dati mancanti? ecco il mio file per i dati mancanti 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain,

Non sono riuscito a scaricare il file. È possibile pubblicare i dati, ad esempio visualizzando anni per righe e mesi per colonne e valori separati da virgole.
javlacalle,

Risposte:


9

Il mio suggerimento è simile a quello che proponete, tranne per il fatto che vorrei utilizzare un modello di serie temporale anziché spostare le medie. Il framework dei modelli ARIMA è adatto anche per ottenere previsioni, incluso non solo la serie MSCI come regressore, ma anche ritardi della serie GCC che possono anche catturare la dinamica dei dati.

Innanzitutto, è possibile inserire un modello ARIMA per la serie MSCI e interpolare le osservazioni mancanti in questa serie. Quindi, è possibile adattare un modello ARIMA per la serie GCC utilizzando MSCI come regressori esogeni e ottenere le previsioni per GCC basate su questo modello. Nel fare ciò, è necessario prestare attenzione alle interruzioni che sono graficamente osservate nella serie e che possono distorcere la selezione e l'adattamento del modello ARIMA.


Ecco cosa ottengo facendo questa analisi R. Uso la funzione forecast::auto.arimaper effettuare la selezione del modello ARIMA e tsoutliers::tsoper rilevare possibili cambi di livello (LS), cambiamenti temporanei (TC) o valori anomali additivi (AO).

Questi sono i dati una volta caricati:

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

Passaggio 1: montare un modello ARIMA sulla serie MSCI

Nonostante il grafico mostri la presenza di alcune interruzioni, non sono stati rilevati valori anomali tso. Ciò può essere dovuto al fatto che ci sono diverse osservazioni mancanti nel mezzo del campione. Possiamo occuparcene in due passaggi. Innanzitutto, adatta un modello ARIMA e usalo per interpolare le osservazioni mancanti; in secondo luogo, montare un modello ARIMA per la serie interpolata verificando eventuali LS, TC, AO e perfezionare i valori interpolati se vengono rilevate modifiche.

Scegli il modello ARIMA per la 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

Riempi le osservazioni mancanti seguendo l'approccio discusso nella mia risposta a questo post :

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]

Montare un modello ARIMA sulla serie riempita msci.filled. Ora vengono trovati alcuni valori anomali. Tuttavia, utilizzando opzioni alternative sono stati rilevati diversi valori anomali. Terrò quello che è stato trovato nella maggior parte dei casi, uno spostamento di livello a ottobre 2008 (osservazione 18). Puoi provare ad esempio queste e altre opzioni.

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

Il modello scelto è ora:

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

Utilizzare il modello precedente per perfezionare l'interpolazione delle osservazioni mancanti:

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]

Le interpolazioni iniziale e finale possono essere confrontate in un grafico (non mostrato qui per risparmiare spazio):

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

Passaggio 2: adattare un modello ARIMA a GCC utilizzando msci.filled2 come regressore esogeno

Ignoro le osservazioni mancanti all'inizio di msci.filled2. A questo punto ho riscontrato alcune difficoltà da utilizzare auto.arimainsieme tso, quindi ho provato a mano diversi modelli ARIMA tsoe infine ho scelto l'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

La trama di GCC mostra uno spostamento all'inizio del 2008. Tuttavia, sembra che sia già stato catturato dal regressore MSCI e che non siano stati inclusi regressori addizionali, tranne un valore aggiunto additivo a novembre 2008.

La trama dei residui non suggeriva alcuna struttura di autocorrelazione ma la trama suggeriva uno spostamento di livello a novembre 2008 e un valore anomalo additivo a febbraio 2011. Tuttavia, aggiungendo gli interventi corrispondenti la diagnosi del modello era peggiore. Ulteriori analisi potrebbero essere necessarie a questo punto. Qui, continuerò a ottenere le previsioni basate sull'ultimo modello 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"))

risultato


grazie mille javlacalle ,, apprezzo molto il tuo aiuto, è esattamente quello che sto cercando, mi dispiace di aver dedicato del tempo, e non so come usarlo .... grazie ancora grazie
TG Zain,

Sono contento di vederti utile.
javlacalle,

Sono nuovo per il RI non sono riuscito a trovare la risposta in Eviews ... quindi ho iniziato a utilizzare R e ho alcune domande, come devo importare i dati .. Intendo tutti i dati con na vendibili o solo per i dati disponibili per msci su R + c'è un messaggio di errore su nessun kalmansmooth o esecuzione trovata Ho già scaricato i pacchetti per il filtro kalman cosa devo fare? ..grazie
TG Zain,

Le domande relative all'utilizzo del software sono fuori tema in questo sito. Stack Overflow è più adatto a questo tipo di domande. Se è qualcosa di specifico per la mia risposta, puoi inviarmi una e-mail.
javlacalle,

1
  1. L'imputazione (cioè "fornita" dalla media mobile ") è valida se i valori mancano casualmente. Se si tratta di un periodo ininterrotto di notevole durata, ciò diventa improbabile. La seconda parte della domanda non è chiara.
  2. A seconda della domanda, viene considerato qualsiasi cosa da non ottimale a non valido per utilizzare il modello per la previsione oltre l'ambito dei dati: ad esempio, se la relazione tra i due indici cambia nel 2012-2014? È possibile utilizzare i valori stimati dalla regressione (ma non sostituirli direttamente con i valori non elaborati di un altro indice) per i punti dati mancanti, ma ciò avrebbe senso solo se esiste una relazione forte tra i due indici ed è fondamentale che questi valori siano chiaramente indicato come stima. E cosa intendi con "corretto il modello da tutti i problemi"?

2
Un'ampia parte dell'analisi delle serie storiche è dedicata alla previsione del futuro. Per alcuni, è il motivo principale per le statistiche! # 2 è quindi un consiglio di perfezione che divide il timido dai previsori delle serie temporali.
Nick Cox,

Abbastanza giusto, sono d'accordo / sono corretto. Mi chiedo ancora se sia più prudente scegliere un predittore con valori mancanti nel gradiente medio rispetto alla fine del gradiente. Se sono correlati.
Katya,

mi dispiace di aver provato a caricare il mio file ma non sapevo come o dove :( ... + intendevo corretto il modello da eteroscedasticità e correlazione seriale
TG Zain,

ecco il mio file per i dati mancanti su Excel 4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain,

1

2 Sembra a posto. Vorrei andare con esso.

Per quanto riguarda 1. Ti suggerirei di addestrare un modello per prevedere GCC utilizzando tutte le funzionalità disponibili nel set di dati (che non sono NA durante il periodo da settembre 2011 in poi) (ometti le righe che hanno un valore NA prima di settembre 2012 durante l'allenamento). Il modello dovrebbe essere molto buono (usare la validazione incrociata di K-fold). Ora prevedere il CCG per il periodo da settembre 2011 in poi.

In alternativa, è possibile addestrare un modello che prevede MSCI, utilizzarlo per prevedere i valori MSCI mancanti. Ora forma un modello per prevedere GCC utilizzando MSCI e quindi prevedere GCC per il periodo da settembre 2011 in poi


Grazie nar .. la tua risposta mi porta a pensare al modello var ... funzionerebbe?
TG Zain,

Teoricamente, il modello VAR dovrebbe funzionare, ma quando inizi a fare previsioni molto tardi, l'errore accumulato diventa molto elevato. cioè se stai in piedi y (t) e vuoi il valore di y (t + 10), dovrai prevedere ricorsivamente 10 volte. Per prima cosa pronosticherai y (t + 1), quindi userai il predetto per prevedere y (t + 2) e così via.
show_stopper,

Apprezzo il tuo aiuto ... quindi intendi il metodo che hai suggerito in treno amodel meglio di var ... ma non ne so nulla ... potresti per favore mostrare come o hai tutorial e che tipo di modello dovrei usare?
TG Zain,

Ok. Quindi ora che ho visto il tuo set di dati, procedi come segue. Progetta un modello semplice che utilizza MSCI per prevedere GCC. Ora prevedere GCC per il periodo agosto 2012 e successivi. Per il periodo da ottobre 2011 a luglio 2012 utilizzare un VAR o un semplice modello AR per prevedere i valori GCC
show_stopper

1
Per modello semplice intendo un modello di regressione lineare o log-lineare. La convalida di K-fold è semplice. Dividi il set di dati totale in k pieghe. k potrebbe essere qualsiasi numero. Allena il modello usando le divisioni k-1, testa il modello sull'ultima divisione. Ripeti fino a quando ogni sputo è stato testato. Ora calcola i valori RMSE. Il motivo per fare quanto sopra è assicurarsi che il modello scelto abbia un buon potere predittivo
show_stopper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.