随机生成具有指定聚类系数的网络

时间:2020-03-31 08:31:19

标签: r igraph

过去,我使用igraph生成具有指定重新布线概率p的小型世界网络,这特别容易,因为它是sample_smallworld函数中的一个自变量。例如:

myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
plot(myNetwork, layout = layout_in_circle)

我现在想生成具有指定聚类系数的小型世界网络。我是igraph的新手,这似乎是它应该具有的功能,但是经过一番搜索,我只找到了从现有网络中计算系数的方法,而不是将其用作系数的方法。用于生成网络本身的参数。

生成具有指定聚类系数的网络的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

据我所知,您无法指定聚类系数(或传递性,因为它是在igraph包中命名的),因为它取决于您指定的参数。

为什么? sample_smallworld根据Watts-Strogatz模型生成图形,如documentation中所述。在Wikipedia上查看模型的数学运算。 Watts-Strogatz模型具有三个参数:

  1. 节点数(size方法中的sample_smallworld参数,维基百科文章中的 N );
  2. 每个节点的平均链接数(nei参数,维基百科上的 K );
  3. 对于图形中的每个链接,通过“重排”(p参数,维基百科上的 beta )连接随机节点对的可能性。

看看Wikipedia(“聚类系数”部分),了解如何从这些参数计算聚类系数。

从经验上讲,如果您在模型中使用参数,则可以使用transitivity命令查看它们如何影响聚类系数。

# clustering coefficient in your data:

myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
transitivity(myNetwork)
[1] 0.3870968
# Varying average links/node:

for(i in 1:5) {
  set.seed(1) # use this to get the same results
  myNetwork <- sample_smallworld(dim = 1, size = 10, nei = i, p = 0.25)
  print(transitivity(myNetwork, type="global"))
}

[1] 0
[1] 0.2380952
[1] 0.6
[1] 0.8723404
[1] 1

# Varying rewiring probability:

for(i in c(0.05, 0.1, 0.2, 0.5, 1)) {
  set.seed(1)
  myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = i)
  print(transitivity(myNetwork, type="global"))
}
[1] 0.483871
[1] 0.4615385
[1] 0.328125
[1] 0.3802817
[1] 0.4347826

答案 1 :(得分:1)

如果您在某些情况下还可以,那么可以使用sna::rguman()来获得某种hacky近似。条件是:(1)使用全局可传递性(也许您可以使用它并进行修改); (2)使用无向图; (3)如果使用较小的传递性值,则使用大尺寸图,或者对于较小尺寸的图使用较大的传递性值。另外,放弃sample_smallworld()算法。如果可以的话,这可能会把您带到您想去的地方:

library(sna)
library(igraph)

sample_cluster <- function(nv = 150, clustering_coef = 0.5, thres = 0.05) {
  g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
    graph_from_adjacency_matrix(mode = "undirected")

  while (!(transitivity(g) >= clustering_coef-thres & transitivity(g) <= clustering_coef+thres)) {
    g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
      graph_from_adjacency_matrix(mode = "undirected")
  }

  return(g)

} 


sample_cluster(15, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2

sample_cluster(200, clustering_coef = 0.01, thres = 0.001) %>% transitivity()
#> [1] 0.009009009

sample_cluster(200, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2007628

sample_cluster(20, clustering_coef = 0.7, thres = 0.001) %>% transitivity()
#> [1] 0.7007168

reprex package(v0.3.0)于2020-03-31创建

不花哨,不复杂,但是可以解决问题!