Clinical TDM Workflow
OpenDose-PopPK includes a practical workflow to process therapeutic drug monitoring (TDM) tables and run MAP fitting per patient.
Input Schema
Required CSV columns:
patient_idtime_hconcdose_mg
Optional columns used as covariates when present:
weightcrclage
Flexible real-world aliases are accepted during loading/validation. For example:
patientorsubject_id->patient_idtimeorsampling_time->time_hconcentration->concdose->dose_mg
Unit normalization is automatic to canonical units:
Time -> hours (supports
h,min,day)Concentration ->
ug/mL(supportsug/mL,mg/L,ng/mL,mg/mL,ug/L,g/L)Dose ->
mg(supportsmg,g,ug,ng)
CLI Workflow
Create an input template:
opendose init-tdm-template --output data/tdm_template.csv
# Clinical/raw-data oriented template with explicit unit columns:
opendose init-tdm-template --format clinical --output data/tdm_template_clinical.csv
Validate and clean raw TDM table:
opendose validate-tdm --input data/tdm.csv --output-clean output/tables/tdm_clean.csv
# Optional fallback units when numeric values have no explicit units:
opendose validate-tdm --input data/tdm.csv --time-unit min --conc-unit ng/mL --dose-unit g \
--output-clean output/tables/tdm_clean.csv
Run MAP fitting for each patient:
opendose fit-tdm --drug Paracetamol \
--input output/tables/tdm_clean.csv \
--output output/tables/tdm_fit.csv \
--predictions-csv output/tables/tdm_predictions.csv \
--plot-png output/figures/tdm_obs_vs_pred.png \
--report-md output/reports/tdm_fit_report.md
Fit naive pooled population PK parameters:
opendose fit-population \
--input output/tables/tdm_clean.csv \
--maxiter 2000 \
--bootstrap-n 200 \
--output-json output/reports/population_fit.json
4b. Fit mixed-effects population PK parameters:
opendose fit-population-mixed \
--drug Paracetamol \
--input output/tables/tdm_clean.csv \
--maxiter 1200 \
--eta-csv output/tables/pop_mixed_eta.csv \
--output-json output/reports/population_fit_mixed.json
Run the full workflow in one command:
opendose run-tdm-workflow \
--drug Paracetamol \
--input data/tdm.csv \
--outdir output/workflows/tdm_paracetamol
Fit mixed-drug TDM file (must include
drugcolumn):
opendose fit-tdm-mixed \
--input data/tdm_mixed.csv \
--output output/tables/tdm_mixed_fit.csv
Run external validation (observed vs model and optional reference software):
opendose init-external-template --output data/external_validation_template.csv
opendose validate-external \
--drug Paracetamol \
--input data/external_validation.csv \
--predictions-csv output/tables/external_predictions.csv \
--output-json output/reports/external_validation.json
Generate reproducible validation report (protocol + metrics + limitations):
opendose validation-report \
--drug Paracetamol \
--output-md output/reports/validation_report.md \
--output-json output/reports/validation_report.json
Programmatic Workflow
from opendose_poppk import PKModel, load_tdm_csv, fit_tdm_patients
df = load_tdm_csv("data/tdm.csv")
pk = PKModel(F=0.8, ka=1.8, ke=0.28, Vd=65.0)
fit_df = fit_tdm_patients(df, pk=pk, sigma_obs=0.8, n_iter=3000)
print(fit_df.head())