2

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

似乎大部分工作都在“R_igraph_sir”中完成,但我在那个包中找不到这样的功能。有没有办法设置起始节点?

4

1 回答 1

2

您似乎想要一个 SIR 模型,您可以在其中通过猴子修补现有的 R 代码来设置最初受感染的节点。由于 R 包是从 C 代码编译的,这取决于您的编程经验可能会很困难,并且通常不建议使用猴子补丁,如果没有别的,因为您将在更新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

一些aberdabeis:

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