【问题标题】:Producing a rolling average of ALL the previous observations per ID in an unbalanced panel data set在不平衡面板数据集中生成每个 ID 的所有先前观察值的滚动平均值
【发布时间】:2013-04-19 18:26:48
【问题描述】:

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

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) 栏目是我想要的,但是拿不到。换句话说,我正在寻找每个ID 之前对Var 的所有观察的滚动平均值。我曾尝试在zooplyr 包中使用rollapplyddply,但我看不到如何设置滚动窗口长度以使用每个ID 的所有先前观察。也许我应该改用 plm 包?任何帮助表示赞赏。

我看过其他关于 BALANCED 面板数据集的滚动平均值的帖子,但我似乎无法推断他们对不平衡数据的答案。

谢谢,

中号

【问题讨论】:

标签: r plyr zoo


【解决方案1】:

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

【讨论】:

  • 你不应该将DT$x = ...data.table 一起使用,这会复制整个表格,而这正是它试图不做的事情。请改用:=(阅读小插图)
  • @eddi:谢谢,这行得通!仍在尝试了解发生了什么,但我可能会到达那里:) 是否可以扩展您的答案,以便第一个说 2 个观察被编码为“NA”,而不仅仅是第一个? (我知道它不在原来的问题中)
  • 当然,发生的事情是我计算累积总和,然后将其除以直到那时的观察次数,这实际上是您想要的平均值的定义(运行 cumsum 和 @987654328 @分开看他们做了什么);之后我只是将它转换为您喜欢的形式 - 如果您想更多地转换它,只需在前面添加 2 个NA 并从尾部取出两个元素
  • 我还认为您可能需要在应用此之前仔细检查您的 DT 对象是否按时间正确排序。
【解决方案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

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2019-08-26
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多