Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于igraph的引文网络主路径分析_R_Igraph - Fatal编程技术网

基于igraph的引文网络主路径分析

基于igraph的引文网络主路径分析,r,igraph,R,Igraph,是否有人熟悉在R中使用IGRAPHE实现主路径分析的方法(Hummon和Doreian 1989) 下面是Hummon和Doreian原始文章中的一个示例。它追踪了40篇关于DNA的期刊文章的引用。箭头在时间上向前移动(信息从旧文章流向新文章) dna\u边缘更新 如果您想找出哪条路径的总权重最高,可以尝试下面的代码 g <- graph_from_data_frame(edgelst) asp <- unlist( sapply( names(dna_sources),

是否有人熟悉在R中使用IGRAPHE实现主路径分析的方法(Hummon和Doreian 1989)

下面是Hummon和Doreian原始文章中的一个示例。它追踪了40篇关于DNA的期刊文章的引用。箭头在时间上向前移动(信息从旧文章流向新文章)

dna\u边缘更新
如果您想找出哪条路径的总权重最高,可以尝试下面的代码

g <- graph_from_data_frame(edgelst)
asp <- unlist(
  sapply(
    names(dna_sources),
    function(s) {
      all_simple_paths(g, s, names(dna_sinks))
    }
  ),
  recursive = FALSE
)

path_weight <- sapply(
  asp,
  function(p) {
    v <- names(p)
    sum(merge(
      edgelst,
      data.frame(from = head(v, -1), to = tail(v, -1))
    )$weight)
  }
)

max_cum <- max(path_weight)
path_max <- asp[path_weight == max_cum]

这里是一个使用
所有最短路径的暴力方法(如果您不需要所有路径都是最短的,您可以使用
所有简单路径

你会得到一个像下面这样的图

SPC 以下函数实现SPC


spc请提供有关“主路径分析”的更多信息。那是什么?它是如何工作的?一个有解释的例子?我根据文献添加了更多的细节“交叉时每边的重量”是什么意思?你是说两条路共用一条边吗?是的。例如,在图中的示例中,有多条路径从源3通向汇39(3-21-32-36-39或3-21-32-33-35-39等)[viz不太清楚:原始H&D产品更干净]。这样做的目的是,如果每条边位于源-汇路径上,那么它将获得一个点或其他东西。因此我们看到边3-21-32会得到更多的点(“更高的权重”),因为它们存在于更多的路径中;“强制性路线”之类的。非常感谢@ThomasIsCoding,我相信这应该行得通。我将测试它并将其返回给you@Rafael欢迎您的光临,祝您好运。是否可以将此扩展以指示哪条路径的总权重最高?@Rafael再次查看我的更新,Thomas。我在复制代码时得到了一个稍微不同的结果(max_cum=307),但它似乎已经完成了这项工作。干杯谢谢蒂姆。同样在这种情况下,要找到主路径,还需要一个函数来显示哪条路径的总和最高,对吗?@Rafael你说得对。我用一个搜索主路径的附加函数更新了我的答案。
dna_sources <- V(dna_g)$name[which(degree(dna_g, mode="in")==0)] # sources
[1] "8"  "18" "4"  "34" "25" "28" "37" "40" "38" "39"
dna_sinks <- V(dna_g)$name[which(degree(dna_g, mode="out")==0)] # sinks
[1] "1"  "2"  "3"  "6"  "10" "11" "14" "19" "23" "26"
g <- graph_from_data_frame(edgelst)
asp <- unlist(
  sapply(
    names(dna_sources),
    function(s) {
      all_simple_paths(g, s, names(dna_sinks))
    }
  ),
  recursive = FALSE
)

path_weight <- sapply(
  asp,
  function(p) {
    v <- names(p)
    sum(merge(
      edgelst,
      data.frame(from = head(v, -1), to = tail(v, -1))
    )$weight)
  }
)

max_cum <- max(path_weight)
path_max <- asp[path_weight == max_cum]
> max_cum
[1] 30

> path_max
$`61`
+ 7/33 vertices, named, from a74a1fe:
[1] 6  9  12 29 32 36 39

$`111`
+ 6/33 vertices, named, from a74a1fe:
[1] 11 20 31 32 36 39
dna_g <- graph_from_data_frame(dna_edges, directed = T)

dna_sources <- V(dna_g)[degree(dna_g, mode = "in") == 0]
dna_sinks <- V(dna_g)[degree(dna_g, mode = "out") == 0]

edgelst <- aggregate(weight ~ ., cbind(
  do.call(
    rbind,
    unlist(sapply(
      dna_sources,
      function(s) {
        # asp <- all_simple_paths(dna_g, s, dna_sinks) ## if we apply `all_simple_paths`
        asp <- all_shortest_paths(dna_g, s, dna_sinks)$res
        lapply(asp, function(p) {
          v <- names(p)
          data.frame(from = head(v, -1), to = tail(v, -1))
        })
      }
    ), recursive = FALSE)
  ),
  weight = 1
), sum)

dna_df <- merge(dna_edges, edgelst, all = TRUE)

g <- graph_from_data_frame(dna_df, directed = TRUE)

plot(g, edge.label = dna_df$weight)
> dna_df
   from to weight
1     1  8      1
2     2 18      1
3     3  4      1
4     3  5     NA
5     3 21      3
6     5 12     NA
7     6  9      3
8     9 12      3
9    10 17      1
10   11 13     NA
11   11 20      4
12   12 15     NA
13   12 29      3
14   13 20     NA
15   14 16      1
16   14 20     NA
17   14 31      3
18   15 22     NA
19   15 29     NA
20   16 17      1
21   16 20     NA
22   17 34      2
23   19 20      2
24   19 21      2
25   19 24      2
26   19 25      2
27   19 25      2
28   20 22     NA
29   20 22     NA
30   20 30      2
31   20 31      4
32   21 22     NA
33   21 32      5
34   22 27     NA
35   23 27      3
36   24 28      1
37   24 37      1
38   26 27      3
39   27 32      6
40   29 32      3
41   30 40      2
42   31 32      4
43   31 40      3
44   32 33     NA
45   32 36     11
46   32 38      7
47   33 32     NA
48   33 35     NA
49   35 38     NA
50   35 39     NA
51   36 38     NA
52   36 39      7
53   36 40      4