Independent population-PK analysis — run R-20261008-141821-7241
primary
template pk_2cmt_oral_v1 v1.0.3 ·
status completed · 2026-10-08T14:18:36Z
1. Pre-comparison checks
| Check | Status | Detail |
|---|---|---|
| convergence | pass | Optimizer message: Normal exit from bobyqa |
| covariance step | pass | Covariance matrix obtained (method |r|,|s| (full)) |
| RSE feasibility | pass | All RSE below 50% |
| parameter bounds | pass | All estimates and variances within plausible bounds |
| estimation diagnostics | warn | nlmixr2 reported: gradient problems with covariance; see $scaleInfo; since sandwich matrix is corrected, you may compare to $covR or $covS if you wish; S matrix non-positive definite but corrected by S = sqrtm(S%*%S); R matrix non-positive definite but corrected by R = sqrtm(R%*%R); last objective function was not at minimum, possible problems in optimization; ETAs were reset to zero during optimization; (Can control by foceiControl(resetEtaP=.)) |
2. Comparison with the applicant's reported values
Relative difference = (independent − applicant) / applicant. Flag when |Δ| > 20%.
| Parameter | Applicant | Independent | 95% CI | Δ | Applicant value in CI | Flag |
|---|---|---|---|---|---|---|
| CL/F (L/h) | 4.2 | 4.09 | 3.81 – 4.39 | -2.6% | yes | |
| V2/F (L) | 35 | 35.5 | 31.5 – 40 | +1.3% | yes | |
| Q/F (L/h) | 8.1 | 7.94 | 7.53 – 8.38 | -1.9% | yes | |
| V3/F (L) | 120 | 117 | 110 – 125 | -2.1% | yes | |
| KA (1/h) | 1.1 | 1.14 | 0.959 – 1.36 | +3.6% | yes | |
| IIV CL (CV%) | 30 | 27 | – | -10.0% | – |
Possible sources of difference
No parameter differs from the applicant's value by more than the tolerance. Generic factors are listed for completeness.
Facts about this run
- BLQ method used in this run: M1; 0 censored observations used; BLQ fraction 1.7% overall, 6.2% of samples with NTIME ≥ 24 h.
- Actual sampling times used; 9 records deviate from nominal time beyond the QC tolerance.
- 10 records excluded and 4 records corrected during data preparation (see QC log).
- Estimation: FOCEi, template pk_2cmt_oral_v1.
- Software: R 4.6.1, nlmixr2 7.0.1, nlmixr2est 7.1.0, rxode2 5.1.7.1.
Generic factors
- Handling of BLQ observations — M1 (discarding) and M3 (likelihood-based censoring) use different information from late samples, which mostly informs terminal-phase parameters (V3/F, Q/F) and CL/F.
- Time variables and rounding — Use of actual vs nominal times, and rounding of sampling times, changes the observation design seen by the model.
- Data exclusions and corrections — Records excluded or corrected during data preparation (pre-dose records, unit conversions, outliers) may differ from the applicant's data handling.
- Estimation settings — Estimation algorithm, interaction term, initial estimates, parameterisation and optimiser tolerances can lead to different local optima.
- Software and versions — Different software (e.g. NONMEM vs nlmixr2) or versions may give numerically different estimates for the same model.
3. Parameter estimates
| Parameter | Estimate | RSE % | 95% CI | IIV CV% | η-shrinkage SD% | Fixed |
|---|---|---|---|---|---|---|
| CL/F (L/h) | 4.091 | 3.62 | 3.81 – 4.39 | 27 | 5.58 | no |
| V2/F (L) | 35.47 | 6.08 | 31.5 – 40 | 24.9 | 19.5 | no |
| Q/F (L/h) | 7.944 | 2.74 | 7.53 – 8.38 | – | – | no |
| V3/F (L) | 117.4 | 3.17 | 110 – 125 | – | – | no |
| KA (1/h) | 1.14 | 8.84 | 0.959 – 1.36 | 28.7 | 34.7 | no |
| Residual: add.sd | 5.835 | 61.4 | – | – | – | no |
| Residual: prop.sd | 0.1453 | 3.61 | – | – | – | no |
RSE on the natural scale ≈ 100 × SE(log θ); 95% CI = exp(log θ ± 1.96 SE). OFV = 4372.9333 · AIC = 5151.9766 · 60 subjects, 413 observations (0 censored) · covariance |r|,|s| (full) · estimation time 11.4 s.
4. Goodness-of-fit
5. Data QC and preparation
Every exclusion or correction is listed. Raw records: 483 → prepared: 473 (413 observations, 60 subjects).
| Check | Outcome | Records | Detail | Subjects |
|---|---|---|---|---|
| required_columns | pass | 0 | All 11 required columns present | |
| units | fix | 4 | Converted DV and LLOQ from ug/mL to ng/mL | SYN-052 |
| duplicates | pass | 0 | No duplicate records | |
| chronology | pass | 0 | Every subject has a dose record (60 subjects) | |
| records_before_dose | exclude | 3 | Observation records before the first dose excluded (3 with a quantified concentration > 0, which is not expected before dosing) | SYN-007, SYN-023, SYN-041 |
| ntime_vs_time | warn | 9 | Actual time deviates from nominal by more than max(0.5 h, 10% of NTIME); records kept, actual TIME used | SYN-005, SYN-007, SYN-012, SYN-014, SYN-019, SYN-025, SYN-035, SYN-046 |
| missing_covariates | pass | 0 | WT available for all subjects | |
| blq_proportion | pass | 7 | 7 BLQ records = 1.7% of observations (6.2% of samples with NTIME >= 24 h) | |
| blq_handling | exclude | 7 | BLQ method M1: BLQ records discarded before estimation | SYN-002, SYN-011, SYN-020, SYN-030, SYN-039, SYN-042 |
6. Analysis spec (confirmed by the assessor)
Confirmed 2026-10-08T14:18:21Z by auto-confirm (auto-confirm (demo)).
{
"compartments": 2,
"absorption": "first_order",
"route": "oral",
"error_model": "combined",
"iiv": [
"CL",
"V2",
"KA"
],
"estimation": "FOCEi",
"reference_values": {
"CL": 4.2,
"V2": 35.0,
"V3": 120.0,
"Q": 8.1,
"KA": 1.1,
"IIV_CL": 30.0
},
"analysis_type": "primary",
"blq_method": "M1",
"template": "pk_2cmt_oral_v1"
}
7. Traceability manifest
| Run ID / parent | R-20261008-141821-7241 / — (root R-20261008-141821-7241) |
| Template | pk_2cmt_oral_v1 v1.0.3, catalogue 1.0.3, template hash 589f254e36326ab2… |
| Script SHA-256 | 41f519daf7a1adac8e51bef28150365230ef97a2c5e983f2d5d6962366ae729d |
| Raw data SHA-256 | 1cb7adff311dcd25660f2353d892964c98ad1932a6b69b6ed28c6ebfcaa48c6b |
| Prepared data SHA-256 | 643cf77a70d32f3e284a6391b2438c2c1ee0b95f85d8b6c246098e4ef7f82494 |
| Seed | 20240607 |
| Extractor | mock (rule-based, prompt mock_v1) jobs J-4c1e061e5b, J-7f6d32ad91 |
| R packages | nlmixr2 7.0.1, nlmixr2est 7.1.0, rxode2 5.1.7.1, lotri 1.0.5, ggplot2 4.0.3, jsonlite 2.0.0, R 4.6.1, BLAS /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3, LAPACK /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so |
| Python packages | python 3.12.3, jinja2 3.1.4, pandas 2.2.3, numpy 2.1.3, jsonschema 4.23.0, typer 0.12.5 |
| Environment | Linux-6.17.0-1022-azure-x86_64-with-glibc2.39 · image ghcr.io/djindetoss/pk-analysis-poc:sha-39060f2 · commit 39060f262255 |
Full manifest.json
{
"run_id": "R-20261008-141821-7241",
"parent_run_id": null,
"root_run_id": "R-20261008-141821-7241",
"purpose": "analysis",
"analysis_type": "primary",
"sensitivity_fields": [],
"status": "completed",
"created_at": "2026-10-08T14:18:21Z",
"completed_at": "2026-10-08T14:18:36Z",
"spec": {
"compartments": 2,
"absorption": "first_order",
"route": "oral",
"error_model": "combined",
"iiv": [
"CL",
"V2",
"KA"
],
"estimation": "FOCEi",
"reference_values": {
"CL": 4.2,
"V2": 35.0,
"V3": 120.0,
"Q": 8.1,
"KA": 1.1,
"IIV_CL": 30.0
},
"analysis_type": "primary",
"blq_method": "M1",
"template": "pk_2cmt_oral_v1"
},
"spec_hash": "5c35bee5bc26c533ecfbf89e2cc3a004ae8575e9508e07875adba84dacdf6d07",
"methodology_hash": "b654e16c214dc3976105d8ac0299bbdd62f10838806e6f9b8c4930f04667771a",
"template": {
"id": "pk_2cmt_oral_v1",
"version": "1.0.3",
"hash": "589f254e36326ab2ae18dce251949169b318f7e59c79210d33428f972dc38600",
"catalogue_version": "1.0.3"
},
"script_hash": "41f519daf7a1adac8e51bef28150365230ef97a2c5e983f2d5d6962366ae729d",
"seed": 20240607,
"input_data": {
"raw_file": "data/raw/adpc_synthetic.csv",
"raw_hash": "1cb7adff311dcd25660f2353d892964c98ad1932a6b69b6ed28c6ebfcaa48c6b",
"prepared_hash": "643cf77a70d32f3e284a6391b2438c2c1ee0b95f85d8b6c246098e4ef7f82494"
},
"extractor": {
"name": "mock",
"model": "rule-based",
"prompt_version": "mock_v1",
"job_ids": [
"J-4c1e061e5b",
"J-7f6d32ad91"
]
},
"confirmation": {
"at": "2026-10-08T14:18:21Z",
"by": "auto-confirm",
"mode": "auto-confirm (demo)"
},
"packages": {
"python": {
"python": "3.12.3",
"jinja2": "3.1.4",
"pandas": "2.2.3",
"numpy": "2.1.3",
"jsonschema": "4.23.0",
"typer": "0.12.5"
},
"r": {
"nlmixr2": "7.0.1",
"nlmixr2est": "7.1.0",
"rxode2": "5.1.7.1",
"lotri": "1.0.5",
"ggplot2": "4.0.3",
"jsonlite": "2.0.0",
"R": "4.6.1",
"BLAS": "/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3",
"LAPACK": "/usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so"
}
},
"environment": {
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
"machine": "x86_64",
"cpu": "AMD EPYC 9V74 80-Core Processor",
"math_env": {
"OPENBLAS_CORETYPE": "Prescott",
"OPENBLAS_NUM_THREADS": "1",
"GLIBC_TUNABLES": "glibc.cpu.hwcaps=-AVX2_Usable,-AVX512F_Usable,-FMA_Usable,-FMA4_Usable,-AVX2,-AVX512F,-FMA,-FMA4"
},
"container_image": "ghcr.io/djindetoss/pk-analysis-poc:sha-39060f2",
"git_commit": "39060f262255991b7d5beba50bd8273ae2702323",
"python_executable": "/opt/venv/bin/python"
},
"tool_version": "0.1.0",
"settings": {
"tolerance": 0.2,
"rse_threshold": 50.0,
"qc": {
"ntime_abs_tol_h": 0.5,
"ntime_rel_tol": 0.1,
"blq_warn_fraction": 0.1
}
},
"engine": {
"returncode": 0,
"elapsed_s": 15.1,
"resumed_from_checkpoint": false
},
"outputs": {},
"request_prompt_hash": "3c85327d7417dfcc3e3852c5f74c8462505acdc9d7dbdb44cf9c4a2d2bfe283d",
"comparable": true
}Generated 2026-10-08T14:18:36Z by pk-analysis-poc 0.1.0 — synthetic data, demonstrator only.