基于igraph的引文网络主路径分析
是否有人熟悉在R中使用IGRAPHE实现主路径分析的方法(Hummon和Doreian 1989) 下面是Hummon和Doreian原始文章中的一个示例。它追踪了40篇关于DNA的期刊文章的引用。箭头在时间上向前移动(信息从旧文章流向新文章)基于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),
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