r-如何在不在同一级别内创建关系的情况下随机更改二部分网络中的关系



我有一个无向二分网络,我想在保持相同度分布的同时随机切换关系。

在igraph中,我使用了rewire()和keeping_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--12 2--10 3--14 5--14 6--14 12--148-14 6-9 10-14

12-13、3-6和13-14等边位于相同模式下的节点之间,这是我希望在本模拟中保留的原始网络的特性。

有没有其他功能更符合我的目的?有没有办法告诉rewire()函数不要在相同模式下的节点之间创建边?

我们可以对顶点进行排列,而不是对边进行处理:

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的第二个自变量中的混洗顶点索引块。与其考虑混洗,一个简单的方法就是认为我们只在顶点的名称之间切换。

最新更新