【问题标题】:interpolate node attributes of a network插入网络的节点属性
【发布时间】:2020-05-21 05:28:59
【问题描述】:

BLUF:我正在寻找一个现有的函数,或者我可以开发成一个函数的通用算法,以沿图表插入节点属性。

考虑下图:

library(tidyverse)
library(tidygraph)
library(ggraph)

set.seed(40)

g = create_lattice(c(8, 8), TRUE, TRUE) %N>%
  mutate(
    value = if_else(
      runif(n()) > 0.5, 
      rnorm(n(), 50, 15), 
      NA_real_
    )
  ) %E>%
  mutate(length = abs(rnorm(n(), 5, 3))) %E>%
  filter(runif(n()) > 0.25)

ggraph(g) + theme_void() + 
  geom_edge_link2(arrow = arrow(length = unit(4, 'mm')),
    end_cap = circle(3, 'mm')) + 
  geom_node_point(aes(color = value), size = 5)

我想根据相邻节点插入缺失的节点属性。理想情况下,插值将考虑边缘权重(例如距离或长度)以及边缘方向,并且可以选择通过常数值进行推断(即类似于approx(..., rule = 2) 的工作方式)。我对特定类型的插值没有特别的偏好(我会对线性插值、反距离加权等感到满意),但我很难确定或概念化算法。

在 R 中是否有适用于 igraphtidygraph 的节点属性插值算法,或者是否有已发布的算法可以在 R 中轻松实现?

【问题讨论】:

    标签: r interpolation igraph


    【解决方案1】:

    对于小图,您可以生成距离矩阵并将其用作反距离加权方法的基础。您可以使用边缘方向(或不使用)和权重(或不使用)来计算距离矩阵:

    library(igraph)
    E(g)$weight = E(g)$length
    d = distances(g, mode = "out")
    
    n = vector("numeric", ncol(d))
    
    for (i in 1:ncol(d)){
      w = d[,i]^(-3) 
      w[!(d[,i] > 0)] = 0
      n[i] = sum(w * V(g)$value, na.rm = TRUE) / sum(w, na.rm = TRUE)
    }
    
    g.new = g %N>%
      mutate(interpolated = is.na(value)) %N>%
      mutate(value = if_else(interpolated, n, value))
    
    ggraph(g.new) + theme_void() + 
      geom_edge_link2(arrow = arrow(length = unit(4, 'mm')),
        end_cap = circle(3, 'mm')) + 
      geom_node_point(aes(color = value, shape = interpolated), size = 5)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多