Decision-analytic modeling for health economic evaluation and health technology assessment: probabilistic parameters, cohort and individual-level simulation engines, cost-effectiveness analysis, and value of information
Project description
heormodel
heormodel is a Python decision-analytic modeling framework for health economic evaluation and health technology assessment.
heormodel covers the full cost-effectiveness analysis workflow in one package. It supports probabilistic parameter specification for a range of models: Markov cohort state-transition models, microsimulation models, and discrete-event simulation models. It builds the incremental cost-effectiveness ratio (ICER) table and runs value-of-information analysis. If you are not ready to port your model to Python, you can also bring your existing model results directly into the package.
Read more in the documentation: pedroliman.github.io/heormodel
Install
If you are new to Python, I recommend installing it with uv. Once you have a working Python installation, run this from your terminal within your project's folder:
pip install heormodel
# or using uv, which I prefer:
# (run uv init once)
uv init
uv add heormodel
Quickstart
This example compares treatment with standard care in a three-state Markov cohort state-transition model, evaluated by probabilistic sensitivity analysis. The code builds the model, runs it, and reports the ICER table and the expected value of perfect information.
import numpy as np
import pandas as pd
from heormodel.models import CohortSpec, MarkovModel
from heormodel.params import Beta, Gamma, ParameterSet
from heormodel.run import SeedManager, run_psa
from heormodel.cea import icer_table
from heormodel.voi import evpi
# define your model.
def model(p, intervention):
p_progress = p["p_progress"] * (p["rr_treat"] if intervention == "Treatment" else 1.0)
# Transition matrix. Rows: Current state. Columns: Next state.
P = np.array([
[1 - p_progress - p["p_die"], p_progress, p["p_die"]],
[0.0, 1 - p["p_die_sick"], p["p_die_sick"]],
[0.0, 0.0, 1.0],
])
cost = np.array([0.0, p["c_sick"], 0.0])
if intervention == "Treatment":
cost[:2] += p["c_treat"]
return CohortSpec(P, cost, np.array([1.0, p["u_sick"], 0.0]))
# create the MarkovModel engine.
engine = MarkovModel(states=("Healthy", "Sick", "Dead"),
interventions=("Standard care", "Treatment"),
transitions_and_rewards=model, n_cycles=40)
# Define your parameters:
params = ParameterSet({
"p_progress": Beta(20, 180), "rr_treat": Beta(60, 40),
"p_die": Beta(5, 995), "p_die_sick": Beta(50, 450),
"c_sick": Gamma(100, 250.0), "c_treat": Gamma(100, 80.0),
"u_sick": Beta(150, 50),
})
# sample your parameters:
draws = params.sample(1000, seed=SeedManager(1).generator())
# run your model over your parameters.
outcomes = run_psa(engine, draws).outcomes
# Get the ICER table.
icer_table(outcomes).round(1)
# cost effect inc_cost inc_effect icer status
# intervention
# Standard care 142910.9 11.2 NaN NaN NaN ND
# Treatment 233676.2 13.4 90765.3 2.2 41130.9 ND
# And from here your EVPI
round(evpi(outcomes, wtp=50_000), 1)
# 2738.7
Beyond this workflow, the package supports microsimulations, discrete-event simulation models, and compartmental transmission models written as ordinary differential equations (the ODEModel engine, with a susceptible-exposed-infectious-recovered vaccination example). A calibration function calibrates some parameters, takes others from the literature, then runs a full probabilistic sensitivity analysis. When the model is expensive to run, a surrogate-accelerated calibration tutorial trains a Gaussian process on a small design and calibrates through it with the sbi package, reaching the same posterior with about a hundred times fewer model runs.
Development
Developer documentation lives in devdocs/. See the CHANGELOG.md for recent changes and follow the release process: RELEASING.md.
Requires Python 3.11+ and uv:
uv venv && uv pip install -e ".[dev]"
uv run pytest
uv run pytest --doctest-modules src
uv run ruff check . && uv run mypy
The site in docs/ builds with Quarto and quartodoc; tutorials execute at render time. With Quarto installed and uv sync --extra docs:
uv run quartodoc build --config docs/_quarto.yml
quarto preview docs
Each tutorial also carries an "Open in Colab" badge backed by a runnable notebook under docs/_notebooks/. Regenerate the badges and notebooks after editing a tutorial; continuous integration checks they stay in sync:
uv run python docs/build_colab_notebooks.py
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file heormodel-0.7.4.tar.gz.
File metadata
- Download URL: heormodel-0.7.4.tar.gz
- Upload date:
- Size: 104.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79d798a8092bd6c3b29cc8ffbd91d1dc6cd7176ba05e088aec25782f1f8d174c
|
|
| MD5 |
5a5562bb9681d39c28329fa61fbec0fa
|
|
| BLAKE2b-256 |
5255824722b9a1f80bc4840009a92c248c9296b2c64cdfde4c5a04cf70a69a7b
|
Provenance
The following attestation bundles were made for heormodel-0.7.4.tar.gz:
Publisher:
release.yml on pedroliman/heormodel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
heormodel-0.7.4.tar.gz -
Subject digest:
79d798a8092bd6c3b29cc8ffbd91d1dc6cd7176ba05e088aec25782f1f8d174c - Sigstore transparency entry: 2194330359
- Sigstore integration time:
-
Permalink:
pedroliman/heormodel@ea914144141c32e45d29740163bdd94f86bd7d58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pedroliman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea914144141c32e45d29740163bdd94f86bd7d58 -
Trigger Event:
push
-
Statement type:
File details
Details for the file heormodel-0.7.4-py3-none-any.whl.
File metadata
- Download URL: heormodel-0.7.4-py3-none-any.whl
- Upload date:
- Size: 90.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be4869ca0e26562156fbc61cfea4e4ec1d128b9bf5470a72d60a9193e12d4e79
|
|
| MD5 |
ac73cb5f51a1961b43452ef25bac5b43
|
|
| BLAKE2b-256 |
daddbcb890fedae3850331040df19a6709b465afc541988c14d464a600d0f81f
|
Provenance
The following attestation bundles were made for heormodel-0.7.4-py3-none-any.whl:
Publisher:
release.yml on pedroliman/heormodel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
heormodel-0.7.4-py3-none-any.whl -
Subject digest:
be4869ca0e26562156fbc61cfea4e4ec1d128b9bf5470a72d60a9193e12d4e79 - Sigstore transparency entry: 2194330361
- Sigstore integration time:
-
Permalink:
pedroliman/heormodel@ea914144141c32e45d29740163bdd94f86bd7d58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pedroliman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea914144141c32e45d29740163bdd94f86bd7d58 -
Trigger Event:
push
-
Statement type: