r - 如何在 R 中计算具有断开组件的网络上的紧密度中心性度量?

标签 r igraph sna network-analysis

我想计算具有断开连接的组件的网络上的紧密度中心性度量。 igraph 中的 closeness 函数不会在此类图表上给出有意义的结果。 (see)

然后我遇到了this site其中解释了也可以在具有断开连接的组件的图表上测量紧密度。

建议使用以下代码来实现此目的:

# Load tnet
library(tnet)
 
# Load network 
# Node K is assigned node id 8 instead of 10 as isolates at the end of id sequences are not recorded in edgelists
net <- cbind(
  i=c(1,1,2,2,2,3,3,3,4,4,4,5,5,6,6,7,9,10,10,11),
  j=c(2,3,1,3,5,1,2,4,3,6,7,2,6,4,5,4,10,9,11,10),
  w=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
 
# Calculate measures
closeness_w(net, gconly=FALSE)

就我而言,我有交易数据,因此我在此数据上构建的网络是定向加权。权重由1/(交易金额)组成。

这是我的示例数据:

structure(list(id = c(2557L, 1602L, 18669L, 35900L, 48667L, 51341L
), from = c("5370", "6390", "5370", "5370", "8934", "5370"), 
    to = c("5636", "5370", "8933", "8483", "5370", "7626"), date = structure(c(13099, 
    13113, 13117, 13179, 13238, 13249), class = "Date"), amount = c(2921, 
    8000, 169.2, 71.5, 14.6, 4214)), row.names = c(NA, -6L), class = "data.frame")

我使用以下代码来实现我想要的:

df2 <- select(df,c(from,to,amount)) %>% 
    group_by(from,to) %>% mutate(weights=1/sum(amount)) %>% select(-amount) %>% distinct
  
  network <- cbind(df2$from,df2$to,df2$weights)

  cl <- closeness_w(network, directed = T, gconly=FALSE)  # here it gives the error: "Error in net[, "w"]^alpha : non-numeric argument to binary operator"

  # so I modify from and to columns as follows to solve the error mentioned above
  df2$from <- as.integer(df2$from)
  df2$to <- as.integer(df2$to)
  # then I run the code again
  network <- cbind(df2$from,df2$to,df2$weights)
  cl <- closeness_w(network, directed = T, gconly=FALSE)

但是输出并不像网站上仅包含每个节点的紧密度分数的输出,而是创建了很多值为 0 的行,我不知道为什么。

我得到的输出如下:

     node  closeness    n.closeness
   [1,]    1 0.00000000 0.000000000000
   [2,]    2 0.00000000 0.000000000000
   [3,]    3 0.00000000 0.000000000000
   [4,]    4 0.00000000 0.000000000000
   [5,]    5 0.00000000 0.000000000000
   ...........................................................
 [330,]  330 0.00000000 0.000000000000
 [331,]  331 0.00000000 0.000000000000
 [332,]  332 0.00000000 0.000000000000
 [333,]  333 0.00000000 0.000000000000
 [ reached getOption("max.print") -- omitted 8600 rows ]

此外,网站上给出的数据中的 ij 列中的输入是倒数,即 1->2 存在,当且仅当 2->1 存在。但我的数据不是这样的,所以在我的数据中 53705636 汇款,但 5636 还没有向 5636 汇款>5370。那么,如何在这种有向交易数据网络上正确计算紧密度度量。以前有人尝试过类似的计算吗?

EDIT: Since the weights are not considered as distance in closeness_w function, but rather they are considered as strength, I should have determined weights as sum(amount) instead of 1/sum(amount)

最佳答案

您获得许多零值行的原因是因为它提供了节点 1 到 8934 的紧密度值(矩阵中的最大值)。如果您过滤数据框中的值,您将找到您要查找的值:

cl <- closeness_w(df2, directed = T, gconly=FALSE)
cl[cl[, "node"] %in% c(df2$from), ]

     node  closeness  n.closeness
[1,] 5370 1.37893704 1.543644e-04
[2,] 6390 0.03668555 4.106745e-06
[3,] 8934 5.80008056 6.492870e-04

方向已被考虑在内,如果您过滤“到”节点,您将看到只有 5370 有一个值:

cl[cl[, "node"] %in% c(df2$to), ]

     node closeness  n.closeness
[1,] 5370  1.378937 0.0001543644
[2,] 5636  0.000000 0.0000000000
[3,] 7626  0.000000 0.0000000000
[4,] 8483  0.000000 0.0000000000
[5,] 8933  0.000000 0.0000000000

如果您回到下面的示例,如果您从数据中间删除节点,您将看到它为缺失的节点提供零,并尝试设置 directed = F您会注意到其中的差异。

更新:

如果您想要创建网络的替代方案,在创建 df2 后,您可以将其传递到 closeness_w 函数中,您的节点标签将成为索引,并且节点列将减少到 1:n:

df2 <- df %>% 
  group_by(from, to) %>% 
  mutate(weights = 1/sum(amount)) %>% 
  select(from, to, weights) %>% 
  distinct

cl <- closeness_w(df2, directed = T, gconly=FALSE)
cl 

     node  closeness n.closeness
5370    1 1.37893704 0.229822840
5636    2 0.00000000 0.000000000
7626    3 0.00000000 0.000000000
8483    4 0.00000000 0.000000000
8933    5 0.00000000 0.000000000
6390    6 0.03668555 0.006114259
8934    7 5.80008056 0.966680093

关于r - 如何在 R 中计算具有断开组件的网络上的紧密度中心性度量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64018735/

相关文章:

regex - R字符串在拆分时删除标点符号

r - 小数点后可以使用R显示多少个数字?

python - 如何将权重输入 igraph 社区检测 [Python/C/R]

python - 使用 python igraph 绘制图形从未成功

R - 顶点属性 - 'Inappropriate value given in set.vertex.attribute.'

python - 如何将邻接表读入 NetworkX 以创建有向图?

r - 如何在 R 中使用 d3Network 可视化图形

正则表达式删除punct删除R中的非标点字符

r - 如何在R中获取面板数据的 "extrapolate"值?

python - 比较两个小有向图以及边和节点上的属性