如何避免比较相关矩阵中的对角线

Posted

技术标签:

【中文标题】如何避免比较相关矩阵中的对角线【英文标题】:How to avoid comparing diagonal lines in correlation matrix 【发布时间】:2022-01-09 16:02:50 【问题描述】:

我有一个相关矩阵,我想比较我的变量的相关值,以将相关性高于特定值的变量分组。我正在使用for 循环执行此操作,我想知道如何避免比较对角线值(其中值等于 1)

这是我的相关矩阵的示例

Data >
     A     B    C      D     E     F      G
A    1    0.2   0.7   0.41  0.89  0.63  0.22
B    0.2   1    0.12  0.5   0.7   0.74  0.3
C    0.7  0.12  1     0.65  0.23  0.88  0.19
D    0.41 0.5   0.65   1    0.33  0.57  0.9
E    0.89 0.7   0.23  0.33  1     0.20  0.94
F    0.63 0.74  0.88  0.57  0.20   1    0.86
G    0.22 0.3   0.19  0.9   0.94  0.86   1

这是我使用的代码的简单版本

for (ii in 1:(ncol(Data)-1)) 
  for(jj in 1:(ncol(Data)))
    if (abs(Data[1,ii] - Data[1,jj]) <= 0.8) 
      print("True")
      print(paste("Le nom de variable est ",colnames(Data)[jj]))
      
    
    else
      print("false")
      print(paste("Le nom de variable est ",colnames(Data)[ii]))
      
    
    
  

但它会将变量与它自己进行比较(当ii = jj时)并返回对角线值等于1的结果。

所以我的问题是:如何修改我的代码以不比较对角线?

谢谢

【问题讨论】:

if (ii==jj) next? 【参考方案1】:

如果你想使用自己的代码,试试这个

for (ii in 1:(ncol(Data)-1)) 
  for(jj in 1:(ncol(Data)))
    if (ii != jj)
      if (abs(Data[1,ii] - Data[1,jj]) <= 0.8) 
        print("True")
        print(paste("Le nom de variable est ",colnames(Data)[jj]))
      
      
      else
        print("false")
        print(paste("Le nom de variable est ",colnames(Data)[ii]))
      
      
        
  

【讨论】:

【参考方案2】:

虽然可能,for-loop 可能不是这里最有效的解决方案。考虑一个替代方案,使用 upper.triwhich 函数返回矩阵中满足条件的位置:

x <- c(1, .2, .7, .41, .89, .63, .22, .2, 1, .12,.5,.7,.74,.3,.7,.12,1,.65,.23,.88,.19,.41,.5,.65,.1,.33,.57,.9,.89,.7,.23,.33,1,.2,.94,.63,.74,.88,.57,.2,1,.86,.22,.3,.19,.9,.94,.86,1)
m <- matrix(x, ncol = 7)

m[upper.tri(m, diag = T)] <- NA
locs <- which(m >= .8, arr.ind = T)
locs
     row col
[1,]   5   1
[2,]   6   3
[3,]   7   4
[4,]   7   5
[5,]   7   6

# or if you want the names of matches
f <- Vectorize(function(x)
  switch(as.character(x),
         "1" = "A", "2" = "B", "3" = "C", "4" = "D",
         "5" = "E", "6" = "F", "7" = "G", NA)
)
apply(locs, 2, f)

【讨论】:

以上是关于如何避免比较相关矩阵中的对角线的主要内容,如果未能解决你的问题,请参考以下文章

使用 mclapply 或 %dopar% 从对角线切片组装矩阵,例如 Matrix::bandSparse

如何使用 itertools 继续使用列表中的值直到矩阵的对角线已满

R - 标准化矩阵以具有单位对角线

用对角线索引矩阵中的上三角形或下三角形

如何循环矩阵让对角线上的数字具有高优先级?

Eigen - 将每个(稀疏)矩阵行除以其对应的对角线元素