From 97fbc8b267874d5df7a1b74a20f210c7d3085ded Mon Sep 17 00:00:00 2001 From: David McCoy Date: Tue, 8 Feb 2022 17:30:36 -0800 Subject: [PATCH] earth with offset formula --- R/Lrnr_earth.R | 55 +++++++++++++++++++---- README.md | 50 +++++++++++++++++++++ docs/articles/custom_lrnrs.html | 2 +- docs/articles/intro_sl3.html | 64 +++++++++++++-------------- docs/index.html | 50 +++++++++++++++++++++ docs/pkgdown.yml | 2 +- docs/reference/Lrnr_cv_selector.html | 2 +- docs/reference/importance.html | 18 ++++---- docs/reference/importance_plot-1.png | Bin 37411 -> 37139 bytes tests/testthat/test-earth.R | 31 +++++++++++++ 10 files changed, 221 insertions(+), 53 deletions(-) diff --git a/R/Lrnr_earth.R b/R/Lrnr_earth.R index 0ca89db5..b2806b45 100644 --- a/R/Lrnr_earth.R +++ b/R/Lrnr_earth.R @@ -68,11 +68,17 @@ Lrnr_earth <- R6Class( classname = "Lrnr_earth", inherit = Lrnr_base, portable = TRUE, class = TRUE, public = list( - initialize = function(degree = 2, penalty = 3, pmethod = "backward", + initialize = function(formula = NULL, degree = 2, penalty = 3, pmethod = "backward", nfold = 0, ncross = 1, minspan = 0, endspan = 0, ...) { params <- args_to_list() super$initialize(params = params, ...) + }, + # for learners that take formula as an argument, the function + # process_formula that's defined in Lrnr_base needs to be redefined in + # the learner like below + process_formula = function(task) { + return(task) } ), private = list( @@ -80,15 +86,45 @@ Lrnr_earth <- R6Class( .train = function(task) { args <- self$params outcome_type <- self$get_outcome_type(task) - args$x <- task$X - args$y <- outcome_type$format(task$Y) + # args$x <- task$X + # args$y <- outcome_type$format(task$Y) + args$data <- task$data - if (task$has_node("weights")) { - args$weights <- task$weights + if (!is.null(args$formula)) { + form <- args$formula + if (class(form) != "formula") form <- as.formula(form) + + if (task$has_node("offset") && is.null(attr(terms(form), "offset"))) { + stop("Task has an offset; this needs to be specified as another term in the user-supplied formula") + } + + # check response variable corresponds to outcome in task, if provided + if (attr(terms(form), "response")) { + if (!all.vars(form)[1] == task$nodes$outcome) { + stop(paste0( + "Outcome variable in formula ", all.vars(form)[1], + " does not match the task's outcome ", task$nodes$outcome + )) + } + formula_covars <- all.vars(form)[-1] + } else { + formula_covars <- all.vars(form) + } + # check that regressors in the formula are contained in the task + if (!all(formula_covars %in% task$nodes$covariates)) { + stop("Regressors in the formula are not covariates in task") + } + } else { + if (task$has_node("offset")) { + args$formula <- as.formula(paste(paste(task$nodes$outcome, paste("offset", "(", task$nodes$offset, ")", sep = ""), sep = "~"), paste(task$nodes$covariates, collapse = "+"), sep = "+")) + } else { + # create formula if it's not specified + args$formula <- as.formula(paste(task$nodes$outcome, paste(task$nodes$covariates, collapse = "+"), sep = "~")) + } } - if (task$has_node("offset")) { - args$offset <- task$offset + if (task$has_node("weights")) { + args$weights <- task$weights } if (outcome_type$type == "continuous") { @@ -99,7 +135,7 @@ Lrnr_earth <- R6Class( stop("Unsupported outcome type for Lrnr_earth.") } args$glm <- glm - earth_fun <- utils::getS3method("earth", "default", + earth_fun <- utils::getS3method("earth", "formula", envir = getNamespace("earth") ) @@ -109,13 +145,14 @@ Lrnr_earth <- R6Class( utils::getS3method("earth", "fit", envir = getNamespace("earth")) )) extra_args <- extra_args[!(extra_args %in% default_args)] + # extra_args <- extra_args[extra_args != "offset"] fit_object <- call_with_args(earth_fun, args, other_valid = extra_args) return(fit_object) }, .predict = function(task) { preds <- stats::predict( - object = private$.fit_object, newdata = task$X, + object = private$.fit_object, newdata = task$data, type = "response" ) return(preds) diff --git a/README.md b/README.md index 7c079396..7b1af5ff 100644 --- a/README.md +++ b/README.md @@ -1312,6 +1312,56 @@ x +Lrnr\_glmtree + + +√ + + +x + + +√ + + +x + + +x + + +x + + +x + + +x + + +√ + + +x + + +x + + +x + + +x + + +√ + + +x + + + + Lrnr\_grf diff --git a/docs/articles/custom_lrnrs.html b/docs/articles/custom_lrnrs.html index 85307123..c2a82161 100644 --- a/docs/articles/custom_lrnrs.html +++ b/docs/articles/custom_lrnrs.html @@ -99,7 +99,7 @@

Defining New sl3 Learners

Jeremy Coyle, Nima Hejazi, Ivana Malenica, Oleg Sofrygin

-

2022-01-25

+

2022-02-08

Source: vignettes/custom_lrnrs.Rmd diff --git a/docs/articles/intro_sl3.html b/docs/articles/intro_sl3.html index 831e001a..95b13800 100644 --- a/docs/articles/intro_sl3.html +++ b/docs/articles/intro_sl3.html @@ -100,7 +100,7 @@

Modern Machine Learning in R

Jeremy Coyle, Nima Hejazi, Ivana Malenica, Oleg Sofrygin

-

2022-01-25

+

2022-02-08

Source: vignettes/intro_sl3.Rmd @@ -287,7 +287,7 @@

Pipelines - +

Stacks @@ -315,7 +315,7 @@

Stacks

Above, we’ve defined and fit a stack comprised of a simple glm learner as well as a pipeline that combines a screening algorithm with that same learner. We could have included any abitrary set of learners and pipelines, the latter of which are themselves just learners. We can see that the predict method now returns a matrix, with a column for each learner included in the stack.

We can visualize the stack:

-

We see one “branch” for each learner in the stack.

+

We see one “branch” for each learner in the stack.

Cross-validation @@ -378,7 +378,7 @@

Computation with delayeddelayed_sl_fit <- delayed_learner_train(sl, task) plot(delayed_sl_fit)

-

delayed then allows us to parallelize the procedure across these tasks using the future package. For more information on specifying future plans for parallelization, see the documentation of the future package. Performance comparisons can be found in the “SuperLearner Benchmarks” vignette that accompanies this package. This feature is currently experimental and hasn’t yet been throughly tested on a range of parallel backends.

+

delayed then allows us to parallelize the procedure across these tasks using the future package. For more information on specifying future plans for parallelization, see the documentation of the future package. Performance comparisons can be found in the “SuperLearner Benchmarks” vignette that accompanies this package. This feature is currently experimental and hasn’t yet been throughly tested on a range of parallel backends.


@@ -411,34 +411,34 @@

Session Information## [10] R6_2.5.1 rpart_4.1-15 DBI_1.1.1 ## [13] colorspace_2.0-2 nnet_7.3-16 withr_2.4.3 ## [16] tidyselect_1.1.1 prettyunits_1.1.1 compiler_4.1.0 -## [19] glmnet_4.1-3 textshaping_0.3.6 desc_1.4.0 -## [22] sass_0.4.0 scales_1.1.1 checkmate_2.0.0 -## [25] randomForest_4.6-14 pkgdown_2.0.2 systemfonts_1.0.3 -## [28] stringr_1.4.0 digest_0.6.29 rmarkdown_2.11.12 -## [31] pkgconfig_2.0.3 htmltools_0.5.2 parallelly_1.30.0 -## [34] fastmap_1.1.0 htmlwidgets_1.5.4 rlang_0.4.12 -## [37] BBmisc_1.11 shape_1.4.6 visNetwork_2.1.0 -## [40] jquerylib_0.1.4 generics_0.1.1 jsonlite_1.7.3 -## [43] ModelMetrics_1.2.2.2 dplyr_1.0.7 magrittr_2.0.1 -## [46] delayed_0.3.0 Matrix_1.3-4 Rcpp_1.0.8 -## [49] munsell_0.5.0 fansi_1.0.2 abind_1.4-5 -## [52] lifecycle_1.0.1 pROC_1.18.0 stringi_1.7.6 -## [55] yaml_2.2.2 MASS_7.3-54 plyr_1.8.6 -## [58] recipes_0.1.17 grid_4.1.0 parallel_4.1.0 -## [61] listenv_0.8.0 crayon_1.4.2 lattice_0.20-44 -## [64] hms_1.1.1 knitr_1.37 pillar_1.6.5 -## [67] igraph_1.2.11 uuid_1.0-3 stats4_4.1.0 -## [70] reshape2_1.4.4 future.apply_1.8.1 codetools_0.2-18 -## [73] glue_1.6.1 evaluate_0.14 vctrs_0.3.8 -## [76] Rdpack_2.1.3 gtable_0.3.0 purrr_0.3.4 -## [79] rstackdeque_1.1.1 future_1.23.0 assertthat_0.2.1 -## [82] cachem_1.0.6 ggplot2_3.3.5 xfun_0.29 -## [85] gower_0.2.2 rbibutils_2.2.7 prodlim_2019.11.13 -## [88] ragg_1.2.1 class_7.3-19 survival_3.2-11 -## [91] timeDate_3043.102 tibble_3.1.6 iterators_1.0.13 -## [94] memoise_2.0.1 lava_1.6.10 globals_0.14.0 -## [97] imputeMissings_0.0.3 ellipsis_0.3.2 caret_6.0-90 -## [100] ROCR_1.0-11 ipred_0.9-12 +## [19] glmnet_4.1-3 textshaping_0.3.6 cli_3.1.1 +## [22] desc_1.4.0 sass_0.4.0 scales_1.1.1 +## [25] checkmate_2.0.0 randomForest_4.6-14 pkgdown_2.0.2 +## [28] systemfonts_1.0.3 stringr_1.4.0 digest_0.6.29 +## [31] rmarkdown_2.11.12 pkgconfig_2.0.3 htmltools_0.5.2 +## [34] parallelly_1.30.0 fastmap_1.1.0 htmlwidgets_1.5.4 +## [37] rlang_1.0.0 BBmisc_1.11 shape_1.4.6 +## [40] visNetwork_2.1.0 jquerylib_0.1.4 generics_0.1.1 +## [43] jsonlite_1.7.3 ModelMetrics_1.2.2.2 dplyr_1.0.7 +## [46] magrittr_2.0.2 delayed_0.3.0 Matrix_1.3-4 +## [49] Rcpp_1.0.8 munsell_0.5.0 fansi_1.0.2 +## [52] abind_1.4-5 lifecycle_1.0.1 pROC_1.18.0 +## [55] stringi_1.7.6 yaml_2.2.2 MASS_7.3-54 +## [58] plyr_1.8.6 recipes_0.1.17 grid_4.1.0 +## [61] parallel_4.1.0 listenv_0.8.0 crayon_1.4.2 +## [64] lattice_0.20-44 hms_1.1.1 knitr_1.37 +## [67] pillar_1.6.5 igraph_1.2.11 uuid_1.0-3 +## [70] stats4_4.1.0 reshape2_1.4.4 future.apply_1.8.1 +## [73] codetools_0.2-18 glue_1.6.1 evaluate_0.14 +## [76] vctrs_0.3.8 Rdpack_2.1.3 gtable_0.3.0 +## [79] purrr_0.3.4 rstackdeque_1.1.1 future_1.23.0 +## [82] assertthat_0.2.1 cachem_1.0.6 ggplot2_3.3.5 +## [85] xfun_0.29 gower_0.2.2 rbibutils_2.2.7 +## [88] prodlim_2019.11.13 ragg_1.2.1 class_7.3-19 +## [91] survival_3.2-11 timeDate_3043.102 tibble_3.1.6 +## [94] iterators_1.0.13 memoise_2.0.1 lava_1.6.10 +## [97] globals_0.14.0 imputeMissings_0.0.3 ellipsis_0.3.2 +## [100] caret_6.0-90 ROCR_1.0-11 ipred_0.9-12

diff --git a/docs/reference/importance.html b/docs/reference/importance.html index 63122115..901c90c3 100644 --- a/docs/reference/importance.html +++ b/docs/reference/importance.html @@ -193,12 +193,12 @@

Examples

importance_result <- importance(sl_fit) importance_result #> covariate MSE_difference -#> 1: mage 0.041605149 -#> 2: gagebrth 0.033319023 -#> 3: meducyrs 0.028760333 -#> 4: apgar1 0.018513919 -#> 5: parity 0.011646247 -#> 6: apgar5 -0.007892869 +#> 1: gagebrth 0.035120250 +#> 2: mage 0.032385220 +#> 3: meducyrs 0.029969387 +#> 4: apgar1 0.010211139 +#> 5: parity 0.008426229 +#> 6: apgar5 0.001291949 # importance with groups of covariates groups <-
list( @@ -208,9 +208,9 @@

Examples

importance_result_groups <- importance(sl_fit, covariate_groups = groups) importance_result_groups #> covariate_group MSE_difference -#> 1: scores 7.24638331 -#> 2: maternal 0.15464180 -#> 3: gagebrth 0.03361065 +#> 1: scores 8.99649345 +#> 2: maternal 0.14155149 +#> 3: gagebrth 0.03408582 diff --git a/docs/reference/importance_plot-1.png b/docs/reference/importance_plot-1.png index e55ecc1a67fed0dc95da2efdd73fadee309de152..606e6b3b0941597af47bf7c6be7a1d817d35cb95 100644 GIT binary patch literal 37139 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 diff --git a/tests/testthat/test-earth.R b/tests/testthat/test-earth.R index ef30339b..b174641a 100644 --- a/tests/testthat/test-earth.R +++ b/tests/testthat/test-earth.R @@ -31,3 +31,34 @@ test_that("Lrnr_earth produces results matching those of earth::earth", { # check equality of predictions expect_equal(preds, as.numeric(preds_classic)) }) + +test_that("Test Lrnr_earth earth offset matches earth::earth", { + covars <- c( + "apgar1", "apgar5", "parity", "gagebrth", "mage", "meducyrs", + "sexn" + ) + outcome <- "haz" + task <- sl3_Task$new(cpp_imputed, + covariates = covars, + outcome = outcome, + offset = "waz" + ) + # get predictions from Lrnr_* wrapper + set.seed(4738) + lrnr_earth <- make_learner(Lrnr_earth) + fit <- lrnr_earth$train(task) + preds <- fit$predict(task) + + # get predictions from classic implementation + formula <- as.formula(paste(paste(task$nodes$outcome, paste("offset", "(", task$nodes$offset, ")", sep = ""), sep = "~"), paste(task$nodes$covariates, collapse = "+"), sep = "+")) + fit_classic <- earth::earth( + formula, + data = task$data, degree = 2, penalty = 3, + pmethod = "backward", nfold = 0, ncross = 1, + minspan = 0, endspan = 0 + ) + preds_classic <- predict(fit_classic, newdata = task$data, type = "response") + + # check equality of predictions + expect_equal(preds, as.numeric(preds_classic)) +})