Как вставить значения NA в объект ts, чтобы заполнить пробел другим временным рядом? - PullRequest
0 голосов
/ 30 сентября 2019

(я новичок в R) У меня есть два временных ряда различной длины, один из которых начинается с января 2011 года (ts1), а другой - с января 2016 года (ts2). Как заполнить временной интервал «ts1 - ts2» (с января 2011 года по декабрь 2015 года) в ts2 значениями NA, чтобы «выровнять» его по ts1?

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Допустим, у вас есть две таблицы данных временных рядов различной длины:

dt1 = data.table(
  Date = seq(as.Date('2000-01-01'), as.Date('2000-01-10'), by = 1),
  Return1 = rnorm(10)
)

dt2 = data.table(
  Date = seq(as.Date('2000-01-05'), as.Date('2000-01-10'), by = 1),
  Return2 = rnorm(6)
)

Вы можете выполнить merge () для двух таблиц data.table и предоставить переменную, с которой вы хотите объединить их. В данном случае «Дата». Кроме того, мы передаем аргумент All = T, чтобы сохранить строки, которые не находятся в объединении записей Date для dt1 и dt2.

dtmain = merge(dt1, dt2, on = 'Date', all = T)

> dtmain
          Date    Return1     Return2
 1: 2000-01-01 -2.9934945          NA
 2: 2000-01-02 -0.6712139          NA
 3: 2000-01-03  0.2146184          NA
 4: 2000-01-04  1.2342134          NA
 5: 2000-01-05  0.3276646 -2.35205416
 6: 2000-01-06  1.1823349  0.39382064
 7: 2000-01-07 -0.8771251  0.72213968
 8: 2000-01-08 -0.8145120 -0.15433887
 9: 2000-01-09  1.0455526  0.05794934
10: 2000-01-10 -1.2378961 -0.49929648

Теперь рассмотрим, есть ли у вас три или более данных временных рядов. объекты таблицы:

dt3 = data.table(
  Date = seq(as.Date('2000-01-02'), as.Date('2000-01-8'), by = 1),
  Return3 = rnorm(7)
)

Если вы хотите объединить их все, вы можете использовать следующее решение, используя Reduce ():

dtlist = list(dt1, dt2, dt3) # Put your TS objects in a list
by = 'Date' # Declare the variable you want to merge the tables on

dtmain = Reduce(function(...) merge(..., all = TRUE, by = by), dtlist)

> dtmain
          Date     Return1    Return2    Return3
 1: 2000-01-01  0.45667875         NA         NA
 2: 2000-01-02 -0.84284705         NA  0.7747270
 3: 2000-01-03  0.58849764         NA -0.4224948
 4: 2000-01-04 -0.76110475         NA -0.7372464
 5: 2000-01-05  0.72950287 -0.6800249 -0.6412878
 6: 2000-01-06  1.65512675 -0.9477490  0.4073604
 7: 2000-01-07 -0.56407002  0.9283520  0.3264292
 8: 2000-01-08  0.05535025  1.7146754  0.7125701
 9: 2000-01-09  0.06031502  1.2413374         NA
10: 2000-01-10 -0.23840704  0.3846532         NA
0 голосов
/ 30 сентября 2019

Добро пожаловать в StackOverflow! В будущем, пожалуйста, включите пример ваших данных, чтобы мы могли проверить код, прежде чем дать ответ. В этом случае достаточно любого объекта временного ряда с разными датами начала. Я должен был найти свои собственные данные, чтобы ответить на ваш вопрос.

Сначала я загружаю данные о цене акций в R с пакетом quantmod. Это возвращает объекты класса xts, что удобно в этом случае. Я загрузил AAPL, который начинается с 2011 года, и GOOG, который начинается с 2016 года. Теперь для достижения того, что вы хотите, самый простой способ - создать новый объект xts с 2011 по 2016 год и заполнить его сетевыми символами. ,Затем просто объедините объект более короткого временного ряда с этим новым объектом временного ряда, который имеет NA, в данном случае GOOG.

library(quantmod)

getSymbols('AAPL', from = "2011-01-01", to = "2019-09-30")
getSymbols("GOOG", from = '2016-01-01', to = "2019-09-30")

new_rows <- nrow(AAPL) - nrow(GOOG)
temp <- matrix(NA, nrow = new_rows, ncol = ncol(GOOG))
temp <- xts(temp, order.by = index(AAPL[1:new_rows,,drop=F]))
column_names <- colnames(GOOG)
GOOG <- rbind(temp, GOOG)
colnames(GOOG) <- column_names
nrow(AAPL)==nrow(GOOG)
[1] TRUE

Теперь GOOG имеет ту же дату начала, что и AAPL, и имеет NA с 2011 по 2015 декабрь.

...