我正在计算扩展窗口的标准偏差,在每个点我重新计算标准偏差。这似乎是一个相当简单的事情,应该相对较快。但是,它需要比你想象的要长很多(约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)
答案 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