如何解决如何在R中具有断开连接的组件的网络上计算接近度集中度度量?
我想在组件断开连接的网络上计算接近度集中度度量。 closeness
中的igraph
函数在此类图上没有给出有意义的结果。 (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,3,4,5,6,7,9,10,11),j=c(2,11,10),w=c(1,1))
# Calculate measures
closeness_w(net,gconly=FALSE)
就我而言,我有一个交易数据,因此我基于此数据构建的网络是directed
和weighted
。权重由1/(transaction amount)
组成。
这是我的示例数据:
structure(list(id = c(2557L,1602L,18669L,35900L,48667L,51341L
),from = c("5370","6390","5370","8934","5370"),to = c("5636","8933","8483","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$weights)
cl <- closeness_w(network,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 ]
此外,网站上给出的数据的i
和j
列中的输入是对等的,即1-> 2存在,而2-> 1存在。但是我的数据不是那样,因此我的数据5370
汇款到5636
,但是5636
却没有汇款到5370
。因此,如何在这种定向的交易数据网络上正确计算接近度度量。有没有人尝试过类似的计算?
编辑: 由于权重在
closeness_w
函数中不被视为距离,而是被视为强度,因此我应该将weights
确定为sum(amount)
而不是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,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
,
您引用的网页没有解释“紧密度可以应用于断开的网络”。相反,它建议计算与接近度完全不同的数量。
他们计算的内容实际上称为全局效率,并在本文中提出:
您将在某些软件包中找到实现。我也为igraph实现了此功能,它将被包含在C / igraph的0.9版本中(大概也在R / igraph的某些版本中)。 from IGraph/M已经可以访问,它是igraph的Mathematica界面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。