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

しかし、それが機能しないだけでなく (遅れたベクトルの累積がすべての 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 に答える