多个滚动分位数的高效计算
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
函数。它完成工作非常快。
根据其他一些计算,我得到了一个包含 ~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
函数。它完成工作非常快。