每个节点及其网络的 igraph 计算指标

igraph compute metrics for each node and its network

我很好奇如何为每个节点计算一些指标。

为每个节点计算

的欺诈连接百分比

开始使用 igraph 我不确定如何继续编写自己的图形处理函数(即不仅应用学位、pagerank 等)。期待一些建议,仅通过一次图表即可解决此任务。

这里是最小样本

library(igraph)
id = c("a", "b", "c", "d", "e", "f", "g") 
name = c("Alice", "Bob", "Charlie", "David", "Esther", "Fanny", "Gaby") 
fraud = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) 
verticeData <- data.frame(id, name, fraud) 
verticeData

src <- c("a", "b", "c", "f", "e", "e", "d", "a")
dst <- c("b", "c", "b", "c", "f", "d", "a", "e")
relationship <-c("A", "B", "B", "B", "B", "A", "A", "A")
edgeData <- data.frame(src, dst, relationship)
edgeData
g <- graph_from_data_frame(edgeData, directed = TRUE, vertices = verticeData)
plot(g, vertex.color=V(g)$fraud)
# TODO compute metrics

我没有移动的权限,因此将根据 https://stats.stackexchange.com/questions/256859/igraph-compute-metrics-for-each-node-and-its-network

的评论手动移动

sna 包中的 gapply 函数为计算各种自我网络统计数据提供了很大的灵活性。它的功能或多或少类似于 apply 函数族,但特别是在网络邻居上循环。 intergraph 包使 igraphsna 之间的转换变得容易。

library(sna)
net<-intergraph::asNetwork(g)
c <- c(1,2)
funcs <- c(sum,mean)
for (i in funcs){
  for (j in list(1,2,c)){
    print(gapply(net,j,net %v% "fraud",i)) 
  }
}

gapply 使用起来不是很直接。第二个参数 ("MARGIN") 表示 row-wise(传出关系)、column-wise(传入关系)或两者(即无向)。第三个参数是要计算的统计向量,第四个参数是您要使用的函数。如您所愿,第三个和第四个参数有很大的灵活性。

> gapply(net,c(1,2),net %v% "fraud",sum)
[1] 0 1 0 1 1 0 0
> gapply(net,c(1),net %v% "fraud",sum)
  Alice     Bob Charlie   David  Esther   Fanny    Gaby 
      0       0       0       1       0       0       0 
> gapply(net,c(2),net %v% "fraud",sum)
  Alice     Bob Charlie   David  Esther   Fanny    Gaby 
      0       1       0       0       1       0       0