使用不同的开始日期计算不同开始日期的滚动平均值/标准偏差

时间:2015-02-18 11:02:17

标签: r xts zoo

rollaply包中的zoo函数是否有 start 参数?我想计算数据框的列标准偏差,但每列的起始日期不同。

如何计算大型数据框的标准偏差:

library(zoo)
dat <- data.frame(cbind(runif(120),runif(120)))
StDev <-rollapply(dat,12,sd,by=12,na.rm=T,by.column=TRUE, align='right',fill=c(NULL,NULL,NULL))

我想让rollaply从数据框的不同行开始,但像这样硬编码需要很长时间:

SD1 <-rollapply(dat$X1[1:120],12,sd,by=12,na.rm=T, align='right',fill=c(NULL,NULL,NULL)) #start at the first row
SD2 <-rollapply(dat$X1[12:120],12,sd,by=12,na.rm=T, align='right',fill=c(NULL,NULL,NULL)) #start at the 12th row

StDev <-cbind(SD1,c(NA,SD2))

> StDev_desired 
       SD1          SD2
  [1,] 0.2717607        NA
  [2,] 0.2848454 0.2869931
  [3,] 0.3024353 0.3036127
  [4,] 0.1919298 0.1954726
  [5,] 0.3427318 0.3097042
  [6,] 0.3513110 0.3468135
  [7,] 0.3205552 0.3485802
  [8,] 0.2594149 0.2575002
  [9,] 0.3159097 0.3095329
  [10,] 0.2967858 0.2786670

我希望能够将带有起始行的向量传递给滚动函数。我可能首先对齐我的数据集(在列中移动观察结果我希望滚动函数比其余部分更晚开始)但我想知道是否有更新的选择。

在stata中,-rolling-函数作为执行它的start参数。

1 个答案:

答案 0 :(得分:1)

创建一个函数,它接受data.frame的列和起始位置向量的一个元素,对子集化数据执行rollapply,反转系列并将其转换为zoo。使用Map将其应用于给出动物园系列列表的数据。动物园系列中的cbind会在每个结尾处插入NA,所以我们剩下的就是将它们反转并将它们转换为data.frame:

roll <- function(x, st) {
  zoo(rev(rollapplyr(x[st:length(x)], 12, sd, na.rm = TRUE, by = 12, fill = NULL)))
}

st <- c(1, 12)
m <- do.call(cbind, Map(roll, dat, st))
data.frame(lapply(as.list(m), rev), check.names = FALSE)

下次请使用set.seed(...)使问题中的代码重现。