考虑一个数据帧df
,其中前两列是节点对,连续列V1
,V2
,...,Vn
表示节点之间的流量(可能0,暗示该列的网络没有边缘)。我想使用流量作为权重来进行度,社区检测和其他网络测量的分析。
然后分析关于V1
我做的权重的图表:
# create graph and explore unweighted degrees with respect to V1
g <- graph.data.frame( df[df$V1!=0,] )
qplot(degree(g))
x <- 0:max(degree(g))
qplot(x,degree.distribution(g))
# set weights and explore weighted degrees using V1
E(g)$weights <- E(g)$V1
qplot(degree(g))
第三个qplot的输出与第一个没有什么不同。我做错了什么?
更新
所以graph.strength
正是我要找的,但在我的案例中graph.strength(g)
给出标准学位输出,然后是:
Warning message:
In graph.strength(g) :
At structural_properties.c:4928 :No edge weights for strength calculation,
normal degree
我必须正确设置权重,是否仅E(g)$weights <- E(g)$V1
以及为什么g$weights
与E(g)$weights
不同?
答案 0 :(得分:7)
函数graph.strength
可以赋予带有weights
参数的权重向量。我认为你的代码出了什么问题,你应该调用权重属性E(g)$weight
而不是E(g)$weights
。
答案 1 :(得分:3)
我为自己的代码创建了一个等效的degree.distribution
加权图形函数,方法是使用degree.distribution
代码并进行一处更改:
graph.strength.distribution <- function (graph, cumulative = FALSE, ...)
{
if (!is.igraph(graph)) {
stop("Not a graph object")
}
# graph.strength() instead of degree()
cs <- graph.strength(graph, ...)
hi <- hist(cs, -1:max(cs), plot = FALSE)$density
if (!cumulative) {
res <- hi
}
else {
res <- rev(cumsum(rev(hi)))
}
res
}