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

时间:2014-10-31 02:14:14

标签: r matrix correlation

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

corMatrix <- cor(cl2014, use="pairwise.complete.obs")

矩阵要大得多,但看起来像这样:

> 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"

我正在尝试确定如何获取矩阵中所有值的行名和列名,这些值的相关性大于某个值。

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

workingset <- corMatrix > 0.85

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

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

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

3 个答案:

答案 0 :(得分:10)

另一种选择是使用来自&#34; reshape2&#34;的melt。和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

如果您的数据集是melt(as.matrix(corMatrix)),则需要data.frame,因为矩阵和melt的方法不同data.frame


更新

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

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

您也可以使用基础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

答案 1 :(得分:3)

您可以使用which来获取行/列对的矩阵。使用arr.ind参数。然后我们可以匹配对的行名和列名,并将它们放入具有各自值的数据框中。

w <- which(corMatrix > 0.85, arr.ind = TRUE)
data.frame(row = rownames(w), col = colnames(corMatrix)[w[, "col"]], 
           value = corMatrix[corMatrix > 0.85])
#            row          col     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
# 4  RY.TO.Close  CM.TO.Close 0.8990782
# 5  CM.TO.Close  CM.TO.Close 1.0000000
# 6  RY.TO.Close BNS.TO.Close 0.8700985
# 7 BNS.TO.Close BNS.TO.Close 1.0000000
# 8  TD.TO.Close  TD.TO.Close 1.0000000

答案 2 :(得分:1)

添加到接受的答案,

subset(melt(corMatrix)), value > .75 & value < 1.0)
subset(melt(corMatrix)), value < -.75 & value > -1.0)
我想

会更准确。 “相关性也可能是负的”