Можно ли создать лаговую переменную, которая ссылается на t - k рабочих дней во фрейме данных временного ряда только с рабочими днями и несколькими пропущенными днями? - PullRequest
1 голос
/ 30 июня 2019

У меня есть фрейм данных временного ряда (см. Воспроизводимый фрейм данных ниже), где я хочу создать новые столбцы значений отстающих переменных в рабочие дни t-1 и t-2. Все наблюдения являются рабочими днями. Таблица данных организована в соответствии с первой переменной / столбцом, который указывает и форматируется как дата в соответствии с «% Y-% m-% d». Проблема заключается в том, что иногда возникают временные промежутки, когда в кадре данных отсутствует один или несколько рабочих дней, что означает, что при создании переменных с запаздыванием в некоторых случаях это может привести к неправильным значениям с запаздыванием, основанным на предыдущих наблюдениях, когда на самом деле NA уточняется, поскольку рабочий день t-1 или t-2 отсутствует. Таким образом, мой вопрос заключается в том, существует ли какой-нибудь разумный способ создания лаговых переменных, позволяющий избежать этой проблемы?

Ниже я привел воспроизводимый кадр данных в качестве примера:

set.seed(1)
Data <- data.frame( date = as.Date(c("2019-06-24", "2019-06-25","2019-06-27", "2019-06-28","2019-07-01", "2019-07-03", "2019-07-04", "2019-07-08", "2019-07-09","2019-07-10")),
  X = sample(1:10),
  Y = sample(1:10),
  Z = sample(c("YES", "NO"), 10, replace = TRUE))

Как вы можете заметить, я намеренно пропустил несколько рабочих дней. И, если вы запустите следующий код, который традиционно создает лаговые переменные, вы можете заметить, что вывод будет неточным.

install.packages(data.table)
library(data.table)
setDT(Data)[, paste0('X', 1:2) := shift(X, 1:2)][]
setDT(Data)[, paste0('Y', 1:2) := shift(Y, 1:2)][]
setDT(Data)[, paste0('Z', 1:2) := shift(Z, 1:2)][]

например. на дату 2019-06-27 желаемым выходом для запаздывающих переменных «X1» и «X2» будет «NA», поскольку дата 2019-06-26 отсутствует.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Одним из решений является добавление отсутствующих дат в ваши данные, чтобы функция shift работала правильно.Здесь я предполагаю, что «Рабочий день» означает будний день, но, очевидно, вы могли бы построить вектор так, как хотите.Для этого необходимо, чтобы вы знали, какие дни являются рабочими днями для построения вектора, но для этого потребуется знание любого подхода.

bus_days <- 
  df[, {days <- seq(min(date), max(date), by = 'day')
        days[!format(days, '%u') %in% 6:7]}]

df[J(bus_days), on = 'date']
0 голосов
/ 30 июня 2019

Попробуйте:

library(data.table)

irregularShift <- function(date_var, val, k) sapply(date_var, function(x) val[date_var == x - k])

setDT(Data)[
  , paste0('X', 1:2) := list(irregularShift(date, X, 1), irregularShift(date, X, 2))][
    , paste0('Y', 1:2) := list(irregularShift(date, Y, 1), irregularShift(date, Y, 2))][
      , paste0('Z', 1:2) := list(irregularShift(date, Z, 1), irregularShift(date, Z, 2))
  ]

Выход:

          date  X  Y   Z X1 X2 Y1 Y2  Z1  Z2
 1: 2019-06-24  9  3 YES                    
 2: 2019-06-25  4  1 YES  9     3    YES    
 3: 2019-06-27  7  5 YES     4     1     YES
 4: 2019-06-28  1  8  NO  7     5    YES    
 5: 2019-07-01  2  2 YES                    
 6: 2019-07-03  5  6 YES     2     2     YES
 7: 2019-07-04  3 10  NO  5     6    YES    
 8: 2019-07-08 10  9  NO                    
 9: 2019-07-09  6  4  NO 10     9     NO    
10: 2019-07-10  8  7 YES  6 10  4  9  NO  NO

Здесь, однако, X2 не пропущено для 2019-06-27, поскольку мы рассматриваем t-2 и 2019-06-25 здесь. Если это нежелательно, вам необходимо переформулировать изменения, которые вы хотели бы видеть, возможно, с дополнительными условиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...