【问题标题】:How to read a Correlation matrix and form a Scatterplot matrix in R如何读取相关矩阵并在 R 中形成散点图矩阵
【发布时间】:2016-08-25 12:11:14
【问题描述】:

我在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]!

请帮我解决这个问题。

【问题讨论】:

  • 我可能误解了,但我认为您正在创建一个由 Excel 制成的相关矩阵图的相关矩阵,它不会飞。您只能使用“整洁”的数据来执行相关矩阵。在这种情况下,整洁意味着您需要独特的观察结果,因为行和 beta1、beta2、beta3... 是您的列。希望这会有所帮助。
  • @BGA 实际上我在 excel 中有一个相关矩阵,所以,我正在尝试从该相关矩阵制作散点图矩阵图。
  • 啊。但同样的概念。我相信您仍然需要原始数据来执行散点图矩阵。你没有原始数据了吗?如果可以访问,则很容易将其作为数据框从 csv 或 excel 带入 r。
  • @BGA 我没有原始数据。那么,做散点图就没有希望了吗?
  • 此时您只是从十进制数字创建圆圈,而不再是散点图。

标签: r matrix r-corrplot


【解决方案1】:

corrplot() 解决方案

根据上面 user20650 的 cmets 使用 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()

【讨论】:

  • @user20650 太酷了。在看到您对该问题的评论之前,我已提交了答案。我将更新我的帖子以包含 corrplot()。另外,为什么我需要 byrow 参数?似乎 matrix() 已经将值正确放入 corMat。
  • 好眼光。我将使用 OP 的新 read.table() 导入进行更新。
  • 它工作得很好(我已经制作了散点图矩阵)谢谢你的回答和这样的一步一步的代码解释。实际上 ggplot 看起来比基于圆形的散点图要好得多。我很抱歉我提供数据的方式。你能帮我如何以矩阵格式将相关矩阵导入R吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2011-02-05
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多