问题描述
我正在与一个具有数千个节点和边缘的大型网络一起工作。可以在Number of Connected Nodes in a dendrogram
的上一个问题中找到网络的代表但是,在计算网络中的节点数时,尝试计算加在一起导致下一个级别提升的节点数时遇到了一个问题。例如,
library(tidygraph)
library(ggraph)
library(tidyverse)
parent_child <- tribble(
~parent,~child,"a","b","c","d","e","f","g","z"
)
# converted to a dendrogram ------------
parent_child %>%
as_tbl_graph() %>%
ggraph(layout = "dendrogram") +
geom_node_point() +
geom_node_text(aes(label = name),vjust = -1,hjust = -1) +
geom_edge_elbow()
# Table of calculations ----------------------
parent_child %>%
as_tbl_graph() %>%
activate(nodes) %>%
mutate(n_community_out = local_size(order = graph_size(),mode = "out",mindist = 0)) %>%
as_tibble()
# Final Output Table -----------------------
# A tibble: 8 x 2
name n_community_out
<chr> <dbl>
1 a 8
2 b 7
3 d 5
4 g 2
5 c 1
6 e 1
7 f 1
8 z 1
上表显示了从起始节点开始连接的节点数。但是,为什么某些级别不累加到下一个级别? (节点d + c!=节点b)我一直在试图向同事解释这一点,但是不能充分解释网络正在计数什么,以及为什么将节点连接从就地添加到下一个并不会导致下一个更高级别。
在具有数千个节点的网络中,此问题更加严重,并且难以显示。无论如何,有人知道如何解释为什么节点连接不累加到下一层吗?任何帮助将不胜感激。
解决方法
您正在使用one-off-by error。比较连接的节点数时,由于要进行计数,因此需要减去一个,将节点本身包括在连接的节点数中。
以您为例
Node D + Node E ?= Node B
您的表中给出了值
...
2 b 7
3 d 5
...
5 c 1
...
您有意设置了mindist = 0
,以便在计数来自父级的节点时,包括该节点本身。
这里是快速的视觉效果,可以看到方向性。
library(tidygraph)
library(ggraph)
library(tidyverse)
parent_child <- tribble(
~parent,~child,"a","b","c","d","e","f","g","z"
)
plot(as_tbl_graph(parent_child))
由reprex package(v0.3.0)于2020-11-25创建
节点C不能指向其他任何东西,但是由于mindist = 0
,它会自动计数并使其社区等于1
,就像在表中一样。
节点D可以访问4个节点(e
,f
,g
,z
),当我们计算自身时,它的本地邻居总数为5个节点。
类似地,节点B将计算其连接的所有节点,但也计算其自身。
因此,要比较实际计数,您需要减去1。
Node D + Node E
=> 5 + 1
=> 6
Node B = 7
=> 7 - 1
=> 6