我想模拟指数族随机图,我刚开始学习使用statnet
和ergm
R包。从我在网上找到的tutorial,我能够从示例数据集中学习ERGM模型:
# install.packages('statnet')
# install.packages('ergm')
# install.packages('coda')
library(statnet)
set.seed(123)
data(package='ergm') # tells us the datasets in our packages
data(florentine) # loads flomarriage and flobusiness data
# Triad model
flomodel <- ergm(flomarriage ~ edges + triangle)
summary(flomodel)
目前,我想使用simulate
命令来模拟具有预先指定的节点数量的网络(不是从任何特定数据集中学习的),例如{{1} 1}},其中P(y) = 1/Z exp(a * num_edges + b * num_triangles)
和a
是用户指定的系数。
我应该如何在b
中编写这样的模型?
答案 0 :(得分:1)
您可以使用simulate(或simulate.formula)从给定公式进行模拟:
simulate(flomarriage ~ edges + triangles, coef = c(3,1))
修复模拟以获得与给定图形相同数量的边缘(在这种情况下为flomarriage)
simulate(flomarriage ~ edges + triangles, coef = c(3,1), constraints = ~edges)
并非每个您可能想要应用的约束都可用,因为每个约束都需要特定的mcmc采样器,但是对于可用内容列表,请参阅?ergm.constraints
要将模拟修复为具有任意数量的节点和边(不基于观察到的数据),解决方法是首先创建此类网络。例如,模拟具有17个节点和16个边缘的网络。
test.mat = matrix(0, 17, 17)
test.mat[1,] = 1 #adds 16 edges
test.net = as.network(test.mat, directed = F)
test.sim = simulate(test.net ~ triangles, coef = 1, constraints = ~edges)
summary.statistics(test.sim ~ edges() + triangles())
P.S。我不建议在ERGM模型中使用triangles
术语。几何加权项(gwesp,gwdsp)是更稳定的最佳替代品。