我正致力于使用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;但是我无法在那个包中找到这样的功能。 有没有办法设置起始节点?
答案 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
随机抽样,而不是迭代所有邻居。