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

问题描述 投票:0回答:1

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

    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

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

r matrix attributes igraph
1个回答
0
投票

如果您的采样图包含两个没有共享边的不同成分(如您提供的示例,那么您可以使用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创建

© www.soinside.com 2019 - 2024. All rights reserved.