Метод кластеризации на двоичной матрице в R - PullRequest
0 голосов
/ 24 апреля 2020

Мне понадобится некоторая помощь для кластеризации моего binary values в моей матрице. Это двоичная матрица, вот пример:

G1  G2  G3  G4  G5  G6  G7  G8  G9  G10 G11 G12
Sp1 0   0   0   0   0   0   0   0   0   0   0   0
Sp2 1   1   1   1   1   0   0   0   0   0   0   0
Sp3 0   0   0   0   0   0   0   0   0   1   1   1
SP4 0   0   0   0   0   0   0   0   0   1   1   1
SP5 1   1   1   1   1   1   1   1   1   0   1   0
SP6 1   1   1   1   1   1   1   1   1   0   0   0
SP7 0   0   0   0   0   0   0   0   0   0   0   0
SP8 0   0   0   0   0   0   0   0   0   0   0   0
SP9 0   1   0   1   0   1   1   0   1   0   0   0

И я бы хотел кластеризовать the columns, а не строки.

Идея состоит в том, чтобы получить наилучшее из возможных представлений групп точек, которые похожи. Вот в этом примере это должно выглядеть примерно так:

    G8  G1  G3  G5  G9  G2  G4  G11 G10 G12
Sp1 0   0   0   0   0   0   0   0   0   0
Sp2 0   1   1   1   0   1   1   0   0   0
Sp3 0   0   0   0   0   0   0   1   1   1
SP4 0   0   0   0   0   0   0   1   1   1
SP5 1   1   1   1   1   1   1   1   0   0
SP6 1   1   1   1   1   1   1   0   0   0
SP7 0   0   0   0   0   0   0   0   0   0
SP8 0   0   0   0   0   0   0   0   0   0
SP9 0   0   0   0   1   1   1   0   0   0

Я попробовал следующее:

#get the best k value wich is the number of groups 
library(fpc)
pamk.best <- pamk(t(test_matrix_bis))
k= pamk.best$nc

matbis<-t(test_matrix_bis)
dist_mat <- dist(matbis, method = 'binary')
hclust_avg <- hclust(dist_mat, method = 'ward.D')
cut_avg <- cutree(hclust_avg, k = k)

test_matrix=setDT(as.data.frame(t(test_matrix)), keep.rownames = TRUE)[]

test_matrix=test_matrix %>%
  mutate(cluster = cut_avg)

rownames(test_matrix) <- test_matrix$rn
test_matrix$rn  <-NULL
test_matrix=test_matrix[order(test_matrix$cluster, decreasing = TRUE), ]

Результат не так плох, но, возможно, есть лучший подход для этого вида вопрос?

...