应用功能R中的日历天

时间:2018-07-04 11:51:29

标签: r dataframe calendar apply covariance

我有每日(财务)时间序列。由于每个月都不会在30号或31号结束,因此使用apply函数给我自己造成了问题。使用每月的时间序列,我可以只指定每个n'th个月。但是,如何指定每个n'th月的每日系列。

假设我设置了此日期数据:

dates <- seq(as.Date("2000-01-01"), length = 1000, by = "days")

data <- cbind(rnorm(1000, mean = 0.01, sd = 0.001),
              rnorm(1000, mean = 0.01, sd = 0.001),
              rnorm(1000, mean = 0.01, sd = 0.001))

特别是,我想每个n'th月运行协方差矩阵,类似于:

cov.fixed <- lapply(as.data.frame(t(rollapply(1:nrow(data), 90, c))),
 function(i) cov(data[i,]))

但是可以代替90那样写每个3rd month以便考虑日历天吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

如果每个月都需要协方差,则可以执行以下操作。关键是通过split month来建立矩阵。

library(zoo)

month <- as.yearmon(dates)

cov.month <- lapply(split(as.data.frame(data), month), cov)

names(cov.month) <- sub(" ", "_", names(cov.month))
cov.month$Jan_2000
#             V1           V2           V3
#V1 7.825062e-07 7.063689e-08 9.561721e-08
#V2 7.063689e-08 8.989207e-07 1.293351e-07
#V3 9.561721e-08 1.293351e-07 1.175318e-06

cov.month[[1]]    # The same

就四分之一而言,代码是相似的,只是用as.yearqtr代替as.yearmon

quarter <- as.yearqtr(dates)
cov.quarter <- lapply(split(as.data.frame(data), quarter), cov)

然后使用sub来命名更好的名称,不要使用空格。

数据。

与问题不同,我已经设置了RNG种子。

set.seed(3658)    # Make the results reproducible
data <- cbind(rnorm(1000, mean = 0.01, sd = 0.001),
              rnorm(1000, mean = 0.01, sd = 0.001),
              rnorm(1000, mean = 0.01, sd = 0.001))