Quantmod :: chart_Series () ошибка?

Я хотел бы составить график SPX с помощью метода Quantmod :: chart_Series () и ниже изобразить изменения ВВП и 12-месячную SMA изменений ВВП. Независимо от того, как я пытаюсь это сделать (какие комбинации я использую), возникают ошибки или Quantmod :: chart_Series () отображает только частичный график.

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

РЕДАКТИРОВАТЬ: На самом деле мне кажется, что это проблема Quantmod :: chart_series () при использовании квартальных данных:

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

Это создает график SPX на главной панели, но оставляет пустыми вторую и третью панели. Затем я попытался поиграть с одинаковым индексом данных, одинаковой длиной и т. Д.

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

И результат - повсюду ошибки:

> 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

С использованием

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

мне все хорошо.

Моя 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  

Есть идеи, как решить эти проблемы?

РЕДАКТИРОВАТЬ: это похоже на ошибку qualmod :: chart_Series (). Если я сделаю это:

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

Есть идеи, как это исправить?


person Samo    schedule 21.06.2012    source источник


Ответы (2)


У меня была аналогичная ошибка несколько дней назад. Я обнаружил, что проблема была в add_TA со строкой:

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

na.approx по умолчанию использует ок с правилом = 1, что оставляет конечные NA в списке, если последняя отметка времени в исходных данных находится перед последней отметкой времени в данных TA. Изменение этой строки для установки rule = 2 устранило проблему.

ta.x <- as.numeric(na.approx(ta.adj[, 1], rule=2))
person Michael741    schedule 24.06.2012
comment
Применяется к SVN в r581. Спасибо @ Michael741. - person Brian G. Peterson; 24.06.2012
comment
+1, К сожалению, это все еще не работает с первым примером @Samo, где SPX имеет более высокую частоту, чем GDPC96. Но преобразование обоих to.quarterly - довольно простой обходной путь. Кроме того, исправленный код по-прежнему генерирует множество предупреждений от as_numeric(H), которые поступают от parse.side функции, которая является локальной для .parseISO8601. (да, да, я знаю, это просто предупреждения) - person GSee; 24.06.2012

Я просто написал длинный «ответ», подтверждающий ваши проблемы, даже после некоторой обработки данных и даже с использованием старой функции chartSeries. Потом я понял, что add_TA(), возможно, неправильная функция. Такой подход работает:

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

(См. R / Quantmod: несколько диаграмм, использующих одни и те же ось y для альтернативного подхода с использованием команды layout.)

Или с подмножеством:

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

(NB. Два набора данных заканчиваются в разных местах, поэтому не совсем совпадают.)

Между прочим, есть одна явная ошибка в chart_Series с квартальными данными: метки оси x выглядят как «% n% b% n2010».

q.SPX=to.quarterly(SPX)
chart_Series(q.SPX)
person Darren Cook    schedule 24.06.2012
comment
Хорошая работа. Re: ошибка форматирования метки оси, проблема в том, что zoo:::format.yearqtr не поддерживает %n спецификацию преобразования. chart_Series использует xts:::axTicksByTime, который использует общий format. Поскольку to.quarterly присвоил индексу класс yearqtr, format отправляет format.yearqtr строку, которая включает %n (но отличается в зависимости от вашей ОС). Один, по общему признанию, не лучший способ обойти это на уровне пользователя - изменить класс индекса: indexClass(q.SPX) <- "Date"; chart_Series(q.SPX) - person GSee; 24.06.2012