Как рассчитать распределение весовых степеней с помощью igraph в R? - PullRequest
9 голосов
/ 01 декабря 2011

Рассмотрим фрейм данных 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?

Ответы [ 2 ]

7 голосов
/ 01 декабря 2011

Для функции graph.strength может быть задан вектор весов с аргументом weights.Я думаю, что в вашем коде что-то не так, вы должны вызывать атрибут weights E(g)$weight, а не E(g)$weights.

3 голосов
/ 02 декабря 2011

Я создал эквивалентную функцию 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
}
...