是否可以在提取网络骨干网后保留边缘权重?

Possible to retain edge weights after extracting network backbone?

提问人:LennyAngola 提问时间:11/7/2023 更新时间:11/7/2023 访问量:18

问:

我正在使用一个复杂的加权网络,我想使用 R 包“骨干网”中的视差滤波器提取具有统计意义的骨干网。(https://search.r-project.org/CRAN/refmans/backbone/html/disparity.html)

new_graph <- disparity(g, alpha = alpha)

从上面的例子中生成的“骨干”图输出了一个网络,该网络在技术上仍被视为加权 (is_weighted = TRUE),但所有剩余边的权重都已展平为 1。视差函数的 CRAN 页面似乎没有任何允许保留边权重的参数。

这使得无法从生成的图形中计算加权中心性度量或将边缘权重用作社区检测算法的输入。

我想知道 R 中是否有任何替代方案可用于以保留剩余边缘的边缘权重的方式提取网络的主干,无论是否使用视差过滤器。

R iGraph

评论


答:

1赞 Joe Simpson 11/20/2023 #1

我也一直在使用骨干包,遇到了这个问题。经过一些实验,我想我已经想出了最简单的方法来做到这一点。

从原始加权 igraph 对象开始,将其转换为矩阵。将其输入到 disparity() 函数中。然后,使用原始图形中的边缘权重为生成的未加权过滤的 igraph 对象分配权重。您需要使用 as_ids 将边缘拉出到普通的 R 字符串向量中。然后使用 %in% 创建布尔值。然后,您可以使用它来索引原始 igraph 对象的边缘权重。 我写了一个函数来做到这一点。见下文:

filter_graph <- function(graph, alpha = 0.05, narrative = FALSE) {


  # CREATE AN ADJACENCY MATRIX FROM THE IGRAPH OBJECT
  adj_matrix <- as_adjacency_matrix(graph, attr = "Weight", sparse = FALSE)

  # CONVERT THE ADJACENCY MATRIX TO A MATRIX"
  adj_matrix <- as.matrix(adj_matrix)
  # USE THE ADJACENCY MATRIX IN THE DISPARITY() FUNCTION
  result <- disparity(adj_matrix, alpha = alpha, class = "igraph",narrative = narrative)
  # GET VECTOR OF EDGE WEIGHTS FOR EDGES IN FILTERED IGRAPH
  Weights <-  E(graph)$Weight[as_ids(E(graph))  %in% as_ids(E(result))]
  # ADD EDGE WEIGHTS TO IGRAPH OBJECT
  result <- result %>% 
    set_edge_attr("Weight",value = Weights)
  
  return(result)
  
}

评论

0赞 LennyAngola 11/21/2023
这效果很好。谢谢!
1赞 LennyAngola 11/21/2023
顺便说一句,这是否消除了“结果”图中的顶点属性,以至于它们必须以与边缘权重类似的方式重新分配?
0赞 Joe Simpson 11/21/2023
很高兴它奏效了!
0赞 Joe Simpson 11/21/2023
它确实删除了节点属性,是的。因此,如果您想要该信息,则需要使用与上述相同的方法重新分配它。干杯