【问题标题】:Splitting a random network into two networks in R在R中将随机网络分成两个网络
【发布时间】:2023-03-23 20:50:02
【问题描述】:

我使用 igraph 库在 R 中创建了一个无向随机 (Erdos-Renyi) 网络。它由100个节点组成,两个节点之间存在一条边的概率p为0.2。

这是我创建随机网络的代码:

original <- erdos.renyi.game(100, 0.2, type = c("gnp", "gnm"), directed = FALSE,
    loops = FALSE)

所以原始网络可能看起来像这样:

      O
      |                    Please note: O represent nodes, and the lines
      |                                 represent the edges between the nodes
O-----O-----O
|     | \
|     |  \
O-----O   O

我需要将这个随机网络分成两个网络(称为 net1 和 net2),这样如果选择随机数“1”,则原始网络的两个节点之间的边将存在于 net1 的相同两个节点之间(或者如果选择了随机数 '2',则边将存在于 net2 中,同样位于相同的两个节点之间)。

那么 net1 和 net2 可能看起来像这样,这取决于它们边缘的随机数('1' 和 '2'):

      O                   O
                          |
                          |
O-----O     O       O     O-----O
      | \           |
      |  \          |
O     O   O         O-----O   O
     net1                net2

因此,如果 net1 在最初位于原始网络中的两个节点之间有一条边,则 net2 在相同的两个节点之间不会有这条边(如果边在 net2 中,则它不应该在 net1 中)以及)。

我不确定如何根据随机数('1' 或 '2 ') 被选中。

对不起,如果这有点混乱,很难解释。

任何帮助将不胜感激。非常感谢。

【问题讨论】:

  • 你最好用一个可重现的例子来解释你想要什么。向我们展示一个网络以及如果它被拆分后会是什么样子。

标签: r networking graph igraph


【解决方案1】:

对于一些igraph随机网络对象a

# what is the order of a?
n <- length(V(a))

# random network
# we're only interested in this for that fact that it provides a
# random symmetric matrix with approx. half of its edges present
ran <- erdos.renyi.game(n, .5, type="gnp", directed=F)

# network 1 (as an igraph graph object)
g1 <- graph.adjacency(a[,] * ran[,])

# network 2 (also as an igraph graph object)
g2 <- graph.adjacency(a[,] * !ran[,])

生成的对象将是您的拆分网络的igraph 图形表示。您可以轻松地将它们转换为您需要的任何形式。例如,如果没有graph.adjacency(),最后两个计算会导致稀疏矩阵表示。

这里的基本逻辑是,一个由 0 和 1(大约各占 50%)组成的随机矩阵(与随机网络不同)按元素乘以随机网络,从而得到一个网络,平均而言,随机选择原始随机网络中一半的边。然后将随机矩阵的补集乘以随机网络,得到第二个网络,其中包含原始网络的剩余联系。

如果您以矩阵格式获取两个结果并按元素添加它们,您将再次拥有原始网络(以矩阵格式)。

【讨论】:

  • 如果我想修改代码,如果概率小于或等于 0.1,边缘进入 net1,如果概率小于或等于,我将如何修改代码到0.9,它进入net2?如果概率在这个范围之外(即大于 0.9),那么边缘进入 net1 还是 net2 的概率是 50-50?
  • 我可以通过生成 0-1 之间的随机数来做到这一点,如果随机数在 0-0.1 之间(不包括 0.1),则边缘进入 net1,如果随机数在 0.1 之间-1(包括 0.1)边缘进入 net2?我生成一个这样的随机数:randnum &lt;- runif(1, min=0, max=1),然后在 while 循环中使用 for 循环:while (there are edges to look through) { if (randnum &gt;= 0 &amp;&amp; randnum &lt; 0.1) { put edge in net1 } else if (randnum &gt;= 0.1 &amp;&amp; randnum &lt; 1) { put edge in net2 }}。我只是不确定如何编写代码来查看边缘并将边缘放在 net1 或 net2 中。
  • @LoneWolf 您可以将erdos.renyi.game() 的第二个参数(在上面的示例中设置为.5,从而产生50/50 的分割)任意设置。如果你使用0.1,那么有 10% 的概率,原始网络中的任何给定 tie 都会以 g1 结束,否则它将以 g2 结束。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多