2013-03-27 86 views
3

Q.I有一個erdos.reyni圖。我感染一個頂點,並想看看疾病會出現什麼樣的頂點序列? igraph有像get.adjacency(),neighbors()這樣的函數。獲取鄰接矩陣的傳染鏈,r,igraph

詳情。這是帶有頂點名稱而不是0,1標誌的鄰接矩陣,我試圖從中得到傳染鏈。如果某個頂點被感染,就像通過圖形的流行病的流程/順序一樣。我們不必擔心這裏的感染概率(假設所有頂點命中都被概率1感染)。

因此,假設我點擊頂點1(這是第1行)。我們看到它有到4,5,18,22,23,24,25頂點的傳出鏈接。那麼接下來的頂點將是那些連接到4,5,18 ... 25的頂點,即那些在第4行,第5行,第18行,...第25行中的值。然後,根據該模型,疾病將穿過這些等等。

我明白我可以傳遞一個字符串來排列矩陣行。我的問題是,我無法弄清楚如何生成該序列。

矩陣看起來像這樣。

> channel 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 4 5 18 22 23 24 25 NA 
[2,] 6 10 11 18 25 NA NA NA 
[3,] 7 11 18 20 NA NA NA NA 
[4,] 24 NA NA NA NA NA NA NA 
[5,] 1 3 9 13 14 NA NA NA 
[6,] 3 8 9 14 19 23 NA NA 
[7,] 3 4 8 15 20 22 NA NA 
[8,] 2 3 25 NA NA NA NA NA 
[9,] 3 4 11 13 20 NA NA NA 
[10,] 4 5 8 15 19 20 21 22 
[11,] 3 13 15 18 19 23 NA NA 
[12,] 11 13 16 NA NA NA NA NA 
[13,] 4 6 14 15 16 17 19 21 
[14,] 2 6 13 NA NA NA NA NA 
[15,] 3 17 20 NA NA NA NA NA 
[16,] 6 15 18 23 NA NA NA NA 
[17,] 2 25 NA NA NA NA NA NA 
[18,] 2 5 NA NA NA NA NA NA 
[19,] 3 11 NA NA NA NA NA NA 
[20,] 1 4 7 10 12 21 22 25 
[21,] 2 4 6 13 14 16 18 NA 
[22,] 1 3 4 15 23 NA NA NA 
[23,] 1 16 24 NA NA NA NA NA 
[24,] 7 8 19 20 22 NA NA NA 
[25,] 7 12 13 17 NA NA NA NA 

我想基於一個選擇標準來重新排序這個矩陣如下:

R.將是最有幫助的(但我感興趣的算法中,因此任何Python和Ruby,etc.will很大)。所得到的載體將具有115的長度(8×25 = 200-85NA = 115)。看起來像這樣。基本上,如果頂點1被感染,疾病會如何傳播。

4,5,18,22,23,24,25,24,1,3,9,13,14,2,5,1,3,4,15,23,1,16,24,7,8,19,20,22,7,12,13,17,7,8,19,20,22, 4,5,18,22,23,24,25,7,11,18,20... 

我知道到目前爲止什麼: 1. R的包**igraph**它讓我算算鄰居(graph, vertex, "out") 2.同一個包還可以生成get.adjlist(graph...), get.adjacency

+0

有趣的評論。現在你們堅持。該矩陣是具有向量名稱而不是二進制標誌的鄰接矩陣。 輸出將是流行病流模型,但它不是模擬疾病而是銀行違約! :) 至於提示......從編碼的最後2周開始,我收集了像R/java這樣的高級語言,它比C++中的舊學校字符類型更好地操縱矢量。 – user2217564 2013-03-27 22:44:19

+0

等等,這不是基本上是通過圖形的廣度優先搜索嗎? – Marius 2013-03-27 23:38:08

+0

查看'graph.bfs()',特別是'order'參數。 – Marius 2013-03-27 23:47:10

回答

4

像這樣找到一個「傳染鏈」就相當於圖中的廣度優先搜索,例如,:

library(igraph) 
set.seed(50) 
g = erdos.renyi.game(20, 0.1) 
plot(g) 
order = graph.bfs(g, root=14, order=TRUE, unreachable=FALSE)$order 

輸出:

> order 
[1] 14 1 2 11 16 18 4 19 12 17 20 7 8 15 5 13 9 NaN NaN NaN 

enter image description here

1

你如何定義的排序目前尚不清楚行,所以...只是一些提示:

> (m <- matrix(data=1:9, nrow=3)) 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
> m[c(2,3,1),] 
    [,1] [,2] [,3] 
[1,] 2 5 8 
[2,] 3 6 9 
[3,] 1 4 7 

你可以通過索引向量選擇行的置換/組合

函數t()轉置矩陣。

矩陣被存儲在列 - 第一(或column-major)順序:

> as.vector(m) 
[1] 1 2 3 4 5 6 7 8 9 

NA值可以通過子集被刪除:

> qq <- c(1,2,NA,5,7,NA,3,NA,NA) 
> qq[!is.na(qq)] 
[1] 1 2 5 7 3 

另外,圖表算法由Bioconductor的的graph或提供CRAN的igraph包。