Skip to content

Commit 4505e76

Browse files
authored
Merge pull request #160 from bblodfon/uni_cox
Add Univariate cox filter
2 parents 17f93b3 + c0b7f06 commit 4505e76

33 files changed

+256
-8
lines changed

DESCRIPTION

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ Authors@R: c(
88
comment = c(ORCID = "0000-0001-9754-0393")),
99
person("Bernd", "Bischl", , "bernd_bischl@gmx.net", role = "aut",
1010
comment = c(ORCID = "0000-0001-6002-6980")),
11-
person("Martin", "Binder", , "mlr.developer@mb706.com", role = "aut")
11+
person("Martin", "Binder", , "mlr.developer@mb706.com", role = "aut"),
12+
person("John", "Zobolas", , "bblodfon@gmail.com", role = "aut",
13+
comment = c(ORCID = "0000-0002-3609-8674"))
1214
)
1315
Description: Extends 'mlr3' with filter methods for feature selection.
1416
Besides standalone filter methods built-in methods of any
@@ -40,6 +42,7 @@ Suggests:
4042
mlr3pipelines,
4143
praznik,
4244
rpart,
45+
survival,
4346
testthat (>= 3.0.0),
4447
withr
4548
Config/testthat/edition: 3
@@ -71,6 +74,7 @@ Collate:
7174
'FilterPermutation.R'
7275
'FilterRelief.R'
7376
'FilterSelectedFeatures.R'
77+
'FilterUnivariateCox.R'
7478
'FilterVariance.R'
7579
'bibentries.R'
7680
'flt.R'

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export(FilterPerformance)
2323
export(FilterPermutation)
2424
export(FilterRelief)
2525
export(FilterSelectedFeatures)
26+
export(FilterUnivariateCox)
2627
export(FilterVariance)
2728
export(as.data.table)
2829
export(flt)

NEWS.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# mlr3filters 0.7.1-9000
22

3-
* Parameter value `na.rm` is properly initialized to `TRUE` (Thanks to @bblodfon)
4-
* Bugfix: property `missings` is now set correctly for `FilterFindCorrelation`
3+
- Fixed issue with `FilterPerformance` where the arg `measure` wasn't passed on
4+
- Added `FilterUnivariateCox` (thanks to @bblodfon)
5+
- Parameter value `na.rm` is properly initialized to `TRUE` (thanks to @bblodfon)
6+
- Bugfix: property `missings` is now set correctly for `FilterFindCorrelation`
57

68
# mlr3filters 0.7.1
79

R/FilterPerformance.R

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ FilterPerformance = R6Class("FilterPerformance",
8080

8181
perf = map_dbl(fn, function(x) {
8282
task$col_roles$feature = x
83-
resample(task, self$learner, self$resampling, clone = character())$aggregate()
83+
resample(task, self$learner, self$resampling, clone = character())$
84+
aggregate(measures = self$measure)
8485
})
8586

8687
if (self$measure$minimize) {

R/FilterUnivariateCox.R

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#' @title Univariate Cox Survival Filter
2+
#'
3+
#' @name mlr_filters_univariate_cox
4+
#'
5+
#' @description Calculates scores for assessing the relationship between
6+
#' individual features and the time-to-event outcome (right-censored survival
7+
#' data) using a univariate Cox proportional hazards model.
8+
#' The goal is to determine which features have a statistically significant
9+
#' association with the event of interest, typically in the context of clinical
10+
#' or biomedical research.
11+
#'
12+
#' This filter fits a [Cox Proportional Hazards][survival::coxph()] model using
13+
#' each feature independently and extracts the \eqn{p}-value that quantifies the
14+
#' significance of the feature's impact on survival. The filter value is
15+
#' `-log10(p)` where `p` is the \eqn{p}-value. This transformation is necessary
16+
#' to ensure numerical stability for very small \eqn{p}-values. Also higher
17+
#' values denote more important features. The filter works only for numeric
18+
#' features so please ensure that factor variables are properly encoded, e.g.
19+
#' using [PipeOpEncode][mlr3pipelines::PipeOpEncode].
20+
#'
21+
#' @family Filter
22+
#' @include Filter.R
23+
#' @template seealso_filter
24+
#' @export
25+
#' @examples
26+
#'
27+
#' filter = flt("univariate_cox")
28+
#' filter
29+
#'
30+
FilterUnivariateCox = R6Class("FilterUnivariateCox",
31+
inherit = Filter,
32+
public = list(
33+
#' @description Create a FilterUnivariateCox object.
34+
initialize = function() {
35+
super$initialize(
36+
id = "surv.univariate_cox",
37+
packages = "survival",
38+
param_set = ps(),
39+
feature_types = c("integer", "numeric", "logical"),
40+
task_types = "surv",
41+
label = "Univariate Cox Survival Score",
42+
man = "mlr3filters::mlr_filters_univariate_cox"
43+
)
44+
}
45+
),
46+
47+
private = list(
48+
.calculate = function(task, nfeat) {
49+
features = task$feature_names
50+
targets = task$data(cols = task$target_names)
51+
52+
scores = map_dbl(features, function(feature) {
53+
model = invoke(
54+
survival::coxph,
55+
formula = task$formula(rhs = feature),
56+
data = cbind(task$data(cols = feature), targets)
57+
)
58+
pval = summary(model)$coefficients[, "Pr(>|z|)"]
59+
-log10(pval) # smaller p-values => larger scores
60+
})
61+
62+
set_names(scores, features)
63+
}
64+
)
65+
)
66+
67+
#' @include mlr_filters.R
68+
mlr_filters$add("univariate_cox", FilterUnivariateCox)

README.Rmd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ Please open an issue so we can add your package.
102102
Some learners need to have their variable importance measure "activated" during learner creation.
103103
For example, to use the "impurity" measure of Random Forest via the {ranger} package:
104104

105-
```{r }
105+
```{r}
106106
task = tsk("iris")
107-
lrn = lrn("classif.ranger")
107+
lrn = lrn("classif.ranger", seed = 42)
108108
lrn$param_set$values = list(importance = "impurity")
109109
110110
filter = flt("importance", learner = lrn)

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ head(as.data.table(filter$calculate(task)))
8484
| permutation | Permutation Score | Universal | Logical, Integer, Numeric, Character, Factor, Ordered, POSIXct | |
8585
| relief | RELIEF | Classif & Regr | Integer, Numeric, Factor, Ordered | [FSelectorRcpp](https://cran.r-project.org/package=FSelectorRcpp) |
8686
| selected_features | Embedded Feature Selection | Universal | Logical, Integer, Numeric, Character, Factor, Ordered, POSIXct | |
87+
| univariate_cox | Univariate Cox Survival Score | Surv | Integer, Numeric, Logical | [survival](https://cran.r-project.org/package=survival) |
8788
| variance | Variance | Universal | Integer, Numeric | stats |
8889

8990
### Variable Importance Filters
@@ -108,7 +109,7 @@ Random Forest via the {ranger} package:
108109

109110
``` r
110111
task = tsk("iris")
111-
lrn = lrn("classif.ranger")
112+
lrn = lrn("classif.ranger", seed = 42)
112113
lrn$param_set$values = list(importance = "impurity")
113114

114115
filter = flt("importance", learner = lrn)

man/Filter.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_anova.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_auc.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_carscore.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_carsurvscore.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_cmim.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_correlation.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_disr.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_find_correlation.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_importance.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_information_gain.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_jmi.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_jmim.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_kruskal_test.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_mim.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_mrmr.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_njmim.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_performance.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_permutation.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_relief.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mlr_filters_selected_features.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)