如何基于节点属性模拟ERGM分布的网络?
模拟带节点属性的ERGM网络实现方案
你需要先创建带有节点属性的初始网络对象,nodematch这类依赖节点属性的统计量,必须先给节点分配好属性,再在模型公式中明确指定要匹配的属性名称。以下是完整实现步骤:
步骤1:构建带节点属性的初始网络
library(ergm) # 设定节点数量 n <- 50 # 创建空的无向网络 g_initial <- network(n, directed = FALSE) # 给节点添加目标属性,比如分组属性"group",随机分成2组 set.vertex.attribute(g_initial, "group", sample(c(1,2), n, replace = TRUE))
步骤2:定义ERGM模型并模拟网络
nodematch必须指定具体属性名(例如nodematch("group")),同时coef向量的长度要和模型中的统计量数量一一对应:
triangles的系数控制三角闭合的倾向(正数表示更易形成三角)nodematch("group")的系数控制同属性节点连边的倾向(正数表示同组节点更易相连)
示例代码:
# 设定系数向量,顺序与公式中统计量的顺序一致 thetas <- c(1, 0.8) # 前者对应triangles,后者对应nodematch("group") # 执行模拟 g_sim <- simulate(g_initial ~ triangles + nodematch("group"), nsim = 1, coef = thetas)
验证模拟结果
可以通过以下代码检查网络的属性与结构特征:
# 查看节点属性 get.vertex.attribute(g_sim, "group") # 统计网络中的三角数量 summary(g_sim ~ triangles) # 统计同组节点的连边匹配度 summary(g_sim ~ nodematch("group"))
关键注意事项
- 初始网络的边结构不影响最终模拟结果(ERGM基于统计量分布生成网络,初始结构仅作为MCMC的起点),但节点属性必须预先定义完成。
- 若需多属性匹配或属性与三角的交互效应,可扩展公式为
~ triangles + nodematch("group") + nodematch("age")或~ triangles * nodematch("group"),同时对应调整coef向量的长度。
内容的提问来源于stack exchange,提问作者Tendero
相关产品推荐
相关产品推荐

