
Non-compartmental analysis (NCA) and compartmental pharmacokinetic (PK) modeling are two different approaches used to analyze drug concentration-time data from a population of subjects. PK modeling has been a common topic in these blog posts, but this is my first post related to NCA. NCA is a quick method to obtain descriptive statistics from the data, whereas a PK model is ideally a full mathematical description of the data-generating process. Such a model can be used to predict things like drug exposure for new patients given things like age and weight. Modeling is therefore more useful than NCA, but can lead to biased results if the model is misspecified.
In this post, I will limit the comparison to estimating exposure quantities, namely the maximum concentration (Cmax) and area under the concentration curve from time 0 to infinity (AUCinf). I assume that there is only a single 100 mg dose at time t=0 and the concentration is measured rather densely in time.
A common NCA method is to divide the total exposure into AUCinf = AUClast + AUCterm. One typically uses the trapezoidal rule until the last observed time point Tlast to get AUClast, and analytically integrates from that point to infinity assuming exponential decay, to get AUCterm. The exponential decay rate has to be estimated, and here I use the common method of fitting ordinary least squares linear regression to the last three data points on the log scale. So, this NCA method has the assumption of linear elimination baked in. NCA methods are often quoted to be free of modeling assumptions, but that is not exactly the case. To me, any terminal phase extrapolation is a "model" of some sort.
Below is an experiment where I simulate data using a 2-compartment (2C) model with oral absorption and linear elimination. I compare Bayesian fits of one- and two-compartment models and NCA.
As we see, the trapezoidal rule picks up all the log-normal noise from the concentration measurements but errors in different directions cancel out on average in AUC computations. The difficult part is the terminal phase estimation (dotted line). For SUBJ003, NCA fails because the noise makes it seem like the concentration is increasing after time t=10 h.

Below we compare true and estimated values of exposure quantities using NCA and the compartmental models. The reported r value is the correlation coefficient between the true and estimated values. We see that the 2C model recovers the true values of AUCinf best as expected (first row). The 1C model has a model mismatch and does not fit to data, which leads to a bias in the estimates. But the ordering of subjects based on AUCinf still stays rather accurate, and the correlation (r=0.77) is almost as good as that of the 2C model (r=0.78). The points are colored based on the true fraction of the terminal phase AUC, defined as Fterm = AUCterm / AUCinf. In general, NCA is considered unreliable if Fterm is higher than 0.2, which is clearly the case here.
I have reported also AUClast (second row). This is clearly estimated way better by NCA than the 1C model, as can be seen from the previous plot, too. The last row shows the Cmax. In this case, NCA overestimates Cmax, since it always picks the maximum observed concentration: there are always multiple noisy observations taken near the peak concentration timepoint. Chances are that at least one of them is higher than the true max concentration. The 1C model on the other hand underestimates Cmax since it cannot fit the initial distribution phase.

Here is the same experiment, but we add two more observation time points at t=48 and t=64 hours. In this case Fterm is clearly smaller and the exposure estimation accuracy improves for all methods.


A critical part of succesful NCA is estimating the terminal elimination rate. Its estimation is noisy and it may require human input in cases where typical methods such as the one presented here fail. The analyst may need to hand-pick the points to be used for estimation. The presented method requires quite densely sampled data for all subjects to be useful. It could be improved to make it more robust, but I feel like why not just develop actual models at that point? Models of course can be badly misspecified, but a good thing is that it can be diagnosed. I don't think anyone would start making decisions based on a model fit like the 1C model seen here!
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.
This is a comment related to the post above. It was submitted in a form, formatted by Make, and then approved by an admin. After getting approved, it was sent to Webflow and stored in a rich text field.