NB: This vignette is work-in-progress and not yet complete.
This vignette describes how births, deaths and movements can be
incorporated into a model as scheduled events at predefined
time-points. Events can, for example, be used to simulate disese
spread among multiple subpopulations (e.g., farms) when individuals
can move between the subpopulations and thus transfer infection, see
Figure 1. In SimInf, we use node
to denote a subpopulation.
$~$
knitr::include_graphics("img/temporal-network.svg")
Let us define the 6 movement events in Figure 1 to include them in
an SIR model. Below is a data.frame
, that contains the
movements. Interpret it as follows:
events <- data.frame( event = rep("extTrans", 6), ## Event "extTrans" is ## a movement between nodes time = c(1, 1, 2, 2, 3, 3), ## The time that the event happens node = c(3, 3, 1, 4, 3, 4), ## In which node does the event occur dest = c(4, 2, 3, 3, 2, 2), ## Which node is the destination node n = c(9, 2, 8, 3, 5, 4), ## How many individuals are moved proportion = c(0, 0, 0, 0, 0, 0), ## This is not used when n > 0 select = c(4, 4, 4, 4, 4, 4), ## Use the 4th column in ## the model select matrix shift = c(0, 0, 0, 0, 0, 0)) ## Not used in this example
and have a look at the data.frame
events
Now, create an SIR model where we turn off the disease dynamics (beta=0, gamma=0) to focus on the scheduled events. Let us start with different number of individuals in each node.
library(SimInf) model <- SIR(u0 = data.frame(S = c(10, 15, 20, 25), I = c(5, 0, 0, 0), R = c(0, 0, 0, 0)), tspan = 0:3, beta = 0, gamma = 0, events = events)
The compartments that an event operates on, is controlled by the select value specified for each event together with the model select matrix (E). Each row in E corresponds to one compartment in the model, and the non-zero entries in a column indicate which compartments to sample individuals from when processing an event. Which column to use in E for an event is determined by the event select value. In this example, we use the 4th column which means that all compartments can be sampled in each movement event (see below).
model@events@E
In another case you might be interested in only targeting the
susceptibles, which means for this model that we select the first
column. Now, let us run the model and generate data from it. For
reproducibility, we first call the set.seed()
function since there
is random sampling involved when picking inviduals from the
compartments.
set.seed(1) result <- run(model)
And plot (Figure 2) the number of individuals in each node.
plot(result, range = FALSE)
$~$
Or use the trajectory()
function to more easily inspect the outcome
in each node in detail.
trajectory(result)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.