Stepwise Covariate Model-selection (SCM) method
Arguments
- fit
an nlmixr2 'fit' object
- varsVec
a list of candidate variables to which the covariates could be added
- covarsVec
a list of candidate covariates that need to be tested
- pVal
a named list with names 'fwd' and 'bck' for specifying the p-values for the forward and backward searches, respectively
- catvarsVec
character vector of categorical covariates that need to be added
- searchType
one of 'scm', 'forward' and 'backward' to specify the covariate search method; default is 'scm'
- restart
a boolean that controls if the search should be restarted; default is FALSE
Value
A list summarizing the covariate selection steps and output; This list has the "summaryTable" for the overall summary of the covariate selection as well as "resFwd" for the forward selection method and "resBck" for the backward selection method.
Examples
# \donttest{
one.cmt <- function() {
ini({
## You may label each parameter with a comment
tka <- 0.45 # Log Ka
tcl <- log(c(0, 2.7, 100)) # Log Cl
## This works with interactive models
## You may also label the preceding line with label("label text")
tv <- 3.45; label("log V")
## the label("Label name") works with all models
eta.ka ~ 0.6
eta.cl ~ 0.3
eta.v ~ 0.1
add.sd <- 0.7
})
model({
ka <- exp(tka + eta.ka)
cl <- exp(tcl + eta.cl)
v <- exp(tv + eta.v)
linCmt() ~ add(add.sd)
})
}
fit <- nlmixr2(one.cmt, nlmixr2data::theo_sd,"focei")
#>
#>
#>
#>
#> ℹ parameter labels from comments will be replaced by 'label()'
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 5952
#> → compress parHist in nlmixr2 object, save 2040
rxode2::.rxWithWd(tempdir(), {# with temporary directory
auto1 <- covarSearchAuto(fit, varsVec = c("ka", "cl"),
covarsVec = c("WT"))
})
#>
#> ── starting forward search... ──────────────────────────────────────────────────
#>
#>
#> → loading into symengine environment...
#> → pruning branches (`if`/`else`) of full model...
#> ✔ done
#> → calculate jacobian
#> → calculate ∂(f)/∂(η)
#> → calculate ∂(R²)/∂(η)
#> → finding duplicate expressions in inner model...
#> → optimizing duplicate expressions in inner model...
#> → finding duplicate expressions in EBE model...
#> → optimizing duplicate expressions in EBE model...
#> → compiling inner model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → finding duplicate expressions in FD model...
#> → compiling EBE model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → compiling events FD model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 5952
#> → compress parHist in nlmixr2 object, save 2480
#>
#>
#> → loading into symengine environment...
#> → pruning branches (`if`/`else`) of full model...
#> ✔ done
#> → calculate jacobian
#> → calculate ∂(f)/∂(η)
#> → calculate ∂(R²)/∂(η)
#> → finding duplicate expressions in inner model...
#> → optimizing duplicate expressions in inner model...
#> → finding duplicate expressions in EBE model...
#> → optimizing duplicate expressions in EBE model...
#> → compiling inner model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → finding duplicate expressions in FD model...
#> → compiling EBE model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → compiling events FD model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 5952
#> → compress parHist in nlmixr2 object, save 2616
#>
#> ── objf value did not improve, exiting the search ... ──────────────────────────
#>
#> ── forward search complete ──
#>
#> Error in backwardSearch(varsVec, covarsVec, catvarsVec, fitorig = fit, fitupdated = resFwd[[1]], pVal = pVal$bck, reFitCovars = FALSE, outputDir = outputDir, restart = restart): object 'fit' not found
## Note that this didn't include sex, add it to dataset and restart model
d <- nlmixr2data::theo_sd
d$SEX <-0
d$SEX[d$ID<=6] <-1
fit <- nlmixr2(one.cmt, d, "focei")
#>
#>
#>
#>
#> ℹ parameter labels from comments will be replaced by 'label()'
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 7184
#> → compress parHist in nlmixr2 object, save 2040
# This would restart if for some reason the search crashed:
rxode2::.rxWithWd(tempdir(), {# with temporary directory
auto2 <- covarSearchAuto(fit, varsVec = c("ka", "cl"), covarsVec = c("WT"),
catvarsVec= c("SEX"), restart = TRUE)
auto3 <- covarSearchAuto(fit, varsVec = c("ka", "cl"), covarsVec = c("WT"),
catvarsVec= c("SEX"), restart = TRUE,
searchType = "forward")
})
#>
#> ── starting forward search... ──────────────────────────────────────────────────
#>
#>
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 7096
#> → compress parHist in nlmixr2 object, save 2480
#>
#>
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 7096
#> → compress parHist in nlmixr2 object, save 2616
#>
#>
#> → loading into symengine environment...
#> → pruning branches (`if`/`else`) of full model...
#> ✔ done
#> → calculate jacobian
#> → calculate ∂(f)/∂(η)
#> → calculate ∂(R²)/∂(η)
#> → finding duplicate expressions in inner model...
#> → optimizing duplicate expressions in inner model...
#> → finding duplicate expressions in EBE model...
#> → optimizing duplicate expressions in EBE model...
#> → compiling inner model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → finding duplicate expressions in FD model...
#> → compiling EBE model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → compiling events FD model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 7096
#> → compress parHist in nlmixr2 object, save 2968
#>
#>
#> → loading into symengine environment...
#> → pruning branches (`if`/`else`) of full model...
#> ✔ done
#> → calculate jacobian
#> → calculate ∂(f)/∂(η)
#> → calculate ∂(R²)/∂(η)
#> → finding duplicate expressions in inner model...
#> → optimizing duplicate expressions in inner model...
#> → finding duplicate expressions in EBE model...
#> → optimizing duplicate expressions in EBE model...
#> → compiling inner model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → finding duplicate expressions in FD model...
#> → compiling EBE model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → compiling events FD model...
#>
#>
#> using C compiler: ‘gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0’
#> ✔ done
#> → Calculating residuals/tables
#> ✔ done
#> → compress origData in nlmixr2 object, save 7096
#> → compress parHist in nlmixr2 object, save 3016
#>
#> ── objf value did not improve, exiting the search ... ──────────────────────────
#>
#> ── forward search complete ──
#>
#> Error in backwardSearch(varsVec, covarsVec, catvarsVec, fitorig = fit, fitupdated = resFwd[[1]], pVal = pVal$bck, reFitCovars = FALSE, outputDir = outputDir, restart = restart): object 'fit' not found
# }