Применение функций w.r.t. календарные дни в R - PullRequest
0 голосов
/ 04 июля 2018

У меня есть ежедневные (финансовые) временные ряды. Поскольку каждый месяц не заканчивается 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 голосов
/ 05 июля 2018

Если вы хотите ковариации каждый месяц, вы можете сделать что-то вроде следующего. Ключ к 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, как указано выше.

Данные.

В отличие от вопроса, я установил семя ГСЧ.

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))
...