2013-04-25 11 views
5

Mam macierz korelacji w R i chcę wiedzieć, ile grup (i umieścić te grupy w wektorach) elementów koreluje między nimi w ponad 95%.exctract skorelowane elementy macierzy korelacji

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 zawiera wtedy:

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

Oznacza to, że, zgodnie z oczekiwaniami, że wektory 1,2 i 3, korelują między nimi, jak również 4 i 5.

Co muszę jest uzyskanie dwóch wektorów c(1,2,3) i c(4,5) jako wyniku końcowego.

Jest to prosty przykład, ale przetwarzam duże macierze.

+0

to możliwe, że '1-2',' 1-3' są skorelowane, ale '2-3' nie jest? – Nishanth

+0

Nie jest. Jeśli 1-2 i 1-3 korelują, to 2-3 muszą być zawarte w tej samej grupie. Jest to szczególny warunek tego, czego potrzebuję. – Xavi

+0

Podejściem naiwnym byłoby przetestowanie wszystkich kombinacji par/wierszy 'cor.vector' za pomocą' sum (is.element (i, j))> 0' i jeśli mają one wspólny element, to dołącz do nich i idź na. Ponieważ prawdopodobnie istnieją bardziej skuteczne sposoby rozwiązania, nie odważę się zapisać tego jako odpowiedzi ... –

Odpowiedz

4

Oto Podejście wykorzystujące igraph pakiet:

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 

co to zasadniczo nie jest znalezienie klastrów na wykresie (g), odłączone zestawów, jak pokazano na rysunku. Ponieważ wierzchołki są używane do utworzenia wykresu w podanej kolejności (z Twojego cor.vector), kolejność grupowania również powraca w tej samej kolejności. Oznacza to, że dla wierzchołków c (2,3,5,1,4) klastry to c (1,1,2,1,2) o łącznej liczbie dwóch skupień (klaster 1 i klaster 2). Po prostu używamy tego do podziału przy użyciu grupy klastrów.

enter image description here

+0

Uruchomiłem kod z moimi danymi i działa idealnie. Porównałem także wyniki twojego kodu z opracowanym przeze mnie kodem, który działa dobrze, ale jest znacznie mniej wydajny i muszę przetworzyć mnóstwo danych. Wyniki są takie same. – Xavi

Powiązane problemy