移动R中的标准偏差

时间:2013-02-17 22:59:44

标签: r

我想在R中的时间序列上计算任何类型的“移动统计量”,超出移动平均值。例如,如何在长度为3的时间窗口上计算移动标准偏差?

我尝试了以下内容:

#example data
x <- c(3,9,2,8,4,6,5,8)
#moving standard deviation over a time window of length 3
msd3 <- (cumsum(x^2)-cumsum(Lag(x^2,3)))/((1:length(x))-(Lag(1:length(x),3)))-((cumsum(x)-cumsum(Lag(x,3)))/((1:length(x))-(Lag(1:length(x),3))))^2

但它不仅不起作用(因为滞后向量的cumsum给出了所有NA的向量),但我不再尝试解决最后一个问题,因为它似乎不必要地复杂化。对这个问题有任何优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

我会编写一个单独的函数来处理这个问题,只是为了让它变得简单。例如:

lag_apply <- function(x, n, callback){
    k = length(x);
    result = rep(0, k);
    for(i in 1 : (k - n + 1)){
        result[i] <- callback(x[i :  (i + n -1)]);
    }    
    return(result);
}

> x 
   [1] 2 3 4 5 6 2 2 3 3 4 4
> lag_apply(x, 2, function(x){mean(x)})
   [1] 2.5 3.5 4.5 5.5 4.0 2.0 2.5 3.0 3.5 4.0
> lag_apply(x, 2, function(x){sd(x)})
   [1] 0.7071068 0.7071068 0.7071068 0.7071068 2.8284271 0.0000000 0.7071068 0.0000000 0.7071068 [10] 0.0000000

现在,您可以将此功能用于您可以想到的任何“滞后”回调。它传递了x的部分作为长度n的向量。