我一直在使用igraph,with thanks to this answer for my previous query.在R中运行Louvain社区检测但是,我发现cluster_louvain
方法在分配组成员身份时似乎做了一些奇怪的事情,我认为这是由于错误在我如何导入我的数据。虽然我认为我解决了这个问题,但我想了解问题所在。
我在400x400相关矩阵上运行了louvain聚类(即400个人的相关分数)。当我最初导入我的数据时,我的相关矩阵具有与行标题和列标题相同的个人ID号(即顶点数),如下所示:
1 2 3 4 ... 400
1 0 0.8 0.7 0.1
2 0.8 0 0.6 0.3
3 0.7 0.6 0 0.9
4 0.1 0.3 0.9 0
...
400
此相关矩阵保存在“Correlations.csv”文件中,我使用read.csv
导入该文件。然后我使用下面的代码将其转换为距离矩阵,删除低于某个阈值的相关性,将其转换为igraph的邻接矩阵,并运行cluster_louvain :(此代码也在答案here中提供)。
correlationmatrix <- read.csv("Correlations.csv", header = TRUE,
row.name = 1, check.names = FALSE)
distancematrix <- cor2dist(correlationmatrix)
DM2<- as.matrix(distancematrix)
DM2[correlationmatrix < 0.33] = 0
G2 <- graph.adjacency(DM2, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain <- cluster_louvain(G2)
sizes(clusterlouvain)
Community sizes
1 2
200 200
然后,我想在每个ID号码旁边获取群集号码,以了解属于每个社区的个人。所以我使用了IDs_cluster <- cbind(V(G2)$name, clusterlouvain$membership)
。这给出了顶点ID列表,但旁边的成员资格被列为“1 2 1 2 1 2 1 2”,这显然是不对的(因为我们不希望数据集中的每个替代个体被分配到不同的社区):
ID Membership
1 1
2 2
3 1
4 2
5 1
6 2
…
400 2
通过查看其他数据集,我意识到问题可能是因为我的相关矩阵中的行标题是数字的。所以我更改了相关矩阵,以便行标题仍然是ID号,但列标题为“V1-V400”:
V1 V2 V3 V4 ... V400
1 0 0.8 0.7 0.1
2 0.8 0 0.6 0.3
3 0.7 0.6 0 0.9
4 0.1 0.3 0.9 0
...
40
我将其作为.csv文件导入并重新运行'cluster_louvain',如下所示:
correlationmatrix_V <- read.csv("Correlations_withV.csv", header = TRUE,
row.name = 1, check.names = FALSE)
distancematrix_V <- cor2dist(correlationmatrix_V)
DM2_V <- as.matrix(distancematrix_V)
DM2_V[correlationmatrix_V < 0.33] = 0
G2_V <- graph.adjacency(DM2_V, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain_V <- cluster_louvain(G2_V)
现在当我重新cluster_louvain
时,它产生了三个集群的更明智的结果,每个集群的成员资格看起来更像我们期望的那样:
sizes(clusterlouvain_V)
Community sizes
1 2 3
168 52 180
IDs_cluster <- cbind(V(G2_V)$name, clusterlouvain_V$membership)
View(IDs_cluster)
ID Membership
1 1
2 1
3 3
4 2
5 2
6 2
…
400 1
我的问题是:是否可以澄清使用相同的行标题和列标题时发生的情况,这意味着将组成员身份分配给其他人(即“1 2 1 2” ID列表,如第一个示例中所示),但在将列标题更改为非数字格式时已解决(如第二个示例中所示)?
这可能是一个简单的错误,因为当使用'read.csv'导入相关矩阵的.csv时,我没有使用正确的设置,因为我的列标题也是数字。
但是,想要理解为什么这意味着'cluster_louvain'以它的方式分配了组成员身份。我发布这个以防万一有人犯了我上面做的同样的错误。任何见解都会受到欢迎,谢谢您的任何建议!