Non-Compartmental Analysis (NCA)

NCA in Pumas is conducted in the following steps:

  1. Read source data (.csv, .xlxs, .xpt, sas7bdata)
  2. Create a NCAPopulation by mapping variables from source data to Pumas-NCA data format - PumasNCADF
  3. Exploratory data analysis
  4. Run NCA analysis
  5. Generate report

Pumas also provides a convenient way to perform NCA analysis within the model as well, this is discussed in the Model integrated NCA section.

Read Source Data

The Pumas-NCA data format - PumasNCADF provides the specification requirements of the source data. Currently, several file formats can be read in for analysis:

  • .csv (CSV package)
  • .xslx (XSLX package)
  • .sas7bdat / .xpt (ReadStatTables package)
  • .arrow (Arrow package)

For this introduction we'll use the PharmaDatasets package and the po_sad_1 dataset:

using PharmaDatasets

pkdata = dataset("po_sad_1")
first(pkdata, 6)
6×14 DataFrame
RowidtimedvamtevidcmtrateagewtdoselevelisPMisfedsexroute
Int64Float64Float64?Float64?Int64Int64?Float64Int64Int64Int64String3String3String7String3
110.0missing30.0110.0517430noyesmaleev
210.2535.7636missing0missing0.0517430noyesmaleev
310.571.9551missing0missing0.0517430noyesmaleev
410.7597.3356missing0missing0.0517430noyesmaleev
511.0128.919missing0missing0.0517430noyesmaleev
612.0155.85missing0missing0.0517430noyesmaleev

Create a NCAPopulation

The generated DataFrame object now needs to be mapped to the requirements of Pumas NCA package. Mapping is done using the read_nca function that is described in detail later. An example for read_nca is the following:

using NCA
ncapop = read_nca(pkdata; observations = :dv, group = [:doselevel])
NCAPopulation (18 subjects):
  Group: [["doselevel" => 30], ["doselevel" => 60], ["doselevel" => 90]]
  Number of missing observations: 18
  Number of blq observations: 0

Mapping a DataFrame to the Pumas NCA package requirements using read_nca generates an object called NCAPopulation, which is collection of NCASubject's, i.e., ncapop is of type NCAPopulation.

Exploratory Data Analysis

Exploratory analysis of the NCAPopulation can be performed using the built-in plotting ecosystem. The NCA subsection of the Plotting section provides more details, but here are some example syntax and the corresponding plots.

Observations-time plots

We can produce a plot of the concentration against time using observations_vs_time. The plotting recipes for NCA analyses are fund in the NCAUtilities package. Below is the code for generating this plot for the first subject found using ncapop[1]:

using NCAUtilities
observations_vs_time(
    ncapop[1];
    axis = (; xlabel = "Time (hours)", ylabel = "CTM Concentration (mg L⁻¹)"),
)
Example block output

We can also use log-scale for the concentrations such that exponential decay shows as a straight line. Below is the code to set the y-scale to use the natural logarithm:

observations_vs_time(
    ncapop[1];
    axis = (; xlabel = "Time (hours)", ylabel = "CTM Concentration (mg L⁻¹)", yscale = log),
)
Example block output

Other options are yscale = log10 and yscale = log2 for a base-10 and base-2 logarithm.

To generate these plots side-by-side we have to create a Figure-object first, and then pass fig[row,column] as the first argument. row specifies which row of the figure the element should be added to and column specifies the column number.

using CairoMakie
fig = Figure()
observations_vs_time(
    fig[1, 1],
    ncapop[1];
    axis = (; xlabel = "Time (hours)", ylabel = "CTM Concentration (mg L⁻¹)"),
)
observations_vs_time(
    fig[1, 2],
    ncapop[1];
    axis = (; xlabel = "Time (hours)", ylabel = "CTM Concentration (mg L⁻¹)", yscale = log),
)
fig
Example block output

Summary plots

We can also group all the subjects into a single summarizing plot of the concentration against time using summary_observations_vs_time:

summary_observations_vs_time(
    ncapop;
    axis = (; xlabel = "Time (hours)", ylabel = "CTM Concentration (mg L⁻¹)"),
)
Example block output

Subject fit plots

We can also check all the subject fits with:

subject_fits(ncapop; axis = (; yscale = log), rows = 3, columns = 3)
Example block output

Run Analysis

The NCAPopulation object is the processed version of the DataFrame that is amenable for a complete NCA analysis via run_nca or individual parameter results through a collection of functions described in the NCA Function List. Example syntax to perform a complete NCA analysis is below:

using Dates

pk_nca = run_nca(
    ncapop;
    sigdigits = 3,
    studyid = "STUDY-001",
    studytitle = "Phase 1 SAD of Drug Y",
    author = [("Mary Jane", "Pumas-AI"), ("Joe Smith", "Pumas-AI")],
    sponsor = "PumasAI",
    date = Dates.now(),
    conclabel = "CTMX Concentration (mg/L)",
    grouplabels = ["Dose (mg)"],
    timelabel = "Time (Hr)",
    versionnumber = v"0.1",
)

The result of a complete NCA analysis using run_nca is an object called NCAReport, i.e., pk_nca is of type NCAReport. This object carries the result of the analysis in a DataFrame called reportdf and corresponding metadata information that are used for post-processing the results.

Summarize results

The per subject results in the DataFrame component of NCAReport, reportdf, can be summarized using the summarize function:

parms = [:cmax, :aucinf_obs]
summary_output = summarize(pk_nca.reportdf; parameters = parms)
2×9 DataFrame
RowparametersnumsamplesminimummaximummeanstdgeomeangeostdgeomeanCV
StringInt64Float64Float64Float64Float64Float64Float64Float64
1cmax18142.02230.0696.0493.824567.0571.9499774.9677
2aucinf_obs185600.075400.026070.021122.418866.52.32614101.954

The summary_output generated above is of type DataFrame.

Plot results

We can use several plotting functions from NCAUtilities package for the results of run_nca.

The NCA subsection of the Plotting section provides more details, but here are some example syntax and the corresponding plots.

Subject fits

subject_fits(pk_nca; columns = 2, rows = 3)
Example block output

Parameter distributions

parameters_dist(pk_nca; parameter = :aucinf_obs, rows = 3, columns = 1)
Example block output

Parameter distribution by groups (ID or covariates)

parameters_vs_group(pk_nca; parameter = :aucinf_obs)
Example block output

Generate Report

The report function takes in either a NCAPopulation or a NCAReport object to generate a comprehensive, currently only PDF, report. This generated PDF file has all the necessary information including tables, listings and figures that are required for NCA analysis. Example syntax:

report(pk_nca; output = "my_nca_report", title = "report")
[ Info: Generating Tables
[ Info: Generating Plots
┌ Warning: Could not create plot.
  error =
   MethodError: convert_single_argument(::Vector{Missing}) is ambiguous.

   Candidates:
     convert_single_argument(a::AbstractArray{<:Union{Missing, var"#s856"} where var"#s856"<:GeometryBasics.Point{N, PT}}) where {N, PT}
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/conversions.jl:45
     convert_single_argument(a::AbstractArray{<:Union{Missing, var"#s856"} where var"#s856"<:Real})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/conversions.jl:40

   Possible fix, define
     convert_single_argument(::AbstractArray{<:Missing})

  func = parameters_dist (generic function with 4 methods)
  backtrace =

   Stacktrace:
     [1] convert_single_argument(a::Vector{Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/conversions.jl:52
     [2] map
       @ ./tuple.jl:291 [inlined]
     [3] convert_arguments(T::Type{MakieCore.Plot{Makie.hist}}, args::Vector{Any}; kw::@Kwargs{})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/conversions.jl:20
     [4] convert_arguments(T::Type{MakieCore.Plot{Makie.hist}}, args::Vector{Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/conversions.jl:14
     [5] conversion_pipeline(P::Type{MakieCore.Plot{Makie.hist}}, used_attrs::Tuple{}, args::Tuple{Vector{Any}}, kw_obs::Observables.Observable{Vector{Pair{Symbol, Any}}}, args_obs::Tuple{Observables.Observable{Any}}, user_attributes::Dict{Symbol, Any}, deregister::Vector{Observables.ObserverFunction}, recursion::Int64)
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:227
     [6] conversion_pipeline(P::Type{MakieCore.Plot{Makie.hist}}, used_attrs::Tuple{}, args::Tuple{Vector{Any}}, kw_obs::Observables.Observable{Vector{Pair{Symbol, Any}}}, args_obs::Tuple{Observables.Observable{Any}}, user_attributes::Dict{Symbol, Any}, deregister::Vector{Observables.ObserverFunction})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:218
     [7] (MakieCore.Plot{Makie.hist})(user_args::Tuple{Vector{Any}}, user_attributes::Dict{Symbol, Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:278
     [8] _create_plot!(F::Function, attributes::Dict{Symbol, Any}, scene::MakieCore.Plot{NCAUtilities.parameters_dist, Tuple{NCAReport}}, args::Vector{Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/figureplotting.jl:390
     [9] hist!(::MakieCore.Plot{NCAUtilities.parameters_dist, Tuple{NCAReport}}, ::Vararg{Any}; kw::@Kwargs{label::String, color::Observables.Observable{Any}, strokecolor::Observables.Observable{Any}, strokewidth::Observables.Observable{Any}, cycle::Observables.Observable{Any}})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/MakieCore/NeQjl/src/recipes.jl:453
    [10] plot!(pg::MakieCore.Plot{NCAUtilities.parameters_dist, Tuple{NCAReport}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:67
    [11] connect_plot!(parent::Makie.Scene, plot::MakieCore.Plot{NCAUtilities.parameters_dist, Tuple{NCAReport}})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:395
    [12] plot!
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:412 [inlined]
    [13] plot!(ax::Makie.Axis, plot::MakieCore.Plot{NCAUtilities.parameters_dist, Tuple{NCAReport}})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/figureplotting.jl:412
    [14] _create_plot!(::Function, ::Dict{Symbol, Any}, ::Makie.Axis, ::MakieCore.Attributes, ::Vararg{Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/figureplotting.jl:381
    [15] parameters_dist!(::Makie.Axis, ::Vararg{Any}; kw::@Kwargs{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}, group::Vector{Pair{String, Any}}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/MakieCore/NeQjl/src/recipes.jl:189
    [16] parameters_dist(fig::GridLayoutBase.GridPosition, report::NCAReport; axis::@NamedTuple{}, keywords::@Kwargs{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}, group::Vector{Pair{String, Any}}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:94
    [17] parameters_dist
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:79 [inlined]
    [18] #62
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:114 [inlined]
    [19] (::PlottingUtilities.var"#11#12"{@Kwargs{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}}, NCAUtilities.var"#62#65"{@NamedTuple{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}}, @NamedTuple{}, NCAReport}, Makie.Figure, SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}})()
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:137
    [20] _with_updates_suspended(f::PlottingUtilities.var"#11#12"{@Kwargs{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}}, NCAUtilities.var"#62#65"{@NamedTuple{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}}, @NamedTuple{}, NCAReport}, Makie.Figure, SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}}, fig::Makie.Figure; update::Bool)
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:189
    [21] _with_updates_suspended(f::Function, fig::Makie.Figure)
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:185
    [22] #facet#10
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:129 [inlined]
    [23] facet
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:128 [inlined]
    [24] (::NCAUtilities.var"#61#64"{@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, @NamedTuple{}, NCAReport})(keywords::@NamedTuple{paginate::Bool, parameter::Symbol, groups::SubArray{Vector{Pair{String, Any}}, 1, Vector{Vector{Pair{String, Any}}}, Tuple{UnitRange{Int64}}, true}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:113
    [25] pagination(func::NCAUtilities.var"#61#64"{@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, @NamedTuple{}, NCAReport}, keywords::@Kwargs{paginate::Bool, parameter::Symbol}; limit::Int64, vars::@Kwargs{groups::Vector{Vector{Pair{String, Any}}}})
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:107
    [26] parameters_dist(report::NCAReport; figure::@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, axis::@NamedTuple{}, keywords::@Kwargs{paginate::Bool, parameter::Symbol})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:106
    [27] parameters_dist
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_dist.jl:98 [inlined]
    [28] (::NCAUtilities.var"#171#178"{NCAUtilities.var"#171#172#179"{typeof(parameters_dist), Int64, Tuple{Int64, Int64}}})(args::NCAReport; kws::@Kwargs{parameter::Symbol})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:141
    [29] report(r::NCAReport, summary::DataFrame; output::String, force::Bool, clean::Bool, header::String, footer::String, plot_fontsize::Int64, plot_resolution::Tuple{Int64, Int64}, section_order::Vector{String}, plot_styles::NCAUtilities.PlotStyles, kws::@Kwargs{title::String})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:171
    [30] top-level scope
       @ introduction.md:208
    [31] eval
       @ ./boot.jl:385 [inlined]
    [32] #60
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:754 [inlined]
    [33] cd(f::Documenter.var"#60#62"{Module, Expr}, dir::String)
       @ Base.Filesystem ./file.jl:112
    [34] (::Documenter.var"#59#61"{Documenter.Page, Module, Expr})()
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:753
    [35] (::IOCapture.var"#5#9"{DataType, Documenter.var"#59#61"{Documenter.Page, Module, Expr}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}})()
       @ IOCapture ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/IOCapture/Y5rEA/src/IOCapture.jl:170
    [36] with_logstate(f::Function, logstate::Any)
       @ Base.CoreLogging ./logging.jl:515
    [37] with_logger
       @ ./logging.jl:627 [inlined]
    [38] capture(f::Documenter.var"#59#61"{Documenter.Page, Module, Expr}; rethrow::Type, color::Bool, passthrough::Bool, capture_buffer::IOBuffer, io_context::Vector{Any})
       @ IOCapture ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/IOCapture/Y5rEA/src/IOCapture.jl:167
    [39] runner(::Type{Documenter.Expanders.ExampleBlocks}, node::MarkdownAST.Node{Nothing}, page::Documenter.Page, doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:752
    [40] dispatch(::Type{Documenter.Expanders.ExpanderPipeline}, ::MarkdownAST.Node{Nothing}, ::Vararg{Any})
       @ Documenter.Selectors ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/utilities/Selectors.jl:170
    [41] expand(doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:22
    [42] runner(::Type{Documenter.Builder.ExpandTemplates}, doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/builder_pipeline.jl:222
    [43] dispatch(::Type{Documenter.Builder.DocumentPipeline}, x::Documenter.Document)
       @ Documenter.Selectors ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/utilities/Selectors.jl:170
    [44] #89
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:272 [inlined]
    [45] withenv(::Documenter.var"#89#91"{Documenter.Document}, ::Pair{String, Nothing}, ::Vararg{Pair{String, Nothing}})
       @ Base ./env.jl:257
    [46] #88
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:271 [inlined]
    [47] cd(f::Documenter.var"#88#90"{Documenter.Document}, dir::String)
       @ Base.Filesystem ./file.jl:112
    [48] makedocs(; debug::Bool, format::Documenter.HTMLWriter.HTML, kwargs::@Kwargs{plugins::Vector{CitationBibliography}, modules::Vector{Module}, doctest::Bool, warnonly::Vector{Symbol}, clean::Bool, draft::Bool, linkcheck::Bool, linkcheck_timeout::Int64, linkcheck_ignore::Vector{Regex}, sitename::String, authors::String, remotes::Nothing, pages::Vector{Any}})
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:271
    [49] top-level scope
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/docs/make.jl:76
    [50] include(mod::Module, _path::String)
       @ Base ./Base.jl:495
    [51] exec_options(opts::Base.JLOptions)
       @ Base ./client.jl:318
@ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:151
┌ Warning: Could not create plot.
  error = ArgumentError: cannot convert a value to Union{} for assignment
  func = parameters_vs_group (generic function with 4 methods)
  backtrace =

   Stacktrace:
     [1] convert(T::Type{Union{}}, x::Missing)
       @ Base ./essentials.jl:315
     [2] setindex!(A::Vector{Union{}}, x::Missing, i1::Int64)
       @ Base ./array.jl:1021
     [3] _unsafe_copyto!(dest::Vector{Union{}}, doffs::Int64, src::Vector{Missing}, soffs::Int64, n::Int64)
       @ Base ./array.jl:299
     [4] unsafe_copyto!
       @ ./array.jl:353 [inlined]
     [5] _copyto_impl!
       @ ./array.jl:376 [inlined]
     [6] copyto!
       @ ./array.jl:363 [inlined]
     [7] copyto!
       @ ./array.jl:385 [inlined]
     [8] _collect
       @ ./array.jl:696 [inlined]
     [9] collect
       @ ./array.jl:694 [inlined]
    [10] (CategoricalArrays.CategoricalVector{Missing, UInt32})(::UndefInitializer, dims::Tuple{Int64}; levels::Vector{Missing}, ordered::Bool)
       @ CategoricalArrays ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:164
    [11] CategoricalArray
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:157 [inlined]
    [12] _convert(::Type{CategoricalArrays.CategoricalVector{Missing, UInt32}}, A::Vector{Missing}; levels::Vector{Missing})
       @ CategoricalArrays ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:358
    [13] _convert
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:354 [inlined]
    [14] #_#34
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:253 [inlined]
    [15] CategoricalArray
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:249 [inlined]
    [16] CategoricalArray
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:258 [inlined]
    [17] #CategoricalVector#38
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/CategoricalArrays/0yLZN/src/array.jl:271 [inlined]
    [18] (::PlottingUtilities.var"#func#72"{PlottingUtilities.var"#func#66#73"{typeof(Makie.violin!)}})(plot::MakieCore.Plot{NCAUtilities.parameters_vs_group, Tuple{NCAReport}}, xs::CategoricalArrays.CategoricalVector{Int64, UInt32, Int64, CategoricalArrays.CategoricalValue{Int64, UInt32}, Union{}}, ys::Vector{Missing}; kws::@Kwargs{color::Observables.Observable{Any}, cycle::Observables.Observable{Any}})
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:1244
    [19] plot!(pg::MakieCore.Plot{NCAUtilities.parameters_vs_group, Tuple{NCAReport}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:59
    [20] connect_plot!(parent::Makie.Scene, plot::MakieCore.Plot{NCAUtilities.parameters_vs_group, Tuple{NCAReport}})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:395
    [21] plot!
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/interfaces.jl:412 [inlined]
    [22] plot!(ax::Makie.Axis, plot::MakieCore.Plot{NCAUtilities.parameters_vs_group, Tuple{NCAReport}})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/figureplotting.jl:412
    [23] _create_plot!(::Function, ::Dict{Symbol, Any}, ::Makie.Axis, ::MakieCore.Attributes, ::Vararg{Any})
       @ Makie ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Makie/6c4lt/src/figureplotting.jl:381
    [24] parameters_vs_group!(::Makie.Axis, ::Vararg{Any}; kw::@Kwargs{paginate::Bool, parameter::Symbol, group::String})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/MakieCore/NeQjl/src/recipes.jl:189
    [25] parameters_vs_group(fig::GridLayoutBase.GridPosition, report::NCAReport; axis::@NamedTuple{}, keywords::@Kwargs{paginate::Bool, parameter::Symbol, group::String})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:82
    [26] (::NCAUtilities.var"#77#85"{@NamedTuple{paginate::Bool, parameter::SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true}}, @NamedTuple{}, NCAReport})(figpos::GridLayoutBase.GridPosition, parameter::Symbol)
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:122
    [27] (::PlottingUtilities.var"#11#12"{@Kwargs{}, NCAUtilities.var"#77#85"{@NamedTuple{paginate::Bool, parameter::SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true}}, @NamedTuple{}, NCAReport}, Makie.Figure, SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true}})()
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:137
    [28] #_with_updates_suspended#19
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:189 [inlined]
    [29] _with_updates_suspended
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:185 [inlined]
    [30] #facet#10
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:129 [inlined]
    [31] facet
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:128 [inlined]
    [32] (::NCAUtilities.var"#76#84"{@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, @NamedTuple{}, NCAReport})(keywords::@NamedTuple{paginate::Bool, parameter::SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true}})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:121
    [33] pagination(func::NCAUtilities.var"#76#84"{@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, @NamedTuple{}, NCAReport}, keywords::@Kwargs{paginate::Bool, parameter::Symbol}; limit::Int64, vars::@Kwargs{parameter::Vector{Symbol}})
       @ PlottingUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/PlottingUtilities/hLMMc/src/convert.jl:107
    [34] parameters_vs_group(report::NCAReport; figure::@NamedTuple{fontsize::Int64, size::Tuple{Int64, Int64}}, axis::@NamedTuple{}, keywords::@Kwargs{paginate::Bool, parameter::Symbol})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:119
    [35] parameters_vs_group
       @ ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/recipes/parameters_vs_group.jl:89 [inlined]
    [36] (::NCAUtilities.var"#171#178"{NCAUtilities.var"#171#172#179"{typeof(parameters_vs_group), Int64, Tuple{Int64, Int64}}})(args::NCAReport; kws::@Kwargs{parameter::Symbol})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:141
    [37] report(r::NCAReport, summary::DataFrame; output::String, force::Bool, clean::Bool, header::String, footer::String, plot_fontsize::Int64, plot_resolution::Tuple{Int64, Int64}, section_order::Vector{String}, plot_styles::NCAUtilities.PlotStyles, kws::@Kwargs{title::String})
       @ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:178
    [38] top-level scope
       @ introduction.md:208
    [39] eval
       @ ./boot.jl:385 [inlined]
    [40] #60
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:754 [inlined]
    [41] cd(f::Documenter.var"#60#62"{Module, Expr}, dir::String)
       @ Base.Filesystem ./file.jl:112
    [42] (::Documenter.var"#59#61"{Documenter.Page, Module, Expr})()
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:753
    [43] (::IOCapture.var"#5#9"{DataType, Documenter.var"#59#61"{Documenter.Page, Module, Expr}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}, IOContext{Base.PipeEndpoint}})()
       @ IOCapture ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/IOCapture/Y5rEA/src/IOCapture.jl:170
    [44] with_logstate(f::Function, logstate::Any)
       @ Base.CoreLogging ./logging.jl:515
    [45] with_logger
       @ ./logging.jl:627 [inlined]
    [46] capture(f::Documenter.var"#59#61"{Documenter.Page, Module, Expr}; rethrow::Type, color::Bool, passthrough::Bool, capture_buffer::IOBuffer, io_context::Vector{Any})
       @ IOCapture ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/IOCapture/Y5rEA/src/IOCapture.jl:167
    [47] runner(::Type{Documenter.Expanders.ExampleBlocks}, node::MarkdownAST.Node{Nothing}, page::Documenter.Page, doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:752
    [48] dispatch(::Type{Documenter.Expanders.ExpanderPipeline}, ::MarkdownAST.Node{Nothing}, ::Vararg{Any})
       @ Documenter.Selectors ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/utilities/Selectors.jl:170
    [49] expand(doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/expander_pipeline.jl:22
    [50] runner(::Type{Documenter.Builder.ExpandTemplates}, doc::Documenter.Document)
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/builder_pipeline.jl:222
    [51] dispatch(::Type{Documenter.Builder.DocumentPipeline}, x::Documenter.Document)
       @ Documenter.Selectors ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/utilities/Selectors.jl:170
    [52] #89
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:272 [inlined]
    [53] withenv(::Documenter.var"#89#91"{Documenter.Document}, ::Pair{String, Nothing}, ::Vararg{Pair{String, Nothing}})
       @ Base ./env.jl:257
    [54] #88
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:271 [inlined]
    [55] cd(f::Documenter.var"#88#90"{Documenter.Document}, dir::String)
       @ Base.Filesystem ./file.jl:112
    [56] makedocs(; debug::Bool, format::Documenter.HTMLWriter.HTML, kwargs::@Kwargs{plugins::Vector{CitationBibliography}, modules::Vector{Module}, doctest::Bool, warnonly::Vector{Symbol}, clean::Bool, draft::Bool, linkcheck::Bool, linkcheck_timeout::Int64, linkcheck_ignore::Vector{Regex}, sitename::String, authors::String, remotes::Nothing, pages::Vector{Any}})
       @ Documenter ~/_work/PumasDocs.jl/PumasDocs.jl/sysimage_directory/julia_depot/packages/Documenter/C1XEF/src/makedocs.jl:271
    [57] top-level scope
       @ ~/_work/PumasDocs.jl/PumasDocs.jl/docs/make.jl:76
    [58] include(mod::Module, _path::String)
       @ Base ./Base.jl:495
    [59] exec_options(opts::Base.JLOptions)
       @ Base ./client.jl:318
@ NCAUtilities ~/_work/PumasSystemImages/PumasSystemImages/julia_depot/packages/NCAUtilities/eg4Er/src/reports/reports.jl:151
[ Info: Gathering System Information
[ Info: Ordering Report Sections

You can view the report generated here.