【发布时间】:2013-11-22 13:16:50
【问题描述】:
我正在处理一个不平衡、不规则间隔的横截面时间序列。我的目标是获取“数量”向量的滞后移动平均向量,按“主题”分割。
换句话说,假设已对 Subject_1 观察到以下数量: [1,2,3,4,5]。我首先需要将其滞后 1,得到 [NA,1,2,3,4]。
然后我需要取 3 阶的移动平均线,得到 [NA,NA,NA,(3+2+1)/3,(4+3+2)/3]
以上所有科目都需要完成。
# Construct example balanced panel DF
panel <- data.frame(
as.factor(sort(rep(1:6,5))),
rep(1:5,6),
rnorm(30)
)
colnames(panel)<- c("Subject","Day","Quantity")
#Make panel DF unbalanced
panelUNB <- subset(panel,as.numeric(Subject)!= Day)
panelUNB <- panelUNB[-c(15,16),]
如果面板是平衡的,我将首先使用包plm 和函数lag 滞后“数量”变量。
然后我会像这样使用包zoo中的函数rollmean来获取滞后“数量”的移动平均值:
panel$QuantityMA <- ave(panel$Quantity, panel$Subject, FUN = function(x) rollmean(
x,3,align="right",fill=NA,na.rm=TRUE))
这将在应用于平衡“面板”DF 时产生正确的结果。
问题在于 plm 和 lag 依赖于均匀分布的系列来生成索引变量,而 rollapply 要求所有对象的观察次数(窗口大小)相等。
StackExchange 上有一个带有 data.table 的解决方案,它暗示了我的问题的解决方案:Producing a rolling average of an unbalanced panel data set
也许可以修改此解决方案以生成固定长度的移动平均线,而不是“滚动累积平均线”。
【问题讨论】:
标签: r data.table plyr panel-data split-apply-combine