使用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
相关产品推荐
相关产品推荐

