私は定期的に時系列 (特に手段) のローリングを見つけて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
オブジェクトです。これは問題ですか?)