Last updated: 2026-09-19
“If you know the enemy and know yourself, you need not fear the result of a hundred battles.”
--- Sun Tzu, The Art of War
Understanding the data via exploratory data analysis (EDA) is arguably the most important aspect during model development, yet often overlooked. MVP provides some flexible tools to inspect and explore uploaded datasets quickly, with the goal to effortlessly:
This vignette is meant to introduce a workflow of using MVP to perform quick exploratory data analysis, which all takes place in the “Data Input” page. The reader is recommended to start MVP on a separate browser screen and follow the instructions on this page.
ID, DV, and TIME
columns should be present in the dataset. At minimum, the
ID column should be present to at least support
plotting in the Data Exploration pages on the right hand side of the
page.DV and
TIME, respectively, if using non-NONMEM formatted
datasets).DV column, per ID
and CMT (DV_CFB and DV_CFBPCT for
absolute and percentage CFB, respectively). If the EVID
column is present, the first instance where EVID == 0
(i.e. observation row) will be taken as the baseline value per
subject.💡 In general, the filters applied here should match with what eventually will be used in the NONMEM control stream files.
Quick summary statistics are now available on the “Summary
Statistics” tab on the right hand side of the page, derived by using
ID as a grouping variable. While summary of all variables
(each column) will be provided, obviously not all are relevant or
applicable, especially if a variable is a categorical (i.e. discrete)
variable. However, this is a useful functionality to review
summary statistics for continuous variables e.g. body weight or
renal function.
💡 There is a “Transpose Table” checkbox that will further aid
visualization of the results for datasets with a lot of columns.
Note: NCA functionality is currently only applicable for single ascending dose (SAD) studies or its equivalent where each subject will only receive one dose in a single compartment. If that’s not the case, skip this section.
💡 Individual results and/or all profiles can be downloaded by clicking on their respective buttons on the bottom right of the page. For information and details on the various settings, visit the NonCompart and ncar packages guide.
The General Plot provide a quick way to visualize multiple data types, including continuous/continuous data, continuous/discrete data (box plots), and discrete/discrete data (count plots).
TIME and DV columns automatically. For
non-NONMEM datasets, the user may need to adjust accordingly.facet_wrap(). To optimize visualization, there currently is
a hard limit of up to 30 unique combinations.💡 The “Quantize X-axis” option converts a continuous X-axis into discrete quantiles, and displays the results in a box plot with the quantile limits shown at the bottom. Note that this option retains all observations, as opposed to the “Box plot” option that only retains unique IDs.
💡 by default interactive plots are switched off for speed. Toggle the checkbox to allow interactive plotting, where hovering on each individual observation will display extra information, along with other useful features.
💡 Switch off Interactive Plot when using the “Color by” option to
ensure the box plots are dodged properly, as the plotly
package currently do not offer full support during conversion of a
ggplot object.
Count plots are considered a special case of box plot where the y-axis variable is either:
Count plots are triggered automatically when any of these two conditions are met when the Box Plot option is toggled. The size of the circle reflects the number of unique subjects belonging to that subset, which is also displayed in a text label.
💡 Currently if the “Color by” option is used, a known issue is that the circles would be stacked on top of each other. A workaround is to use the Interactive Plot option and hover over the circle to obtain count sizes of the “hidden” circles.
Most options in the “Ind. Plot” tab are carried over from the
“General Plot” tab, with the exception of the “Facet by” option, since
individual plots are always faceted by the ID column. Note
that smoothers and median lines are not relevant for individual plots so
they will also not be inserted.
EVID, ADDL, and II
columns, and inserts dosing lines for each subject. The height of the
dosing lines are scaled by their relative amount that is given by the
“Dose Column”, and each unique dose will be labeled as text. If the
RATE column is present, the dosing lines will be extended
accordingly to the infusion duration. An optional unit for the dose can
also be inserted. Dosing records (i.e. EVID == 1) must be
present in the filtered data for this option to work!*) on the plot, for further
visualization beyond the “Color by” option.EVID == 0 when an
EVID column is present), and missing values are ignored. If
the subject’s mean value is above/below X% of the group, the subject
will be considered an outlier.💡 To visualize and/or highlight BLQ values, make sure the built-in filter option to remove BLQ values on the left hand side of the page is unchecked (“Built-in Dataset Cleaning Options” box - click on the “+” icon to expand the box)!
💡 All individual profiles can be downloaded by clicking on the “Generate All Individuals” button which is located directly below the plot. Plot dimensions can be adjusted by expanding the “Download Options” box on the bottom right side of the page.
Correlation between variables can be quickly assessed in this tab,
using the GGally::ggpairs function (this requires the
optional ‘GGally’ package: install.packages("GGally")). It
is recommended to keep the number of variables <7 as the plot may
become too bunched up.
💡 Any variables with more than <=10 unique values are assumed to be categorical and converted into a factor for plotting.
Covariate distributions can be quickly evaluated in this tab to check for outliers. Note that columns of character type would be coerced into numerics to support plotting of histograms.
The Data Input page of MVP offers the ability to effortlessly review the data, assisting sanity checks and easily pinpoint outliers or potential errors. While this does not replace a more rigorous (i.e. scripted) EDA, the provided features serves as a great “first-pass” and should massively reduce turnaround time of queries back to data programmers.