重置cumprod功能

时间:2019-06-21 22:37:26

标签: r zoo rolling-computation

我正在尝试创建一个函数来计算滚动cumprod。该功能必须允许滑动窗口。我得到了以下数据:

set.seed(1)
library(zoo)
test1 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(1:12,3),outcome1=rep(cumprod(1:12),3))
test2 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(rnorm(36)))
test2[,outcome2:=c(NA,NA,cumprod(test2$a[3:8]),rep(NA,6),cumprod(test2$a[15:20]),rep(NA,6),cumprod(test2$a[27:32]),rep(NA,4))]

test1仅计算12个月内的cumprod,然后再次计算,以此类推,以说明没有滑动窗口的想法。 test2显示了预期的计算:从示例3月到8月的cumprod,然后是6个月的空白窗口,然后在明年3月开始下一次计算。

前一段时间,我尝试创建一个解决方案,该解决方案可以手动计算相当大的数据集的起点和终点,但是循环内的函数太慢/不可行。我相信使用zoo可以更快。我正在测试以下内容:

rollapply(c(1:12,1:12), width = 12, prod, partial = TRUE, align = "right")

..但是到目前为止,在12个月后仍无法正确重置。另外,无法在rollapply中添加带有by的窗口。任何提示表示赞赏!

请注意,我的完整数据集并非总是从一月份开始,因此建立索引并不是那么容易。我想避免在这里使用面板以保持简单。

1 个答案:

答案 0 :(得分:1)

如果ym是yearmon向量,则as.integer(ym)是年份,而cycle(ym)是月份数,因此:

test1[, out := cumprod(a), by = as.integer(time)] 

test2[, out := cumprod(ifelse(cycle(time) %in% 3:8, a, NA)), 
  by = .(as.integer(time), cycle(time) %in% 3:8)]