我正在一个扩展窗口上计算标准偏差,在每个点我重新计算标准偏差。这似乎是一件相当简单的事情,应该相对较快。但是,它需要的时间比您想象的要长得多(约 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.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
关于r - R 中令人惊讶的缓慢标准偏差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7474943/