0

我想计算 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 的向量),而且我停止尝试解决最后一个问题,因为它看起来不必要地复杂。这个问题有什么优雅的解决方案吗?

4

1 回答 1

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 的向量。

于 2013-02-17T23:26:55.350 回答