Матрица корреляции с фреймом данных, по дате - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть фрейм данных, который содержит столбцы фактора и столбец даты.Я ищу, чтобы выяснить наиболее эффективный способ расчета корреляции для каждой пары факторов для каждой даты.Вот пример рамки даты, с которой я работаю.

structure(list(MktDate = structure(c(17865, 17865, 17865, 17896, 
17896, 17896, 17927, 17927, 17927), class = "Date"), Var1 = c(1, 
2, 3, 1, 2, 3, 1, 2, 3), Var2 = c(3, 5, 2, 4, 3, 2, 1, 2, 5), 
    Var3 = c(8, 7, 6, 9, 8, 9, 5, 8, 7)), class = "data.frame", row.names = c(NA, 
-9L))

Я бы хотел, чтобы рамка даты была результатом в формате, аналогичном показанному ниже

MktDate,FactorPair,Correl
2018-11-30,Var1Var2,-.32733
2018-11-30,Var1Var3,-1
2018-11-30,Var2Var3,.3273
2018-12-31,Var1Var2,-1
...

Я предполагаю, что это может быть легко достигнуто с использованием некоторой формы dplyr и apply, но я не уверен, как это сделать без использования нескольких вложенных циклов.

Я заранее благодарен за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вот более обобщенное решение, которое вычисляет корреляцию для пар столбцов n.

library(reshape2)
library(dplyr)

#Original Data
df_og = data.frame(MktDate = structure(c(17865, 17865, 17865, 17896, 
                                         17896, 17896, 17927, 17927, 17927), class = "Date"),
                   Var1 = c(1, 2, 3, 1, 2, 3, 1, 2, 3),
                   Var2 = c(3, 5, 2, 4, 3, 2, 1, 2, 5),
                   Var3 = c(8, 7, 6, 9, 8, 9, 5, 8, 7))

#Dataframe to store result
df_result = data.frame(MktDate = unique(df_og$MktDate))

#Create pars of variables to eventually itterate over
combs = utils::combn(c("Var1","Var2","Var3"),2)%>%
  t()

#Convert to long format data frame and store elements in a vector for each date variable pair
df = df_og %>%
  melt(id.vars = "MktDate")%>%
  group_by(MktDate,variable)%>%
  summarise(val = list(value))%>%
  ungroup()

# Itterate over each combination
for(i in seq(1,nrow(combs))){
  combination = combs[i,] # Select the combination
  new_col_name = paste0(combination,collapse = "") #Define the new column name
  df_result = df %>%
    filter(variable %in% combination)%>% #Select only the variables in this combination
    dcast(MktDate~variable)%>% #Convert back into "fat" formation
    group_by(MktDate)%>% #This resets the row names
    mutate_(.dots = setNames(
      paste0("cor(unlist(",combination[1],"),unlist(",combination[2],"))"),
      new_col_name))%>% # Compute the correlation
    ungroup()%>%
    select_(.dots = c("MktDate",new_col_name))%>%
    inner_join(df_result,by = "MktDate") #Join with the result dataframe
}

# If required convert it back into a long format
df_result = df_result%>%
  melt(id.vars = "MktDate")%>%
  arrange(MktDate)

Преимущество этого фрагмента кода в том, что он гибкий.Вы можете добавить новый «Var4, Var5, Var6», и вам нужно будет только указать новые имена столбцов в combn.combn вычисляет каждую пару переменных, а оставшийся код вычисляет корреляцию между этими парами.

0 голосов
/ 14 февраля 2019

Я создал столбец для объединения повторений, если они не все тройные, вам нужно это настроить.

library(reshape)
df<-structure(list(MktDate = structure(c(17865, 17865, 17865, 17896, 
              17896, 17896, 17927, 17927, 17927), class = "Date"), Var1 = c(1, 2, 3, 1, 2, 3, 1, 2, 3), 
              Var2 = c(3, 5, 2, 4, 3, 2, 1, 2, 5), Var3 = c(8, 7, 6, 9, 8, 9, 5, 8, 7)),
              class = "data.frame", row.names = c(NA,-9L))
df$rep<- rep(seq(1,3),3)

df.mut<-reshape(df, idvar = "MktDate", timevar = "rep", direction = "wide")

var1var2=apply(df.mut,1, function(x) cor(as.numeric(x[seq(2,10,3)]), as.numeric(x[seq(3,10,3)])))
var2var3=apply(df.mut,1, function(x) cor(as.numeric(x[seq(3,10,3)]), as.numeric(x[seq(4,10,3)])))
var1var3=apply(df.mut,1, function(x) cor(as.numeric(x[seq(2,10,3)]), as.numeric(x[seq(4,10,3)])))

results <- data.frame(MktDate = rep(unique(df$MktDate)), FactorPair = rep(c("Var1Var2", "Var2Var3", "Var1Var3"), each =3 ),
                      cor= c(var1var2,var2var3,var1var3))
results <- results[order(results$MktDate),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...