提问者:小点点

分解R中的相关矩阵


我有一个包含400个变量的数据集,我用它来生成一个关联矩阵(即将每个变量相互比较)。所得矩阵具有以下结构:

然后,我使用以下命令使用corrplot包生成相关矩阵图:

library(corrplot)
corrplot(df, order = "hclust", 
         tl.col = "black", tl.srt = 45)

不出所料,这会产生一个非常大的可解释的数字。我希望拆分我的矩阵,然后创建单独的相关矩阵数字(一次实际上有20个变量的成对比较)。我正在努力寻找代码来帮助我拆分我的矩阵并将其插入corrplo。任何帮助都将不胜感激!

谢谢你。


共1个答案

匿名用户

一种方法是把你的相关矩阵分解,然后画出所有的子矩阵。这样做的挑战是,你要设置< code>order=,而你(显然)事先并不知道。假设你想让< code>corrplot来决定顺序,那么这里有一个方法:先绘制整个东西捕捉函数的返回值(包含顺序信息),然后拆分矩阵,绘制组件。

有用:虽然大多数绘图函数通过副作用(创建绘图,不一定返回值)运行,但某些函数返回的信息对于使用或围绕其绘图组件很有用。科普洛特也不例外;来自 ?corrplot

Value:

     (Invisibly) returns a 'list(corr, corrTrans, arg)'. 'corr' is a
     reordered correlation matrix for plotting. 'corrPos' is a data
     frame with 'xName, yName, x, y, corr' and 'p.value'(if p.mat is
     not NULL) column, which x and y are the position on the
     correlation matrix plot. 'arg' is a list of some corrplot() input
     parameters' value. Now 'type' is in.

有了这个,我们就开始吧。我将使用< code>mtcars

>

  • 绘制整个内容。如果这需要很长时间,或者您不希望它尝试在R的图形窗格中绘制,则取消注释pngdev.off,只是为了将绘图本身转储为“无”。("NUL"是Windows的东西……我怀疑"/dev/null"应该可以在大多数其他操作系统上运行,未经测试。)

    # png("NUL")
    CP <- corrplot::corrplot(M, order="hclust", tl.col="black", tl.srt=45)
    # dev.off()
    
    str(CP)
    # List of 3
    #  $ corr   : num [1:6, 1:6] 1 0.4 0.8 0.1 0.2 0.2 0.4 1 0.84 0.11 ...
    #   ..- attr(*, "dimnames")=List of 2
    #   .. ..$ : chr [1:6] "var_1" "var_5" "var_6" "var_2" ...
    #   .. ..$ : chr [1:6] "var_1" "var_5" "var_6" "var_2" ...
    #  $ corrPos:'data.frame':  36 obs. of  5 variables:
    #   ..$ xName: chr [1:36] "var_1" "var_1" "var_1" "var_1" ...
    #   ..$ yName: chr [1:36] "var_1" "var_5" "var_6" "var_2" ...
    #   ..$ x    : num [1:36] 1 1 1 1 1 1 2 2 2 2 ...
    #   ..$ y    : num [1:36] 6 5 4 3 2 1 6 5 4 3 ...
    #   ..$ corr : num [1:36] 1 0.4 0.8 0.1 0.2 0.2 0.4 1 0.84 0.11 ...
    #  $ arg    :List of 1
    #   ..$ type: chr "full"
    

    < code>rownames(CP$corr)(等于< code>colnames(CP$corr))提供了列/行顺序,因此我们可以使用它们作为我们的排序(由< code>order="hclust"产生)。

    M_reord <- M[rownames(CP$corr), colnames(CP$corr)]
    M_reord
    #       var_1 var_5 var_6 var_2 var_3 var_4
    # var_1   1.0  0.40  0.80  0.10  0.20  0.20
    # var_5   0.4  1.00  0.84  0.11  0.05  0.25
    # var_6   0.8  0.84  1.00  0.60  0.72  0.54
    # var_2   0.1  0.11  0.60  1.00  0.15  0.30
    # var_3   0.2  0.05  0.72  0.15  1.00  0.47
    # var_4   0.2  0.25  0.54  0.30  0.47  1.00
    

    现在我们把矩阵分开。对于这个例子,我假设你的“20”实际上是“3”。一些帮助程序对象:

    grps <- (seq_len(nrow(M)) - 1) %/% 3
    grps
    # [1] 0 0 0 1 1 1
    eg <- expand.grid(row = unique(grps), col = unique(grps))
    eg
    #   row col
    # 1   0   0
    # 2   1   0
    # 3   0   1
    # 4   1   1
    

    其中 eg 的行首先计算列(上-下然后从左到右),如下所示:

    给定一个特定的子矩阵编号(行< code>eg),绘制它。让我们试试“2”:

    subplt <- 2
    rows <- which(grps == eg[subplt, "row"])
    cols <- which(grps == eg[subplt, "col"])
    corrplot::corrplot(M[rows, cols], tl.col="black", tl.srt=45)
    

    如果您想要自动绘制它们(例如,在rmarkdown文档中,在< code>shiny中),那么您可以使用以下命令对它们进行循环:

    for (subplt in seq_len(nrow(eg))) {
      rows <- which(grps == eg[subplt, "row"])
      cols <- which(grps == eg[subplt, "col"])
      corrplot::corrplot(M[rows, cols], tl.col="black", tl.srt=45)
    }