Извлеките определенные значения из корреляционной матрицы

#r #extract #correlation

Вопрос:

Есть ли способ вывести коэффициенты корреляции из корреляционной матрицы ?

Допустим, у меня есть набор данных с 3 переменными (a, b, c), и я хочу рассчитать корреляции между ними.

с

  df lt;- data.frame(a lt;- c(2, 3, 3, 5, 6, 9, 14, 15, 19, 21, 22, 23),  b lt;- c(23, 24, 24, 23, 17, 28, 38, 34, 35, 39, 41, 43),  c lt;- c(13, 14, 14, 14, 15, 17, 18, 19, 22, 20, 24, 26),  d lt;- c(6, 6, 7, 8, 8, 8, 7, 6, 5, 3, 3, 2))  

и

 cor(df[, c('a', 'b', 'c')])  

Я получу корреляционную матрицу:

 a b c  a 1.0000000 0.9279869 0.9604329  b 0.9279869 1.0000000 0.8942139  c 0.9604329 0.8942139 1.0000000  

Есть ли способ показать результаты таким образом:

  1. Корреляция между a и b составляет: 0,9279869.
  2. Корреляция между a и c составляет: 0,9604329.
  3. Корреляция между b и c составляет: 0,8942139:

?

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

Спасибо.

Ответ №1:

Использование reshape2 и расплава

 df lt;- data.frame("a" = c(2, 3, 3, 5, 6, 9, 14, 15, 19, 21, 22, 23),  "b" = c(23, 24, 24, 23, 17, 28, 38, 34, 35, 39, 41, 43),  "c" = c(13, 14, 14, 14, 15, 17, 18, 19, 22, 20, 24, 26),  "d" = c(6, 6, 7, 8, 8, 8, 7, 6, 5, 3, 3, 2))  tmp=cor(df[, c('a', 'b', 'c')]) tmp[lower.tri(tmp)]=NA diag(tmp)=NA  library(reshape2) na.omit(melt(tmp))  

в результате чего

 Var1 Var2 value 4 a b 0.9279869 7 a c 0.9604329 8 b c 0.8942139  

Ответ №2:

Вы можете сделать,

 df1 = cor(df[, c('a', 'b', 'c')]) df1 = as.data.frame(as.table(df1)) df1$Freq = round(df1$Freq,2) df2 = subset(df1, (as.character(df1$Var1) != as.character(df1$Var2))) df2$res = paste('Correlation between', df2$Var1, 'and', df2$Var2, 'is', df2$Freq)    Var1 Var2 Freq res 2 b a 0.93 Correlation between b and a is 0.93 3 c a 0.96 Correlation between c and a is 0.96 4 a b 0.93 Correlation between a and b is 0.93 6 c b 0.89 Correlation between c and b is 0.89 7 a c 0.96 Correlation between a and c is 0.96 8 b c 0.89 Correlation between b and c is 0.89  

Ответ №3:

Вот еще одна идея с преобразованием в длинный формат, т. е.

 tidyr::pivot_longer(tibble::rownames_to_column(as.data.frame(cor(df[, c('a', 'b', 'c')])), var = 'rn'), -1)  # A tibble: 9 x 3  rn name value  lt;chrgt; lt;chrgt; lt;dblgt; 1 a a 1  2 a b 0.928 3 a c 0.960 4 b a 0.928 5 b b 1  6 b c 0.894 7 c a 0.960 8 c b 0.894 9 c c 1   

Комментарии:

1. Спасибо. Есть ли способ не отображать все корреляции, которые относятся к самим себе? Как a и a, b и ab = 1? И показывать только однонаправленные корреляции? как только a и b, вместо a и b / b и a , так как значения одинаковы?

Ответ №4:

Может быть, ты сможешь попробовать as.table as.data.frame

 gt; as.data.frame(as.table(cor(df[, c("a", "b", "c")])))  Var1 Var2 Freq 1 a a 1.0000000 2 b a 0.9279869 3 c a 0.9604329 4 a b 0.9279869 5 b b 1.0000000 6 c b 0.8942139 7 a c 0.9604329 8 b c 0.8942139 9 c c 1.0000000