从邻接矩阵r,igraph获得传染链

时间:2013-03-27 23:35:57

标签: r matrix igraph adjacency-list

问:我有一张erdos.reyni图。我感染了一个顶点,想看看疾病将遵循什么样的顶点序列? igraph有很多函数,比如get.adjacency(),neighbors()。

详情。这是具有顶点名称而不是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等都会很棒)。结果向量的长度为115(8x25 = 200 - 85 NAs = 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

2 个答案:

答案 0 :(得分: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 :(得分: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软件包提供。