2012-11-02 18 views
2

我已經寫了cumsum功能,在那裏我將當前值之前乘以衰減因子以前總和的變化:矢量化功能:cumsum有衰減參數

decay <- function(x, decay=0.5){ 
    for (i in 2:length(x)){ 
    x[i] <- x[i] + decay*x[(i-1)] 
    } 
    return(x) 
} 

這裏有一個演示,使用二進制變量做出明確的效果:

set.seed(42) 
Events <- sample(0:1, 50, replace=TRUE, prob=c(.7, .3)) 
plot(decay(Events), type='l') 
points(Events) 

Rplot

編譯這個函數其加速了很多:

#Benchmark 
library(compiler) 
library(rbenchmark) 
cumsum_decayCOMP <- cmpfun(cumsum_decay) 
Events <- sample(0:1, 10000, replace=TRUE, prob=c(.7, .3)) 
benchmark(replications=rep(100, 1), 
      cumsum_decay(Events), 
      cumsum_decayCOMP(Events), 
      columns=c('test', 'elapsed', 'replications', 'relative')) 

         test elapsed replications relative 
1  cumsum_decay(Events) 3.28   100 6.979 
2 cumsum_decayCOMP(Events) 0.47   100 1.000 

但我懷疑矢量化將改善它甚至更多。有任何想法嗎?

回答

3

嘗試filter功能:

filter.decay <- function(x, decay=0.5) filter(x, decay, method = "recursive") 

這是非常快:

#      test elapsed replications relative 
# 1  cumsum_decay(Events) 4.83   100 19.32 
# 2 cumsum_decayCOMP(Events) 1.00   100  4.00 
# 3  filter.decay(Events) 0.25   100  1.00 
+0

那太好了,謝謝! – Zach

+2

小心點。 filter.decay返回一個ts對象。使用as.vector(...)使其與其他兩個函數的結果相同。您可以將as.vector(..)放入函數中。 – Bhas