2014-08-31 81 views
0

滚动标准偏差我有时间序列数据帧,它看起来像为每5天中的R

2014-02-05 2014-02-06 2014-02-07 2014-02-12 2014-02-14 2014-02-17 2014-02-18 2014-02-19 ...... 
    0.0379 -0.0008  0.0352  0.0379  0.0392  0.0173  0.0360  0.0371 

我要计算每5天的数据从这个名单中R.移动标准差我的意思是我希望选择一个样本,例如sample1 [1] = 2014-02-05,0.0379,sample1 [2] = 2014-02-12,0.0379 .....然后找到std dev然后使用滚动标准偏差移动到下一个日期,即sample2 [1] = 2014-02-06,-0.0008,sample2 [2] = 2014-02-12,0.0379,然后找到此标准偏差列表等。由于可用日期不规则,我无法使用seq(1:1,by =)。在rollapply中,该函数将采用每个连续的数字来计算标准偏差。是否有办法以有效的方式从此列表中每隔5天对数据进行一次采样,或者以某种方式修改标准偏差函数,以便每隔5天选择一次数据,然后计算可用数据的标准偏差。任何有关这方面的建议将不胜感激。

+3

非常不清楚这个问题,它是...你能提供一些例子所需的输出为上面的设置? – 2014-08-31 11:25:35

+0

@ user3785531:我们将非常感谢您对答案的反馈意见。 – rnso 2014-09-01 00:56:23

回答

0

以下可能是有用的:

xx = structure(c(0.0379, -8e-04, 0.0352, 0.0379, 0.0392, 0.0173, 0.036, 
0.0371), .Names = c("2014-02-05", "2014-02-06", "2014-02-07", 
"2014-02-12", "2014-02-14", "2014-02-17", "2014-02-18", "2014-02-19" 
)) 

xx 
2014-02-05 2014-02-06 2014-02-07 2014-02-12 2014-02-14 2014-02-17 2014-02-18 2014-02-19 
    0.0379 -0.0008  0.0352  0.0379  0.0392  0.0173  0.0360  0.0371 
yy = as.numeric() 
for(i in 5:length(xx)){ 
    yy[i]= sd(xx[(i-4):i]) 
} 
yy 
[1]   NA   NA   NA   NA 0.017212408 0.017278108 0.008982038 0.009130991 

对于数据帧版本:

ddf = structure(list(date = structure(1:8, .Label = c("2014-02-05", 
"2014-02-06", "2014-02-07", "2014-02-12", "2014-02-14", "2014-02-17", 
"2014-02-18", "2014-02-19"), class = "factor"), value = c(0.0379, 
-8e-04, 0.0352, 0.0379, 0.0392, 0.0173, 0.036, 0.0371)), .Names = c("date", 
"value"), class = "data.frame", row.names = c(NA, -8L)) 


ddf 
     date value 
1 2014-02-05 0.0379 
2 2014-02-06 -0.0008 
3 2014-02-07 0.0352 
4 2014-02-12 0.0379 
5 2014-02-14 0.0392 
6 2014-02-17 0.0173 
7 2014-02-18 0.0360 
8 2014-02-19 0.0371 


ddf$rolling_sd=0 
for(i in 5:nrow(ddf)){ 
    ddf$rolling_sd[i]= sd(ddf$value[(i-4):i]) 
} 
ddf 
     date value rolling_sd 
1 2014-02-05 0.0379 0.000000000 
2 2014-02-06 -0.0008 0.000000000 
3 2014-02-07 0.0352 0.000000000 
4 2014-02-12 0.0379 0.000000000 
5 2014-02-14 0.0392 0.017212408 
6 2014-02-17 0.0173 0.017278108 
7 2014-02-18 0.0360 0.008982038 
8 2014-02-19 0.0371 0.009130991 
5

重述问题我假设你想填补缺失天,然后如果z所产生的系列计算如下

sd(c(z[1], z[6], z[11], z[16], z[21])) 
sd(c(z[2], z[7], z[12], z[17], z[22])) 
etc. 

但是o只保留那些在sample1中发现的sd。

如果这不是问题的意图,请通过进一步的解释并给出一个实际的输入和输出示例来阐明。

回答创建每日发车g和最终给予填补系列z以NAS与sample1填充合并。 (请注意,如果点的间隔大于4天,那么我们不会填补这些空白,因为这会涉及在SD中包含多次点)。然后使用rollapply来计算所需的sd只保留原始时间。

g <- zoo(, seq(start(sample1), end(sample1), "day")) 
z <- na.locf(merge(sample1, g), fromLast = TRUE, maxgap = 4) 
r <- rollapply(z, 21, function(x) sd(x[seq(1, 21, 5)]), align = "left") 
r[time(sample1)] 

注意rollapply声明可以替代地写成这样:

r <- rollapply(z, list(seq(0, length = 5, by = 5)), sd) 

因为width参数可以被指定为包含偏移向量的列表。

更新重新阅读问题后再次修改。还提供了替代rollapply表达式。

+0

绝对......这正是我所看到的。感谢您的建议。 – 2014-09-01 12:05:10