Compute coefficients v0, tempt and kappa of a mixed model fit to a linexp function with one grouping variable
Arguments
- d
A data frame with columns
recordRecord descriptor as grouping variable, e.g. patient IDminuteTime after meal or start of recording.volVolume of meal or stomach
- pnlsTol
The value of pnlsTol at the initial iteration. See
nlmeControlWhen the model does not converge,pnlsTolis multiplied by 5 and the iteration repeated until convergence orpnlsTol >= 0.5. The effective value ofpnlsTolis returned in a separate list item. When it is known that a data set converges badly, it is recommended to set the initialpnlsTolto a higher value, but below 0.5, for faster convergence.- model
linexp(default) orpowexp- variant
For both models, there are 3 variants
variant = 1The most generic version with independent estimates of all three parameters per record (random = v0 + tempt + kappa ~ 1 | record). The most likely to fail for degenerate cases. If this variant converges, use it.variant = 2Diagonal random effects (random = pdDiag(v0 + tempt + kappa) ~ 1; groups = ~record). Better convergence in critical cases. Note: I never found out why I have to use thegroupsparameter instead of the|; see also p. 380 of Pinheiro/Bates.variant = 3Since parameterskappaandbetarespectively are the most difficult to estimate, these are fixed in this variant (random = v0 + tempt ~ 1). This variant converges in all reasonable cases, but the estimates ofkappaandbetacannot be use for secondary between-group analysis. If you are only interested int50, you can use this safe version.
Value
A list of class nlme_gastempt with elements
coef, summary, plot, pnlsTol, message
coefis a data frame with columns:recordRecord descriptor, e.g. patient IDv0Initial volume at t=0temptEmptying time constantkappaParameterkappaformodel = linexpbetaParameterbetaformodel = powexpt50Half-time of emptyingslope_t50Slope in t50; typically in units of ml/minute
On error, coef is NULL
nlme_resultResult of the nlme fit; can be used for addition processing, e.g. to plot residuals or viasummaryto extract AIC. On error, nlme_result is NULL.plotA ggplot graph of data and prediction. Plot of raw data is returned even when convergence was not achieved.pnlsTolEffective value of pnlsTo after convergence or failure.messageString "Ok" on success, and the error message ofnlmeon failure.
Examples
suppressWarnings(RNGversion("3.5.0"))
set.seed(4711)
d = simulate_gastempt(n_record = 10, kappa_mean = 0.9, kappa_std = 0.3,
model = linexp)$data
fit_d = nlme_gastempt(d)
# fit_d$coef # direct access
coef(fit_d) # better use accessor function
#> # A tibble: 10 × 7
#> # Rowwise:
#> record v0 tempt kappa t50 slope_t50 auc
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 rec_01 514. 38.3 0.961 62.7 4.21 38601.
#> 2 rec_02 494. 29.1 0.779 42.1 5.39 25554.
#> 3 rec_03 475. 65.6 0.979 109. 2.27 61652.
#> 4 rec_04 409. 70.6 0.673 94.2 1.87 48352.
#> 5 rec_05 365. 69.4 0.427 74.3 1.86 36156.
#> 6 rec_06 343. 105. 0.605 132. 1.07 57579.
#> 7 rec_07 439. 48.0 0.641 62.3 2.97 34564.
#> 8 rec_08 371. 72.3 0.484 81.5 1.76 39757.
#> 9 rec_09 396. 59.6 0.505 68.7 2.26 35557.
#> 10 rec_10 446. 82.8 0.967 136. 1.69 72655.
coef(fit_d, signif = 3) # Can also set number of digits
#> # A tibble: 10 × 7
#> # Rowwise:
#> record v0 tempt kappa t50 slope_t50 auc
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 rec_01 514 38.3 0.961 62.7 4.21 38600
#> 2 rec_02 494 29.1 0.779 42.1 5.39 25600
#> 3 rec_03 475 65.6 0.979 109 2.27 61700
#> 4 rec_04 409 70.6 0.673 94.2 1.87 48400
#> 5 rec_05 365 69.4 0.427 74.3 1.86 36200
#> 6 rec_06 343 105 0.605 132 1.07 57600
#> 7 rec_07 439 48 0.641 62.3 2.97 34600
#> 8 rec_08 371 72.3 0.484 81.5 1.76 39800
#> 9 rec_09 396 59.6 0.505 68.7 2.26 35600
#> 10 rec_10 446 82.8 0.967 136 1.69 72700
# Avoid ugly ggplot shading (not really needed...)
library(ggplot2)
theme_set(theme_bw() + theme(panel.spacing = grid::unit(0,"lines")))
# fit_d$plot # direct access is possible
plot(fit_d) # better use accessor function