在 iGraph 中模拟网络后添加组成员作为节点属性

adding group membership as a node attribute after simulating a network in iGraph

我创建了一个模拟网络(通过 SBM)igraph R 中的包:

    library(igraph)
    pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
    g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                    directed = FALSE, loops = FALSE)

g的邻接矩阵确认节点1-5被认为是一组,节点6-10被认为是另一组。

> as_adj(g)
 [1,] . 1 . 1 . . . . . .
 [2,] 1 . 1 1 . . . . . .
 [3,] . 1 . 1 1 . . . . .
 [4,] 1 1 1 . 1 . . . . .
 [5,] . . 1 1 . . . . . .
 [6,] . . . . . . 1 1 . 1
 [7,] . . . . . 1 . 1 1 1
 [8,] . . . . . 1 1 . 1 .
 [9,] . . . . . . 1 1 . 1
[10,] . . . . . 1 1 . 1 .

但是我的 sample_sbm 调用生成的 igraph 对象不包括组成员身份作为顶点属性。

> g
IGRAPH 8750fb0 U--- 10 15 -- Stochastic block-model
+ attr: name (g/c), loops (g/l)
+ edges from 8750fb0:
 [1] 1-- 2 2-- 3 1-- 4 2-- 4 3-- 4 3-- 5 4-- 5 6-- 7 6-- 8 7-- 8 7-- 9 8-- 9 6--10 7--10 9--10

如何添加此信息以进行绘图和分析?

如果您的采样图包含两个没有共享边的不同组件(如您提供的示例所示),那么您可以使用 components()$membership 获取组成员资格并将其分配给节点属性:

library(igraph)

set.seed(1234)

pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- components(g)$membership

plot(g, vertex.color = V(g)$group)

这之所以有效,是因为您提供的偏好矩阵创建了两个不同的组件。如果块之间有边,那么图中显然只有一个分量。在这种情况下,您可以使用 cluster_*() 函数之一:

set.seed(1234)

pr_mat <- cbind(c(0.5,0.1), c(0.1, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- cluster_louvain(g)$membership

plot(g, vertex.color = V(g)$group)

reprex package (v0.3.0)

于 2020-04-14 创建