我试图在Actor-Actor网络中找到中心节点.当我说中心节点时,我的意思是网络中所有其他节点的路径最短的节点。
例如:
df <- structure(list(Movie.Name = structure(c(1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("A", "B", "C",
"D"), class = "factor"), Actor.Name = structure(c(1L, 5L, 6L,
7L, 8L, 5L, 9L, 1L, 10L, 11L, 8L, 12L, 2L, 3L, 4L), .Label = c("Actor1",
"Actor10", "Actor11", "Actor12", "Actor2", "Actor3", "Actor4",
"Actor5", "Actor6", "Actor7", "Actor8", "Actor9"), class = "factor")), .Names = c("Movie.Name",
"Actor.Name"), class = "data.frame", row.names = c(NA, -15L))在这个二分网络中,我投影了参与者-参与者网络,并通过以下代码为所有节点寻找最短路径:
library(igraph)
g_graph <- graph.data.frame(df,directed=FALSE)
V(g_graph)$type <- bipartite_mapping(g_graph)$type
# project only actor&actor network
projected_g <- bipartite_projection(g_graph, multiplicity = TRUE, which = TRUE)
# Get connected nodes in largest component
# get largest component
getmax = function(g) {
V(g)$comp = clusters(g)$membership
delete.vertices(g, V(g)[V(g)$comp!=which(clusters(g)$csize==max(clusters(g)$csize))])
}
lc_projected_g <- getmax(projected_g)
# Turn weights into sample value!!
E(lc_projected_g)$weight <- 1
# Find shortes path from one to all nodes
p_short <- shortest.paths(lc_projected_g)
p_df <-as.data.frame(rownames(p_short))
p_df$Total_path_length <- rowSums(p_short)
# Find eigenvector centrality!!!
projected_eig <- eigen_centrality(lc_projected_g)$vector我的问题是:
我希望我的问题清楚合理。提前谢谢。
发布于 2019-01-18 08:45:59
连接所有其他节点的最短路径节点是距离最小的节点,或者是在closeness() See ?closeness()和Bavelas (1950)和nice 中心性度量的wiki页面中计算出的最高贴近度中心度。
回答以下三个子问题:
1)在中,重量是摩擦,而不是润滑剂。有关更多细节,请参见我最近的回答中的相同问题
我认为closeness-centrality听起来更像是您要寻找的东西:“所有其他节点的最小求和距离”。在你的例子中,特征向量中心性(我认为它有一个更复杂和不那么直观的公式)和亲密中心性都会给你留下一个平分的胜利者。比较:
eigen_centrality(lc_projected_g)$vector
closeness(lc_projected_g)如果很多胜利者都有相同的价值,那么决定哪个才是正确的节点,这确实是你自己的判断问题。由于有多位学者使用了Erdős - to 1,Paul Erdős使用了一个替代公式,将最低的Erdős-号与他合著论文最多的人(k)授予最低的Erdős-number。我的怀疑是,你那类附属网络的复制会产生带有“捆绑赢家”的结构,从而使所有其他节点的最短路径也以略大于您的图的形式出现。也许你可以重新思考,为什么你希望你的重新投影中最核心的节点是指返回到你的图的原始的二部结构?
3)你失去了你的边名,因为重新投影的边本质上完全不是相同的边。很高兴他们走了。不过,我不能用您的代码复制任何丢失的边名。g_graph没有为E(g)设置名称或标签。E(lc_projected_g)列出了很好的命名边,因为顶点的名称很好。你可以重新建立你自己的名字,比如:
E(lc_projected_g)$label <- apply(ends(lc_projected_g, E(lc_projected_g)), 1, paste,collapse="--")前提是你的顶点已经正确命名了。您在bipartite_projection()中的投影应该总是带有垂直的名称,而不是边缘名称。在你上面的代码中,至少对我来说是这样的。我上面的代码行设置了标签(在绘制图形时显示),使用paste()将每个边的垂直对的名称用"--“粘合在一起。看看ends(lc_projected_g, E(lc_projected_g))。它应该将命名为垂直对的矩阵列出来。
许多问题在一个,但工作良好的代码-示例。祝好运。
https://stackoverflow.com/questions/54246965
复制相似问题