Risk Bridge
Risk Bridge is a Python package for estimating transportable binary-risk prediction models when the available cohorts do not share identical covariate support or when observational clinic data is subject to selection bias and calibration drift.
It combines propensity-score matching, reference-cohort calibration, joint maximum likelihood estimation, and constrained maximum likelihood estimation (cMLE) into reproducible simulation and user-data workflows.
Package title: Risk Bridging through Constrained MLE.
📖 Documentation Website: https://saehwanpark.github.io/risk-bridge/
Motivation
In clinical risk prediction, models fitted on specialized clinic registries or electronic health record (EHR) databases often fail when deployed to external target populations. This calibration breakdown occurs because:
- Covariate distributions $P(X)$ drift across health systems.
- High-value intermediate risk markers $Z$ (e.g. imaging, biopsies, or genomic scores) are measured in the source study but missing in the broader target registry.
- Clinic cohorts reflect non-random testing, referral enrichment, and selection bias.
Standard unconstrained Maximum Likelihood Estimation (MLE) on source data leads to miscalibrated risk predictions in the target cohort. Risk Bridge provides a principled way to constrain model fitting using calibration information from a representative external reference study, restoring well-calibrated probabilities.
Foundation Papers
-
Cao, Y., Ma, W., Zhao, G., McCarthy, A. M., & Chen, J. (2024). A constrained maximum likelihood approach to developing well-calibrated models for predicting binary outcomes. Lifetime Data Analysis, 30(3), 624–648. DOI: 10.1007/s10985-024-09623-6
-
Wang, L., & Chen, J. (2026). Developing Accurate Risk Prediction Using Biased Electronic Health Record Data. Manuscript in preparation.
Key Features
- Simulated & Applied Workflows: Built-in Scenario 1–3 data generators for methodological experiments and a streamlined pipeline for prepared user CSV datasets.
- Dual Analysis Paths: Evaluates Propensity Score Matched (PSM) source samples alongside unadjusted Random Sampling (RS) baselines.
- Hierarchical Solver Ladder: Warm starts from unconstrained BFGS, transitions to interior-point constrained optimization (
trust-constr) with analytic gradients and constraint Jacobians, and falls back toSLSQPwhen needed. - Rigorous Calibration Diagnostics: Exports Calibration-in-the-Large (CITL), calibration slope, observed-to-expected (O/E) ratio, Brier score, and stratum-specific moment residuals.
- Reproducible Output Contract: Strict, versioned tabular output contract (
schema_version=1.1.0) with comprehensive execution metadata and anenvironment.jsonsidecar. - Public Python API & CLI: High-level typed configurations (
UserDataRunConfig,RunConfig) and therisk-bridgecommand-line tool.
Installation
From PyPI (Standard Installation)
uv add risk-bridge
# or: pip install risk-bridge
The public-safe reproduction case runners are included in the wheel and source distribution. After installation, invoke them directly with python -m cases.<case>.<runner>.
From Source Repository
git clone https://github.com/SaehwanPark/risk-bridge.git
cd risk-bridge
uv sync --locked
Run the test suite and verify typing:
uv run pytest
uv run basedpyright
Quickstart
1. Simulated Scenario Run (CLI)
uv run risk-bridge \
--mode simulated \
--scenario 1 \
--nsim 2 \
--n-target 1000 \
--n-source 500 \
--n-reference 1000 \
--sample-size 100 \
--output-root data \
--run-label quickstart
2. User-Data Cohort Run (CLI)
uv run risk-bridge \
--mode user-data \
--target-csv examples/target.csv \
--source-csv examples/source.csv \
--reference-csv examples/reference.csv \
--x-cols X1,X2,X3,X4 \
--y-col caseY \
--z-origin-col zOrigin \
--z-cat-col zCat \
--sample-size 500 \
--nsim 1 \
--output-root data \
--run-label user_data
For a five-minute walkthrough, see QUICKSTART.md or the Online Quickstart Tutorial.
Library Usage
from pathlib import Path
import polars as pl
from risk_bridge import UserDataRunConfig, UserDataSchema, run_user_data
target_df = pl.read_csv("examples/target.csv")
source_df = pl.read_csv("examples/source.csv")
reference_df = pl.read_csv("examples/reference.csv")
schema = UserDataSchema(
x_cols=("X1", "X2", "X3", "X4"),
y_col="caseY",
z_origin_col="zOrigin",
z_cat_col="zCat",
)
config = UserDataRunConfig(
target_df=target_df,
source_df=source_df,
reference_df=reference_df,
schema=schema,
sample_size=500,
output_root="data",
run_label="applied_run",
)
output_dir: Path = run_user_data(config)
print(f"Results written to: {output_dir}")
Outputs
Each run writes a timestamped directory under output_root containing:
final/run_metadata.csv: Full configuration parameters, seeds, and schema version (1.1.0).final/fit_diagnostics.csv: Optimizer convergence status, objective values, and feasibility violations.final/est_cml_psm.csv: cMLE parameter estimates ($\alpha, \beta_X, \beta_Z, \gamma_0, \gamma_X, \sigma$).final/calibration_metrics.csv: Target cohort CITL, slope, O/E ratio, and Brier score.final/calibration_residuals.csv: Stratum-specific post-fit calibration residuals.final/roc_metrics.csv: Area under the ROC curve (AUC).final/accuracy_metrics.csv: Sensitivity, specificity, and precision at target FPR.final/environment.json: Reproducibility metadata and numerical tolerance contract.
Replication Cases
Risk Bridge ships with four privacy-safe reproduction case studies:
python -m cases.numerical_validation.run_suitepython -m cases.external_calibration_validation.run_suite --profile smoke --condition matchedpython -m cases.synthetic_transport_example.run_casepython -m cases.runtime_support_scaling.run_scaling --profile smoke
See REPRODUCTION.md and the Online Reproduction Runbook for instructions.
Documentation Links
- Documentation Website — Full online user guide, mathematical derivations, and tutorials
- Quickstart Guide — Fast setup and verification
- User Guide — Comprehensive guide to cohorts, schemas, and CLI options
- API Reference — Python library API reference
- Example Workflows — Datasets and runnable scripts
- Architecture Overview — Module map and data flow
- Contributing — Development setup and contribution standards
- Changelog — Version release history
- Citation — Software and methodology citation info
- License — Apache License 2.0
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 risk_bridge-1.0.5.tar.gz.
File metadata
- Download URL: risk_bridge-1.0.5.tar.gz
- Upload date:
- Size: 93.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9b6279ac357da1476de54f3a417eaab7079daf0e75c7ed38cd1383b0a6828f2
|
|
| MD5 |
79278037a1702a70ac968bbcddbff530
|
|
| BLAKE2b-256 |
11c3563a72063c3ddd13352dd6a7e4323dc509dc8277195012cd011ea14fcfaf
|
File details
Details for the file risk_bridge-1.0.5-py3-none-any.whl.
File metadata
- Download URL: risk_bridge-1.0.5-py3-none-any.whl
- Upload date:
- Size: 89.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
432b3266c9063e1f6292e28a62c31423d0c81fd1a53fb3b21fc030e6959b0931
|
|
| MD5 |
c0847c4368bf79106c61cb58d5551512
|
|
| BLAKE2b-256 |
bb48b3cf7b9f6331281274436262baf0315622499faa4c35590c33de5e187296
|