多个滚动分位数的高效计算

Efficient calculation of multiple rolling quantiles

根据其他一些计算,我得到了一个包含 ~4500000 个条目的长向量 (vec)。现在我想计算滚动 period = 1000 的第 5、25、50、75 和 95 分位数,即我想从 vec 中的第 1 到第 1000 个元素获取这些分位数,然后vec 中的第 2 到第 1001 个元素,等等

这是一些示例代码以及我将如何解决该问题:

vec <- rnorm(4500000) #create sample data
res <- matrix(nrow=length(vec), ncol=5)
period = 1000
for (i in period:length(vec)) {
  res[i,] <- quantile(vec[(i-period+1):i], p=c(0.05, 0.25, 0.5, 0.75, 0.95))
}

(虽然我使用rnorm创建示例数据,但我的数据不是正态分布的,标准差不是常数!)

但是,这个实现需要相当长的时间。因此,我正在寻找 R 中更省时的实现。

您可以使用 sapply 函数:

res <- sapply(period:(length(vec)), function(x) quantile(vec[(x-period+1):x], p=c(0.05, 0.25, 0.5, 0.75, 0.95)))
res <- t(res)

我刚从 caTools 包中找到 runquantile 函数。它完成工作非常快。