Skip to contents

This example uses a PBPK model of dermal absorption to examine the influence of formulation-specific descriptors on the in vivo exposure of two UV filter compounds, octocrylene and oxybenzone, that differ in their physical and chemical properties, but which are dermally applied via a common vehicle (A-lotion).

Although octocrylene and oxybenzone are dermally applied via a common vehicle, their different physical and chemical properties result in different absorption profiles and different sensitivities in their respective plasma AUC to the formulation-specific parameters. This example corresponds to Supplementary Materials 5 of the accompanying publication (Najjar et al., 2024) and is implemented in the file examples/example-UV-filters.R in the installed package folder.

If you are new to the package, start with the Getting started article, which explains each of the building blocks used below.

Parameters analyzed

The sensitivity of the plasma AUC of each UV filter is evaluated with respect to four formulation-specific parameters:

Parameter Description Nominal Uncertainty
scale_factor_vehicle_evaporation (kevapfrmk_{evap}^{frm}) Scaling of volatile vehicle components’ evaporation rate 1 LogUniform(1/100, 100)
delta_trans (Δtrans\Delta_{trans}) Fold change in permeability across stratum corneum lipid bilayers 1 LogUniform(1/10, 10)
fraction_vehicle_volume_non_volatile (φnonvol\varphi_{non-vol}) Vehicle volume fraction that is non-volatile 0.5 Uniform(0.2, 0.8)
beta (β\beta) Vehicle/water partitioning to lipophilicity ratio 4.36 LogUniform(4.36/1.1, 4.36×1.1)

Loading the package and simulation

To run this example, load the OSP Global Sensitivity package and the UV filter simulation for either octocrylene or oxybenzone:

rm(list = ls())
# Load the OSP Global Sensitivity R package
library(ospsuite.globalsensitivity)

# Load octocrylene model simulation
simFilePath <- system.file("extdata", "octocrylene-gsa.pkml", package = "ospsuite.globalsensitivity")
sim <- loadSimulation(simFilePath)

# OR

# Load oxybenzone model simulation
simFilePath <- system.file("extdata", "oxybenzone-gsa.pkml", package = "ospsuite.globalsensitivity")
sim <- loadSimulation(simFilePath)

Specifying the input parameters

Specify the input parameters for which sensitivity is to be evaluated:

# Create a list of Parameter objects corresponding to parameters that exist in
# the octocrylene model.
parametersList <- list(
  SAParameter$new(simulation = sim,
                  path = "DERMAL_APPLICATION_AREA|vehicle|scale_factor_vehicle_evaporation",
                  displayName = "scale_factor_vehicle_evaporation",
                  unit = "",
                  parameterDistribution = LogUniformDistribution$new(minimum = 1e-2, maximum = 1e2)
  ),
  SAParameter$new(simulation = sim,
                  path = "DERMAL_APPLICATION_AREA|vehicle|delta_trans",
                  displayName = "delta_trans",
                  unit = ospUnits$Dimensionless$Unitless,
                  parameterDistribution = LogUniformDistribution$new(minimum = 1e-1, maximum = 1e1)
  ),
  SAParameter$new(simulation = sim,
                  path = "DERMAL_APPLICATION_AREA|vehicle|fraction_vehicle_volume_non_volatile",
                  displayName = "fraction_vehicle_volume_non_volatile",
                  unit = "",
                  parameterDistribution = UniformDistribution$new(minimum = 0.2, maximum = 0.8)
  ),
  SAParameter$new(simulation = sim,
                  path = "DERMAL_APPLICATION_AREA|vehicle|beta",
                  displayName = "beta"
  )
)

Specifying the model output

Define the output and its PK parameter, for which sensitivity is to be analyzed. Here the whole-body concentration of the permeant is analyzed, with the AUC up to the end of the simulation (AUC_tEnd) as the PK parameter of interest:

# Create an Output object corresponding to a simulated quantity that exists in
# the octocrylene model.
Y <- SAOutput$new(simulation = sim,
                  path = "DERMAL_APPLICATION_AREA|in_vivo_sink|permeant|whole_body_concentration",
                  displayName = "whole_body_concentration")
Y$addPKParameter(standardPKParameter = "AUC_tEnd")
outputList <- list(Y)

Running the sensitivity analyses

Run the one-at-a-time (local and uncertainty) analyses followed by the Morris, Sobol, and EFAST global sensitivity analyses:

# Run local sensitivity analysis and uncertainty analysis
su <- runSU(simulation = sim,
            customParameters = parametersList,
            outputs = outputList,
            evaluateForAllParameters = FALSE,
            # Sensitivity analysis parameters:
            variationRange = 0.2,
            numberOfSensitivityAnalysisSteps = 2,
            sensitivityThreshold = 0,
            # Uncertainty analysis parameters:
            runUncertaintyAnalysis = TRUE,
            numberOfUncertaintyAnalysisSamples = 100,
            quantiles = c(0.05, 0.25, 0.5, 0.75, 0.95),
            saveResults = TRUE, saveFolder = "folder/path", saveFileName = "SU-UVFilter.xlsx")

# Run Morris sensitivity analysis
morrisResults <- runMorris(simulation = sim,
                           parameters = parametersList,
                           outputs = outputList,
                           numberOfSamples = 100,
                           saveResults = TRUE, saveFolder = "folder/path", saveFileName = "morris-UVFilter.xlsx")

# Run Sobol sensitivity analysis
sobolResults <- runSobol(simulation = sim,
                         parameters = parametersList,
                         outputs = outputList,
                         numberOfSamples = 2000,
                         saveResults = TRUE, saveFolder = "folder/path", saveFileName = "sobol-UVFilter.xlsx")

# Run EFAST sensitivity analysis
efastResults <- runEFAST(simulation = sim,
                         parameters = parametersList,
                         outputs = outputList,
                         numberOfResamples = 1,
                         saveResults = TRUE, saveFolder = "folder/path", saveFileName = "efast-UVFilter.xlsx")

Before running the script, specify a valid saveFolder to which the Excel result files should be written.

Interpreting the results

For octocrylene, the proportion of the vehicle volume that is non-volatile (φnonvol\varphi_{non-vol}) is a key influencing parameter in both the OAT and GSA analyses since, if a large proportion of the vehicle evaporates, the UV filter could concentrate within a thin film on the skin surface, resulting in high flux into the stratum corneum. On the other hand, the vehicle volatility scaling (kevapfrmk_{evap}^{frm}) is of most influence on oxybenzone plasma AUC, as rapid evaporation of the vehicle results in rapid precipitation of the UV filter on the skin surface and reduced absorption.

The local sensitivity analysis suggests that the plasma AUC of both octocrylene and oxybenzone are strongly influenced by the parameter β\beta. However, the uncertainty analysis shows that when the influence of each parameter is examined over its entire range, β\beta has a relatively small influence. This relatively low overall impact of β\beta is also observed in the results of the three GSA methods. This contrast illustrates how global methods can identify influential parameters that may be over- or under-emphasized by a local sensitivity analysis alone.

The plots of the results may be generated using generateTornadoPlot(), generateMorrisPlot(), generateSobolBarGraph(), and generateEFASTBarGraph(), as described in the Getting started article.