This is just a very simple vignette showing how to fit a degradation model for a parent compound with one transformation product using mkin. After loading the library we look at the data. We have observed concentrations in the column named value at the times specified in column time for the two observed variables named parent and m1.

library(mkin, quietly = TRUE)
print(FOCUS_2006_D)
##      name time  value
## 1  parent    0  99.46
## 2  parent    0 102.04
## 3  parent    1  93.50
## 4  parent    1  92.50
## 5  parent    3  63.23
## 6  parent    3  68.99
## 7  parent    7  52.32
## 8  parent    7  55.13
## 9  parent   14  27.27
## 10 parent   14  26.64
## 11 parent   21  11.50
## 12 parent   21  11.64
## 13 parent   35   2.85
## 14 parent   35   2.91
## 15 parent   50   0.69
## 16 parent   50   0.63
## 17 parent   75   0.05
## 18 parent   75   0.06
## 19 parent  100     NA
## 20 parent  100     NA
## 21 parent  120     NA
## 22 parent  120     NA
## 23     m1    0   0.00
## 24     m1    0   0.00
## 25     m1    1   4.84
## 26     m1    1   5.64
## 27     m1    3  12.91
## 28     m1    3  12.96
## 29     m1    7  22.97
## 30     m1    7  24.47
## 31     m1   14  41.69
## 32     m1   14  33.21
## 33     m1   21  44.37
## 34     m1   21  46.44
## 35     m1   35  41.22
## 36     m1   35  37.95
## 37     m1   50  41.19
## 38     m1   50  40.01
## 39     m1   75  40.09
## 40     m1   75  33.85
## 41     m1  100  31.04
## 42     m1  100  33.13
## 43     m1  120  25.15
## 44     m1  120  33.31

Next we specify the degradation model: The parent compound degrades with simple first-order kinetics (SFO) to one metabolite named m1, which also degrades with SFO kinetics.

The call to mkinmod returns a degradation model. The differential equations represented in R code can be found in the character vector $diffs of the mkinmod object. If a C compiler (gcc) is installed and functional, the differential equation model will be compiled from auto-generated C code.

SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))
## Temporary DLL for differentials generated and loaded
print(SFO_SFO$diffs)
##                                                    parent 
##                          "d_parent = - k_parent * parent" 
##                                                        m1 
## "d_m1 = + f_parent_to_m1 * k_parent * parent - k_m1 * m1"

We do the fitting without progress report (quiet = TRUE).

fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)
## Warning in mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE): Observations with
## value of zero were removed from the data

A plot of the fit including a residual plot for both observed variables is obtained using the plot_sep method for mkinfit objects, which shows separate graphs for all compounds and their residuals.

plot_sep(fit, lpos = c("topright", "bottomright"))

Confidence intervals for the parameter estimates are obtained using the mkinparplot function.

mkinparplot(fit)

A comprehensive report of the results is obtained using the summary method for mkinfit objects.

summary(fit)
## mkin version used for fitting:    1.2.6 
## R version used for fitting:       4.3.1 
## Date of fit:     Fri Oct 13 16:46:10 2023 
## Date of summary: Fri Oct 13 16:46:10 2023 
## 
## Equations:
## d_parent/dt = - k_parent * parent
## d_m1/dt = + f_parent_to_m1 * k_parent * parent - k_m1 * m1
## 
## Model predictions using solution type analytical 
## 
## Fitted using 401 model solutions performed in 0.053 s
## 
## Error model: Constant variance 
## 
## Error model algorithm: OLS 
## 
## Starting values for parameters to be optimised:
##                   value   type
## parent_0       100.7500  state
## k_parent         0.1000 deparm
## k_m1             0.1001 deparm
## f_parent_to_m1   0.5000 deparm
## 
## Starting values for the transformed parameters actually optimised:
##                      value lower upper
## parent_0        100.750000  -Inf   Inf
## log_k_parent     -2.302585  -Inf   Inf
## log_k_m1         -2.301586  -Inf   Inf
## f_parent_qlogis   0.000000  -Inf   Inf
## 
## Fixed parameter values:
##      value  type
## m1_0     0 state
## 
## 
## Warning(s): 
## Observations with value of zero were removed from the data
## 
## Results:
## 
##        AIC      BIC    logLik
##   204.4486 212.6365 -97.22429
## 
## Optimised, transformed parameters with symmetric confidence intervals:
##                 Estimate Std. Error   Lower    Upper
## parent_0        99.60000    1.57000 96.4000 102.8000
## log_k_parent    -2.31600    0.04087 -2.3990  -2.2330
## log_k_m1        -5.24700    0.13320 -5.5180  -4.9770
## f_parent_qlogis  0.05792    0.08926 -0.1237   0.2395
## sigma            3.12600    0.35850  2.3960   3.8550
## 
## Parameter correlation:
##                   parent_0 log_k_parent   log_k_m1 f_parent_qlogis      sigma
## parent_0         1.000e+00    5.174e-01 -1.688e-01      -5.471e-01 -1.172e-06
## log_k_parent     5.174e-01    1.000e+00 -3.263e-01      -5.426e-01 -8.479e-07
## log_k_m1        -1.688e-01   -3.263e-01  1.000e+00       7.478e-01  8.211e-07
## f_parent_qlogis -5.471e-01   -5.426e-01  7.478e-01       1.000e+00  1.305e-06
## sigma           -1.172e-06   -8.479e-07  8.211e-07       1.305e-06  1.000e+00
## 
## Backtransformed parameters:
## Confidence intervals for internally transformed parameters are asymmetric.
## t-test (unrealistically) based on the assumption of normal distribution
## for estimators of untransformed parameters.
##                 Estimate t value    Pr(>t)     Lower     Upper
## parent_0       99.600000  63.430 2.298e-36 96.400000 1.028e+02
## k_parent        0.098700  24.470 4.955e-23  0.090820 1.073e-01
## k_m1            0.005261   7.510 6.165e-09  0.004012 6.898e-03
## f_parent_to_m1  0.514500  23.070 3.104e-22  0.469100 5.596e-01
## sigma           3.126000   8.718 2.235e-10  2.396000 3.855e+00
## 
## FOCUS Chi2 error levels in percent:
##          err.min n.optim df
## All data   6.398       4 15
## parent     6.459       2  7
## m1         4.690       2  8
## 
## Resulting formation fractions:
##                 ff
## parent_m1   0.5145
## parent_sink 0.4855
## 
## Estimated disappearance times:
##           DT50   DT90
## parent   7.023  23.33
## m1     131.761 437.70
## 
## Data:
##  time variable observed predicted   residual
##     0   parent    99.46  99.59848 -1.385e-01
##     0   parent   102.04  99.59848  2.442e+00
##     1   parent    93.50  90.23787  3.262e+00
##     1   parent    92.50  90.23787  2.262e+00
##     3   parent    63.23  74.07319 -1.084e+01
##     3   parent    68.99  74.07319 -5.083e+00
##     7   parent    52.32  49.91207  2.408e+00
##     7   parent    55.13  49.91207  5.218e+00
##    14   parent    27.27  25.01258  2.257e+00
##    14   parent    26.64  25.01258  1.627e+00
##    21   parent    11.50  12.53462 -1.035e+00
##    21   parent    11.64  12.53462 -8.946e-01
##    35   parent     2.85   3.14787 -2.979e-01
##    35   parent     2.91   3.14787 -2.379e-01
##    50   parent     0.69   0.71624 -2.624e-02
##    50   parent     0.63   0.71624 -8.624e-02
##    75   parent     0.05   0.06074 -1.074e-02
##    75   parent     0.06   0.06074 -7.382e-04
##     1       m1     4.84   4.80296  3.704e-02
##     1       m1     5.64   4.80296  8.370e-01
##     3       m1    12.91  13.02400 -1.140e-01
##     3       m1    12.96  13.02400 -6.400e-02
##     7       m1    22.97  25.04476 -2.075e+00
##     7       m1    24.47  25.04476 -5.748e-01
##    14       m1    41.69  36.69003  5.000e+00
##    14       m1    33.21  36.69003 -3.480e+00
##    21       m1    44.37  41.65310  2.717e+00
##    21       m1    46.44  41.65310  4.787e+00
##    35       m1    41.22  43.31313 -2.093e+00
##    35       m1    37.95  43.31313 -5.363e+00
##    50       m1    41.19  41.21832 -2.832e-02
##    50       m1    40.01  41.21832 -1.208e+00
##    75       m1    40.09  36.44704  3.643e+00
##    75       m1    33.85  36.44704 -2.597e+00
##   100       m1    31.04  31.98162 -9.416e-01
##   100       m1    33.13  31.98162  1.148e+00
##   120       m1    25.15  28.78984 -3.640e+00
##   120       m1    33.31  28.78984  4.520e+00