Получение скользящего среднего ВСЕХ предыдущих наблюдений по идентификатору в несбалансированном наборе данных панели
Я пытаюсь вычислить скользящие средства из несбалансированного набора данных. Чтобы проиллюстрировать мою точку зрения, я привел этот игрушечный пример моих данных:
ID year Var RollingAvg(Var)
1 2000 2 NA
1 2001 3 2
1 2002 4 2.5
1 2003 2 3
2 2001 2 NA
2 2002 5 2
2 2003 4 3.5
Колонка RollingAvg(Var)
это то, что я хочу, но не могу получить. Словами, я ищу скользящее среднее ВСЕХ предыдущих наблюдений Var
для каждого ID
, Я пытался использовать rollapply
а также ddply
в zoo
и plyr
пакет, но я не вижу, как установить длину скользящего окна, чтобы использовать ВСЕ предыдущие наблюдения для каждого идентификатора. Может, мне лучше использовать пакет plm? Любая помощь приветствуется.
Я видел другие публикации о скользящих средствах на наборе данных панели BALANCED, но я не могу экстраполировать их ответы на несбалансированные данные.
Спасибо,
M
2 ответа
С помощью data.table
:
library(data.table)
d = data.table(your_df)
d[, RollingAvg := {avg = cumsum(Var)/seq_len(.N);
c(NA, avg[-length(avg)])},
by = ID]
(или даже упрощенный)
d[, RollingAvg := c(NA, head(cumsum(Var)/(seq_len(.N)), -1)), by = ID]
Предполагая, что годы являются непрерывными в пределах каждого идентификатора (что имеет место в данных примера), и DF
это фрейм входных данных, вот решение с использованием только базы R. cumRoll
это функция, которая выполняет необходимую операцию с одним идентификатором и ave
затем выполняет это по ID:
cumRoll <- function(x) c(NA, head(cumsum(x) / seq_along(x), -1))
DF$Roll <- ave(DF$Var, DF$ID, FUN = cumRoll)
Результат:
> DF
ID year Var Roll
1 1 2000 2 NA
2 1 2001 3 2.0
3 1 2002 4 2.5
4 1 2003 2 3.0
5 2 2001 2 NA
6 2 2002 5 2.0
7 2 2003 4 3.5