如何读取相关矩阵并在 R 中形成散点图矩阵

How to read a Correlation matrix and form a Scatterplot matrix in R

我在 excel 中有一个相关矩阵如下:

dfA <- read.table(text=
      "beta1   beta2   beta3   beta4   beta5   beta6       X      X2      X3
beta1  1.0000 -0.2515 -0.2157  0.7209 -0.7205  0.4679  0.1025 -0.3606 -0.0356
beta2 -0.2515  1.0000  0.9831  0.1629 -0.1654 -0.5595 -0.0316  0.0946  0.0829
beta3 -0.2157  0.9831  1.0000  0.1529 -0.1559 -0.4976 -0.0266  0.0383  0.0738
beta4  0.7209  0.1629  0.1529  1.0000 -1.0000 -0.2753  0.0837 -0.1445  0.0080
beta5  0.4679 -0.5595 -0.4976 -0.2753  1.0000  0.2757  0.0354 -0.3149 -0.0596
beta6 -0.7205 -0.1654 -0.1559 -1.0000  0.2757  1.0000 -0.0837  0.1451 -0.0081
X      0.1025 -0.0316 -0.0266  0.0837 -0.0837  0.0354  1.0000  0.0278 -0.0875
X2    -0.3606  0.0946  0.0383 -0.1445  0.1451 -0.3149  0.0278  1.0000  0.2047
X3    -0.0356  0.0829  0.0738  0.0080 -0.0081 -0.0596 -0.0875  0.2047  1.0000", 
      header=TRUE) 

我只有相关矩阵而不是形成矩阵的原始数据,因此,我尝试使用以下代码将此矩阵读入 R 中的矩阵:

 B <- as.matrix(dfA)

但是当我尝试使用以下代码形成散点图矩阵时:

library(corrplot)
corrplot(B, method="circle")

我收到错误

Error in corrplot(B, method = "circle") : The matrix is not in [-1, 1]!

请帮我解决这个问题。

corrplot() 解

根据 user20650 的上述评论更新我的第一个 post 使用 ggplot。 user20650 显示错误的可能来源是舍入错误导致某些数字超出允许的 [-1,1] 范围,舍入解决了这个问题。我也能够使用 corrplot() 生成一个图。

此时,运行 corrplot() 生成以下图:

corMat<-as.matrix(dfA)

library('corrplot')
corrplot(corMat, method='circle')

ggplot() 解法

您也可以在 ggplot2 中通过一些额外的步骤来完成此操作。我个人认为它看起来好多了。

1)我去掉了矩阵下三角的冗余信息

corMat[lower.tri(corMat)]<-NA

> print(corMat)
      beta1   beta2   beta3  beta4   beta5   beta6       X      X2      X3
beta1     1 -0.2515 -0.2157 0.7209  0.4679 -0.7205  0.1025 -0.3606 -0.0356
beta2    NA  1.0000  0.9831 0.1629 -0.5595 -0.1654 -0.0316  0.0946  0.0829
beta3    NA      NA  1.0000 0.1529 -0.4976 -0.1559 -0.0266  0.0383  0.0738
beta4    NA      NA      NA 1.0000 -0.2753 -1.0000  0.0837 -0.1445  0.0080
beta5    NA      NA      NA     NA  1.0000  0.2757 -0.0837  0.1451 -0.0081
beta6    NA      NA      NA     NA      NA  1.0000  0.0354 -0.3149 -0.0596
X        NA      NA      NA     NA      NA      NA  1.0000  0.0278 -0.0875
X2       NA      NA      NA     NA      NA      NA      NA  1.0000  0.2047
X3       NA      NA      NA     NA      NA      NA      NA      NA  1.0000

2) 然后我使用 reshape2::melt() 将矩阵转换为长格式,并创建一个只显示小数点后两位的格式化版本的值。这对情节很有用。

library(reshape2)
m<-melt(corMat)
m<-data.frame(m[!is.na(m[,3]),]) # get rid of the NA matrix entries
m$value_lab<-sprintf('%.2f',m$value)

数据如下:

> head(m)
    Var1  Var2   value value_lab
1  beta1 beta1  1.0000      1.00
10 beta1 beta2 -0.2515     -0.25
11 beta2 beta2  1.0000      1.00
19 beta1 beta3 -0.2157     -0.22
20 beta2 beta3  0.9831      0.98
21 beta3 beta3  1.0000      1.00

3) 最后,我将这些数据输入到 ggplot2 - 主要依靠 geom_tile() 打印矩阵和 geom_text() 在每个图块上打印标签。如果你愿意,你可以把它打扮得更漂亮。

library(ggplot2)
ggplot(m, aes(Var2, Var1, fill = value, label=value_lab),color='blue') + 
  geom_tile() + 
  geom_text() +
  xlab('')+
  ylab('')+
  theme_minimal()