我有一个无向的双向网络,在这里我想随机切换联系,同时仍保持相同的度数分布。
在igraph中工作,我使用了rewire()和keep_degseq()函数在节点之间随机切换边缘,如下面的代码所示。但是,这导致在处于相同模式的节点之间创建边缘。对于此示例网络,节点1到10处于一种模式,节点11-14处于另一种模式。
library(igraph)
set.seed(1)
b <- sample_bipartite(10,4,type = "gnp", p = 0.5)
b2 <- rewire(b, keeping_degseq(niter = 100))
b2
得到的边是:
[1] 1--13 3--11 5--11 3-- 6 7--12 1--11 9--12 9--11 7--14 8--13 12--13 4- 6 13--14 11--14 10--11 1--12 2--10 3--14 5--14 6--14 12--14 8--14 6-- 9 10--14
诸如12--13、3--6和13--14之类的边缘位于相同模式下的节点之间,这是我想在此模拟中保留的原始网络的属性。
是否有其他功能可以更好地满足我的目的?有没有办法告诉rewire()函数不要在相同模式下的节点之间创建边缘?
答案 0 :(得分:2)
我们可能会对顶点进行置换,而不是对边缘进行处理:
set.seed(1)
b1 <- sample_bipartite(10,4,type = "gnp", p = 0.5)
table(degree(b1))
# 1 2 3 4 5 6
# 4 3 2 2 2 1
(b2 <- permute(b1, c(sample(1:10), sample(11:14))))
# IGRAPH cf35948 U--B 14 20 -- Bipartite Gnp random graph
# + attr: name (g/c), p (g/n), type (v/l)
# + edges from cf35948:
# [1] 5--14 4--14 9--14 3--14 5--11 8--11 4--11 7--11 10--11 5--13 8--13 6--13
# [13] 7--13 3--13 10--13 5--12 4--12 2--12 1--12 10--12
table(degree(b2))
# 1 2 3 4 5 6
# 4 3 2 2 2 1
这种方法也很容易推广到多个社区。这完全取决于permute
的第二个自变量中重新排列的顶点索引的块。不用考虑改组,而是一种简单的方法来了解其工作原理,那就是认为我们仅在顶点名称之间切换。