#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
Есть ли способ показать результаты таким образом:
- Корреляция между a и b составляет: 0,9279869.
- Корреляция между a и c составляет: 0,9604329.
- Корреляция между 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