You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用statnet的networkDynamic函数报错:网络大小与顶点ID不匹配

R语言statnet时序网络分析:networkDynamic报错解决

问题背景

使用R 4.3.1(Beagle Scouts),借助statnet工具包的networkDynamic和ndtv进行时序网络分析时,调用networkDynamic函数触发报错。

相关数据与执行代码

输入数据

test_spells <- data.frame(
  onset = c(58, 65, 74, 77, 52, 55, 57, 1, 6, 17, 20, 22, 46, 74, 52, 57, 58, 84, 60, 71, 61),
  terminus = c(63, 66, 74, 77, 52, 55, 60, 4, 15, 18, 20, 44, 67, 78, 54, 58, 62, 84, 63, 71, 61),
  idTail = c(248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 29, 29, 29, 29, 29, 29, 29),
  idHead = c(28, 28, 28, 28, 29, 29, 29, 76, 76, 76, 76, 76, 76, 76, 248, 248, 28, 28, 3, 3, 56)
)

test_el <- data.frame(
  idTail = c(29, 29, 29, 29, 248, 248, 248),
  idHead = c(3, 28, 56, 248, 28, 29, 76),
  weight = c(2, 2, 1, 2, 4, 3, 7),
  edge.id = c(1, 2, 3, 4, 5, 6, 7)
)

执行代码

net <- network(x = test_el)
net_dyn <- networkDynamic(base.net = net, edge.spells = test_spells)

报错信息

Error in networkDynamic(base.net = net, edge.spells = test_spells) :
base.net network size is smaller than size implied by vertex.ids in vertex or edge argument

报错原因

  • 调用network(test_el)创建基础网络时,默认将边列表中的idTail/idHead当作节点标签,实际仅创建6个节点(对应数据中唯一节点的数量),节点内部索引为1-6,而非自定义的3、28、29等ID。
  • networkDynamic的edge.spells参数使用的是自定义节点ID(如248、28),这些数值远大于基础网络的节点数(6),因此触发规模不匹配的报错。

解决方案

需要让基础网络的节点ID与自定义ID一一对应,以下两种方法均可:

方法1:先初始化网络再添加边

# 收集所有出现的节点ID(覆盖test_el和test_spells)
all_nodes <- unique(c(test_el$idTail, test_el$idHead, test_spells$idTail, test_spells$idHead))

# 初始化对应规模的网络
net <- network.initialize(length(all_nodes))

# 设置节点的自定义ID属性
set.vertex.attribute(net, "id", all_nodes)

# 将边列表中的自定义ID转换为网络内部索引
tail_indices <- match(test_el$idTail, all_nodes)
head_indices <- match(test_el$idHead, all_nodes)

# 添加边并附加属性
add.edges(net, tail = tail_indices, head = head_indices, 
          attr = list(weight = test_el$weight, edge.id = test_el$edge.id))

# 创建动态网络,指定节点ID属性用于匹配
net_dyn <- networkDynamic(base.net = net, edge.spells = test_spells, vertex.pid = "id")

方法2:创建网络时直接指定节点ID映射

# 收集所有出现的节点ID
all_nodes <- unique(c(test_el$idTail, test_el$idHead, test_spells$idTail, test_spells$idHead))

# 创建网络时绑定节点ID与边列表
net <- network(test_el, vertex.attr = data.frame(id = all_nodes), 
               vertex.attrnames = "id", directed = TRUE)

# 创建动态网络
net_dyn <- networkDynamic(base.net = net, edge.spells = test_spells, vertex.pid = "id")

验证

执行完上述代码后,可通过以下命令确认动态网络创建成功:

# 查看节点数量
network.size(net_dyn)
# 查看节点ID属性
get.vertex.attribute(net_dyn, "id")

内容的提问来源于stack exchange,提问作者JHJH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:17:36