50% off | Unlimited Data & AI Learning
Get 50% off unlimited learning

IBMPopSim

The IBMPopSim package aims at simulating the random evolution of heterogeneous populations, called stochastic Individual Based Models (IBMs). Such models have a wide range of applications in various fields including actuarial sciences, biology, demography, or ecology. For instance, IBMs can be used for simulating the evolution of an heterogeneous insurance portfolio, of an spatial ecological population with interacting individuals, or for validation mortality forecasts.

The package allows users to simulate population evolution in which individuals are characterized by their age and some characteristics, and where the population is modified by different types of events including births/arrivals, death/exit events, or changes of characteristics. The frequency at which an event can occur to an individual can depend on his age and characteristics, but also on time and on the rest of the population (interactions).

IBMPopSim overcomes the limitations of time consuming IBMs simulations. This is done by implementing new efficient algorithms based on thinning methods, which are compiled using the Rcpp library. The package allows a wide range of IMBs to be simulated, while being user-friendly thanks to its structure based on simple build blocks. In addition, we provide tools for analyzing outputs, such a age-pyramids or life tables obtained from the simulated data, consistent with the data format of packages for mortality modeling such as StMoMo. See vignette(IBMPopSim) for more details.

Installation

The latest stable version can be installed from CRAN:

install.packages('IBMPopSim')

The latest development version can be installed from github:

# install.packages("devtools")
devtools::install_github('DaphneGiorgi/IBMPopSim')

First example to check installation

To illustrate the use of the package and to check the installation, a simple model with Poisson arrivals and exits is implemented.

library(IBMPopSim)

init_size <- 100000
pop <- population(data.frame(birth = rep(0, init_size), death = NA))

birth = mk_event_poisson(type = 'birth', intensity = 'lambda')
death = mk_event_poisson(type = 'death', intensity = 'mu')
params = list('lambda' = 100, 'mu' = 100)

# mk_model compiles C++ code using sourceCpp from Rcpp
birth_death <- mk_model(events = list(birth, death),
                        parameters = params)

If there are no errors then the C++ built environment is compatible with the package. The model is created and a C++ code has been compiled. The simulation is done using the popsim function.

sim_out <- popsim(model = birth_death, 
                  initial_population = pop, 
                  events_bounds = c('birth' = params$lambda, 'death' = params$mu),
                  parameters = params, 
                  time = 10)

num_births <- length(sim_out$population$birth) - init_size
num_deaths <- sum(!is.na(sim_out$population$death))
print(c("births" = num_births, "deaths" = num_deaths))
## births deaths 
##    952    981

Quick model creation

  • We take here an initial population, stored in a data frame, composed of 100 000 individuals marked by their gender (encoded by a Boolean characteristic):
pop <- population(EW_pop_14$sample)
  • The second step is to define the model parameters’ list:
params <- list("alpha" = 0.008, "beta" = 0.02, "p_male" = 0.51,
               "birth_rate" = stepfun(c(15,40), c(0,0.05,0)))
  • The last step is to defined the events that can occur in the population, here birth and death events:
death_event <- mk_event_individual(type = "death",
                  intensity_code = "result = alpha * exp(beta * age(I, t));")

birth_event <- mk_event_individual(type = "birth", 
                  intensity_code = "result = birth_rate(age(I,t));",
                  kernel_code = "newI.male = CUnif(0, 1) < p_male;")

Note that these events contain some C++ statements that depend (implicitly) on the previously declared parameters in variable params.

  • Finally, the model is created by calling the function mk_model. A C++ source code is obtained from the events and parameters, then compiled using the sourceCpp function of the Rcpp package.
  model <- mk_model(characteristics = get_characteristics(pop),
                    events = list(death_event, birth_event),
                    parameters = params)
  • In order to simulate a random trajectory of the population until a given time T bounds on the events intensities have to be specified:
a_max <- 115
events_bounds = c("death" = params$alpha * exp(params$beta * a_max),
                  "birth" = max(params$birth_rate))

Then, the function popsim can be called:

sim_out <- popsim(model, pop, events_bounds, params,
                  age_max = a_max, time = 30)
  • The data frame sim_out$population contains the information (date of birth, date of death, gender) on individuals who lived in the population over the period [0, 30]. Functions of the package allows to provide aggregated information on the population.
pop_out <- sim_out$population
head(pop_out)
##       birth death  male
## 1 -84.96043    NA FALSE
## 2 -84.86327    NA FALSE
## 3 -84.84161    NA FALSE
## 4 -84.79779    NA FALSE
## 5 -84.76461    NA FALSE
## 6 -84.76363    NA FALSE
female_pop <- pop_out[pop_out$male==FALSE, ]
age_pyramid(female_pop, ages = 85:90, time = 30)
##       age  male value
## 1 85 - 86 FALSE   224
## 2 86 - 87 FALSE   250
## 3 87 - 88 FALSE   213
## 4 88 - 89 FALSE   170
## 5 89 - 90 FALSE   180
Dxt <- death_table(female_pop, ages = 85:90, period = 20:30)
Ext <- exposure_table(female_pop, ages = 85:90, period = 20:30)
  • Note that parameters of the model can be changed without recompiling the model.
params$beta <- 0.01

# Update death event bound:
events_bounds["death"] <- params$alpha * exp(params$beta * a_max)

sim_out <- popsim(model, pop, events_bounds, params,
                  age_max = a_max, time = 30)

Copy Link

Version

Install

install.packages('IBMPopSim')

Monthly Downloads

206

Version

1.1.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Daphnc3<a9> Giorgi

Last Published

October 15th, 2024

Functions in IBMPopSim (1.1.0)

gompertz

Gompertz–Makeham intensity function.
has_event_type

Search for a given string in event types
id_complete

Complete a population id
mk_individual_type

Function for internal use
mk_event_poisson

Creating Poisson class event
get_characteristics

Generic method for get_characteristics
piecewise_xy

Piecewise real function of two variables.
plot.population

Plot the age pyramid of a population data frame (at a given time).
mkcpp_parameters

Function for internal use
mkcpp_definition_events

Function for internal use
mkcpp_declaration_individual

Function for internal use
mkcpp_output_population

Function for internal use
get_Rtype

Function for internal use
pyramid

Class pyramid
stepfun

Step Function.
summary.event

Summarizing an event
assertEvents

Function for internal use
assertPyramid

Function for internal use
assertPopulation

Function for internal use
assertParameters

Function for internal use
death_table

Death table
summary.logs

Summary logs
weibull

Weibull function.
age_pyramid

Generic method for age_pyramid
details_intensity_code

Autogenerated documentation for intensity code
linfun

Linear interpolation function.
age_pyramids.population

Age pyramid from a population data frame at some given times.
details_cpp

Autogenerate cpp details documentation
details_interaction_code

Autogenerated documentation for interaction code
popsample.pyramid

Sample a population from an age pyramid (at a given time).
print.model

Printing of a model
mk_model

Creates a model for IBMPopSim.
max.stepfun

Returns the maximum of a function of class stepfun.
popsim

Simulation of a model.
popsample

Generic method for popsample
print.population

Printing population
plot.pyramid

Plot an age pyramid.
mkcpp_event

Function for internal use
mk_parameters_types

Extract types (R and C++) of the parameters
assertCharacteristics

Function for internal use
mkcpp_initialisation_population

Function for internal use
merge_pop_withid

A function returning a merged dataframe from a list of population dataframes with id.
details_type_event

Autogenerated documentation for event type
details_kernel_code

Autogenerated documentation for kernel code
mk_event_individual

Creating an event with intensity of class individual
mk_event_inhomogeneous_poisson

Creating inhomogeneous Poisson class event
mkcpp_popsim

Function for internal use
piecewise_x

Piecewise real function.
mk_event_interaction

Creating an event with intensity of type interaction
print.event

Print Event
summary.population

Summary population
population_alive.population

Returns a population of individuals alive.
summary.model

Summary of a model
population_alive

Generic method for population_alive
population

Class population
toy_params

Toy parameters for IBMPopSim-human_popIMD vignette example.
summary.simulation_output

Summary simulation output
add_characteristic.population

Add characteristic to a population
EW_pop_out

Example of "human population" after 100 years of simulation.
check_interaction_code

Check the interaction code.
age_pyramid.population

Age pyramid from a population at a given time.
age_pyramids

Generic method for age_pyramids
EWdata_hmd

England and Wale mortality data (source: Human Mortality Database)
capitalize

Function for internal use
check_intensity_code

Check the intensity code.
IBMPopSim-package

IBMPopSim: Individual Based Model Population Simulation
add_characteristic

Generic method for add_characteristic
compatibility_pop_model

Check population-model compatibility
compatibility_chars_events

Check characteristics-events compatibility
check_kernel_code

Check the kernel code.
EW_popIMD_14

England and Wales (EW) 2014 population and death rates by Index of Multiple Deprivation (IMD).
EW_pop_14

England and Wales (EW) 2014 population, death and birth rates.
get_characteristics.population

Returns names and C types of the characteristics.
get_Ctype

Function for internal use
exposure_table

Exposure table