生成具有不同集中化的igraph

时间:2018-04-03 00:25:38

标签: r igraph

我正在开发图表的估算方法。我需要在不同的igraphs上测试它的稳健性。如何使用不同的图级集中生成(在R中)多个igraphs?我熟悉sample_(...),'示例_'允许我生成图形GIVEN一个模型,但不给出图级集中。

我想举个例子:

graph_1 <- centralization=.50; graph_2 <- centralization=.30 . . . graph_n <- centralization=.00

1 个答案:

答案 0 :(得分:0)

igraph中没有烘焙函数,但您可以使用度序列采样器生成具有特定集中度的图形:sample_degseq。关键是要找到一个度分布,其中分布中最大度和每个度之间的差值之和等于理论最大值*集中度。

这个功能可以解决这个问题,但有点困难:

sample_centr <- function(size, centralization, leeway = 50) {
  theoretical_max <- size * (size - 1)
  sum_diff <- theoretical_max * centralization

  # Must be an interger
  sum_diff <- round(sum_diff)

  sim_diff <- 0

  while (sim_diff < (sum_diff - leeway) | sim_diff > (sum_diff - leeway)) {

    # To deal with very low levels of centralization...
    if (centralization < 0.10) {
      max_deg <- floor(size * runif(1, 0, 1))
      degs <- floor(runif(size, min = max_deg - floor(max_deg*0.25), max_deg))
    } else {
      degs <- sample(1:size, size, replace=TRUE, prob=(1:size)^-2)
    }
    sim_diff <- sum(max(degs) - degs)
  }

  if (sum(degs) %% 2 != 0) { 
    degs[1] <- degs[1] + 1 
    }

  g <- sample_degseq(degs)
  return(g)
}

当然这仅适用于学位集中。我认为,中介集中化将会更具挑战性。

> g <- sample_centr(100, 0.5, 0)
> centr_degree(g)
$res
  [1]  1  1  2  1 53  2  1  1  1  1  2  1  1  1  1  1  3  1  1  5  2  1  1  1  1  5  1  7  1 18  1  1
 [33]  1  1  1  2  1  8  2  5  6  1  1  1  1  2  1  1  1  1  1  1  7  1  1  2  1  2  1  9 51  4 12  1
 [65]  1  1  1  1  2  6  3  2  1  2  2  1  4  1  1 25  1  5  1  1  1  2  3 10  1  2  1  3  1  1  2  2
 [97]  2  3  1  1

$centralization
[1] 0.5

$theoretical_max
[1] 9900