скользящая условная медиана с использованием неэквивалентного соединения в data.table - PullRequest
1 голос
/ 21 июня 2020

У меня есть еще одно осложнение, которое здесь решено. Функция скользящего окна для нерегулярных временных рядов, которая может обрабатывать дубликаты .

Вот данные.

   ticker  val   yr           stop_date
1    A    1.0  2009              2012
2    A    2.0  2010              2020
3    A    3.0  2011              2020
4    A    4.0  2012              2020
5    A    5.0  2013              2020
6    B    2.0  2010              2020 
7    B    3.0  2011              2012
8    B    4.0  2014              2020
9    B    5.0  2019              2020
10   B    6.0  2020              2020

Для каждого тикера данных я хочу вычислить прошлое 5-летняя (год может иметь дубликаты, но это нормально) медиана для каждой пары тикер-год. Это стандартное вычисление медианы скользящего временного окна с нерегулярными датами с промежутками.

Но вдобавок к этому наблюдения, включенные в вычисление медианы, не должны быть устаревшими. Параметр stop_date vairiable указывает, что это значение устарело.

Вот пример c с указанием. Предположим, мы вычисляем медиану значений за последние 5 лет в строке 4 для тикера A. Без условия устаревания мы получим результат из медианы (c (1,2,3,4)). Но поскольку в текущей строке yr 2012, поэтому val в 2009 не следует включать в расчет, так как он перестает быть действительным в 2012 году. Поэтому я хочу иметь медианное значение (c (2,3,4)) для строки 4.

Я пробовал

setDT(dt)[.(ticker = ticker, upper = yr, lower = yr-5),
                            on = .(ticker, yr <= upper, yr >lower),
                          .(med = median(val, na.rm = T)), by =.EACHI]

Но, по-видимому, это не решает проблему устаревания.

Поэтому мне нужно, чтобы медианная операция во время неэквивалентного соединения была условной при сравнении текущей строки yr и всех stop_date в диапазоне non equi join yr.

Можете ли вы помочь?

...