Значения объектов зоопарка, потерянные при определенном значении индекса - PullRequest
0 голосов
/ 09 октября 2018

Я столкнулся с очень странной проблемой при работе с данными FRED через пакет quantmod.Я загружаю временные ряды SP500 с сайта и преобразую их в ежеквартальные изменения индекса в годовом исчислении, используя следующий код:

load_pkgs <- function(pkgs){
  for(pkg in pkgs){
    if(!(require(pkg, character.only=TRUE))){
      install.packages(pkg)
      library(pkg, character.only=TRUE)
    }
  }
}

load_fred_data <- function(series, new_names=NULL){
  #' loads FRED data series specified in series and renames them to
  #' new_names if given
  #' if zoo object created does not have the same number of columns as
  #' new_names' length, new_names is ignored
  #' =================================================================
  if(length(series) > 1){
    z <- lapply(
      series,
      getSymbols,
      src = 'FRED',
      auto.assign = FALSE,
      return.class = 'zoo'
    ) %>% do.call('merge', .)
  } else {
    z <- getSymbols(
      series,
      src = 'FRED',
      auto.assign = FALSE,
      return.class = 'zoo'
    )
  }
  if(length(colnames(z) == length(new_names))){
    colnames(z) <- new_names
  }
  return(z)
}

convert_monthly_level <- function(series){
  #' takes as input a series of monthly values and returns a series of
  #' quarterly YoY percent changes
  #' geometric average of monthly YoY percent changes is used
  #' =================================================================
  series <- diff(series, lag = 12, arithmetic = F)
  series <- (series * Lag(series, k = 1) * Lag(series, k = 2))^(1/3) - 1
  index(series) <- index(series) %m-% months(3)
  series <- series[month(index(series)) %in% c(1, 4, 7, 10)]
  return(series)
}

load_pkgs(
  c('downloader', 'dplyr', 'lubridate', 'quantmod', 'tseries', 'zoo')
)

sp <- load_fred_data('SP500') %>%
  to.monthly
index(sp) <- as.Date(index(sp))
sp <- apply(sp, 2, function(x) zoo(x, order.by = index(sp)) %>% convert_monthly_level) %>%
  zoo(order.by = as.Date(index(to.quarterly(sp))))
sp <- window(sp, start = core_st, end = core_end)

Когда я запускаю этот код, я получаю ежеквартальное возвращениезоопарк ряд годовых тенденций OHLC, но записи на 2017-10-01 являются NA, когда они не должны быть.Я подтвердил, что это происходит в zoo(order.by = as.Date(index(to.quarterly(sp)))).Результат оператора apply точно такой, как я ожидал, а результат оператора, который я использую для создания индекса нового объекта zoo, точно такой, как я ожидал.Что-то теряется в переводе.Кроме того, это происходит по крайней мере с одной другой серией FRED, CCSA (Заявления о безработице).Может кто-нибудь помочь мне исправить эту ошибку?

...