5

R に相関行列があり、要素のグループ (およびこれらのグループをベクトルに入れる) がそれらの間で 95% 以上相関している数を知りたいです。

X <- matrix(0,3,5) 
X[,1] <- c(1,2,3)
X[,2] <- c(1,2.2,3)*2
X[,3] <- c(1,2,3.3)*3
X[,4] <- c(6,5,1)
X[,5] <- c(6.1,5,1.2)*4

cor.matrix <- cor(X)
cor.matrix <- cor.matrix*lower.tri(cor.matrix)
cor.vector <- which(cor.matrix>0.95, arr.ind=TRUE)

cor.vector次に含まれます:

     row col 
[1,]   2   1 
[2,]   3   1 
[3,]   3   2 
[4,]   5   4 

これは、予想どおり、ベクトル 1、2、および 3 がそれらの間で相関し、4 と 5 も相関していることを意味します。

私が必要とするのは、最終結果として2 つのベクトルc(1,2,3)を取得することです。c(4,5)

これは簡単な例ですが、大きな行列を処理しています。

4

1 に答える 1

5

igraphパッケージを使用したアプローチは次のとおりです。

require(igraph)
g <- graph.data.frame(cor.vector, directed = FALSE)
split(unique(as.vector(cor.vector)), clusters(g)$membership)
# $`1`
# [1] 2 3 1

# $`2`
# [1] 5 4

これが本質的に行うことは、下の図に示すように、グラフ g (非接続集合) 内のクラスターを見つけることです。頂点は、( から) 入力した順序でグラフを作成するために使用されるためcor.vector、クラスタリングの順序も同じ順序で返されます。つまり、頂点 c(2,3,5,1,4) の場合、クラスターは c(1,1,2,1,2) であり、合計 2 つのクラスター (クラスター 1 とクラスター 2) があります。したがって、これを使用して、クラスター グループを使用して分割します。

ここに画像の説明を入力

于 2013-04-25T13:03:07.033 に答える