gpt4 book ai didi

r - 是什么让 rollmean 比 rollapply 更快(代码方面)?

转载 作者:行者123 更新时间:2023-12-02 03:06:59 27 4
gpt4 key购买 nike

我经常发现时间序列的滚动事物(特别是指),并惊讶地发现 rollmean明显比 rollapply 快,并且 align = 'right'方法比 rollmeanr 更快 wrapper 。

他们是如何实现这种速度的?为什么在使用 rollmeanr() 时会丢失一些它? wrapper ?

一些背景:我一直在使用rollapplyr(x, n, function(X) mean(X)) ,但是我最近偶然发现了一些使用 rollmean 的示例。文件建议rollapplyr(x, n, mean) (注意没有参数的 function 部分)使用 rollmean所以我认为性能不会有太大差异,但是rbenchmark揭示了显着差异。

require(zoo)
require(rbenchmark)

x <- rnorm(1e4)
r1 <- function() rollapplyr(x, 3, mean) # uses rollmean
r2 <- function() rollapplyr(x, 3, function(x) mean(x))
r3 <- function() rollmean(x, 3, na.pad = TRUE, align = 'right')
r4 <- function() rollmeanr(x, 3, align = "right")

bb <- benchmark(r1(), r2(), r3(), r4(),
columns = c('test', 'elapsed', 'relative'),
replications = 100,
order = 'elapsed')

print(bb)

我惊讶地发现rollmean(x, n, align = 'right')速度明显更快,比我的 rollapply(x, n, function(X) mean(X)) 快约 40 倍方法。

  test elapsed relative
3 r3() 0.74 1.000
4 r4() 0.86 1.162
1 r1() 0.98 1.324
2 r2() 27.53 37.203

随着数据集大小的增加,差异似乎会变得更大。我只改变了 x 的大小(到 rnorm(1e5) )在上面的代码中并重新运行测试,函数之间存在更大的差异。

  test elapsed relative
3 r3() 13.33 1.000
4 r4() 17.43 1.308
1 r1() 19.83 1.488
2 r2() 279.47 20.965

以及 x <- rnorm(1e6)

  test elapsed relative
3 r3() 44.23 1.000
4 r4() 54.30 1.228
1 r1() 65.30 1.476
2 r2() 2473.35 55.920

他们是如何做到这一点的?另外,这是最优解吗?当然,这很快,但是有没有更快的方法来做到这一点?

(注意:一般来说,我的时间序列几乎总是 xts 对象 - 这有关系吗?)

最佳答案

计算滚动平均值比计算一般滚动函数更快,因为第一个更容易计算。计算一般滚动函数时,您必须一次又一次地计算每个窗口上的函数,而对于 mean 则不必执行此操作,因为其简单恒等式:

 (a2 + a3 + ... + an)/(n-1) = (a1 + a2 + ... + a(n-1))/(n-1) + (an - a1)/(n-1)

您可以通过查看 getAnywhere(rollmean.zoo) 了解如何利用它。

如果您想要更快的滚动平均值,请使用 caTools 中的 runmean,它是用 C 实现的,使其速度更快(它的扩展性也更好,因此会得到随着数据大小的增加甚至更快)。

library(microbenchmark)
library(caTools)
library(zoo)

x = rnorm(1e4)
microbenchmark(runmean(x, 3, endrule = 'trim', align = 'right'),
rollmean(x, 3, align = 'right'))
#Unit: microseconds
# expr min lq median uq max neval
# runmean(x, 3, endrule = "trim", align = "right") 631.061 740.0775 847.5915 1020.048 1652.109 100
# rollmean(x, 3, align = "right") 7308.947 9155.7155 10627.0210 12760.439 16919.092 100

关于r - 是什么让 rollmean 比 rollapply 更快(代码方面)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113323/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com