【问题标题】:Efficient calculation of multiple rolling quantiles多个滚动分位数的高效计算
【发布时间】:2021-09-23 07:52:43
【问题描述】:

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

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

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 中更省时的实现。

【问题讨论】:

  • 您是在寻找精确的解决方案还是近似值也可以?
  • @user2974951 我正在寻找确切的解决方案。但是你会如何用一个近似值来做呢?

标签: r performance rolling-computation quantile processing-efficiency


【解决方案1】:

我刚刚从caTools 包中找到了runquantile 函数。它的工作速度非常快。

【讨论】:

    【解决方案2】:

    你可以使用 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)
    

    【讨论】:

    • 非常感谢您的解决方案。但是,对较短向量的基准测试表明,我的循环解决方案需要同样长的时间。
    • 你试过rollapply吗? res
    • 没有,没试过。但现在我做到了 - 不幸的是仍然那么慢......
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多