从相关矩阵值中查找行/列名称

cho*_*ida 4 r matrix correlation

我有一个相关矩阵,其中包含股票价格相关性.它的计算方法是:

corMatrix <- cor(cl2014, use="pairwise.complete.obs")
Run Code Online (Sandbox Code Playgroud)

矩阵更大但看起来像这样:

> corMatrix
             RY.TO.Close CM.TO.Close BNS.TO.Close TD.TO.Close
RY.TO.Close    1.0000000   0.8990782    0.8700985  -0.2505789
CM.TO.Close    0.8990782   1.0000000    0.8240780  -0.4184085
BNS.TO.Close   0.8700985   0.8240780    1.0000000  -0.2141785
TD.TO.Close   -0.2505789  -0.4184085   -0.2141785   1.0000000

> class(corMatrix)
[1] "matrix"
Run Code Online (Sandbox Code Playgroud)

我试图确定如何获得矩阵中具有大于某个值的相关值的所有值的行和列名称.

我可以索引矩阵以生成索引矩阵,如下所示:

workingset <- corMatrix > 0.85
Run Code Online (Sandbox Code Playgroud)

我真正想要的只是由行和列名称标识的行/列对列表,因此我知道要进行进一步探索的对.

如何从索引网格转到行/列名称?

理想情况下,我也只检查矩阵的下部或上部,以便不生成重复值,当然主对角线可以忽略,因为它总是1.

A5C*_*2T1 10

另一种选择是使用melt"reshape2"和subset:

library(reshape2)
subset(melt(corMatrix), value > .85)
#            Var1         Var2     value
# 1   RY.TO.Close  RY.TO.Close 1.0000000
# 2   CM.TO.Close  RY.TO.Close 0.8990782
# 3  BNS.TO.Close  RY.TO.Close 0.8700985
# 5   RY.TO.Close  CM.TO.Close 0.8990782
# 6   CM.TO.Close  CM.TO.Close 1.0000000
# 9   RY.TO.Close BNS.TO.Close 0.8700985
# 11 BNS.TO.Close BNS.TO.Close 1.0000000
# 16  TD.TO.Close  TD.TO.Close 1.0000000
Run Code Online (Sandbox Code Playgroud)

melt(as.matrix(corMatrix))如果您的数据集是a,则需要执行此操作,data.frame因为melt矩阵和data.frames 有不同的方法.


更新

正如您所提到的,您只对上三角形的值感兴趣(避免重复对/值)并排除对角线,您可以执行以下操作:

CM <- corMatrix                               # Make a copy of your matrix
CM[lower.tri(CM, diag = TRUE)] <- NA          # lower tri and diag set to NA
subset(melt(CM, na.rm = TRUE), value > .85)   # melt and subset as before
#          Var1         Var2     value
# 5 RY.TO.Close  CM.TO.Close 0.8990782
# 9 RY.TO.Close BNS.TO.Close 0.8700985
Run Code Online (Sandbox Code Playgroud)

您也可以使用base R执行此操作.继续"CM"从上面开始,尝试:

subset(na.omit(data.frame(expand.grid(dimnames(CM)), value = c(CM))), value > .85)
#          Var1         Var2     value
# 5 RY.TO.Close  CM.TO.Close 0.8990782
# 9 RY.TO.Close BNS.TO.Close 0.8700985
Run Code Online (Sandbox Code Playgroud)