Skip to content

Template reproducible analytical pipeline (RAP) for simple R discrete-event simulation (DES) model.

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE
MIT
LICENSE.md
Notifications You must be signed in to change notification settings

pythonhealthdatascience/rap_template_r_des

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

52 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Simple Reproducible R
Discrete-Event Simulation (DES) Template

R 4.4.1 MIT Licence R-CMD-check Lint

A simple template for creating DES models in R, within a reproducible analytical pipeline (RAP)
Click on Use this template to initialise new repository.
A README template is provided at the end of this file.


Table of contents:


πŸ“Œ Introduction

This repository provides a template for building discrete-event simulation (DES) models in R.

😊 Simple: Easy-to-follow code structure using simmer. Implements a simple M/M/s queueing model in which patients arrive, wait to see a nurse, have a consultation with the nurse and then leave.

♻️ Reproducible: This template is designed to function as a RAP. It adheres to reproducibility recommendations from:

  • "Levels of RAP" framework from the NHS RAP Community of Practice (as documented in nhs_rap.md).
  • Recommendations from Heather et al. 2025 "On the reproducibility of discrete-event simulation studies in health research: a computational investigation using open models" (as documented in heather_2025.md).

✨ Design practices: Functions are documented with roxygen2 docstrings and lintr is used to lint .R and .Rmd files.

🧱 Package structure: The simulation code (R/) is structured as a little local R package. It is installed in our environment using devtools::install() and then library(simulation). This means it can easily be used anywhere else in the directory - here, in notebooks/ and tests/ - without needing any additional code (e.g. no need to run source() with paths to the files).

More information about the package structure

Rationale: As explained above, the package structure is helpful for sourcing the simulation code anywhere in the folder. Other benefits of this structure include:

  • Encourages well-organised repository following standardised established R package structure, which ensures that the model and analysis code are kept seperate.
  • Useful "built-in" features like tests, documentation of functions using Roxygen, documentation of data, and package checks (e.g. checking all imports are declared).
  • If your analysis has a short run time, the .Rmd files could be stored in a vignettes/ folder which will mean they re-run with every package build/check, and so any new run issues will be identified. However, in this project, the analysis was instead stored in notebooks/ as the file paths to save outputs cause errors in vignettes/ (as they will differ between your runs of the notebook, and runs during the package build process).
  • Meet packaging requirement on the NHS "Levels of RAP" framework.

For more information on the rationale behind structuring research as an R package, check out:

Commands: Helpful commands when working with the package include:

  • devtools::document() to reproduce documentation in man/ after changes to the docstrings.
  • devtools::check() to build and check the package follows best practices.
  • devtools::install() to load the latest version of the package into your environment.
  • devtools::test() to run the tests in tests/.

🧐 What are we modelling?

A simulation is a computer model that mimics a real-world system. It allows us to test different scenarios and see how the system behaves. One of the most common simulation types in healthcare is DES.

In DES models, time progresses only when specific events happen (e.g., a patient arriving or finishing treatment). Unlike a continuous system where time flows smoothly, DES jumps forward in steps between events. For example, when people (or tasks) arrive, wait for service, get served, and then leave.

Simple DES Animation Simple model animation created using web app developed by Sammi Rosser (2024) available at https://github.com/hsma-programme/Teaching_DES_Concepts_Streamlit and shared under an MIT Licence.

One simple example of a DES model is the M/M/s queueing model, which is implemented in this template. In a DES model, we use well-known statistical distributions to describe the behaviour of real-world processes. In an M/M/s model we use:

  • Poisson distribution to model patient arrivals - and so, equivalently, use an exponential distribution to model the inter-arrival times (time from one arrival to the next)
  • Exponential distribution to model server times.

These can be referred to as Markovian assumptions (hence "M/M"), and "s" refers to the number of parallel servers available.

For this M/M/s model, you only need three inputs:

  1. Average arrival rate: How often people typically arrive (e.g. patient arriving to clinic).
  2. Average service duration: How long it takes to serve one person (e.g. doctor consultation time).
  3. Number of servers: How many service points are available (e.g. number of doctors).

This model could be applied to a range of contexts, including:

Queue Server/Resource
Patients in a waiting room Doctor's consultation
Patients waiting for an ICU bed Available ICU beds
Prescriptions waiting to be processed Pharmacists preparing and dispensing medications

For further information on M/M/s models, see:


πŸ› οΈ Using this template

Step 1: Create a new repository

  1. Click on Use this template.
  2. Provide a name and description for your new project repository.
  3. Clone the repository locally:
git clone https://github.com/username/repo
cd repo

Step 2: Set-up the development environment

Load the R environment described in the renv.lock file (though note this won't fetch the version of R used - you would need to switch to that manually first):

renv::init()
renv::restore()

If facing issues with restoring this environment, an alternative is to set up a fresh environment based on the DESCRIPTION, but note that this may then install more recent package versions.

renv::init()
renv::install()
renv::snapshot()

There may also be system dependencies. The exact requirements will depend on your operating system, whether you have used R before, and what packages you have used. For example, when developing the template, we had to install the following for igraph (as explained in their documentation):

sudo apt install build-essential gfortran
sudo apt install libglpk-dev libxml2-dev

Step 3: Explore and modify

πŸ”Ž Choose your desired licence (e.g. https://choosealicense.com/). If keeping an MIT licence, just modify the copyright holder in LICENSE and LICENSE.md.

πŸ”Ž Review the example DES implementation in R/ and notebooks/. Modify and extend the code as needed for your specific use case.

πŸ”Ž Check you still fulfil the criteria in docs/nhs_rap.md and docs/heather_2025.md.

πŸ”Ž Adapt the template README provided at the end of this file.

πŸ”Ž Create your own CITATION.cff file using cff-init.

πŸ”Ž Update DESCRIPTION and entries in the current NEWS.md with your own details, versions, and create GitHub releases.

πŸ”Ž Archive your repository (e.g. Zenodo).

πŸ”Ž Complete the Strengthening The Reporting of Empirical Simulation Studies (STRESS) checklist (stress_des.md) and use this to support writing publication/report, and attach as an appendice to report.

πŸ”Ž Tests

To run tests:

devtools::test()

The repository contains a GitHub action R-CMD-check.yaml which will automatically run tests with new commits to GitHub, as part of the devtools::check() operation. This is continuous integration, helping to catch bugs early and keep the code stable. It will run the tests on three operating systems: Ubuntu, Windows and Mac.

πŸ”Ž Linting

You can lint the .R and .Rmd files by running:

lintr::lint_package()
lintr::lint_dir("notebooks")

The lint_package() function will run on files typically included in a package (i.e. R/, tests/). This will not include notebooks/ as it is not typical/excluded from our package build, and so we can lint that by specifying the directory for lint_dir().


❓ How does the model work?

TBC

Note: This template does not include a warm-up period, as it is not natively supported by simmer and was not possible to implement. This was explored - as the simulation results returned by get_mon_arrivals() can be filtered to only include patients arriving after a warm-up period. This isn't possible for the get_mon_resources() results (which we use to derive utilisation). This is because it provides times for each resource, but doesn't specify whether each time is a start or end time. We examine results per resource, and when there are multiple resources, it wouldn't be possible to match the resource times to the patient items (to identify which are start and end times), as the patients end time may be later if they had other resources to visit (and vice versa, their start time may be earlier if they visited other resources prior).


πŸ“‚ Repository structure

repo/
β”œβ”€β”€ .github/workflows/          # GitHub actions
β”œβ”€β”€ docs/                       # Documentation
β”œβ”€β”€ images/                     # Image files and GIFs
β”œβ”€β”€ man/                        # Function documentation generated by roxygen
β”œβ”€β”€ notebooks/                  # Run DES model and analyse results
β”œβ”€β”€ outputs/                    # Folder to save any outputs from model
β”œβ”€β”€ R/                          # Local package containing code for the DES model
β”œβ”€β”€ renv/                       # Instructions for creation of R environment
β”œβ”€β”€ tests/                      # Unit and back testing of the DES model
β”œβ”€β”€ .gitignore                  # Untracked files
β”œβ”€β”€ .lintr                      # Lintr settings
β”œβ”€β”€ .Rbuildignore               # Files and directories to exclude when building the package
β”œβ”€β”€ .Rprofile                   # R session configuration file
β”œβ”€β”€ CITATION.cff                # How to cite the repository
β”œβ”€β”€ CONTRIBUTING.md             # Contribution instructions
β”œβ”€β”€ DESCRIPTION                 # Metadata for the R package, including dependencies
β”œβ”€β”€ LICENSE                     # Licence file for the R package
β”œβ”€β”€ LICENSE.md                  # MIT licence for the repository
β”œβ”€β”€ NAMESPACE                   # Defines the exported functions and objects for the R package
β”œβ”€β”€ NEWS.md                     # Describes changes between releases (equivalent to a changelog for R packages)
β”œβ”€β”€ rap_template_r_des.Rproject # Project settings
β”œβ”€β”€ README.md                   # This file! Describes the repository
└── renv.lock                   # Lists R version and all packages in the R environment

⏰ Run time and machine specification

The overall run time will vary depending on how the template model is used. A few example implementations are provided in notebooks/ and the run times for these were:

  • analysis.Rmd: 42s
  • choosing_parameters.Rmd: 56s
  • generate_exp_results.Rmd: 0s

These times were obtained on an Intel Core i7-12700H with 32GB RAM running Ubuntu 24.04.1 Linux.


πŸ“ Citation

Heather, A. (2025). Simple Reproducible R Discrete-Event Simulation (DES) Template. GitHub. https://github.com/pythonhealthdatascience/rap_template_r_des.

Researcher details:

Contributor ORCID GitHub
Amy Heather ORCID: Heather https://github.com/amyheather

πŸ“œ Licence

This template is licensed under the MIT License.

MIT License

Copyright (c) 2025 STARS Project Team

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

πŸ’° Funding

This project was developed as part of the project STARS: Sharing Tools and Artefacts for Reproducible Simulations. It is supported by the Medical Research Council [grant number MR/Z503915/1].


πŸ“„ Template README for your project

Delete everything from this line and above, and use the following structure as the starting point for your project README:





Your Project Name

python licence

Description

Provide a concise description of your project.


Installation

Provide instructions for installing dependencies and setting up the environment.


How to run

Provide step-by-step instructions and examples.

Clearly indicate which files will create each figure in the paper. Hypothetical example:

  • To generate Figures 1 and 2, execute base_case.Rmd
  • To generate Table 1 and Figures 3 to 5, execute scenario_analysis.Rmd

Run time and machine specification

State the run time, and give the specification of the machine used (which achieved that run time).

Example: Intel Core i7-12700H with 32GB RAM running Ubuntu 24.04.1 Linux.

To find this information:

  • Linux: Run neofetch on the terminal and record your CPU, memory and operating system.
  • Windows: Open "Task Manager" (Ctrl + Shift + Esc), go to the "Performance" tab, then select "CPU" and "Memory" for relevant information.
  • Mac: Click the "Apple Menu", select "About This Mac", then window will display the details.

Citation

Explain how to cite your project and include correct attribution for this template.