如何用R中的igraph计算加权度分布?

时间:2011-12-01 16:15:22

标签: r igraph

考虑一个数据帧df,其中前两列是节点对,连续列V1V2,...,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$weightsE(g)$weights不同?

2 个答案:

答案 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
}