R语言sna包degree函数计算有向加权网络入度忽略权重问题求助
问题原因
问题根源如下:
- 用
intergraph::asNetwork转换igraph对象为network对象时,边的Strength权重属性未被sna包默认识别为加权计算的边值参数 - sna包
degree函数默认读取的边值属性名与实际存储权重的属性名不匹配,即便设置ignore.eval=FALSE也无法调用正确的权重数据
解决方法
方法1:直接使用igraph包的strength函数计算加权度(更简便)
igraph包内置的strength函数专门用于计算加权度,不需要转换对象格式,直接调用即可:
# 计算加权入度 weighted_indegree <- strength(graphTestData, mode = "in", weights = E(graphTestData)$Strength) # 查看结果 print(weighted_indegree)
输出结果为:
1 2 3 4 5 0.64 0.53 0.29 0.29 0.43
完全符合加权入度的计算逻辑。
方法2:调整network对象属性适配sna包的degree函数
如果你必须使用sna包完成计算,需要先将权重属性赋值给sna识别的边值字段:
# 将Strength属性设置为network对象的边值 set.edge.attribute(networkTestData, "value", value = TestData$Strength) # 重新计算加权入度 indegreeTestData <- degree(networkTestData, g=1, gmode="digraph", diag=FALSE, tmaxdev=FALSE, cmode="indegree", rescale=FALSE, ignore.eval=FALSE) # 查看结果 print(indegreeTestData)
得到的结果和方法1完全一致。

内容的提问来源于stack exchange,提问作者Per Becker
相关产品推荐
相关产品推荐

