如何避免比较相关矩阵中的对角线
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.tri
和 which
函数返回矩阵中满足条件的位置:
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