我有以下网络:
g <- graph(c("Amy", "Ram",
"Ram", "Li",
"Li", "Amy",
"Amy", "Li",
"Kate", "Li"), directed=TRUE)
,并想了解如何计算此网络中的“紧密度”中心度。从我对文档的理解来看,“紧密度”是从网络的一个顶点到其他顶点的所有最短路径的均值的倒数。凭直觉,我将这样计算:
Dist <- distances(g, mode="out")
Dist[Dist == Inf] <- NA
1/rowMeans(Dist, na.rm=T)
但是,这很可能是错误的,因为内置igraph函数中用于计算紧密度中心性的值显示出不同的结果:
closeness(g, mode = "out")
我想了解如何计算接近度,以及如何在不使用内置函数的情况下逐步获得相同的结果。
答案 0 :(得分:2)
这里发生了几件事。您的代码确实有错误,但是最大的问题在于closeness
函数-无论是其实现还是其文档。首先,我们应该计算什么? closeness
的igraph文档说:
顶点的紧密中心性由的倒数定义 进出所有其他顶点的最短路径的平均长度 该图:
1 / sum(d(v,i),i!= v)
如果顶点v和i之间没有(定向)路径 然后在公式中使用顶点总数,而不是 路径长度。
让我们将其与 Wikipedia article on closeness_centrality。
Bavelas(1950)将亲近度定义为亲和力的倒数。 距离,即:
C(x)= 1 / ∑ d(y,x)其中d(y,x)是顶点之间的距离 x和y。说到 亲密性为中心,人们通常将其归一化 代表最短路径的平均长度,而不是 他们的总和。通常由前面的公式乘以 N − 1,其中N是 图中的节点数。对于大图,此差异 变得无关紧要,因此-1被丢弃 导致:
C(x)= N / ∑ d(y,x)此调整允许在图的节点之间进行比较 大小不同。
首先,igraph文档的总和超过i != v
。
单词说“平均长度的倒数”,这意味着
C(x) = (N-1) / ∑ d(y,x)
,但公式显示为1 / ∑ d(y,x)
。
实际上,我们将看到closeness
函数所计算的内容
尽管字样指示标准化版本,但仍应保留此原始定义。
但是还有另一个问题。您将Inf值更改为NA,然后使用na.rm=T
。请注意igraph文档中的最后一句话。
如果顶点v和i之间没有(定向)路径,则总数 公式中使用的顶点数代替路径长度。
您不应忽略这些节点。您应该将距离设置为图形中节点的总数。因此,要获得与igraph相同的结果,您需要计算:
Dist <- distances(g, mode="out")
Dist[Dist == Inf] <- vcount(g)
1/rowSums(Dist)
Amy Ram Li Kate
0.1666667 0.1428571 0.1428571 0.1666667
closeness(g, mode = "out")
Amy Ram Li Kate
0.1666667 0.1428571 0.1428571 0.1666667
当然,igraph文档不一致。这些词说它计算归一化的紧密度,但是公式(及其实际计算的)是非归一化的形式。
我希望这可以弄清楚正在计算什么 并帮助您选择要用于分析的内容。
顺便说一句::计算1/rowMeans(Dist)
时,将包括igraph遗漏的v = i大小写(距离为零)。这意味着您正在计算C(x) = N / ∑ d(y,x)
而不是C(x) = (N-1) / ∑ d(y,x)
。如Wikipedia所述,对于大型图形,它们本质上是相同的,但是我只想确保您知道自己在计算什么。