2013-02-17 173 views
0

我想計算R中時間序列上任何類型的「移動統計量」,超出移動平均值。例如,我將如何計算長度爲3的時間窗口上的移動標準偏差?在R中移動標準差

我已經試過如下:

#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給所有NAS的向量),但我不再試圖解決最後一個問題因爲它似乎不必要的複雜。任何問題的優雅解決方案?

+2

你問的最後一個問題 - http://stackoverflow.com/questions/14926572/moving-average-with-varying-time-window-in-r - (你沒有標記答案,我可能會添加)將你指向'zoo'庫,這對於這些事情是有用的。請在發佈之前仔細閱讀並進行搜索 - 您會發現像這樣的問題:http://stackoverflow.com/questions/13195442/moving-variance-in-r/13195632#13195632 – thelatemail 2013-02-17 23:05:06

+0

Gavin鏈接提供的答案指向由thelatemail正確回答你的問題(以及少量的工作,你今天早些時候的問題的答案,也是由電郵指出的):'rollapply(vec,width = 3,FUN = sd)' – Arun 2013-02-17 23:31:29

+1

對不起。我確實做了一些搜索。我想我會刪除我的問題。 – cwarny 2013-02-18 15:29:25

回答

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

+0

好的,我會放棄這一點,但實際上,在OQ的評論中提到的rollapply函數幾乎是等價的,只是你不需要做任何工作。我覺得我好笨。 – Gijs 2013-02-17 23:29:33

+0

我正要寫:或'rollapply(..)'。儘管如此,它回答了OP的問題。只有一個建議:你可能想要預先分配'結果'。也許你應該用'sd'替換'mean',因爲它會直接回答OP的queston。 – Arun 2013-02-17 23:32:32

+0

我應該如何預先分配? – Gijs 2013-02-18 00:00:36