Получение скользящего среднего ВСЕХ предыдущих наблюдений по идентификатору в несбалансированном наборе данных панели

Я пытаюсь вычислить скользящие средства из несбалансированного набора данных. Чтобы проиллюстрировать мою точку зрения, я привел этот игрушечный пример моих данных:

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
Другие вопросы по тегам