Показывать корреляции как упорядоченный список, а не как большую матрицу
У меня есть кадр данных со 100 + столбцами. Кор() возвращает замечательно быстро, но слишком много говорит, особенно, поскольку большинство столбцов не коррелируются. Я бы хотел, чтобы он просто сказал мне пары столбцов и их корреляцию, идеально упорядоченные.
Если это не имеет смысла, это искусственный пример:
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)
Ответы
Ответ 1
Я всегда использую
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)
для выбора значимых значений.
Ответ 2
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
Ответ 3
Создание ответа @Marek.
Устраняет диагонали и дубликаты
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 , ]
Ответ 4
Существует несколько способов визуализации корреляционных матриц, чтобы можно было быстро просмотреть набор данных. Вот ссылка на подход, который выглядит довольно хорошо.