【问题标题】:How to remove small communities using igraph in R?如何在 R 中使用 igraph 删除小社区?
【发布时间】:2018-12-18 16:23:51
【问题描述】:

我从我的数据集“allgenes”创建了我的igraph,并找到了基于 louvain 方法的社区模块。

gD <- igraph::simplify(igraph::graph.data.frame(allgenes, directed=FALSE))
lou <- cluster_louvain(gD)

在绘制模块时,我注意到我希望删除几个小社区。如何删除包含 5 个或更少节点的社区?

plot(lou, gD, vertex.label = NA, vertex.size=5, edge.arrow.size = .2)

用杰出的模块绘制:

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 正如 MrFlick 所暗示的那样,您能否附上lou 的样例?

标签: r networking module igraph


【解决方案1】:

由于您不提供示例,我将用随机生成的数据进行说明。

## First create an example like yours
library(igraph)
set.seed(123)
gD = erdos.renyi.game(50,0.05)
lou <- cluster_louvain(gD)
LO = layout_with_fr(gD)
plot(lou, gD, vertex.label = NA, vertex.size=5, 
    edge.arrow.size = .2, layout=LO)

## identify which communities have fewer than 5 members
Small = which(table(lou$membership) < 5)

## Which nodes should be kept?
Keep = V(gD)[!(lou$membership %in% Small)]

## Get subgraph & plot
gD2  = induced_subgraph(gD, Keep)
lou2 = cluster_louvain(gD2)
LO2 = LO[Keep,]
plot(lou2, gD2, vertex.label = NA, vertex.size=5, 
    edge.arrow.size = .2, layout=LO2)

小社区已被移除

【讨论】:

  • 非常好的绘图方式
  • 虽然它在您给出的示例中有效,但通常实际上并不有效。根据聚类算法,当您在诱导子图上再次聚类时,您并不总是得到相同的聚类。
【解决方案2】:

如果您想在保留其他现有社区的同时删除社区,则无法创建带有要保留的顶点并在子图上聚类的诱导子图,因为生成的社区很可能会发生变化。

一种可行的方法是手动对社区对象进行子集化。

此外,如果您想要绘制原始图表和社区以及新的图表并在所有地方保持相同的颜色,您必须执行几个额外的步骤。

suppressPackageStartupMessages(library(igraph))
set.seed(123)

g <- erdos.renyi.game(50, 0.05)
c <- cluster_louvain(g)
l <- layout_with_fr(g)
c_keep_ids <- as.numeric(names(sizes(c)[sizes(c) >= 5]))
c_keep_v_idxs <- which(c$membership %in% c_keep_ids)

g_sub <- induced_subgraph(g, V(g)[c_keep_v_idxs])
# igraph has no direct functionality to subset community objects so hack it
c_sub <- c
c_sub$names <- c$names[c_keep_v_idxs]
c_sub$membership <- c$membership[c_keep_v_idxs]
c_sub$vcount <- length(c_sub$names)
c_sub$modularity <- modularity(g_sub, c_sub$membership, E(g_sub)$weight)

par(mfrow = c(1, 2))
plot(c, g,
  layout = l,
  vertex.label = NA,
  vertex.size = 5
 )
plot(c_sub, g_sub,
  col = membership(c)[c_keep_v_idxs],
  layout = l[c_keep_v_idxs, ],
  mark.border = rainbow(length(communities(c)), alpha = 1)[c_keep_ids],
  mark.col = rainbow(length(communities(c)), alpha = 0.3)[c_keep_ids],
  vertex.label = NA,
  vertex.size = 5
)
par(mfrow = c(1, 1))

【讨论】:

    【解决方案3】:

    请允许我补充一下。我想在可视化时从小社区中“删除”颜色,但将它们保留在图表中。例如我有很多隔离,这会造成一些视觉混乱,而我有一个非常有趣的核心组件,查看它们可以很好地表示。

    我从上面的代码开始。不是问题,因为我不想要子图:

    Small = which(table(g_community$membership) < 2)
    g_community$membership[g_community$membership %in% Small] <- 999
    

    这很好用,但有更聪明的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多