2016-09-14 2 views
0

У меня есть dataframe, и я хочу найти, какая группа переменных имеет самые высокие корреляции. Например:Группа высококоррелированных переменных

mydata <- structure(list(V1 = c(1L, 2L, 5L, 4L, 366L, 65L, 43L, 456L, 876L, 78L, 687L, 378L, 378L, 34L, 53L, 43L), 
         V2 = c(2L, 2L, 5L, 4L, 366L, 65L, 43L, 456L, 876L, 78L, 687L, 378L, 378L, 34L, 53L, 41L), 
         V3 = c(10L, 20L, 10L, 20L, 10L, 20L, 1L, 0L, 1L, 2010L,20L, 10L, 10L, 10L, 10L, 10L), 
         V4 = c(2L, 10L, 31L, 2L, 2L, 5L, 2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 1L), 
         V5 = c(4L, 10L, 31L, 2L, 2L, 5L, 2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 3L)), 
        .Names = c("V1", "V2", "V3", "V4", "V5"), 
        class = "data.frame", row.names = c(NA,-16L)) 

можно рассчитать corelations и найти каждая пара имеет corelations выше порогового значения, как:

var.corelation <- cor(as.matrix(mydata), method="pearson") 

fin.corr = as.data.frame(as.table(var.corelation)) 
combinations_1 = combn(colnames(var.corelation) , 2 , FUN = function(x) paste(x , collapse = "_")) 
fin.corr = fin.corr[ fin.corr$Var1 != fin.corr$Var2 , ] 

fin.corr = fin.corr [order(fin.corr$Freq, decreasing = TRUE) , ,drop = FALSE] 

fin.corr = fin.corr[ paste(fin.corr$Var1 , fin.corr$Var2 , sep = "_") %in% combinations_1 , ] 

fin.corr <- fin.corr[fin.corr$Freq > 0.62, ] 

fin.corr <- fin.corr[order(fin.corr$Var1, fin.corr$Var2), ] 
fin.corr 

Выход до сих пор является:

Var1 Var2  Freq 
V1 V2  0.9999978 
V3 V4  0.6212136 
V3 V5  0.6220380 
V4 V5  0.9992690 

Здесь V1 и V2 формы группа, в то время как другие V3, V4, V5 образуют другую группу, где каждая пара переменных bles имеют корреляцию выше порога. Я хочу, чтобы эти две группы переменных были списком. Например

list(c("V1", "V2"), c("V3", "V4", "V5")) 
+1

Я думаю, вы можете основывать свой подход на более чистом процессе, чтобы извлечь группы из корреляций. Две возможности, которые я могу увидеть: кластеризация корреляционной матрицы (проверьте, например, 'hclust' (пример: http://research.stowers-institute.org/efg/R/Visualization/cor-cluster/). Вторая возможность: факторный анализ (и использовать факторы). –

+0

Спасибо Эрик! Я просмотрел эту ссылку, поставив вопрос. Моя иерархическая кластеризация не работала, потому что я пропустил шаг 'as.dist', чтобы преобразовать матрицу корреляции в объект dist, мое (неправильное) предположение было что они были одинаковыми. Спасибо за комментарий и ответ. Я принял его. – discipulus

ответ

2

Получил ответ, используя теорию графов и igraph пакет.

var.corelation <- cor(as.matrix(mydata), method="pearson") 

library(igraph) 
# prevent duplicated pairs 
var.corelation <- var.corelation*lower.tri(var.corelation) 
check.corelation <- which(var.corelation>0.62, arr.ind=TRUE) 

graph.cor <- graph.data.frame(check.corelation, directed = FALSE) 
groups.cor <- split(unique(as.vector(check.corelation)),   clusters(graph.cor)$membership) 
lapply(groups.cor,FUN=function(list.cor){rownames(var.corelation)[list.cor]}) 

, которая возвращает:

$`1` 
[1] "V1" "V2" 

$`2` 
[1] "V3" "V4" "V5" 

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