使用 rollaply 计算不同开始日期的滚动 mean/standard 偏差

Compute rolling mean/standard deviation with different start date with rollaply

zoo 包中的 rollaply 函数是否有 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 参数执行它。

创建一个函数,它接受 data.frame 的一列和起始位置向量的一个元素,对子集数据执行 rollapply,反转序列并将其转换为动物园。使用 Map 将其应用于给出动物园系列列表的数据。 cbind on zoo series 将在每个末尾插入 NAs 所以我们剩下的就是将它们反转并将它们转换为 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(...) 使问题中的代码可重现。