【问题标题】:How can I create a correlation matrix in R?如何在 R 中创建相关矩阵?
【发布时间】:2012-05-27 16:22:44
【问题描述】:

我有 92 组相同类型的数据。

我想为任何两种组合创建一个相关矩阵。

即我想要一个 92 x92 的矩阵。

这样元素 (ci,cj) 应该是 ci 和 cj 之间的相关性。

我该怎么做?

【问题讨论】:

  • 查看cor 函数,或Hmisc 包中的rcorr 函数
  • 我能够找到两个参数之间的相关性。问题是如何将它们排列成矩阵?
  • 这到底是怎么得到这么多赞的?

标签: r matrix visualization correlation


【解决方案1】:

一个例子,

 d &lt- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)

【讨论】:

    【解决方案2】:

    您可以使用“corrplot”包。

    d <- data.frame(x1=rnorm(10),
                     x2=rnorm(10),
                     x3=rnorm(10))
    M <- cor(d) # get correlations
    
    library('corrplot') #package corrplot
    corrplot(M, method = "circle") #plot matrix
    

    更多信息在这里:http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

    【讨论】:

    • 是否有可能获得类似于这些cran.r-project.org/web/packages/corrplot/vignettes/… 的图形,或者一个简单的矩阵,但使用 R 平方而不是 pearson、kendall 或 spearman 相关?
    • R2 等于 Pearson 相关系数的平方。因此,在创建绘图之前,您只需要将 M 乘以 M(将相关矩阵乘以自身)。
    【解决方案3】:

    cor 函数将在计算相关性时使用矩阵的列。因此,矩阵 x 和矩阵 y 之间的行数必须相同。例如:

    set.seed(1)
    x <- matrix(rnorm(20), nrow=5, ncol=4)
    y <- matrix(rnorm(15), nrow=5, ncol=3)
    COR <- cor(x,y)
    COR
    image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, xlab="x column", ylab="y column")
    text(expand.grid(x=seq(dim(x)[2]), y=seq(dim(y)[2])), labels=round(c(COR),2))
    

    编辑:

    以下是使用单个矩阵计算的相关矩阵上的自定义行和列标签示例:

    png("corplot.png", width=5, height=5, units="in", res=200)
    op <- par(mar=c(6,6,1,1), ps=10)
    COR <- cor(iris[,1:4])
    image(x=seq(nrow(COR)), y=seq(ncol(COR)), z=cor(iris[,1:4]), axes=F, xlab="", ylab="")
    text(expand.grid(x=seq(dim(COR)[1]), y=seq(dim(COR)[2])), labels=round(c(COR),2))
    box()
    axis(1, at=seq(nrow(COR)), labels = rownames(COR), las=2)
    axis(2, at=seq(ncol(COR)), labels = colnames(COR), las=1)
    par(op)
    dev.off()
    

    【讨论】:

    • @Manuel Ramón 的示例可能最适合您的情况(单个矩阵) - 将您的数据集组织为列。
    • 在上图中,如何“反转”颜色,红色的相关性接近 -1 或 1,白色的相关性接近 0?
    • image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
    • @Marcinthebox 您如何将变量标签添加到 x 和 y 轴(而不是数字)?谢谢
    • @AgustínIndaco - 我用另一个例子更新了我的答案。 image 函数不会自动取行列名,所以必须加上。
    【解决方案4】:

    看看qtlcharts。它允许您创建交互式相关矩阵:

    library(qtlcharts)
    data(iris)
    iris$Species <- NULL
    iplotCorr(iris, reorder=TRUE)
    

    当您关联更多变量时会更令人印象深刻,例如在包的小插图中:

    【讨论】:

      【解决方案5】:

      这里还有其他方法可以实现这一点:(Plot correlation matrix into a graph),但我喜欢你的版本,其中包含框中的相关性。有没有办法将变量名称添加到 x 和 y 列,而不仅仅是那些索引号?对我来说,这将使它成为一个完美的解决方案。谢谢!

      编辑:我试图评论 [Marc in the box] 的帖子,但我显然不知道我在做什么。不过,我确实设法自己回答了这个问题。

      如果 d 是矩阵(或原始数据框)并且列名是您想要的,那么以下工作:

      axis(1, 1:dim(d)[2], colnames(d), las=2)
      axis(2, 1:dim(d)[2], colnames(d), las=2)
      

      las=0 会将名称翻转回正常位置,我的很长,所以我使用 las=2 使它们垂直于轴。

      edit2:要禁止 image() 函数在网格上打印数字(否则它们会与变量标签重叠),请添加 xaxt='n',例如:

      image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column", xaxt='n')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-29
        • 2022-01-12
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多