我们使用diamonds这个数据集来做示范
- 剔除离散变量,只留下连续值
diamonds2 <- select(diamonds,which(!sapply(diamonds,is.factor))
输出为:
carat depth table price x y z
<dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 61.5 55 326 3.95 3.98 2.43
2 0.21 59.8 61 326 3.89 3.84 2.31
3 0.23 56.9 65 327 4.05 4.07 2.31
4 0.290 62.4 58 334 4.2 4.23 2.63
5 0.31 63.3 58 335 4.34 4.35 2.75
6 0.24 62.8 57 336 3.94 3.96 2.48
7 0.24 62.3 57 336 3.95 3.98 2.47
8 0.26 61.9 55 337 4.07 4.11 2.53
9 0.22 65.1 61 337 3.87 3.78 2.49
10 0.23 59.4 61 338 4 4.05 2.39
- 计算相关系数
cor_dia <- cor(diamonds2)
输出:
carat depth table price
carat 1.00000000 0.02822431 0.1816175 0.9215913
depth 0.02822431 1.00000000 -0.2957785 -0.0106474
table 0.18161755 -0.29577852 1.0000000 0.1271339
price 0.92159130 -0.01064740 0.1271339 1.0000000
x 0.97509423 -0.02528925 0.1953443 0.8844352
y 0.95172220 -0.02934067 0.1837601 0.8654209
z 0.95338738 0.09492388 0.1509287 0.8612494
x y z
carat 0.97509423 0.95172220 0.95338738
depth -0.02528925 -0.02934067 0.09492388
table 0.19534428 0.18376015 0.15092869
price 0.88443516 0.86542090 0.86124944
x 1.00000000 0.97470148 0.97077180
y 0.97470148 1.00000000 0.95200572
z 0.97077180 0.95200572 1.00000000
3.生成dataframe
cor_dia_df <- as.data.frame(cor_dia) %>%
mutate(var1=row.names(cor_dia))%>%
gather(carat:z,key=var2,value=correlation)
输出:
var1 var2 correlation
1 carat carat 1.00000000
2 depth carat 0.02822431
3 table carat 0.18161755
4 price carat 0.92159130
5 x carat 0.97509423
6 y carat 0.95172220
7 z carat 0.95338738
- geom_tile()
ggplot(cor_dia_df)+
geom_tile(aes(var1,var2,fill=correlation))
ok,到这里我们已经可以生成一张显示相关系数的图表了,但是仍然存在很多可以改进的地方。比如,让正负系数用不同颜色表示,以方便比较;把相近的变量放在一起等等。
- 使用欧式距离计算变量相似度并聚类
hc <- hclust(dist(cor_dia))
ord <- order.dendrogram(as.dendrogram(hc))
#生成树状结构并排序
- 对变量进行排序
cor_dia_df2 <- mutate(cor_dia_df,
var1=factor(var1,levels=row.names(cor_dia)[ord]),
var2=factor(var2,levels=row.names(cor_dia)[ord]))
- 再次使用geom_tile()
ggplot(cor_dia_df2)+
geom_tile(aes(var1,var2,fill=correlation))+
scale_fill_gradient2()+
theme(axis.text.x=element_text(angle=90,vjust=0,
hjust=1))