我有各種列的數據框。我需要計算特定列的標準偏差Spread
。標準偏差應該出現在另一列。從第20行開始計算滾動標準偏差
標準差應該從第20行開始計算,直到數據幀的最後一行。這意味着第20行的標準偏差應該是前20個值的標準偏差。在第21行,標準差應該是從第2行到第21行的數據,依此類推。
雖然標準差的計算有很多帖子,但我找不到與我相關的帖子。謝謝你的幫助。
我有各種列的數據框。我需要計算特定列的標準偏差Spread
。標準偏差應該出現在另一列。從第20行開始計算滾動標準偏差
標準差應該從第20行開始計算,直到數據幀的最後一行。這意味着第20行的標準偏差應該是前20個值的標準偏差。在第21行,標準差應該是從第2行到第21行的數據,依此類推。
雖然標準差的計算有很多帖子,但我找不到與我相關的帖子。謝謝你的幫助。
有這個功能一展身手:
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)
這適用rollingSD
於Spread
列窗口大小20,並保存結果到一個新的列sd
。
這是一個使用for循環的簡單玩具示例。假設列a
在df
保存您的數據。我們計算前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
注意的是,在第一步驟中,我們添加兩個NAs
到b
;因爲前三個值的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
使用rollapply
功能zoo
包
library(zoo)
rollapply(data = dat$Spread,width=20,FUN=sd)
我們可以使用roll_sd
從RcppRoll
(來自@ 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