Скользящая корреляция с «сгруппированными» - ошибка: неверное количество измерений - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь рассчитать скользящие корреляции с пятилетним окном на основе ежедневных данных о запасах. Мой фрейм данных test состоит из 20 столбцов, причем "logRet3" находится в столбце № 17 и "logMarRet3" в № 18. Я хочу рассчитать соотношение этих двух показателей возврата.

Что затрудняет, так это то, что я хочу, чтобы скользящая корреляция была сгруппирована по моему показателю доли "PERMNO" в столбце № 1. Под этим я подразумеваю, что скользящая корреляция «перезапускается» всякий раз, когда заканчиваются данные временных рядов конкретного запаса.

В ходе исследования я придумал следующий код, используя пакеты dplyr, zoo и magrittr:

test <- test %>% 
  group_by(PERMNO) %>% 
  mutate(CorSecMar = zoo::rollapply(test, width = 1255, function(x) cor(x[,logRet3], x[,logMarRet3]), fill = NA, align = "right"))

Однако, когда я запускаю этот код, я получаю следующую ошибку:

Error in x[,logMarRet3]: Incorrect number of dimensions

Будучи новичком, я попытался настроить код, удалив ,:

test <- test %>% 
  group_by(PERMNO) %>% 
  mutate(CorSecMar = zoo::rollapply(test, width = 1255, function(x) cor(x[logRet3], x[logMarRet3]), fill = NA, align = "right"))

, приводящий к следующей ошибке (перевод на английский):

Error in x[logMarRet3]: Only zeros are allowed to be mixed with negative indices

Любая помощь в том, как исправить эти ошибки или альтернативные способы расчета скользящей корреляции по группам, будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Спасибо Г. Гротендик за то, что указал на некоторые недостатки в моем вопросе. Я имею в виду его ответ для воспроизводимого ввода и учту это для дальнейших сообщений.

1 Ответ

1 голос
/ 22 мая 2019

Существует несколько проблем:

  • rollapply применяется к каждому столбцу отдельно, если не используется by.column = FALSE.

  • с использованием test в пределах group_by не приведет к подмножеству test.Это будет относиться ко всему набору данных.Вместо этого используйте отдельные имена столбцов.

  • имена столбцов в коде в вопросе должны иметь кавычки вокруг них;в противном случае он говорит, что есть переменные этих имен, содержащие имена столбцов.

  • при публикации в SO необходимо свести проблему к полному воспроизводимому примеру и опубликовать его.Я сделал это на этот раз для вас в примечании в конце.

Применительно к примечанию используйте этот код:

library(dplyr)
library(zoo)

mycor <- function(x) cor(x[, 1], x[, 2])
DF %>%
  group_by(stock) %>%
  mutate(Cor = rollapplyr(cbind(a, b), 4, mycor, by.column = FALSE, fill = NA)) %>%
  ungroup

или этот код, которыйиспользует только зоопарк.mycor сверху.

library(zoo)

n <- nrow(DF)
roll <- function(i) rollapplyr(DF[i, c("a", "b")], 4, mycor, by.column = FALSE, fill = NA)
transform(DF, Cor = ave(1:n, stock, FUN = roll))

Примечание

Вход в воспроизводимой форме:

DF <- data.frame(stock = rep(LETTERS[1:2], each = 6), a = 1:6, b = (1:6)^3)
...