R igraph包如何计算接近中心性?

8

我有以下网络:

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
如果你想深入了解代码的具体操作,igraph包调用了一个用C语言编写的函数来进行接近度计算。你可以在这里找到该函数:https://github.com/igraph/igraph/blob/master/src/centrality.c。搜索`function igraph_closeness`以跳转到正确的位置。 - eipi10
3个回答

6
这里发生了几件事情。你的代码确实有一个错误,但主要问题在于函数 - 无论是其实现还是文档。首先,我们应该计算什么?igraph文档中的指出:

顶点的接近中心性由图中所有其他顶点到/从其最短路径的平均长度的倒数定义:

1/sum(d(v,i),i!=v)

如果顶点V和I之间没有(有向)路径,则在公式中使用总顶点数而不是路径长度。

让我们将其与维基百科上的“接近中心性”文章进行比较。

Closeness是由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)。事实上,我们将看到函数计算的内容对应于原始定义,尽管文字指示标准化版本。
但还有一个问题。您将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)时,您包括v = i情况(距离为零),而igraph则将其排除在外。 这意味着您正在计算C(x)= N / ∑ d(y,x),而不是C(x)=(N-1)/∑d(y,x)。 正如维基百科所指出的那样,对于大图表,它们本质上是相同的,但我只是想确保您知道自己正在计算什么。

非常感谢!回答写得非常清晰易懂! - Ju Ko

2

看起来自从@G5W发布这篇优秀的答案之后,igraph可能已经发生了变化。 closeness的igraph文档已更改:

一个顶点的中心性定义为到所有其他顶点的距离之和的倒数:

如果顶点v和i之间没有(有向)路径,则i在计算中被省略。如果没有其他顶点可以从v到达,则将其中心度作为NaN返回。

输出也已更改。使用原始示例:

g <- graph(c("Amy", "Ram",
          "Ram", "Li",
          "Li", "Amy",
          "Amy", "Li",
          "Kate", "Li"), directed=TRUE)

closeness(g, mode = "out")

      Amy       Ram        Li      Kate 
0.5000000 0.3333333 0.3333333 0.1666667 

这个结果与上面的例子不同,且正确答案并未在接受的答案中得到复现(链接在上方,并在此处重现),可能是因为函数 igraph::closeness 发生了改变:

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 

注意:这仍然与@G5W的输出匹配,但不再与匹配。 相反,与OP更相似的东西,除了使用而不是,可以匹配:
Dist <- distances(g, mode="out")
Dist[Dist == Inf] <- NA
1/rowSums(Dist,na.rm=T)

      Amy       Ram        Li      Kate 
0.5000000 0.3333333 0.3333333 0.1666667 

会话信息:

> sessionInfo()
R version 4.2.2 (2022-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.utf8 
[2] LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets 
[6] methods   base     

other attached packages:
[1] qgraph_1.9.2  igraph_1.3.2  tidyr_1.2.0   dplyr_1.0.9  
[5] ggplot2_3.4.0

loaded via a namespace (and not attached):
 [1] splines_4.2.2       gtools_3.9.2.2     
 [3] Formula_1.2-4       assertthat_0.2.1   
 [5] stats4_4.2.2        latticeExtra_0.6-29
 [7] yaml_2.3.5          pbivnorm_0.6.0     
 [9] pillar_1.7.0        backports_1.4.1    
[11] lattice_0.20-45     glue_1.6.2         
[13] digest_0.6.29       RColorBrewer_1.1-3 
[15] checkmate_2.1.0     colorspace_2.0-3   
[17] sandwich_3.0-2      htmltools_0.5.2    
[19] Matrix_1.5-1        plyr_1.8.7         
[21] psych_2.2.5         pkgconfig_2.0.3    
[23] purrr_0.3.4         xtable_1.8-4       
[25] corpcor_1.6.10      mvtnorm_1.1-3      
[27] scales_1.2.0        glasso_1.11        
[29] jpeg_0.1-9          fdrtool_1.2.17     
[31] emmeans_1.8.2       tibble_3.1.7       
[33] htmlTable_2.4.0     generics_0.1.2     
[35] farver_2.1.0        ellipsis_0.3.2     
[37] TH.data_1.1-1       withr_2.5.0        
[39] pbapply_1.5-0       nnet_7.3-18        
[41] mnormt_2.1.0        cli_3.6.0          
[43] survival_3.4-0      magrittr_2.0.3     
[45] crayon_1.5.1        estimability_1.4.1 
[47] evaluate_0.15       fansi_1.0.3        
[49] nlme_3.1-160        MASS_7.3-58.1      
[51] foreign_0.8-83      tools_4.2.2        
[53] data.table_1.14.2   lifecycle_1.0.3    
[55] multcomp_1.4-20     stringr_1.4.0      
[57] munsell_0.5.0       cluster_2.1.4      
[59] compiler_4.2.2      rlang_1.0.6        
[61] grid_4.2.2          rstudioapi_0.13    
[63] htmlwidgets_1.5.4   lavaan_0.6-11      
[65] base64enc_0.1-3     labeling_0.4.2     
[67] rmarkdown_2.14      gtable_0.3.0       
[69] codetools_0.2-18    abind_1.4-5        
[71] DBI_1.1.2           reshape2_1.4.4     
[73] R6_2.5.1            gridExtra_2.3      
[75] zoo_1.8-10          knitr_1.39         
[77] performance_0.10.1  fastmap_1.1.0      
[79] utf8_1.2.2          Hmisc_4.7-0        
[81] insight_0.18.8      stringi_1.7.6      
[83] parallel_4.2.2      Rcpp_1.0.8.3       
[85] vctrs_0.5.1         rpart_4.1.19       
[87] png_0.1-7           tidyselect_1.1.2   
[89] xfun_0.31           coda_0.19-4        

1
第1.5.0版本的igraph中,计算在规范化和非规范化之间发生了交换。因此,如果您要求closeness(g, vids="f", normalized = TRUE),它将给您非规范化的结果,而closeness(g, vids="f")将给您规范化的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接