2011-05-03 6 views
5

Quiero crear un conjunto de datos de la serie FRED y utilizo el paquete quantmod así:quantmod: buildData (, na.rm = FALSO) cae la cabeza de series de tiempo

library(quantmod) 
getSymbols(c('FEDFUNDS', 'GDPPOT', 'DGS10'), src='FRED') 
dat <- buildData(FEDFUNDS ~ DGS10 + GDPPOT, na.rm=FALSE) 

Lo que necesito es un XTS objeto con observaciones para todas las fechas en la serie de tiempo más larga, y valores faltantes para completar la serie temporal más corta. En el ejemplo anterior, me sale:

> head(dat, 2) 
      FEDFUNDS DGS10 GDPPOT 
1962-10-01  2.90 3.93 3141.6 
1963-01-01  2.92 NA 3173.9 
> head(FEDFUNDS, 2) 
      FEDFUNDS 
1954-07-01  0.80 
1954-08-01  1.22 
> head(DGS10, 2) 
      DGS10 
1962-01-02 4.06 
1962-01-03 4.03 
> head(GDPPOT, 2) 
      GDPPOT 
1949-01-01 1864.8 
1949-04-01 1885.2 

La serie FEDFUNDS se truncó para que coincida con el valor de fecha mínima de la serie DGS10. Me gusta la conveniencia de la función buildData(), y me encantaría usarla para esta tarea, pero me pregunto cómo puedo seguir perdiendo observaciones.

¡Muchas gracias por su tiempo!

EDITAR: El motivo por el que no deseo utilizar la fusión es que algunas series de datos tienen una periodicidad diferente y que buildData() se encarga de eso automáticamente.

Respuesta

5

buildData no le está dando lo que quiere, en particular debido a DGS10 siendo NA en fiestas (incluyendo el primer día del año) y no tener entrada para los domingos. Así que si usted probar lo que tenía en la cuestión, se obtiene la siguiente rareza

> tail(dat,16) 
      FEDFUNDS DGS10 GDPPOT 
2005-07-01  3.26 4.06 12611.7 
2007-01-01  5.25 NA 13072.4 
2007-10-01  4.76 4.56 13314.1 
2008-01-01  3.94 NA 13393.0 
2008-04-01  2.28 3.57 13471.2 
2008-07-01  2.01 4.01 13547.1 
2008-10-01  0.97 3.77 13619.9 
2009-01-01  0.15 NA 13689.2 
2009-04-01  0.15 2.68 13753.1 
2009-07-01  0.16 3.55 13813.7 
2009-10-01  0.12 3.21 13872.0 
2010-01-01  0.11 NA 13928.2 
2010-04-01  0.20 3.89 13985.8 
2010-07-01  0.18 2.96 14044.7 
2010-10-01  0.19 2.54 14109.8 
2011-04-01  0.10 3.46 14247.2 

con varias líneas que faltan, incluyendo todo el año 2006. dat es un objeto zoo en lugar de xts.

Si está utilizando GDPPOT, entonces presumiblemente desea utilizar datos trimestrales. Prueba esto:

FEDFUNDSq <- aggregate(na.omit(FEDFUNDS), as.yearqtr, first) 
DGS10q <- aggregate(na.omit(DGS10), as.yearqtr, first) 
GDPPOTq <- aggregate(na.omit(GDPPOT), as.yearqtr, first) 
dat2 <- as.xts(merge(FEDFUNDSq, DGS10q, GDPPOTq)) 

El as.xts() es sólo allí porque se lo ha solicitado. Esto debería darle NA donde lo desee y no donde no. Por ejemplo, el siguiente se ve mejor que la cola anterior.

> head(tail(dat2,66),25) 
     FEDFUNDSq DGS10q GDPPOTq 
2005 Q3  3.26 4.06 12611.7 
2005 Q4  3.78 4.39 12684.6 
2006 Q1  4.29 4.37 12758.9 
2006 Q2  4.79 4.88 12835.2 
2006 Q3  5.24 5.15 12913.0 
2006 Q4  5.25 4.62 12992.1 
2007 Q1  5.25 4.68 13072.4 
2007 Q2  5.25 4.65 13153.1 
2007 Q3  5.26 5.00 13233.9 
2007 Q4  4.76 4.56 13314.1 
2008 Q1  3.94 3.91 13393.0 
2008 Q2  2.28 3.57 13471.2 
2008 Q3  2.01 4.01 13547.1 
2008 Q4  0.97 3.77 13619.9 
2009 Q1  0.15 2.46 13689.2 
2009 Q2  0.15 2.68 13753.1 
2009 Q3  0.16 3.55 13813.7 
2009 Q4  0.12 3.21 13872.0 
2010 Q1  0.11 3.85 13928.2 
2010 Q2  0.20 3.89 13985.8 
2010 Q3  0.18 2.96 14044.7 
2010 Q4  0.19 2.54 14109.8 
2011 Q1  0.17 3.36 14178.3 
2011 Q2  0.10 3.46 14247.2 
2011 Q3  NA  NA 14316.8 
+0

Funciona muy bien. ¡Gracias! – Vincent

5

Usted podría utilizar merge.xts, ya que rellena con NA automáticamente:

library(quantmod) 
getSymbols('FEDFUNDS;DGS10'head(, src='FRED') 
dat <- merge(FEDFUNDS, DGS10) 
head(dat) 
#   FEDFUNDS DGS10 
# 1954-07-01  0.80 NA 
# 1954-08-01  1.22 NA 
# 1954-09-01  1.06 NA 
# 1954-10-01  0.85 NA 
# 1954-11-01  0.83 NA 
# 1954-12-01  1.28 NA 
+0

+1 Para fusión, y cuantmod bondad en general – Andrie

+1

Pido disculpas, mi ejemplo no fue lo suficientemente informativo. El motivo por el que quiero usar buildData() es que algunas de mis series de datos tienen una periodicidad diferente, y buildData() se encarga de eso automáticamente. Usar la fusión requeriría una manipulación adicional para obtener datos trimestrales. En un esfuerzo por simplificar el ejemplo, saqué demasiado. Esto ahora se refleja en la edición que hice en la publicación original. – Vincent

+0

@Vincent: eso es un poco más complicado, sí. :) Voy a darle otra oportunidad más tarde esta noche. –

Cuestiones relacionadas