Noisy & Sparse Data

The Getting started example uses dense, noise-free simulated data. This guide applies realistic measurement noise (5% proportional CV + additive component) and sparse clinical sampling (15 PK timepoints) to verify that the IVIVC pipeline degrades gracefully under conditions typical of bioanalytical LC-MS/MS assays.

Key design choices that mirror real practice:

  • Sparse PK sampling: 15 timepoints (dense around absorption, sparse in the terminal phase)
  • Dissolution every 1 h: 49 timepoints (standard for automated dissolution baths)
  • IV data stays clean: numerical deconvolution is sensitive to IV noise with sparse data
  • Dissolution stays clean: matching real IVIVC workflows where dissolution is measured precisely in vitro

Simulated data

first(pk_df, 8)
8×4 DataFrame
Rowidformulationtimeconc
Int64StringFloat64Float64
11FormA0.00.00888018
21FormA0.50.261667
31FormA1.00.871849
41FormA2.01.99015
51FormA4.03.82135
61FormA6.04.17208
71FormA8.03.60427
81FormA12.01.88451
first(diss_df, 8)
8×3 DataFrame
Rowformulationtimediss
StringFloat64Float64
1FormA0.00.0
2FormA1.00.117503
3FormA2.00.297811
4FormA3.00.477703
5FormA4.00.632121
6FormA5.00.752796
7FormA6.00.840724
8FormA7.00.901237

Running the pipeline

The run_ivivc call is identical to the Getting started example — the pipeline handles noisy, sparse data without any special flags.

result = run_ivivc(
    pk_df,
    diss_df;
    fast_formulation = "IV",
    validation_formulation = "FormB",
    times = collect(range(0.0, 48.0, length = 101)),
);

Model parameters

coeftable(result.model)
4×3 DataFrame
Rowparameterconstantestimate
SymbolBoolFloat64
1abs_scalefalse0.993701
2abs_interceptfalse-0.00097586
3time_scalefalse0.82112
4time_shiftfalse-0.0110936

Plots

concentration_profiles(result)
Example block output
dissolution_profiles(result)
Example block output
absorption_profiles(result)
Example block output
levy_plot(result)
Example block output
ivivc_correlation(result)
Example block output