【问题标题】:Get contagion chain from adjacency matrix, r, igraph从邻接矩阵、r、igraph中获取传染链
【发布时间】:2013-03-18 06:50:05
【问题描述】:

Q.我有一个 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

【问题讨论】:

  • 有趣的 cmets。既然你们坚持。该矩阵是具有向量名称而不是二进制标志的邻接矩阵。输出将是流行病流动模型。除了它不是对疾病建模而是对银行违约建模!! :) 至于提示...从最近 2 周的编码中我收集到,使用 R/java 等高级语言,它比 C++ 中的老式 char 类型更好地处理向量。
  • 等等,这不就是图的广度优先搜索吗?
  • 看看graph.bfs(),特别是order 参数。
  • @Marius 是的.. 这正是我想要实现的目标!除了因为这不是 erdos.reyni 方向图,广度优先将导致无限序列.. 我只想知道如何获得第几个。将查看 graph.bfs()
  • 广度优先搜索适用于无向图,因为您保留了您访问过的节点的列表,它最终不会是无限的,它只会到达所有可到达的节点。

标签: r matrix igraph adjacency-list


【解决方案1】:

找到这样的“传染链”相当于在图上进行广度优先搜索,例如:

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

【讨论】:

    【解决方案2】:

    不清楚你如何定义行的顺序,所以......只是一些提示:

    您可以通过传递索引向量来选择行的排列/组合:

    > (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 软件包提供。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2014-10-19
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多