2013-02-17 175 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