Rollapply 在 R 中扩展 window

Rollapply with expanding window in R

假设我在 R 中有一个简单的玩具矢量,例如:

x = seq(1:10);x
 [1]  1  2  3  4  5  6  7  8  9 10

我想使用 zoo 包中的 rollapply 函数,但在不同的 way.Rollapply 中,从向量 x 中计算一个函数,其宽度参数是一个滚动 window.I 想要而不是滚动 expanding.There 是类似的问题 here and here 但他们没有帮助我解决我的问题。

例如,我想计算向量 x 的第一个观测值的总和,然后将 window 扩展 2。

我这样做了:

rollapplyr(x, seq_along(x) ,sum,by=2,partial = 5,fill=NA)
 [1] NA NA NA NA 15 21 28 36 45 55

或替换 NA 的

na.locf0(rollapplyr(x, 5 ,sum,by=2,partial = 5,fill=NA))
[1] NA NA NA NA 15 15 25 25 35 35

但我理想中想要的结果是:

 [1] NA NA NA NA 15 15 28 28 45 45

假设我的数据集很大(包含 2500 个时间序列观测值)并且函数是一些计量经济学统计模型,而不是像我在这里使用的求和那样简单的模型。

我该怎么做?有帮助吗?

x <- seq(10)

expandapply <- function(x, start, by, FUN){
  # set points to apply function up to
  checkpoints <- seq(start, length(x), by)
  # apply function to all windows
  vals <- sapply(checkpoints, function(i) FUN(x[seq(i)]))
  # fill in numeric vector at these points (assumes output is numeric)
  out <- replace(rep(NA_real_, length(x)), checkpoints, vals)
  # forward-fill the gaps
  zoo::na.locf(out, na.rm = FALSE)
}


expandapply(x, start = 5, by = 2, FUN = sum)
#>  [1] NA NA NA NA 15 15 28 28 45 45

reprex package (v2.0.1)

于 2022-03-13 创建

定义nonNA为不应该为NA的位置。您可以将 x 和 nonNA 更改为您需要的任何值。

然后为 w 分配一个宽度向量,使用零表示那些要为 NA 的分量。最后申请na.locf0.

(两种极端情况是,如果 nonNAseq_along(x),那么所有元素都不会被 NA 输出,那么这与 rollapplyr(x, seq_along(x), sum) 相同,如果 nonNAc() 所以没有 non-NAs 那么它 returns 都是 NA。)

library(zoo)

x <- 1:10
nonNA <- seq(5, length(x), 2)

w <- ifelse(seq_along(x) %in% nonNA, seq_along(x), 0)
na.locf0(rollapplyr(x, w, function(x) if (length(x)) sum(x) else NA, fill=NA))
##  [1] NA NA NA NA 15 15 28 28 45 45

另一种方法是为 rollapplywidth= 参数使用一个列表,其组件包含偏移量。 xnonNA来自上面。

L <- lapply(seq_along(x), function(x) if (x %in% nonNA) -seq(x-1, 0))
na.locf0(rollapplyr(x, L, sum, fill = NA))
##  [1] NA NA NA NA 15 15 28 28 45 45

更新

简化了解决方案并添加了第二种方法。