dplyr скользящий изменить несколько столбцов на основе нескольких столбцов

Я пытаюсь объединить несколько вещей, используя dplyr: Учитывая, что у меня есть временной ряд многократных возвратов, я хочу вычислить среднюю корреляцию (я упростил мою реальную задачу, чтобы дать самый простой пример) всех возвращений со всеми другими возвращениями. Конечно (в отличие от примера ниже) мой реальный набор данных довольно большой (и еще не spread(stock,ret)) содержит несколько NA. Кроме того, на втором шаге я должен создать свою собственную функцию и предоставить ее для свертывания. Поэтому, если у вас есть предложение с использованием чего-то из пакета RCpproll, я был бы более чем счастлив!

В приведенном ниже примере вы можете видеть, что мне нужно ввести все столбцы одновременно, выбрать окно, применить функцию ко всем столбцам одновременно, получить вектор с одинаковым количеством столбцов и так далее...

Вот мой пример:

df <- data.frame(Date =as.Date("1926-01-01")+1:24,
             PERMNO1 = rnorm(24,0.01,0.3),
             PERMNO2 = rnorm(24,0.02,0.4),
             PERMNO2 = rnorm(24,-0.01,0.6))
df %>%
do(rollapplyr(.[,-1],width=12,function(a) colMeans(cor(a))))

Я хотел бы получить что-то вроде этого:

df2 <- df; df2[,2:4]<-NA
for (i in 12:24){
   df2[i,2:4] <- colMeans(cor(df[(i-12):i,2:4]))
}
df2
     Date    PERMNO1   PERMNO2 PERMNO2.1
1926-01-02         NA        NA        NA
1926-01-03         NA        NA        NA
1926-01-04         NA        NA        NA
1926-01-05         NA        NA        NA
1926-01-06         NA        NA        NA
1926-01-07         NA        NA        NA
1926-01-08         NA        NA        NA
1926-01-09         NA        NA        NA
1926-01-10         NA        NA        NA
1926-01-11         NA        NA        NA
1926-01-12         NA        NA        NA
1926-01-13 0.14701350 0.2001694 0.3787320
1926-01-14 0.15364347 0.2438042 0.3143516
1926-01-15 0.16118233 0.2549841 0.3266877
1926-01-16 0.04727533 0.2534126 0.3132990
1926-01-17 0.05220443 0.2411095 0.2744379
1926-01-18 0.12252848 0.2461743 0.2766122
1926-01-19 0.08414717 0.2287705 0.2897744
1926-01-20 0.11164866 0.2503174 0.2414130
1926-01-21 0.08886537 0.2604810 0.2621597
1926-01-22 0.14216304 0.2667540 0.2543573
1926-01-23 0.12654902 0.3086711 0.2751671
1926-01-24 0.11068607 0.3019835 0.2728166
1926-01-25 0.06714698 0.2696828 0.2184242

1 ответ

Решение

Преобразовать фрейм данных в объект зоопарка, запустить rollapplyr и конвертировать обратно:

library(dplyr)
library(zoo)

df %>%
   read.zoo %>%
   rollapplyr(12, function(x) colMeans(cor(x)), by.column = FALSE, fill = NA) %>%
   fortify.zoo

Последняя строка может быть опущена, если вы хотите просто сохранить ответ в виде объекта зоопарка, что, вероятно, будет более удобным, чем представление временного ряда в качестве фрейма данных.

Другие вопросы по тегам