
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. It is therefore more useful, 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 use the trapezoidal rule until the last observed time point, and continue from that point to infinity assuming exponential decay. The exponential decay rate has to be estimated, and here we 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 and NCA methods are not free of "modeling" either.
Below is an experiment where I simulate data using a 2-compartment (2C) model with oral absorption and linear elimination. I compare 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 out of total AUCinf. In general, NCA is considered unreliable if this percentage is higher than 20%, which is clearly the case here.
I have reported also AUC0-last (second row), which is the total AUC minus the terminal phase AUC. 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. NCA overestimates Cmax, since it will always pick the maximum observed concentration: there are always multiple noisy observations taken near the peak concentration timepoint and chances are that one of them slips higher than the true max concentration.

Here is the same experiment ut we add two more observation time points at t=48 and t=64 hours. In this case the contribution of terminal phase to AUCinf is clearly smaller.


A critical part of succesful NCA is estimating the terminal elimination rate constant. 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.