设置在网络中传播病毒的起始节点

时间:2016-07-27 14:29:18

标签: r graph igraph complex-networks

我正致力于使用R编程在复杂网络中寻找有影响力的节点。我想使用度中心性,这意味着节点在图中具有的邻居数。我有一个图表和每个节点的程度中心性。现在我想知道当我们开始从每个节点传播病毒时,在指定时间内会有多少节点被感染。根据我的研究,我应该使用SIR(易感,感染,恢复)流行病模型,我在" igraph"包,问题是我无法指定起始节点。似乎这个函数基于SIR方程工作:

s'= -(beta)SI
I' = (beta)SI - (gamma)I
R' = (gamma)I

其中beta是感染参数,gamma是恢复参数。 这是igraph SIR代码:

function (graph, beta, gamma, no.sim = 100) 
{
if (!is_igraph(graph)) {
    stop("Not a graph object")
}
beta <- as.numeric(beta)
gamma <- as.numeric(gamma)
no.sim <- as.integer(no.sim)
on.exit(.Call("R_igraph_finalizer", PACKAGE = "igraph"))
res <- .Call("R_igraph_sir", graph, beta, gamma, no.sim, 
    PACKAGE = "igraph")
class(res) <- "sir"
res
}

似乎大部分工作都是在&#34; R_igraph_sir&#34;但是我无法在那个包中找到这样的功能。 有没有办法设置起始节点?

1 个答案:

答案 0 :(得分:2)

您似乎希望拥有一个SIR模型,您可以通过monkeypatching现有的R代码来设置最初感染的节点。由于R包是用C代码编译的,这可能很难,这取决于你的编程经验,一般情况下不建议使用monkeypatching,如果没有别的,那么因为你在更新igraph包时会丢失你的代码

相反,您可以使用igraph包自己相对轻松地实现此功能。下面是python中未经测试的实现,应该可以轻松移植到R.

第一步感染图中与受感染节点相邻的任何节点,概率为beta

感染阶段后,可以从图表中删除任何受感染的节点,概率为gamma

在给定的时间步数后,您会发现受影响的节点数量为infected_nodes数组的大小。这不会计算已删除的节点,因此如果您想要在整个模拟中感染的总数,则将其放入计数器中,每次感染节点时该计数器都会递增

infected_nodes = []
# Set the infection rate
beta = 0.1
# Set the removal rate
gamma = 0.1
# Set how many timesteps you want to pass through
n_timesteps = 100
# Start from the node you have chosen using edge centrality
infected_nodes.append(chosen_node)
for _ in n_timesteps:
    # Infection stage
    for node in infected_nodes:
        for neighbor in igraph.neighborhood(graph, node):
            # random.random simply returns a number between [0,1)
            if random.random() < beta:
                infected_nodes.append(neighbor)
    # Removal stage
    infected_survivors = []
    for node in infected_nodes:
        if random.random() < gamma:
            graph = igraph.delete_vertices(graph, node)
        else:
            infected_survivors.append(node)
    infected_nodes = infected_survivors

一些异常:

  • 这假设每个节点在每个时间步都访问其所有邻居。如果您只希望每个节点能够每回合感染n个邻居,则需要对邻居进行大小n随机抽样,而不是迭代所有邻居。
  • 在删除阶段,可以删除新感染的节点,这意味着节点有可能没有机会感染其邻居。如果您的情况不太现实,则必须将新感染的节点存储在单独的阵列中,并在感染阶段开始时将它们添加到受感染的节点
  • 这显然比R包提供的C实现慢