A Python library for preclinical human dose projection based on pharmacokinetic (PK) data and compound properties using compartmental models and allometric scaling, in support of the publication Large-Scale Compartmental Model-Based Study of Preclinical Pharmacokinetic Data and Its Impact on Compound Triaging in Drug Discovery at https://pubs.acs.org/doi/10.1021/acs.molpharmaceut.4c00813.
- Overview
- Why ADP Exists
- Features
- Installation and Usage
- Scientific Background
- Core Concepts
- Examples
- API Reference
- Contributing
- Citation
- License
- Contact
The Automated Dose Prediction (ADP) library performs preclinical human dose projection, based on pharmacokinetic (PK) data and compound properties. It aims to predict the required dose of a compound to achieve a specific target concentration (e.g., average steady-state concentration - Cssavg, or trough concentration - Ctrough) in a target species (animal or human).
For an in-depth understanding of the ADP prediction and the project behind it, refer to our published article Large-Scale Compartmental Model-Based Study of Preclinical Pharmacokinetic Data and Its Impact on Compound Triaging in Drug Discovery.
Reliable and robust human dose prediction plays a pivotal role in drug discovery. By predicting human dose early in the drug discovery process, it is possible to reduce the time and resources spent on studying compounds that may not have a safe, effective, and commercially viable dosage in humans. Human dose prediction is crucial for:
- Compound triaging and prioritization: Identifying and prioritizing compounds with the highest probability of success for further discovery and development
- Early decision-making: Reducing drug attrition in clinical development by integrating information from in vitro assays, in vivo animal experiments, and in silico models
- Resource optimization: Avoiding investment in compounds that require impractically high doses or have unfavorable PK properties
- Clinical trial planning: Providing data-driven starting doses for first-in-human studies
Traditional approaches to preclinical PK data analysis typically use noncompartmental analysis (NCA) for routine and large-scale animal PK data analysis. While NCA is straightforward and easy to implement, it has significant limitations:
- Loss of information: NCA does not capture the shape of the PK curve, assuming a monoexponential decline in concentrations
- Limited applicability: For compounds with multiexponential PK behavior, NCA provides insufficient description
- Simulation constraints: NCA cannot support dose simulations with two-compartmental models, as it provides no information on the kinetics of distribution
Compartmental analysis offers a more comprehensive interpretation by conceptualizing the body as interconnected compartments, capturing the full shape of observed PK data. However, it has historically been impractical for large-scale compound triaging because:
- Manual compartmental analysis is too time-consuming to keep pace with active drug discovery programs
- Commercial software requires individual scientist intervention and cannot be scaled to thousands of compounds
ADP addresses these challenges by enabling automated and efficient large-scale compartmental modeling and simulation for discovery compound triaging. Working in conjunction with the Compartmental PK (CPK) tool for automated PK data fitting, ADP performs:
- Automated translation: Scaling animal PK parameters to human using allometric scaling with protein binding correction
- Compartmental simulation: Predicting human dose through one- and two-compartmental model simulations
- High-throughput processing: Handling thousands of compounds to support compound triaging decisions
- Integration of best information: Incorporating the latest data on absorption, distribution, metabolism, and clearance
This approach has been validated on approximately 50,000 IV PK studies for around 37,000 compounds, demonstrating that while different methods have minimal impact on estimating animal PK parameters, they significantly affect predicted human dose, exposure, and Cmax. ADP therefore enables efficient, complex human dose predictions at scale while maintaining the rigor of compartmental analysis.
For an in-depth understanding of the ADP prediction and the project behind it, refer to our published article: Large-Scale Compartmental Model-Based Study of Preclinical Pharmacokinetic Data and Its Impact on Compound Triaging in Drug Discovery.
- One-compartment model: For compounds with simple distribution kinetics
- Two-compartment model: For compounds with distinct distribution and elimination phases
- Single-dose and steady-state: Supports both dosing paradigms
- Species supported: Rat, Dog, Monkey, Mouse → Human
- Fraction unbound correction: Adjusts for protein binding differences
- Single-species allometry (SSA): Empirically derived scaling factors for clearance
- Ctrough: Trough concentration at the end of dosing interval
- Cssavg: Average steady-state concentration
- Command-line interface: Run predictions directly from terminal
- Python API: Integrate into workflows and pipelines
- Batch processing: Handle multiple compounds via JSON or CSV
- Target human dose (mg)
- Pharmacokinetic parameters (half-life, Cmax, AUC, tmax)
- Volume Ligand Efficiency (VLE)
- Scaled human PK parameters (V1, V2, CL, CL2)
See QUICKSTART.md for detailed installation instructions and usage examples.
Quick install:
pip install -e .Quick usage:
from adp import DosePredictor
predictor = DosePredictor(
animal="RAT",
pk_model="one_comp",
parent_weight=450.5,
bioavailability=0.85,
absorption_rate_constant=0.5,
human_fraction_unbound=0.1,
animal_fraction_unbound=0.15,
target_concentration=1.0,
in_vitro_potency_uM=0.05,
pk_target="Ctrough",
tau=24.0,
time_t=24.0,
is_single_dose=False,
animal_v1_L_per_kg=2.5,
animal_cl_L_per_hr_per_kg=0.8
)
predictor.predict()
print(f"Target Dose: {predictor.target_dose_mg:.2f} mg")ADP uses compartmental PK models that represent the body as one or more kinetically homogeneous compartments. These models describe drug concentration over time using differential equations.
One-Compartment Model:
- Central compartment with first-order absorption and elimination
- Suitable for compounds with rapid distribution
- Parameters: V1 (volume), CL (clearance), ka (absorption rate)
Two-Compartment Model:
- Central and peripheral compartments
- Captures distribution phase followed by elimination phase
- Parameters: V1, V2, CL, CL2 (intercompartmental clearance), ka
Allometric scaling translates PK parameters across species based on body size:
Volume of Distribution:
Vd,human = Vd,animal × (fu,animal / fu,human)
Clearance:
CL,human = CL,animal × (fu,human / fu,animal) × SSA
Where:
fu= fraction unbound in plasmaSSA= single-species allometry factor (species-specific)
Intercompartmental Clearance:
CL2,human = CL2,animal × (fu,human / fu,animal) × (BW,human / BW,animal)^0.75
VLE is a compound optimization metric that combines potency and distribution:
VLE = -log10(EC50) - log10(Vd,u)
Where:
EC50= in vitro potency (M)Vd,u= unbound volume of distribution (L/kg)
Higher VLE indicates better compound efficiency (higher potency and/or smaller unbound volume).
One-Compartment (Steady-State):
C(t) = (F × D × ka)/(V1 × (ka - ke)) × [exp(-ke × t)/(1 - exp(-ke × τ)) - exp(-ka × t)/(1 - exp(-ka × τ))]
Two-Compartment (Steady-State):
C(t) = A × exp(-α × t)/(1 - exp(-α × τ)) + B × exp(-β × t)/(1 - exp(-β × τ))
- (A + B) × exp(-ka × t)/(1 - exp(-ka × τ))
Where:
F= bioavailabilityD= doseτ= dosing intervalka= absorption rate constantke= elimination rate constantα,β= distribution/elimination rate constants (two-comp)A,B= pre-exponential coefficients
| Parameter | Description | Units |
|---|---|---|
animal |
Source species | RAT, DOG, MONKEY, MOUSE |
pk_model |
Compartment model | one_comp, two_comp |
parent_weight |
Molecular weight | g/mol |
bioavailability |
Fraction absorbed | 0-1 |
absorption_rate_constant |
ka | 1/hr |
human_fraction_unbound |
fu,human | 0-1 |
animal_fraction_unbound |
fu,animal | 0-1 |
target_concentration |
Target C | μM |
in_vitro_potency_uM |
EC50/IC50 | μM |
pk_target |
PK metric | Ctrough, Cssavg |
tau |
Dosing interval | hr |
time_t |
Evaluation time | hr |
is_single_dose |
Dosing paradigm | True/False |
If human PK parameters are not directly available, provide animal parameters for allometric scaling:
| Parameter | Description | Units |
|---|---|---|
animal_v1_L_per_kg |
Central volume | L/kg |
animal_cl_L_per_hr_per_kg |
Clearance | L/hr/kg |
animal_v2_L_per_kg |
Peripheral volume (two_comp) | L/kg |
animal_cl2_L_per_hr_per_kg |
Intercompartmental CL (two_comp) | L/hr/kg |
After calling predict(), these attributes are populated:
| Attribute | Description | Units |
|---|---|---|
target_dose_mg |
Predicted human dose | mg |
half_life |
Elimination half-life | hr |
time_to_max_concentration |
Time to Cmax | hr |
max_concentration |
Peak concentration | μM |
mean_residence_time |
MRT | hr |
auc_tau |
AUC(0-τ) | μM·hr |
auc_infinity |
AUC(0-∞) single dose | μM·hr |
volume_ligand_efficiency |
VLE metric | - |
elimination_rate_constant |
ke | 1/hr |
human_v1_L_per_kg |
Human V1 | L/kg |
human_cl_L_per_hr_per_kg |
Human CL | L/hr/kg |
execution_comments |
Warnings/errors | list |
from adp import DosePredictor
predictor = DosePredictor(
animal="RAT",
pk_model="one_comp",
parent_weight=450.5,
bioavailability=0.85,
absorption_rate_constant=0.5,
human_fraction_unbound=0.1,
animal_fraction_unbound=0.15,
target_concentration=1.0,
in_vitro_potency_uM=0.05,
pk_target="Ctrough",
tau=24.0,
time_t=24.0,
is_single_dose=False,
animal_v1_L_per_kg=2.5,
animal_cl_L_per_hr_per_kg=0.8
)
predictor.predict()
print(f"Target Dose: {predictor.target_dose_mg:.2f} mg")
print(f"Half-life: {predictor.half_life:.2f} hr")
print(f"VLE: {predictor.volume_ligand_efficiency:.4f}")predictor = DosePredictor(
animal="DOG",
pk_model="two_comp",
parent_weight=550.8,
bioavailability=0.75,
absorption_rate_constant=0.8,
human_fraction_unbound=0.08,
animal_fraction_unbound=0.12,
target_concentration=2.5,
in_vitro_potency_uM=0.1,
pk_target="Cssavg",
tau=12.0,
time_t=12.0,
is_single_dose=False,
animal_v1_L_per_kg=1.8,
animal_v2_L_per_kg=1.2,
animal_cl_L_per_hr_per_kg=0.5,
animal_cl2_L_per_hr_per_kg=0.3
)
predictor.predict()Single prediction:
adp --animal RAT --pk-model one_comp --parent-weight 450.5 \
--bioavailability 0.85 --absorption-rate-constant 0.5 \
--human-fraction-unbound 0.1 --animal-fraction-unbound 0.15 \
--target-concentration 1.0 --in-vitro-potency-uM 0.05 \
--pk-target Ctrough --tau 24.0 --time-t 24.0 \
--animal-v1-L-per-kg 2.5 --animal-cl-L-per-hr-per-kg 0.8Batch from JSON:
adp --input-json compounds.json --output-json results.jsonBatch from CSV:
adp --input-csv compounds.csv --output-csv results.csvclass DosePredictor:
"""Main class for dose prediction."""
def __init__(self, animal: str, pk_model: str, ...):
"""Initialize with PK parameters and compound properties."""
def predict(self) -> None:
"""Execute dose prediction workflow."""
def add_comment(self, comment: str) -> None:
"""Add execution comment."""# Body weights (kg)
HUMAN_BW = 70
RAT_BW = 0.25
DOG_BW = 12
MONKEY_BW = 8
MOUSE_BW = 0.025
# Single-species allometry factors
RAT_SSA = 0.152
DOG_SSA = 0.410
MONKEY_SSA = 0.407
def get_default_body_weight_and_ssa(organism: str) -> Tuple[float, float]:
"""Get body weight and SSA for a species."""# Show help
adp --help
# Single prediction
adp --animal ANIMAL --pk-model MODEL [options...]
# Batch from JSON
adp --input-json INPUT.json --output-json OUTPUT.json
# Batch from CSV
adp --input-csv INPUT.csv --output-csv OUTPUT.csvWe welcome contributions from the community! Here's how you can help:
If you encounter bugs, have feature requests, or need help:
- Open an issue on the GitHub repository
- Provide a clear description of the problem or suggestion
- Include relevant details:
- Python version
- Operating system
- Code snippet to reproduce (if applicable)
- Error messages
- GitHub Issues: For bug reports and feature requests
- Email: Contact us at the address in the Contact section
- Documentation: Check QUICKSTART.md for usage examples
- Fork the repository
- Create a feature branch
- Make your changes with clear commit messages
- Add tests if applicable
- Update documentation
- Submit a pull request
If you use ADP in your research, please cite our paper:
@article{ADP2024,
title={Large-Scale Compartmental Model-Based Study of Preclinical Pharmacokinetic Data and Its Impact on Compound Triaging in Drug Discovery},
journal={Molecular Pharmaceutics},
year={2024},
doi={10.1021/acs.molpharmaceut.4c00813},
url={https://pubs.acs.org/doi/10.1021/acs.molpharmaceut.4c00813}
}This project is licensed under the MIT License - see the LICENCE file for details.
- Code Maintainer: Facundo Esquivel Fagiani (esqufacu@msd.com)
- Scientific Inquiries: Peter Zhiping Zhang (zhiping.peter.zhang@msd.com)
Version: 1.0.0