2016-07-08 85 views
0

我有各種列的數據框。我需要計算特定列的標準偏差Spread。標準偏差應該出現在另一列。從第20行開始計算滾動標準偏差

標準差應該從第20行開始計算,直到數據幀的最後一行。這意味着第20行的標準偏差應該是前20個值的標準偏差。在第21行,標準差應該是從第2行到第21行的數據,依此類推。

雖然標準差的計算有很多帖子,但我找不到與我相關的帖子。謝謝你的幫助。

回答

3

有這個功能一展身手:

rollingSD <- function(x, h = 5) { 
    if (is.numeric(x) && length(x) >= h && h > 0) { 
    c(numeric(h-1), sapply(1:(length(x)-h+1), function(i) sd(x[i:(i+h-1)]))) 
    } 
    } 

它適用於輸入向量x滾動標準偏差,以及窗口大小h。在你的情況下,你應該通過h = 20

實驗

set.seed(0); r <- rnorm(10) 
# [1] 1.262954285 -0.326233361 1.329799263 1.272429321 0.414641434 
# [6] -1.539950042 -0.928567035 -0.294720447 -0.005767173 2.404653389 
rollingSD(r, h = 5) 
# [1] 0.0000000 0.0000000 0.0000000 0.0000000 0.7305264 1.2012939 1.2973930 
# [8] 1.1045270 0.7719939 1.5063519 

如果您的數據幀被稱爲dat,那麼這是你可以做什麼:

dat$sd <- rollingSD(dat$Spread, h = 20) 

這適用rollingSDSpread列窗口大小20,並保存結果到一個新的列sd

1

這是一個使用for循環的簡單玩具示例。假設列adf保存您的數據。我們計算前3個值的標準偏差,然後計算2到4等。您可以修改它以達到您的目的。然後,您可以將sd添加到您的數據框df中的新列。

a <- c(10,100,1000,10000,100000) 
df <- as.data.frame(a) 

b <- c(NA, NA) 
for (i in 3:NROW(df)){ 
    b <- c(b, sd(c(df$a[ c((i-2):i)])))} 
df$b <- b 

df 
#  a   b 
#1 1e+01   NA 
#2 1e+02   NA 
#3 1e+03 547.4486 
#4 1e+04 5474.4863 
#5 1e+05 54744.8628 

注意的是,在第一步驟中,我們添加兩個NAsb;因爲前三個值的sd在df的第3行。

或者,設置窗口大小w並在for loop中使用。現在,每次更改窗口大小時都不必修改整個腳本。

w = 3 
b <- c(rep(NA, w-1)) 
for (i in w:NROW(df)){ 
    b <- c(b, sd(c(df$a[ c((i-(w-1)):i)])))} 
df$b <- b 

您也可以製作一個功能。

roll_sd <- function(string, window){ 
b <- c(rep(NA, window-1)) 
for (i in window:NROW(df)){ 
    b <- c(b, sd(c(df$a[ c((i-(window-1)):i)])))} 
return(b)} 

嘗試使用玩具示例的函數。

roll_sd(df$a, 3) 
#[1]   NA   NA 547.4486 5474.4863 54744.8628 
3

使用rollapply功能zoo

library(zoo) 
rollapply(data = dat$Spread,width=20,FUN=sd) 
2

我們可以使用roll_sdRcppRoll(來自@ ZheyuanLi的POST數據)

library(RcppRoll) 
roll_sd(r, 5, fill=0, align = "right") 
#[1] 0.0000000 0.0000000 0.0000000 0.0000000 0.7305264 1.2012939 1.2973930 
#[8] 1.1045270 0.7719939 1.5063519