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)
假设我有以下系列数据框。
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)