2012-06-21 19 views
6

Me gustaría hacer una gráfica de SPX usando quantmod :: chart_Series() y debajo dibujar cambios en GDP y SMA de 12 meses de cambios en el PBI. No importa cómo intente hacerlo (qué combinaciones uso) se producen los errores o quantmod :: chart_Series() muestra solo un gráfico parcial.quantmod :: chart_Series() error?

require(quantmod) 

FRED.symbols <- c("GDPC96") 

getSymbols(FRED.symbols, src="FRED") 
SPX <- getSymbols("^GSPC", auto.assign=FALSE, from="1900-01-01") 

subset="2000/" 

chart_Series(SPX, subset=subset) 
add_TA(GDPC96) 
add_TA(ROC(GDPC96, type="discrete")) 
add_TA(SMA(ROC(GDPC96, type="discrete"), n=4), on=3, col="blue") 

EDIT: En realidad, me parece que este es un quantmod :: chart_series() problema cuando se usan los datos trimestrales:

subset <- "2000/" 
chart_Series(to.quarterly(SPX, drop.time=TRUE), subset=subset) 
add_TA(SMA(Cl(to.quarterly(SPX, drop.time=TRUE)))) 

> subset <- "2000/" 
> chart_Series(to.quarterly(SPX, drop.time=TRUE), subset=subset) 
> add_TA(SMA(Cl(to.quarterly(SPX, drop.time=TRUE)))) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 

Esto producir parcela SPX en el panel principal, pero deja vacía segundo y tercer panel. Luego trató de jugar un poco con tener mismo índice en los datos, etc. mismas longitudes

chart_Series(head(to.quarterly(SPX, drop.time="TRUE"), -1), subset=subset) 
add_TA(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
add_TA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
add_TA(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4), on=3, col="blue") 

Y es resultado errores de todo:

> chart_Series(head(to.quarterly(SPX, drop.time="TRUE"), -1), subset=subset) 
> add_TA(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4), on=3, col="blue") 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 

Usando

tail(to.quarterly(SPX, drop.time="TRUE")) 
tail(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
tail(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
tail(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)) 

dput(to.quarterly(SPX, drop.time="TRUE")) 
dput(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
dput(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
dput(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)) 

todo se ve bien a mi.

Mi sessionInfo():

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8   LC_NUMERIC=C     
[3] LC_TIME=en_US.UTF-8   LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8  LC_MESSAGES=en_US.UTF-8  
[7] LC_PAPER=en_US.UTF-8   LC_NAME=en_US.UTF-8   
[9] LC_ADDRESS=en_US.UTF-8  LC_TELEPHONE=en_US.UTF-8  
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] quantmod_0.3-18 TTR_0.21-0  xts_0.8-7  zoo_1.7-7  
[5] Defaults_1.1-1 rj_1.1.0-4  

loaded via a namespace (and not attached): 
[1] grid_2.15.0 lattice_0.20-0 tools_2.15.0 

¿Alguna idea de lo que podría ser la solución para estos problemas?

EDITAR: Esto parece ser un error quantmod :: chart_Series(). Si hago esto:

subset <- "1990/" 
test <- cbind(head(to.quarterly(SPX, drop.time="TRUE"), -1)[subset], 
      to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)[subset], 
      ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE),  type="discrete")[subset], 
      SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)[subset]) 

test$test <- 1 

subset <- "2000/" 
chart_Series(OHLC(test), subset=subset) 
add_TA(test$test) 
add_TA(test$GDPC96) 

> test$test <- 1 
> subset <- "2000/" 
> chart_Series(OHLC(test), subset=subset) 
> add_TA(test$test) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(test$GDPC96) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> traceback() 
14: stop("'x' and 'y' lengths differ") at chart_Series.R#510 
13: xy.coords(x, y) at chart_Series.R#510 
12: plot.xy(xy.coords(x, y), type = type, ...) at chart_Series.R#510 
11: lines.default(ta.x, as.numeric(ta.y[, i]), col = col, ...) at chart_Series.R#510 
10: lines(ta.x, as.numeric(ta.y[, i]), col = col, ...) at chart_Series.R#510 
9: plot_ta(x = current.chob(), ta = get("x"), on = NA, taType = NULL, 
     col = 1) at replot.R#238 
8: eval(expr, envir, enclos) at replot.R#238 
7: eval(aob, env) at replot.R#238 
6: FUN(X[[12L]], ...) at replot.R#230 
5: lapply(x$Env$actions, function(aob) { 
     if (attr(aob, "frame") > 0) { 
      x$set_frame(attr(aob, "frame"), attr(aob, "clip")) 
      env <- attr(aob, "env") 
      if (is.list(env)) { 
       env <- unlist(lapply(env, function(x) eapply(x, eval)), 
        recursive = FALSE) 
      } 
      eval(aob, env) 
     } 
    }) at replot.R#230 
4: plot.replot(x, ...) 
3: plot(x, ...) 
2: print.replot(<environment>) 
1: print(<environment>) 

¿Alguna idea sobre cómo solucionarlo?

Respuesta

3

Acabo de escribir una larga "respuesta" confirmando sus problemas, incluso después de algunos datos de masaje, e incluso utilizando la función anterior chartSeries. Entonces me di cuenta de que add_TA() es quizás la función incorrecta. Este enfoque funciona:

par(mfrow=c(2,1)) 
chart_Series(SPX) 
chart_Series(GDPC96) 

(Ver R/quantmod: multiple charts all using the same y-axis de un enfoque alternativo utilizando el comando layout.)

O con el subconjunto:.

par(mfrow=c(2,1)) 
chart_Series(SPX,subset="2000/") 
chart_Series(GDPC96,subset="2000/") 

(NB los dos conjuntos de datos terminan en un lugar diferente , así que no se alineen del todo.)

Incidentalmente, hay un error definido en chart_Series con datos trimestrales: las etiquetas del eje x lo ok como "% n% b% n2010".

q.SPX=to.quarterly(SPX) 
chart_Series(q.SPX) 
+2

Nice work around.Re: el error de formato de la etiqueta del eje, el problema es que 'zoo ::: format.yearqtr' no es compatible con la' _conversion _ especificación__. 'chart_Series' utiliza' xts ::: axTicksByTime' que utiliza el 'formato' genérico. Como 'to.quarterly' proporcionó al índice una clase de' yearqtr', 'format' distribuye' format.yearqtr' con una cadena que incluye '% n' (pero es diferente según su sistema operativo). Una forma, ciertamente no excelente, de evitar esto en el nivel de usuario es cambiar la clase de índice: 'indexClass (q.SPX) <-" Date "; chart_Series (q.SPX) ' – GSee

5

Tuve un error similar hace varios días. He descubierto que el problema estaba en add_TA con la línea:

ta.x <- as.numeric(na.approx(ta.adj[, 1])) 

na.approx utiliza aproximadamente con la regla = 1 por defecto, lo que deja AN se arrastran en la lista si la última marca de tiempo en los datos originales antes de la última marca de tiempo en los datos TA. Cambiar esa línea para establecer la regla = 2 solucionó el problema.

ta.x <- as.numeric(na.approx(ta.adj[, 1], rule=2)) 
+0

Aplicado a SVN en [r581] (https://r-forge.r-project.org/scm/viewvc.php/pkg/R/chart_Series.R?view=markup&revision=581&root= quantmod). Gracias @ Michael741. –

+0

¡Bienvenido a SO, Maddogg! :) – GSee

+0

+1, Desafortunadamente, todavía no funciona con el primer ejemplo de @ Samo donde SPX tiene una frecuencia más alta que GDPC96. Pero convertir ambas 'a.quarterly' es una solución bastante simple. Además, el código parcheado todavía arroja muchas advertencias de 'as_numeric (H)' que proviene de una función 'parse.side' que es local a' .parseISO8601'. (Sí, sí, lo sé, son solo advertencias) – GSee

Cuestiones relacionadas