wiki:tergmUsage

tergm package usage examples

For detailed explanation of STERGM estimation and basic examples, consult the tergm package vignette. This wiki page is intended to additional usage examples.

The following examples use the flobusiness network included in the ergm package. To set up:

library(tergm)
data(florentine)
net = flobusiness

Estimation with cross-sectional network and duration data

If there is data of a cross-sectional network and the mean relationship duration, we can use stergm with EGMME method to estimate the formation coefficients.

  • The formation formula specifies the ERGM terms used in the formation model.
  • The dissolution formula should be ~offset(edges). The offset.coef.diss should be log(d-1) where d is the mean relationship duration.
  • The targets formula specifies the ERGM terms relevant to the network model; stergm estimates coefficients that will produce cross-sectional networks with target statistics similar to the given network. It is usually set as targets = "formation", so the target terms are same as those in the formation model.

Example from the vignette:

theta.diss <- log(9)
stergm.fit.1 <- stergm(flobusiness,
   formation= ~edges+gwesp(0,fixed=T),
   dissolution = ~offset(edges),
   targets="formation",
   offset.coef.diss = theta.diss,
   estimate = "EGMME"
)

If there is no complete data of the cross-sectional network, we can use observed network statistics by specifying target.stats. In this case, the network can be an empty network with the same size as the observed one. The number of target.stats must equal the number of terms in targets formula.

net <- network.initialize(n=16, directed=F)
stergm.fit.2 <- stergm(net,
   formation= ~edges+gwesp(0,fixed=T),
   dissolution = ~offset(edges),
   targets="formation", target.stats=c(15,12),
   offset.coef.diss = log(9),
   estimate = "EGMME"
)

Specifying offset terms in the formation model

If one of the formation coefficients are known to have a certain value, it can be specified using offset.coef.form.

mod1 <- stergm(flobusiness, formation= ~edges + offset(degree(3)), 
               offset.coef.form=0.8, 
               dissolution= ~offset(edges),
               offset.coef.diss=log(9), 
               targets="formation",
               estimate="EGMME"
)

Note that offset terms are automatically dropped from the targets formula, so keep that in mind if specifying target.stats. In the case above, the targets formula only contains ~edges, so the only target statistic is edges.

If, for some reason, you want to specify the initial values of the coefficients for estimation, you can do so with the init.form control parameter. The number of values should match the number of terms in the formation formula.

mod2 <- stergm(flobusiness, formation= ~edges + offset(degree(3)), 
               offset.coef.form=0.8, 
               dissolution= ~offset(edges),
               offset.coef.diss=log(9), 
               targets='formation', estimate="EGMME",   
               control=control.stergm(init.form=c(-3,0.8))
)

Constraints and -Inf offsets

Constraints may be specified via the constraint formula or a -Inf offset (which prevents ties matching that term from forming). Unless there is real network data, the initial network should be created with {{{san()}} to match the constraints. In the example below, the fitted TERGM model has no male-to-male ties, and the maximum degree is 3.

library(tergm)
nw <- network.initialize(100, directed = FALSE)
nw %v% "male" <- rbinom(100, 1, 0.5)
nw2 <- san(nw ~ edges + nodematch('male'), target.stats=c(80,0),constraints = ~bd(maxout=3) )

fit <- stergm(nw2, 
              formation = ~edges + offset(nodematch("male")), 
              dissolution = ~offset(edges), 
              constraints = ~bd(maxout=3),
              target.stats = c(80),
              offset.coef.form = -Inf,
              offset.coef.diss = log(1.5),
              targets = ~edges,
              estimate = "EGMME")

summary(fit$network ~ nodematch("male"))
fit

sim <- simulate.stergm(fit, nsim = 1, time.slices = 100, output = "stats", monitor = ~nodematch("male"))

as.vector(sim)
Last modified 5 years ago Last modified on 11/10/14 13:36:06