<\!DOCTYPE html> CEA Pipeline — Holubar Lab
Holubar Lab — Research Toolkit

CEA Pipeline

Cost-effectiveness analysis scaffolding for the lab — Markov, decision tree, PSA, CEAC, AMA-styled output. Drummond 2015 + CHEERS 2022 standards.

You're authenticated. Magic-link gated. The CEA pipeline is shared Python infrastructure under 0 SDH Prepub Bullpen/1 CEAs/_shared/. This page documents the reusable engine + currently active pilots.

Active pilots

PilotTarget journalQuality scores
VTE Prophylaxis
Apixaban vs Enoxaparin (4-arm decision tree)
DCRDrummond 8.75/10
CHEERS 26/28
IBD-PSC Surgical Strategy
3-arm lifetime Markov; transitions verified vs Maspero 2023 PMID 37477000
Ann SurgDrummond 9.5/10
CHEERS 27/28
CORS CEA Scoping Review
PRISMA-2020 SR + exploratory RE-MA of CRS CEAs; extends Leeds-Holubar 2025 JSR (PMID 40967975)
Ann SurgIn progress

Reusable infrastructure for every CEA project in the Holubar Lab sandbox. Modeled after Leeds 2019/2022 methodology (PMIDs 31596763, 35277799), implemented in Python.


Cost-Effectiveness Analyses/
├── _shared/                   ← you are here
│   ├── Scripts/               ← reusable model code
│   ├── Inputs/                ← canonical parameter library w/ PMID provenance
│   ├── Templates/             ← memo + manuscript + notebook templates
│   ├── Docs/                  ← methodology + CHEERS checklist + this README
│   └── Validation/            ← reference-case validation artifacts
├── VTE_Prophylaxis_Apixaban_vs_Enoxaparin/   ← Pilot 1
└── IBD-PSC_Surgical_Strategy_CEA/            ← Pilot 2

Scripts (_shared/Scripts/)

Module Purpose
cea_utils.pyDistribution samplers (Beta/Gamma/Normal/Lognormal/Dirichlet/Triangular), method-of-moments parameter conversion, discounting, NMB, ICER table with dominance flagging, CEAC, EVPI.
markov_engine.pyCohort Markov simulator with optional half-cycle correction; supports stationary OR time-varying transition matrices; reward vectors stationary OR time-varying.
decision_tree.pyRecursive node-based tree evaluator (DecisionNode / ChanceNode / TerminalNode), folding back to expected (cost, QALY). PSA wrapper provided.
plotting.pyCEA plane, CEAC, tornado, Markov trace — all TIFF 600 DPI LZW, Arial, horizontal labels per statistical-output.md.
reporters.pyPlain-text + AMA three-line .docx ICER tables; PSA summary; CHEERS results paragraph generator.

All scripts include self-tests in __main__ blocks. Run:


cd "/Volumes/T1 Claude/000 Claude Sandbox/Active Research and Manuscripts/Cost-Effectiveness Analyses/_shared/Scripts"
python3 cea_utils.py        # reproduces Leeds 2022 ICER
python3 markov_engine.py    # reference-case Markov + time-varying check
python3 decision_tree.py    # Leeds-2022-style tree + PSA wrapper
python3 plotting.py         # generates 4 canonical figures (CEA plane, CEAC, tornado, Markov trace)
python3 reporters.py        # ICER text + .docx + CHEERS snippet

How to scaffold a new CEA project

  1. Create the project folder with standard subfolder layout:

``bash PROJECT="MyNewCEA" cd "/Volumes/T1 Claude/000 Claude Sandbox/Active Research and Manuscripts/Cost-Effectiveness Analyses" mkdir -p "$PROJECT"/{Scripts,Data,Figures/drafts,Lit} find "$PROJECT" -type d -exec touch {}/z.txt \; ``

  1. In Scripts/main_analysis.py, import from _shared/Scripts/ via

sys.path injection:

``python from pathlib import Path import sys sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "_shared" / "Scripts")) from cea_utils import Strategy, icer_table, ceac_curve, evpi, sample_beta, sample_gamma from markov_engine import MarkovModel from decision_tree import DecisionNode, ChanceNode, TerminalNode, evaluate_psa from plotting import plot_cea_plane, plot_ceac, plot_tornado, plot_markov_trace from reporters import psa_summary, write_icer_table_docx, cheers_results_snippet ``

  1. Load inputs from _shared/Inputs/:

``python import pandas as pd shared_inputs = Path(__file__).resolve().parents[2] / "_shared" / "Inputs" probs = pd.read_csv(shared_inputs / "probabilities.csv").set_index("parameter") costs = pd.read_csv(shared_inputs / "costs.csv").set_index("parameter") utils = pd.read_csv(shared_inputs / "utilities.csv").set_index("parameter") ``

  1. Verify all parameters used are VERIFIED before running the analysis

that will go into the manuscript. TODO_* rows are allowed during model building but must be resolved before final results.

  1. Build the model, run PSA, generate figures + tables, draft the

analytic memo. Each project's Data/ folder holds frozen inputs + results JSON; Figures/ holds draft PNGs + clean TIFFs.

  1. Cascade: per project-structure.md, results JSON → notebook →

analytic memo → manuscript → figures. Use /pc to commit.

Validation requirements (per project)

Each project's Validation/ folder (or Scripts/validate.py) must include:

hand-calculation match at known inputs

when available

and Markov are plausible for the same question, run both and report agreement

Conventions enforced

10,000 PSA iterations (per _shared/Docs/METHODOLOGY.md)

Reference papers (in Odin/PDF Articles/)

Prophylaxis After Surgery for Crohn's Disease" (DCR)

VTE Prophylaxis After Major Surgery for IBD" (J Gastrointest Surg) — SDH co-author

— foundational textbook (not in corpus; see CCF library)

For questions, additions, or onboarding help — email Stefan directly:

webmaster@holubarlab.org