Skip to main content

PK/PD-driven virtual patient and clinical trial simulation toolkit for Refua.

Project description

refua-clinical

refua-clinical is a simulation package for PK/PD-driven clinical trial design in the Refua ecosystem. It generates copula-based virtual patients, runs adaptive multi-arm trial simulations, and produces a tailored protocol that can be re-simulated with modified inputs.

What it provides

  • Population PK/PD simulation with inter-individual variability and covariate effects.
  • Virtual patient generation using Gaussian copulas and configurable marginals.
  • Estimand-aware analysis (treatment_policy, hypothetical, composite, while_on_treatment) for intercurrent-event handling.
  • Clinical trial simulation with multi-arm randomization, Bayesian response-adaptive allocation, early stopping (success/futility), enrollment drift, and optional site/country heterogeneity.
  • Dynamic external-control borrowing with commensurability-weighted discounting.
  • Protocol recommendation engine that scores candidate designs (sample size + interim cadence) on simulated operating characteristics and expected cost.
  • Multi-objective design optimization with Pareto front outputs.
  • Value-of-information (VOI) analysis for expansion decisions.
  • Transportability diagnostics (covariate shift, overlap score, risk level) for target-population extrapolation.
  • Explainability/advice engine that outputs a narrative, interim decision-card summaries, and prioritized actionable recommendations.
  • Re-run workflow from prior run artifacts with YAML/JSON or inline overrides.
  • ADMET-aware simulation path with optional parameter adjustments from Refua ADMET profiles.
  • Biologics mode with IV/SC route support, interval dosing, and optional TMDD-like clearance scaling.
  • One-shot workup CLI to generate all major artifacts in one run.
  • Optional integrations:
    • refua-data for covariate inference from materialized datasets.
    • refua-regulatory for audit/evidence bundles.

Install

cd refua-clinical
pip install -e .

With integrations:

pip install -e .[integrations]

With Refua ADMET support from SMILES:

pip install -e .[admet]

Check installed CLI version:

refua-clinical --version

CLI quickstart

Create a starter config:

refua-clinical init-config --output examples/default_config.yaml

Run simulation:

refua-clinical simulate \
  --config examples/default_config.yaml \
  --output artifacts/run.json

Run with ADMET-informed adjustments:

refua-clinical simulate \
  --config examples/default_config.yaml \
  --admet-json artifacts/admet_profile.json \
  --admet-adjustments \
  --output artifacts/run_admet.json

Run with richer Refua payload integration (affinity + confidence + properties + ADMET):

refua-clinical simulate \
  --config examples/default_config.yaml \
  --refua-json examples/refua_integration_payload.json \
  --refua-apply \
  --output artifacts/run_refua.json

Enforce canonical Refua handoff keys (reject legacy aliases/fallback-only payloads):

refua-clinical simulate \
  --config examples/default_config.yaml \
  --refua-json examples/refua_integration_payload.json \
  --refua-apply \
  --refua-strict-contract \
  --output artifacts/run_refua_strict.json

Run using a shared biologics preset from CLI:

refua-clinical simulate \
  --config examples/default_config.yaml \
  --modality-preset biologic-sc \
  --preset-dosing-interval-hours 336 \
  --preset-tmdd-strength 0.35 \
  --output artifacts/run_biologic.json

Generate an adjusted config from Refua payload without running simulation:

refua-clinical integrate-refua \
  --config examples/default_config.yaml \
  --refua-json examples/refua_integration_payload.json \
  --output-config artifacts/config_refua.yaml \
  --output-summary artifacts/refua_integration_summary.json

Generate tailored protocol:

refua-clinical protocol \
  --run artifacts/run.json \
  --output artifacts/protocol.json \
  --markdown artifacts/protocol.md

Run multi-objective optimization:

refua-clinical optimize \
  --run artifacts/run.json \
  --output artifacts/optimization.json \
  --markdown artifacts/optimization.md

Run value-of-information scenarios:

refua-clinical voi \
  --run artifacts/run.json \
  --extra-n 0 30 60 90 \
  --output artifacts/voi.json \
  --markdown artifacts/voi.md

Assess transportability between reference and target populations:

refua-clinical transportability \
  --reference data/reference_population.csv \
  --target data/target_population.csv \
  --output artifacts/transportability.json \
  --markdown artifacts/transportability.md

Generate explainable narrative and actionable advice:

refua-clinical advise \
  --run artifacts/run.json \
  --protocol artifacts/protocol.json \
  --include-sensitivity \
  --output-json artifacts/advice.json \
  --output-markdown artifacts/advice.md

ADMET-aware advice from SMILES (requires .[admet]):

refua-clinical advise \
  --run artifacts/run.json \
  --admet-smiles "CCO" \
  --output-json artifacts/advice_with_admet.json

Run everything all at once (simulate + protocol + optimize + VOI + advice):

refua-clinical workup \
  --config examples/default_config.yaml \
  --output-dir artifacts/full_workup \
  --include-sensitivity

Re-run with overrides:

refua-clinical rerun \
  --run artifacts/run.json \
  --set enrollment.total_n=240 \
  --set adaptive.interim_every=20 \
  --output artifacts/run_rerun.json

Infer virtual-patient covariates from refua-data:

refua-clinical from-data \
  --dataset-id chembl_activity_ki_human \
  --output examples/from_data.yaml

Create an evidence bundle with refua-regulatory:

refua-clinical evidence \
  --run artifacts/run.json \
  --output-dir artifacts/evidence/clinical_run_001

Python API (Object-Oriented)

The primary API is the fluent object model centered on ClinicalStudy and ClinicalRun.

from refua_clinical import ClinicalStudy

study = (
    ClinicalStudy.default()
    .trial(
        trial_id="oncology-refua-oo-demo",
        indication="Oncology",
        phase="Phase II",
        replicates=96,
    )
    .set("enrollment.total_n", 220)
)

run = study.simulate()
protocol = run.recommend_protocol(replicates_per_candidate=30)
print(run.summary["power"], protocol.protocol["protocol_id"])

Biologics preset example:

from refua_clinical import ClinicalStudy

study = (
    ClinicalStudy.default()
    .trial(trial_id="mab-phase2", indication="Immunology", phase="Phase II", replicates=80)
    .modality_preset(
        preset="biologic-sc",
        dosing_interval_hours=336.0,
        tmdd_strength=0.35,
    )  # q14d
)
run = study.simulate()
print(run.summary["power"], run.config.pk_model.modality, run.config.pk_model.route)

Refua payload-to-clinical mapping API:

from refua_clinical import (
    ClinicalStudy,
)

payload = {
    "ligands": [
        {
            "ligand_id": "lead_a",
            "affinity": {"ic50": 42.0, "binding_probability": 0.79},
            "structure": {"confidence_score": 0.77},
            "admet": {"admet_score": 0.68, "adme_score": 0.70, "safety_score": 0.64},
            "rdkit": {"mol_wt": 340.0, "mol_log_p": 2.1, "qed": 0.73},
        }
    ],
    "target_properties": {"length": 850.0, "instability_index": 45.0},
}

study = (
    ClinicalStudy.default()
    .trial(trial_id="refua-bridge-demo", replicates=80)
    .refua_payload(
        payload,
        apply=True,
        max_candidate_arms=3,
        strict_contract=True,
    )
)
run = study.simulate()
workup = run.workup(
    replicates_per_candidate=30,
    voi_extra_n=[0, 30, 60],
    include_sensitivity=True,
)
print(run.summary["power"], workup.advice.report["summary"]["safety_event_rate"])

End-to-end notebook (Refua + refua-clinical)

Use examples/refua_api_to_clinical_e2e.ipynb for a full workflow that starts with a small-molecule SMILES and protein target in refua, computes molecule/target properties, and feeds those into refua-clinical simulation and protocol recommendation outputs.

From a monorepo checkout:

cd refua
pip install -e .[admet]
cd ../refua-clinical
pip install -e .[admet]
jupyter notebook examples/refua_api_to_clinical_e2e.ipynb

Minimal combined API sketch:

from refua import Protein, SM
from refua_clinical import (
    ClinicalStudy,
)

sm = SM("Cn1cnc2n(C)c(=O)n(C)c(=O)c12")  # small molecule
target = Protein("MSEQNNTEMTFQIQRIYTKDISFEAPNAPHVFQQLAGKYTPEEIRNVLSTLQKAD", ids="A")

study = (
    ClinicalStudy.default()
    .trial(
        trial_id="refua-object-api-demo",
        indication="Target-program demo",
        replicates=72,
    )
    .admet_profile(sm.admet_profile(include_scoring=True), apply=True)
)

run = study.simulate()
protocol = run.recommend_protocol(replicates_per_candidate=30)
print(target.length(), run.summary["power"], protocol.protocol["protocol_id"])

Research-informed design choices

This package maps current literature and regulatory guidance into practical simulation defaults:

  1. ICH M15 (Step 5, adopted November 24, 2025): https://www.ema.europa.eu/en/ich-m15-general-principles-model-informed-drug-development-step-5
  2. ICH E9 (R1) estimands addendum: https://www.ema.europa.eu/en/ich-e9-statistical-principles-clinical-trials-scientific-guideline
  3. FDA adaptive design guidance (2019): https://www.fda.gov/regulatory-information/search-fda-guidance-documents/adaptive-design-clinical-trials-drugs-and-biologics-guidance-industry
  4. FDA Bayesian methods guidance page (updated January 2026): https://www.fda.gov/regulatory-information/search-fda-guidance-documents/use-bayesian-methodology-clinical-trials-drug-and-biological-products
  5. Copula virtual patients (CPT Pharmacometrics Syst Pharmacol, 2024): https://pubmed.ncbi.nlm.nih.gov/38853786/
  6. Copula adult populations (J Pharmacokinet Pharmacodyn, 2024): https://pubmed.ncbi.nlm.nih.gov/38661766/
  7. Dynamic borrowing framework (BMC Med Res Methodol, 2025): https://link.springer.com/article/10.1186/s12874-025-02691-2
  8. Non-concurrent control time-trend methods (Biometrical Journal, 2025): https://pmc.ncbi.nlm.nih.gov/articles/PMC12458466/
  9. Backfilling in adaptive platform trials (BMJ, 2024): https://pmc.ncbi.nlm.nih.gov/articles/PMC11698248/
  10. Trial-to-target transportability with synthetic populations (BMJ Open, 2025): https://pmc.ncbi.nlm.nih.gov/articles/PMC12306361/
  11. High-throughput Bayesian simulation tooling (BATSS, 2024): https://arxiv.org/abs/2410.02050

Test

cd refua-clinical
python -m pytest -q

Notes

  • Intended for research design support and internal decision analysis.
  • Not a substitute for clinical, biostatistical, ethics, or regulatory review.

Project docs

  • Changelog: CHANGELOG.md
  • Contributing guide: CONTRIBUTING.md
  • Security policy: SECURITY.md

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

refua_clinical-0.7.1.tar.gz (90.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

refua_clinical-0.7.1-py3-none-any.whl (80.7 kB view details)

Uploaded Python 3

File details

Details for the file refua_clinical-0.7.1.tar.gz.

File metadata

  • Download URL: refua_clinical-0.7.1.tar.gz
  • Upload date:
  • Size: 90.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.14.3 Darwin/25.3.0

File hashes

Hashes for refua_clinical-0.7.1.tar.gz
Algorithm Hash digest
SHA256 18f4685239a95ec5d9d746755fd068781984b917712f14cee805d3c6a7e3169a
MD5 93e2a3d2e21de3d67996c314c229541e
BLAKE2b-256 c4f48a714172670d4dfed4bca7dc853dbfb10b16c8ffa87d0c88ac8d8c4970b8

See more details on using hashes here.

File details

Details for the file refua_clinical-0.7.1-py3-none-any.whl.

File metadata

  • Download URL: refua_clinical-0.7.1-py3-none-any.whl
  • Upload date:
  • Size: 80.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.14.3 Darwin/25.3.0

File hashes

Hashes for refua_clinical-0.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 83bc393296aae1d7ef00aa17de2effe5126a590eed746ccf8d0270c993ae6a64
MD5 5f9c332e7315e32e653b1b8123f81ff7
BLAKE2b-256 18dda18fbffc94468831196dbf2f09b5cc3e357d09ffab93fa28648ba4a6ab89

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page