过去,我使用igraph
生成具有指定重新布线概率p
的小型世界网络,这特别容易,因为它是sample_smallworld
函数中的一个自变量。例如:
myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
plot(myNetwork, layout = layout_in_circle)
我现在想生成具有指定聚类系数的小型世界网络。我是igraph
的新手,这似乎是它应该具有的功能,但是经过一番搜索,我只找到了从现有网络中计算系数的方法,而不是将其用作系数的方法。用于生成网络本身的参数。
生成具有指定聚类系数的网络的最佳方法是什么?
答案 0 :(得分:1)
据我所知,您无法指定聚类系数(或传递性,因为它是在igraph
包中命名的),因为它取决于您指定的参数。
为什么? sample_smallworld
根据Watts-Strogatz模型生成图形,如documentation中所述。在Wikipedia上查看模型的数学运算。 Watts-Strogatz模型具有三个参数:
size
方法中的sample_smallworld
参数,维基百科文章中的 N ); nei
参数,维基百科上的 K ); 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创建
不花哨,不复杂,但是可以解决问题!