R 时间框架索引中的 Rollapply

Rollapply in R time frame indexing

假设我有以下系列数据框。

library(zoo)
n=10
date = as.Date(1:n);date
y = rnorm(10);y
dat = data.frame(date,y)
dat

         date           y
1  1970-01-02 -0.02052313
2  1970-01-03  0.28255304
3  1970-01-04 -0.10718621
4  1970-01-05 -1.19299366
5  1970-01-06  1.17072468
6  1970-01-07  0.55849119
7  1970-01-08  0.30474050
8  1970-01-09 -0.30777180
9  1970-01-10 -0.01874367
10 1970-01-11 -0.74233556

计算宽度(滚动 window)为 3 天的滚动标准偏差,我做:

a = zoo::rollapply(dat$y,3,sd)

结果:

       2         3         4         5         6 
1.7924102 0.4189522 0.4599979 0.4164408 0.3786601 
        7         8         9 
0.9481849 0.7048868 0.2494578 

并找出最大标准偏差

max(a)
1.79241

现在我想知道这个最大值指的是 3 天间隔的哪个时间 to.How 我可以这样做吗?假设我的系列是20年,所以我想求出这20年的最大标准差,并提取出具体的3天时间间隔。

根据 OP 对工作日的澄清进行了更新,以名义方式包括错过周末的日期向量(我没有检查这些日期是否是真正的周末,目的是错过周末的日期).

set.seed(123)

n = 10

date = as.Date(c(1, 4:8, 11:14), origin = "1970-01-01")

y = rnorm(10)

dat = data.frame(date ,y)

roll_win <- 3

dat$a = c(rep(NA_real_, roll_win - 1), zoo::rollapply(dat$y, roll_win ,sd))

dat <- subset(dat, !is.na(a))

dat_max <- dat[dat$a == max(dat$a, na.rm = TRUE), ]

dat_max$date_start <- dat$date[which(dat$a == max(dat$a, na.rm = TRUE)) - (roll_win - 1)]

dat_max
#>         date         y        a date_start
#> 8 1970-01-13 -1.265061 1.496275 1970-01-09

reprex package (v2.0.1)

创建于 2022-02-22

在居中的情况下window,你可以这样做:

step = (3-1)/2
wmax = which.max(a)
int = (wmax - step):(wmax + step)
dat[int[int > 0],] #Avoids error when wmax < step.

#         date          y
# 1 1970-01-02 -0.6264538
# 2 1970-01-03  0.1836433
# 3 1970-01-04 -0.8356286
#Data
library(zoo)
set.seed(1)
n=10
date = as.Date(1:n)
y = rnorm(10)
dat = data.frame(date,y)
dat

a = rollapply(dat$y,3,sd)