我经常发现时间序列的滚动事物(特别是意味着),并且惊讶地发现它rollmean
明显快于rollapply
,并且这些align = 'right'
方法比rollmeanr
包装器更快。
他们是如何实现这一速度的?为什么在使用rollmeanr()
包装器时会丢失一些?
一些背景:我一直在使用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
(to 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
对象——这有关系吗?)