2016-07-27 103 views
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」正在做,但我無法找到該包中這樣的功能。 有什麼方法可以設置起始節點嗎?

+0

我想你會在支持R包的.c實現中找到你正在尋找的代碼:https://github.com/igraph/igraph/blob/master/src/sir。c 如果不重新編譯R包,您將無法更改 –

+0

浪費了我的編輯,但還有一點評論:您將在前面提到的sir.c中查看第170行 具體而言,您將不得不設置最初感染到您選擇的節點。 –

+0

你可能也想看看'EpiModel'包中實現的隨機網絡模型。我還沒有試過這個軟件包,但似乎可以使用設置哪些節點最初感染('status.vector')並使用'nwstats'參數設置網絡信息,例如度分佈。 – jac

回答

2

您似乎希望有一個SIR模型,您可以通過修改現有的R代碼來設置最初感染的節點。由於R包是從C代碼編譯的,這可能是艱難的,這取決於您的編程經驗,並且一般不建議使用monkeypatching,否則,因爲在更新igraph包時您將丟失代碼。

相反,您可以使用igraph包自己相對輕鬆地實現這一點。下面是在python一個未測試的實現,它應該被easibly移植到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實現慢
+0

感謝您的幫助。它給了我一個新想法。 – shabnam