在 R 中划分相关矩阵

Partitioning a correlation matrix in R

我需要帮助划分 R 中的对称矩阵或任何矩阵,假设我的变量被分组,假设 R 中的默认数据称为 longley,

data()
L.df<-longley
cor(L.df)

我需要一个代码来帮助我将这个相关矩阵划分为

这样我就可以取它的平均值分区允许我假设每个组的插值具有相等的相关性!

所以我可以有类似的东西

作为我的结构化相关矩阵。

PS。我手动获取了结构

希望能够在选择的任何列或行上对其进行分区。

注意:分区假定变量 1 和 2 在组 1 中, 变量 3、4 和 5 在第 2 组中 变量 6&7 在组 3

您可以获得相关矩阵,将对角线设置为 NA,遍历各组并用它们的 NA-omitted 均值重写它们的条目,然后将 1 写入对角线:

partition <- function(m, groups = list(1:2, 3:5, 6:7)) {
  crm <- cor(m)
  diag(crm) <- NA
  for(i in groups) {
    for(j in groups) {
      crm[i, j] <- mean(crm[i, j], na.rm = TRUE)
    }
  }
  diag(crm) <- 1
  crm <- round(crm, 3)
  dimnames(crm) <- NULL
  crm
  
}

partition(longley)
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
#> [1,] 1.000 0.992 0.684 0.684 0.684 0.985 0.985
#> [2,] 0.992 1.000 0.684 0.684 0.684 0.985 0.985
#> [3,] 0.684 0.684 1.000 0.291 0.291 0.667 0.667
#> [4,] 0.684 0.684 0.291 1.000 0.291 0.667 0.667
#> [5,] 0.684 0.684 0.291 0.291 1.000 0.667 0.667
#> [6,] 0.985 0.985 0.667 0.667 0.667 1.000 0.971
#> [7,] 0.985 0.985 0.667 0.667 0.667 0.971 1.000

要更改组,您需要将它们作为列索引列表提供。例如,如果您想要两个包含列 1:3 和 4:7 的组,您可以这样做:

partition(longley, list(1:3, 4:7))
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
#> [1,] 1.000 0.739 0.739 0.709 0.709 0.709 0.709
#> [2,] 0.739 1.000 0.739 0.709 0.709 0.709 0.709
#> [3,] 0.739 0.739 1.000 0.709 0.709 0.709 0.709
#> [4,] 0.709 0.709 0.709 1.000 0.694 0.694 0.694
#> [5,] 0.709 0.709 0.709 0.694 1.000 0.694 0.694
#> [6,] 0.709 0.709 0.709 0.694 0.694 1.000 0.694
#> [7,] 0.709 0.709 0.709 0.694 0.694 0.694 1.000

reprex package (v2.0.1)

于 2022-04-11 创建

定义一个分组向量 g 并从中创建一个分组矩阵 gm 并将其与 ave 一起使用。

g <- c(1, 1, 2, 2, 2, 3, 3)

gm <- outer(g, g, paste)
diag(gm) <- ""
ave(cor(longley), gm)