在 R 中手动进行简单的聚类

Make a simple clustering manually in R

我正在尝试根据点之间的距离手动进行简单的聚类(不使用任何聚类算法)。我用皮尔逊相关系数来计算距离:

c <- round(cor(t(df)), digits = 2)
d <- as.dist(1 - c)

我想聚类相关性大于特定阈值的所有点。例如 0,7。我如何在 R 中对这些数据点进行聚类?

我的数据框的第一行和第一列如下所示:(总共有 188 个条目和 31 列

|       |  A1 |  A2 |  A3 |  A4 |  A5 |
|  ---  | --- | --- | --- | --- | --- |
|  U00  |  0  |  0  |  0  |  0  |  0  |
|  U01  |  0  |  0  | 84  |  0  |  0  |
|  U02  |  0  |  1  |  0  |  0  |  0  |
|  U03  |  0  |  0  |  0  |  0  |  0  |
|  U04  |  0  |  0  |  0  |  0  |  0  |
|  U05  |  0  |  0  |  0  |  0  |  0  |
|  U06  |  0  |  0  |  0  |  0  |  0  |

和距离:

|       |   U00  |   U01  |   U02  |   U03  |   U04  |   U05  |   U06  |
|       | ------ | ------ | ------ | ------ | ------ | ------ | ------ |
|  U01  |  0,05  |        |        |        |        |        |        |
|  U02  |  1,04  |  1,05  |        |        |        |        |        |
|  U03  |  1,04  |  1,04  |  0,92  |        |        |        |        |
|  U04  |  1,04  |  1,04  |  0,92  |  0,00  |        |        |        |
|  U05  |  1,04  |  1,04  |  0,92  |  0,00  |  0,00  |        |        |
|  U06  |  1,04  |  1,04  |  0,92  |  0,00  |  0,00  |  0,00  |        |

最后,我想在我的数据框中添加一个额外的列,其中包含集群的编号。提前致谢!

这样的事情可以使用 igraph 包来完成:

library(igraph)

threshold <- 0.7

graph_from_adjacency_matrix(abs(cor(df)) > threshold) %>% 
  components() %>%
  membership() %>%
  split(names(.), .)

注意:我取的是绝对相关,你可以去掉abs.