A function to apply a given series of changes to a network.
Description
Gives the network a series of timed proposals it can't refuse. Returns the statistics of the network, and, optionally, the final network.
Usage
1 2 3 
Arguments
formula 
An 
changes 
A matrix with four columns: time, tail, head, and new value,
describing the changes to be made. Can only be used if LHS of

toggles 
A matrix with three columns: time, tail, and head, giving the dyads
which had changed. Can only be used if LHS of

start 
Time from which to start applying changes. Note that the first
set of changes will take effect at 
end 
Time from which to finish applying changes. Defaults to the last time point at which a change occurs. 
end.network 
Whether to return a network that results. Defaults to 
stats.start 
Whether to return the network statistics at 
verbose 
Whether to print progress messages. 
control 
A control list generated by

Value
If end.network==FALSE
(the default), an mcmc
object with the requested network statistics associed with the network series
produced by applying the specified changes. Its mcmc
attributes encode the timing information: so start(out)
gives the time point associated with the first row returned, and
end(out)
out the last. The "thinning interval" is always 1.
If end.network==TRUE
, return a network
object
with lasttoggle
"extension", representing the final
network, with a matrix of statistics described in the previous paragraph attached to it as an attr
style
attribute "stats"
.
See Also
simulate.stergm, simulate.network, simulate.networkDynamic
Examples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60  g1 < network.initialize(10, dir=FALSE)
g1[1,2] < 1
g1[3,4] < 1
g1 %n% "time" < 0
g1 %n% "lasttoggle" < 1rgeom(network.dyadcount(g1),1/4)
dc < matrix(rnorm(100),10,10); dc < dc+t(dc)
# Simulate a network, tracking its statistics.
simnet < simulate(g1, formation=~edges, dissolution=~edges, coef.form=1, coef.diss=1,
time.slices=50, monitor=~degree(1)+mean.age+degree.mean.age(1)+
mean.age(log=TRUE)+degree.mean.age(1,log=TRUE)+
degrange(1,3)+mean.age+degrange.mean.age(1,3)+
mean.age(log=TRUE)+degrange.mean.age(1,3,log=TRUE)+
edge.ages+edgecov(dc)+edgecov.ages(dc),
output="networkDynamic")
sim.stats < attr(simnet, "stats")
print(head(sim.stats))
sim.stats < as.matrix(sim.stats)
# Replay the simulation using a networkDynamic, monitoring a potentially different set of
# statistics (but same in this case).
gf1.stats < tergm.godfather(simnet~degree(1)+mean.age+degree.mean.age(1)+
mean.age(log=TRUE)+degree.mean.age(1,log=TRUE)+
degrange(1,3)+mean.age+degrange.mean.age(1,3)+
mean.age(log=TRUE)+degrange.mean.age(1,3,log=TRUE)+
edge.ages+edgecov(dc)+edgecov.ages(dc),
start=0, end=50)
print(head(gf1.stats))
gf1.stats < as.matrix(gf1.stats)
# Replay the simulation using the initial network + list of changes.
gf2.stats < tergm.godfather(g1~degree(1)+mean.age+degree.mean.age(1)+
mean.age(log=TRUE)+degree.mean.age(1,log=TRUE)+
degrange(1,3)+mean.age+degrange.mean.age(1,3)+
mean.age(log=TRUE)+degrange.mean.age(1,3,log=TRUE)+
edge.ages+edgecov(dc)+edgecov.ages(dc),
start=0, end=50, changes=attr(simnet,"changes"))
print(head(gf2.stats))
gf2.stats < as.matrix(gf2.stats)
# We can also compare them to the network statistics summarized.
summ.stats < summary(simnet~degree(1)+mean.age+degree.mean.age(1)+
mean.age(log=TRUE)+degree.mean.age(1,log=TRUE)+
degrange(1,3)+mean.age+degrange.mean.age(1,3)+
mean.age(log=TRUE)+degrange.mean.age(1,3,log=TRUE)+
edge.ages+edgecov(dc)+edgecov.ages(dc), at=1:50)
print(head(summ.stats))
tol < sqrt(.Machine$double.eps)
# If they aren't all identical, we are in trouble.
stopifnot(all.equal(sim.stats,gf1.stats),
all.equal(sim.stats,gf2.stats),
all.equal(sim.stats,summ.stats))
