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.0.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.0-py3-none-any.whl (80.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: refua_clinical-0.7.0.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.0.tar.gz
Algorithm Hash digest
SHA256 15841d1972a903f5010808163040a1d096ebaee4a35dab234e3487fbf59818b8
MD5 48032108ad37c78d34e5be12cd770a7d
BLAKE2b-256 b4c3a0150e777f76d050cb12878b7673dbb739bd4590fadd940c2712d8821ff5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: refua_clinical-0.7.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0ae70646c4ddfb2713928b563d069cb9a0da7cdb360600862aa78f1a5464ef07
MD5 72764ab0cd0f3f89a4fad4ee3a0db60e
BLAKE2b-256 b2e667b52e5209aa2fdbfab8b908f0d8bc2ef4419567b78d9b1f4bc3be107078

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