Output Files

OpenPKPD writes the same output files as NONMEM 7.x. All files are created in the current working directory (or the directory of the .ctl file when using the CLI).

File overview

File

Description

.lst

Estimation log — mirrors the NONMEM .lst report

.ext

Parameter estimates at each outer iteration

.phi

Individual empirical Bayes ETAs (post-hoc estimates)

.cov

Covariance matrix of parameter estimates

.cor

Correlation matrix

sdtab

Standard diagnostic table ($TABLE default)

patab

Parameter table

.lst file

The list file contains:

  • Parsed control stream echo

  • Estimation method and options

  • OFV history (one line per outer iteration)

  • Final parameter estimates with standard errors

  • Covariance step output (if enabled)

 **ESTIMATION STEP OMITTED:  NO
 **COVARIANCE STEP OMITTED:  NO

 #TBLN:      1
 #METH: First Order Conditional Estimation with Interaction

 ESTIMATION STEP COMPLETED

 FINAL PARAMETER ESTIMATE
 THETA - VECTOR OF FIXED EFFECTS PARAMETERS   *TH:
    TH 1      TH 2      TH 3
    1.50E+00  8.00E-02  3.00E+01

.ext file

Tab-delimited file with parameter values at each iteration. Columns:

ITERATION  THETA1  THETA2  ...  SIGMA(1,1)  OBJ

Final estimates are on the row with ITERATION = -1000000000.

import pandas as pd
ext = pd.read_csv("run001.ext", sep=r"\s+", skiprows=1)
final = ext[ext["ITERATION"] == -1000000000]

.phi file

Individual EBE (empirical Bayes estimate) file. One row per subject:

ID  ETA1       ETA2       ETA3       OBJ_i
1   0.1234    -0.0456     0.0789    12.345
import pandas as pd
phi = pd.read_csv("run001.phi", sep=r"\s+", skiprows=1)

Or access directly from Python:

result.post_hoc_etas   # dict {subject_id: np.ndarray}

.cov and .cor files

Symmetric matrices of parameter covariance / correlation written in NONMEM-compatible space-delimited format.

result.covariance_result.cov_matrix   # np.ndarray
result.covariance_result.cor_matrix   # np.ndarray

$TABLE output

$TABLE blocks request specific columns in a diagnostic table file:

$TABLE ID TIME DV PRED IPRED CWRES IWRES NOAPPEND NOPRINT FILE=sdtab

In OpenPKPD:

# Generated automatically after fitting; access via diagnostics:
from openpkpd.plots.diagnostics import compute_diagnostics

diag_df = compute_diagnostics(built.population_model, result)
diag_df.to_csv("sdtab.csv", index=False)

CDISC ADPPK output

write_cdisc_adppk() writes a narrow-scope CDISC ADPPK-style CSV suitable for downstream processing and regulatory data exchange. The file contains four row types, identified by the DTYPE column:

DTYPE

Content

OBSERVATION

One row per observed concentration (PARAMCD=CONC, AVAL=DV)

THETA

Fixed-effect estimates (THETA1, THETA2, …)

OMEGA

Variance/covariance elements, lower-triangular (OMEGA(i,j))

SIGMA

Residual-variance elements (SIGMA(i,j))

ETA

Post-hoc EBEs per subject (ETA1, ETA2, …)

from openpkpd.output import write_cdisc_adppk

write_cdisc_adppk(
    result,          # EstimationResult
    dataset,         # NONMEMDataset used during fitting
    "adppk.csv",
    study_id="STUDY001",
    avalu="ng/mL",
)

Output columns: STUDYID, USUBJID, PARAMCD, PARAM, AVAL, AVALU, DTYPE.

Note: This is a CSV-format ADPPK file. Full SDTM/ADaM validation and XPT transport format are outside the scope of OpenPKPD.

Accessing results programmatically

All output data is available on the EstimationResult object without touching any files:

result.ofv              # Scalar OFV
result.theta_final      # np.ndarray
result.omega_final      # np.ndarray (full matrix)
result.sigma_final      # np.ndarray (full matrix)
result.ofv_history      # list[float]
result.post_hoc_etas    # dict {id: np.ndarray}
result.eta_shrinkage    # np.ndarray (after compute_shrinkage())
result.converged        # bool
result.warnings         # list[str]
print(result.summary()) # One-line text summary