在时间序列的每个向量上滚动应用不同的滚动 window
Rollapply with different rolling window on each vector of time series
假设您有 3 个不同大小的时间序列向量:
xdate = seq(as.Date("2010/1/1"), by = "day", length.out = 2789)
ydate = seq(as.Date("2010/1/1"), by = "day", length.out = 1289)
zdate = seq(as.Date("2010/1/1"), by = "day", length.out = 2245)
xf = as.factor(rep("x",2789))
yf = as.factor(rep("y",1289))
zf = as.factor(rep("z",2245))
x = rnorm(2789)
y = rnorm(1289)
z = rnorm(2245)
date = c(xdate,ydate,zdate)
value = c(x,y,z)
fact = c(xf,yf,zf)
library(tidyverse)
library(quantmod)
dat = tibble(date = as.Date(date),fact,value);head(dat)
结果:
# A tibble: 6 x 3
date fact value
<date> <fct> <dbl>
1 2010-01-01 x 1.15
2 2010-01-02 x -0.830
3 2010-01-03 x -1.93
4 2010-01-04 x -0.957
5 2010-01-05 x -0.174
6 2010-01-06 x 0.288
现在您看到的每个时间序列都有不同的长度。我想在 R 中使用不同滚动 windows 的 rollapply 函数滚动计算。滚动window必须是每个向量的大小减去252。
YEAR = 252
dat%>%
group_by(fact)%>%
summarise(ROLL=n()-YEAR)
# A tibble: 3 x 2
fact ROLL
<fct> <dbl>
1 x 2537
2 y 1037
3 z 1993
我想问的是,x 的滚动 window 是 2537,y 1037 和 z 1993。
是否可以在包含 rollapply 函数的 dplyr 管道中以某种方式组合?
单独地,如果我在每个矢量上进行每个滚动 window 很容易,但想象一下,如果我有 200 个矢量,那将很困难。
有帮助吗?
1) 转换为广式动物园对象 z,然后转换为动物园对象列表 L,每列 z 一个,对 L 的每个组件应用 rollfun,创建一个动物园对象列表,然后合并回宽格式动物园对象 zroll 并使用它或选择转换为长格式数据框 droll。
library(zoo)
z <- read.zoo(dat, split = "fact")
L <- as.list(z)
rollfun <- function(x) rollapplyr(x, length(na.omit(x)) - 252, mean)
zroll <- do.call("merge", Map(rollfun, L))
droll <- fortify.zoo(zroll, melt = TRUE)
2)这也可以表示为rollfun来自上方的管道
droll2 <- dat |>
read.zoo(split = "fact") |>
as.list() |>
Map(f = rollfun) |>
do.call(what = "merge") |>
fortify.zoo(melt = TRUE)
3) 与 dplyr
library(dplyr, exclude = c("lag", "filter"))
library(zoo)
dat %>%
group_by(fact) %>%
mutate(roll = rollapplyr(value, n() - 252, mean, fill = NA)) %>%
ungroup
假设您有 3 个不同大小的时间序列向量:
xdate = seq(as.Date("2010/1/1"), by = "day", length.out = 2789)
ydate = seq(as.Date("2010/1/1"), by = "day", length.out = 1289)
zdate = seq(as.Date("2010/1/1"), by = "day", length.out = 2245)
xf = as.factor(rep("x",2789))
yf = as.factor(rep("y",1289))
zf = as.factor(rep("z",2245))
x = rnorm(2789)
y = rnorm(1289)
z = rnorm(2245)
date = c(xdate,ydate,zdate)
value = c(x,y,z)
fact = c(xf,yf,zf)
library(tidyverse)
library(quantmod)
dat = tibble(date = as.Date(date),fact,value);head(dat)
结果:
# A tibble: 6 x 3
date fact value
<date> <fct> <dbl>
1 2010-01-01 x 1.15
2 2010-01-02 x -0.830
3 2010-01-03 x -1.93
4 2010-01-04 x -0.957
5 2010-01-05 x -0.174
6 2010-01-06 x 0.288
现在您看到的每个时间序列都有不同的长度。我想在 R 中使用不同滚动 windows 的 rollapply 函数滚动计算。滚动window必须是每个向量的大小减去252。
YEAR = 252
dat%>%
group_by(fact)%>%
summarise(ROLL=n()-YEAR)
# A tibble: 3 x 2
fact ROLL
<fct> <dbl>
1 x 2537
2 y 1037
3 z 1993
我想问的是,x 的滚动 window 是 2537,y 1037 和 z 1993。
是否可以在包含 rollapply 函数的 dplyr 管道中以某种方式组合?
单独地,如果我在每个矢量上进行每个滚动 window 很容易,但想象一下,如果我有 200 个矢量,那将很困难。
有帮助吗?
1) 转换为广式动物园对象 z,然后转换为动物园对象列表 L,每列 z 一个,对 L 的每个组件应用 rollfun,创建一个动物园对象列表,然后合并回宽格式动物园对象 zroll 并使用它或选择转换为长格式数据框 droll。
library(zoo)
z <- read.zoo(dat, split = "fact")
L <- as.list(z)
rollfun <- function(x) rollapplyr(x, length(na.omit(x)) - 252, mean)
zroll <- do.call("merge", Map(rollfun, L))
droll <- fortify.zoo(zroll, melt = TRUE)
2)这也可以表示为rollfun来自上方的管道
droll2 <- dat |>
read.zoo(split = "fact") |>
as.list() |>
Map(f = rollfun) |>
do.call(what = "merge") |>
fortify.zoo(melt = TRUE)
3) 与 dplyr
library(dplyr, exclude = c("lag", "filter"))
library(zoo)
dat %>%
group_by(fact) %>%
mutate(roll = rollapplyr(value, n() - 252, mean, fill = NA)) %>%
ungroup