指数随机图模型 ERGM(Exponential Random Graph Models)
指数随机图模型(Exponential Random Graph Models,ERGM),也称为 p* 模型,是一种用于分析网络数据的统计模型。该模型通过考虑图中节点和边之间的依赖关系,来捕捉网络结构的复杂性。ERGM 的基本思想是,通过定义一系列统计量(称为图统计量),这些统计量反映了图的结构特征,然后使用这些统计量来描述网络的生成过程。
ERGM 的主要步骤包括:
定义图统计量:
图统计量是网络中结构特征的定量表示,例如节点的度数分布、三角形闭包、节点属性的同质性等。这些统计量反映了网络中的局部和全局结构特征。构建概率模型:
ERGM 假设给定图统计量的线性组合(加权和)可以用于描述网络的概率分布。具体来说,ERGM 模型的形式可以表示为:
- 是随机关系集; 是特定的关系集,当时表示有连接, 时表示无连接,这种连接既可以是有向的,也可以是无向的。
- 是模型参数,是模型对应的统计量,是影响因素,是归一化常数,确保概率和为 1。
- 给定该分布中的特定图,它出现的概率可以通过该公式进行推导,并且依赖于网络中的统计值 和对应参数,因此,ERGM可以解释某一网络中的各种可能结构规律。
参数估计:
通过最大似然估计(MLE)或贝叶斯方法来估计模型参数 。由于归一化常数 的计算涉及所有可能图的遍历,因此参数估计过程通常需要使用蒙特卡罗方法或伪似然估计。模型检验和诊断:
通过检查模型的拟合优度和残差来评估模型的合理性。例如,可以使用 MCMC 方法生成样本网络,并将其与实际网络进行比较,以验证模型的拟合情况。
ERGM 的优点在于它能够灵活地捕捉网络中的复杂依赖关系和结构特征。然而,由于模型的计算复杂性,特别是对于大规模网络,模型的估计和检验过程可能会比较耗时。
应用领域
ERGM 被广泛应用于社会网络分析、生物网络研究、通信网络建模等领域。例如,在社会网络分析中,ERGM 可以用于研究社交网络中的节点之间的关系模式和影响因素,识别关键节点和社区结构。
示例
假设我们有一个包含 10 个节点的社交网络,节点之间的连边表示友谊关系。我们可以定义一些图统计量,如节点的度数(表示每个节点的朋友数量)、三角形闭包(表示朋友的朋友也是朋友的情况)。通过这些统计量,ERGM 可以用来分析和预测网络的结构特征,例如预测哪些节点更可能形成新的友谊关系。
参考文献
- Robins, G., Pattison, P., Kalish, Y., & Lusher, D. (2007). An introduction to exponential random graph (p*) models for social networks. Social Networks, 29(2), 173-191.
- Wasserman, S., & Faust, K. (1994). Social Network Analysis: Methods and Applications. Cambridge University Press.
library(statnet)
library(ergm)
library(sna)
# 读取数据
data("faux.magnolia.high")
fmh <- faux.magnolia.high
plot(fmh,displayisolates=FALSE,vertex.cex=0.8)
# 读取数据成分--》计算度数和节点个数之间的关联
table(component.dist(fmh)$csize)
# 描述图
summary(fmh)
# 按类别绘制不同颜色的图
plot(fmh,displayisolates=TRUE,vertex.col="Grade",vertex.cex=0.8)
# 节点度的计算
fmh.degreedist <- table(degree(fmh,cmode="indegree"))
fmh.degreedist
#根据分类变量来查看度数分布情况
summary(fmh ~ degree(0:8,"Sex"))
# 内含三元组
summary(fmh ~ triangle)
# 内含边+三元组
summary(fmh ~ edges + triangle)
# 混合矩阵
mixingmatrix(fmh,"Grade")
mixingmatrix(fmh,"Race")
# ermg
model_ergm<-ergm(fmh ~ edges)
summary(model_ergm)
# 网络密度
exp(-6.998)/(1+exp(-6.998))
# 模型结果
names(model_ergm)
model_ergm$coefficients
# 拟合结构=增加星形==>模型退化
model_ergm1<-ergm(fmh ~ edges+kstar(2)+kstar(3))
summary(model_ergm1)
# 拟合结构=增加三角形==>模型退化
model_ergm2<-ergm(fmh ~ edges+triangle)
summary(model_ergm2)
simu<-simulate(model_ergm1,burnin=1e+6,verbose = TRUE,seed = 9)
mixingmatrix(simu,"Race")
mixingmatrix(fmh,"Race")
# 采用图形观测实际值和观测值之间的拟合差异
plot(summary(fmh ~ degree(0:10)),type="l",lty=1,lwd=2,xlab="Degree",ylab="Count")
lines(summary(simu ~ degree(0:10)),type="l",lty=2,lwd=3,xlab="Degree",ylab="Count")
legend("topright",legend = c("observed","simulated"),lwd = 2:3,lty =1:2)