如何在两方网络中随机更改关系而不在同一级别内创建关系

时间:2019-01-04 22:42:53

标签: r igraph

我有一个无向的双向网络,在这里我想随机切换联系,同时仍保持相同的度数分布。

在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()函数不要在相同模式下的节点之间创建边缘?

1 个答案:

答案 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的第二个自变量中重新排列的顶点索引的块。不用考虑改组,而是一种简单的方法来了解其工作原理,那就是认为我们仅在顶点名称之间切换。