Rigraph程序包如何计算紧密度中心度?

时间:2018-07-10 16:39:23

标签: r igraph

我有以下网络:

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")

我想了解如何计算接近度,以及如何在不使用内置函数的情况下逐步获得相同的结果。

1 个答案:

答案 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所述,对于大型图形,它们本质上是相同的,但是我只想确保您知道自己在计算什么。