在不平衡面板数据集中生成每个ID的所有先前观察的滚动平均值

时间:2013-04-19 18:26:49

标签: r plyr zoo

我正在尝试计算不平衡数据集的滚动方式。为了说明我的观点,我制作了这个数据的玩具示例:

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的{​​{1}}所有先前观察的滚动平均值。我已尝试在IDrollapply包中使用ddplyzoo,但我看不到如何设置滚动窗口长度以使用之前的观察结果对于每个ID。也许我应该使用plm包呢?任何帮助表示赞赏。

我在BALANCED面板数据集上看到了关于滚动方式的其他帖子,但我似乎无法推断他们对不平衡数据的回答。

谢谢,

M

2 个答案:

答案 0 :(得分:7)

使用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]

答案 1 :(得分:2)

假设年份在每个ID中是连续的(在示例数据中是这种情况)并且DF是输入数据帧,这里是仅使用基数R的解决方案。cumRoll是一个函数对一个ID执行所需的操作,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