2014-08-31 80 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