A Markov cohort model evaluating the cost-effectiveness of colonoscopy screening every 10 years versus no screening in a 50-year-old cohort. Built in Python as a health economics portfolio project.
Colorectal cancer (CRC) is the third most common cancer worldwide and one of the leading causes of cancer mortality. Organised screening programmes (colonoscopy, FIT test) can detect precancerous adenomas and early-stage tumours, potentially averting advanced disease.
This project implements a 6-state Markov cohort model to compare two strategies:
| Strategy | Description |
|---|---|
| No Screening | Background disease progression only |
| Colonoscopy Screening | Colonoscopy every 10 years from age 50 |
The primary outcome is the Incremental Cost-Effectiveness Ratio (ICER), expressed in €/QALY gained, benchmarked against a willingness-to-pay threshold of €30,000/QALY (consistent with Italian and European HTA practice).
Healthy ──► Adenoma ──► CRC Local ──► CRC Advanced ──► CRC Death
│ │ │ │
└────────────┴────────────┴───────────────┴──────────► Other Death
States:
- Healthy — no CRC, at population risk
- Adenoma — detectable precancerous lesion
- CRC Local — localised disease (stages I–II)
- CRC Advanced — advanced disease (stages III–IV)
- CRC Death — absorbing state (death from CRC)
- Other Death — absorbing state (background mortality)
Model assumptions:
- Annual cycle length, 40-year horizon (age 50–90)
- Discount rate: 3% for both costs and QALYs (AIFA/NICE standard)
- Costs in 2023 EUR
- Half-cycle correction not applied (simplification for portfolio)
crc-cea-markov/
├── src/
│ ├── markov_model.py # Core Markov engine, parameters, ICER computation
│ ├── sensitivity.py # One-way (deterministic) sensitivity analysis
│ ├── psa.py # Probabilistic SA — Monte Carlo, CEAC
│ └── plots.py # Plotly visualisations
├── app/
│ └── dashboard.py # Streamlit interactive dashboard
├── notebooks/
│ └── 01_analysis.ipynb # Step-by-step walkthrough (to be added)
├── data/
│ ├── raw/ # Source data / parameter tables
│ └── processed/ # Model outputs
├── outputs/ # Figures and result tables
├── tests/ # Unit tests
├── requirements.txt
└── README.md
# Clone repo
git clone https://github.com/yourusername/crc-cea-markov.git
cd crc-cea-markov
# Install dependencies
pip install -r requirements.txt
# Run the Streamlit dashboard
streamlit run app/dashboard.py
# Or run the model directly
python -c "
from src.markov_model import ModelParameters, compute_icer
params = ModelParameters()
res = compute_icer(params)
print(f'ICER: €{res[\"icer\"]:,.0f}/QALY')
"| Output | Description |
|---|---|
| ICER | Incremental cost per QALY gained |
| Markov Trace | Cohort distribution across states over time |
| Tornado Diagram | Most influential parameters (one-way SA) |
| CE Plane | Scatter of PSA simulations on cost-effectiveness plane |
| CEAC | Probability of cost-effectiveness across WTP thresholds |
| Parameter | Source |
|---|---|
| Transition probabilities | Lansdorp-Vogelaar et al. (2010), Ann Intern Med |
| Utilities | Ness et al. (1999); Kind et al. (1998) |
| Costs | Italian DRG tariffs (2023); published Italian NHS data |
| Background mortality | ISTAT Italian Life Tables (2022) |
| Colonoscopy sensitivity | Systematic review, NICE CG131 |
- Model type: Markov cohort (deterministic base case, probabilistic SA)
- Perspective: Italian National Health Service (SSN)
- Comparators: No screening vs. colonoscopy every 10 years
- Sensitivity analysis:
- One-way (OWSA): 10 key parameters varied ±20% → tornado diagram
- Probabilistic (PSA): 1,000 Monte Carlo draws → CE plane + CEAC
- Decision rule: Cost-effective if ICER < €30,000/QALY
This model is built for portfolio and educational purposes only. Parameters are sourced from published literature but have not been validated for clinical or policy decision-making. The model simplifies several aspects of CRC natural history (e.g., age-dependent transition rates, FIT-based screening pathways, post-treatment recurrence).
Built by Matteo Garro' — MSc Economics & Data Science
LinkedIn | GitHub