У меня есть еще одно осложнение, которое здесь решено. Функция скользящего окна для нерегулярных временных рядов, которая может обрабатывать дубликаты .
Вот данные.
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.
Можете ли вы помочь?