Показывать корреляции как упорядоченный список, а не как большую матрицу - PullRequest
30 голосов
/ 16 августа 2011

У меня есть фрейм данных со 100+ столбцами. cor () возвращает удивительно быстро, но говорит мне слишком много, тем более что большинство столбцов не коррелированы. Я хотел бы просто сказать мне пары столбцов и их соотношение, в идеальном порядке.

Если это не имеет смысла, вот искусственный пример:

df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10)
z = cor(df)

z выглядит так:

           a          b           c           d          e
a  1.0000000 -0.9966867 -0.38925240 -0.35142452  0.2594220
b -0.9966867  1.0000000  0.40266637  0.35896626 -0.2859906
c -0.3892524  0.4026664  1.00000000  0.03958307  0.1781210
d -0.3514245  0.3589663  0.03958307  1.00000000 -0.3901608
e  0.2594220 -0.2859906  0.17812098 -0.39016080  1.0000000

Мне нужна функция, которая вместо этого сообщит мне:

a:b -0.9966867 
b:c  0.4026664
d:e -0.39016080  
a:c -0.3892524 
b:d  0.3589663
a:d -0.3514245 
b:e -0.2859906
a:e  0.2594220 
c:e  0.17812098
c:d  0.03958307

У меня есть грубый способ избавиться от шума:

z[abs(z)<0.5]=0

затем сканировать, ища ненулевые значения. Но он намного ниже желаемого результата выше.

UPDATE: Основываясь на полученных ответах и ​​пробах и ошибках, вот решение, которое я выбрал:

z[lower.tri(z,diag=TRUE)]=NA  #Prepare to drop duplicates and meaningless information
z=as.data.frame(as.table(z))  #Turn into a 3-column table
z=na.omit(z)  #Get rid of the junk we flagged above
z=z[order(-abs(z$Freq)),]    #Sort by highest correlation (whether +ve or -ve)

Ответы [ 4 ]

33 голосов
/ 16 августа 2011

Я всегда использую

zdf <- as.data.frame(as.table(z))
zdf
#    Var1 Var2     Freq
# 1     a    a  1.00000
# 2     b    a -0.99669
# 3     c    a -0.14063
# 4     d    a -0.28061
# 5     e    a  0.80519

Затем используйте subset(zdf, abs(Freq) > 0.5) для выбора значимых значений.

7 голосов
/ 16 августа 2011
library(reshape)

z[z == 1] <- NA #drop perfect
z[abs(z) < 0.5] <- NA # drop less than abs(0.5)
z <- na.omit(melt(z)) # melt! 
z[order(-abs(z$value)),] # sort
2 голосов
/ 27 августа 2012

Построение ответа @ Марека.Исключает диагональ и дублирует

data = as.data.frame( as.table( z ) )
combinations = combn( colnames( z ) , 2 , FUN = function( x ) { paste( x , collapse = "_" ) } )
data = data[ data$Var1 != data$Var2 , ]
data = data[ paste( data$Var1 , data$Var2 , sep = "_" ) %in% combinations , ]
1 голос
/ 16 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...