我有一个相关矩阵,其中包含股票价格相关性。 它的计算方法是:
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。
答案 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)
我想会更准确。 “相关性也可能是负的”