计算从第20行开始的滚动标准偏差

时间:2016-07-08 02:35:04

标签: r

我有各种列的数据框。我需要计算特定列Spread的标准偏差。标准偏差应出现在另一栏中。

标准偏差应从第20行开始计算,直到数据框的最后一行。这意味着第20行的标准偏差应该是前20个值的标准偏差。在第21行,标准偏差应该是第2行到第21行的数据,依此类推。

虽然有很多关于标准偏差计算的帖子,但我找不到与我相关的帖子。谢谢你的帮助。

4 个答案:

答案 0 :(得分:5)

使用rollapply

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

答案 1 :(得分: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)

这会将rollingSD应用于窗口大小为20的列Spread,并将结果保存到新列sd

答案 2 :(得分:2)

我们可以使用roll_sd中的RcppRoll(来自@ ZheyuanLi的帖子的数据)

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

答案 3 :(得分:1)

这是一个使用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