令人惊讶的是,R的标准偏差很慢

时间:2011-09-19 17:36:35

标签: r

我正在计算扩展窗口的标准偏差,在每个点我重新计算标准偏差。这似乎是一个相当简单的事情,应该相对较快。但是,它需要比你想象的要长很多(约45秒)。我在这里错过了什么吗?在Matlab中,这非常快。

t0 <- proc.time()[[3]]
z <- rep(0, 7000)
x <- rnorm(8000)
for(i in 1000:8000){
##    print(i)
    z[i] <- sd(x[1:i])
}
print(proc.time()[[3]]- t0)

3 个答案:

答案 0 :(得分:8)

您也可以尝试一种算法来更新标准偏差(实际上,与平均值的差异平方和)。在我的系统上,这将时间从大约0.8秒减少到大约0.002秒。

n <- length(x)
m <- cumsum(x)/(1:n)
m1 <- c(NA,m[1:(n-1)])
ssd <- (x-m)*(x-m1)
v <- c(0,cumsum(ssd[-1])/(1:(n-1)))
z <- sqrt(v)

有关详细信息,请参阅http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

另请参阅此问题的答案:Efficient calculation of matrix cumulative standard deviation in r

答案 1 :(得分:5)

编辑修复了一些拼写错误,抱歉。

我的机器需要大约1.3秒:

t0 <- proc.time()[[3]]
x <- rnorm(8000)
z <- sapply(1000:8000,function(y){sd(x[seq_len(y)])})
print(proc.time()[[3]]- t0)

我愿意打赌有更快的方法可以做到这一点。避免使用明确的for循环!

答案 2 :(得分:0)

几天前,当rhelp出现一个关于累积方差和累积驱动峰度操作的类似问题时,我提供了以下内容:

daily <- rnorm(1000000)
mbar <- mean(daily)
cumvar <-  cumsum( (daily-cumsum(daily)/1:length(daily) )^2)
cumskew <- cumsum( (daily-cumsum(daily)/1:length(daily))^3)/cumvar^(3/2)

它肯定比sapply方法快,但可能与Aaron相当。

 system.time( cumvar <-  cumsum( (daily-cumsum(daily)/1:length(daily) )^2) )
   user  system elapsed 
  0.037   0.026   0.061 
 system.time(cumsd <- sqrt(cumvar) )
   user  system elapsed 
  0.009   0.005   0.013