From 7f308f6de493cbe4de0e30bf8ee6d6f74be9ee99 Mon Sep 17 00:00:00 2001 From: bcjaeger Date: Sat, 14 Oct 2023 13:31:20 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20ropensci?= =?UTF-8?q?/aorsf@0d6abdd4ed8b3ccce5beef6decf0b4949bb08669=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/aorsf.html | 6 ++-- articles/fast.html | 19 +++++----- articles/oobag.html | 18 +++++----- .../figure-html/unnamed-chunk-2-1.png | Bin 27772 -> 27711 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 48689 -> 49294 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 45808 -> 50358 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 49713 -> 47917 bytes news/index.html | 2 +- pkgdown.yml | 2 +- reference/as.data.table.orsf_summary_uni.html | 16 ++++----- reference/orsf_control_net.html | 4 +-- reference/orsf_summarize_uni.html | 34 +++++++++--------- reference/orsf_time_to_train.html | 6 ++-- reference/print.orsf_fit.html | 4 +-- reference/print.orsf_summary_uni.html | 16 ++++----- search.json | 2 +- 16 files changed, 64 insertions(+), 65 deletions(-) diff --git a/articles/aorsf.html b/articles/aorsf.html index 5ec89b62..251cb7f1 100644 --- a/articles/aorsf.html +++ b/articles/aorsf.html @@ -259,7 +259,7 @@

What about the original ORSF?) ) #> user system elapsed -#> 5.140 0.000 5.142 +#> 4.076 0.000 4.077 # and how long it takes to fit 50 cph trees print( @@ -271,11 +271,11 @@

What about the original ORSF?) ) #> user system elapsed -#> 0.053 0.000 0.054 +#> 0.041 0.000 0.041 t1['elapsed'] / t2['elapsed'] #> elapsed -#> 95.22222 +#> 99.43902

aorsf and other machine learning software diff --git a/articles/fast.html b/articles/fast.html index 8555de3f..034f3a0b 100644 --- a/articles/fast.html +++ b/articles/fast.html @@ -150,7 +150,7 @@

Use orsf_control_fast()# control_fast() is much faster time_net['elapsed'] / time_fast['elapsed'] #> elapsed -#> 34.96091

+#> 34.77959 +#> elapsed +#> 0.773646

Because R is a single threaded language, multi-threading cannot be applied when orsf() needs to call R functions from C++, which occurs when a customized R function is used to find linear @@ -223,7 +223,7 @@

Do less# about two times faster than auto thread with defaults time_auto_thread['elapsed'] / time_lightweight['elapsed'] #> elapsed -#> 2.439858 +#> 2.361446

While these default values do make orsf() run slower, they also usually make its predictions more accurate or make the fit easier to interpret.

@@ -241,11 +241,10 @@

Show progress= 0, n_tree = 500, verbose_progress = TRUE) -#> Growing trees: 18%. ~ time remaining: 9 seconds. -#> Growing trees: 35%. ~ time remaining: 7 seconds. -#> Growing trees: 54%. ~ time remaining: 5 seconds. -#> Growing trees: 72%. ~ time remaining: 3 seconds. -#> Growing trees: 89%. ~ time remaining: 1 seconds. +#> Growing trees: 20%. ~ time remaining: 8 seconds. +#> Growing trees: 40%. ~ time remaining: 6 seconds. +#> Growing trees: 63%. ~ time remaining: 3 seconds. +#> Growing trees: 82%. ~ time remaining: 1 seconds. #> Growing trees: 100%. #> Computing predictions: 100%. diff --git a/articles/oobag.html b/articles/oobag.html index 5849539e..1c6ef18b 100644 --- a/articles/oobag.html +++ b/articles/oobag.html @@ -139,9 +139,9 @@

Out-of-bag predictions and error# what is the output from this function? fit$eval_oobag$stat_values #> [,1] -#> [1,] 0.8438981 +#> [1,] 0.8399396

The out-of-bag estimate of Harrell’s C-statistic (the default method -to evaluate out-of-bag predictions) is 0.8438981.

+to evaluate out-of-bag predictions) is 0.8399396.

Monitoring out-of-bag error @@ -204,7 +204,7 @@

User-supplied out-of-bag oobag_fun_brier(y_mat = pbc_orsf[,c('time', 'status')], s_vec = fit$pred_oobag) -#> [1] 0.109413

+#> [1] 0.113472

Second, you can pass your function into orsf(), and it will be used in place of Harrell’s C-statistic:

@@ -327,12 +327,12 @@ 

User-supplied function importance = 'negate') fit_tdep_cstat$importance -#> bili copper sex stage protime albumin -#> 0.123055740 0.050740630 0.044082730 0.031778910 0.025512840 0.022952200 -#> chol age ascites ast spiders edema -#> 0.016352160 0.015756850 0.012471920 0.011893780 0.011507280 0.006239915 -#> hepato trt trig alk.phos platelet -#> 0.005418660 0.004056760 0.002503870 0.002399810 0.001907740

+#> bili copper stage sex albumin age +#> 0.11431938 0.04283192 0.03011800 0.02978767 0.02434698 0.02379080 +#> protime chol ascites ast spiders edema +#> 0.02289864 0.01823123 0.01264641 0.00986446 0.00913007 0.00769056 +#> hepato trig alk.phos trt platelet +#> 0.00636780 0.00619816 0.00258887 0.00046192 -0.00201958

Notes diff --git a/articles/oobag_files/figure-html/unnamed-chunk-2-1.png b/articles/oobag_files/figure-html/unnamed-chunk-2-1.png index db66642ef9dabafb26cced351d9755501dcaf14a..da67070eb1887c6f6c4771c5c4e018e3a2fba818 100644 GIT binary patch literal 27711 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 literal 27772 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

&H<>n>TFku$UE=qtq^ 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 literal 48689 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 diff --git a/articles/oobag_files/figure-html/unnamed-chunk-8-1.png b/articles/oobag_files/figure-html/unnamed-chunk-8-1.png index 0d4144b1c6fff8b02fe6ff55234ea4c4acb50c18..7fb5cea67fb8df62c12140383f5825c611b82947 100644 GIT binary patch literal 47917 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

pOT}M~FAwyo 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 f|7U;3=rY7g;y!05ca>b_ATOMC_

-

aorsf 0.1.0 (unreleased)

+

aorsf 0.1.0 (unreleased)

CRAN release: 2023-10-13

diff --git a/reference/print.orsf_fit.html b/reference/print.orsf_fit.html index cd08689b..cc19fa1e 100644 --- a/reference/print.orsf_fit.html +++ b/reference/print.orsf_fit.html @@ -136,10 +136,10 @@

Examples#> N trees: 5 #> N predictors total: 17 #> N predictors per node: 5 -#> Average leaves per tree: 21 +#> Average leaves per tree: 20 #> Min observations in leaf: 5 #> Min events in leaf: 1 -#> OOB stat value: 0.79 +#> OOB stat value: 0.75 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> diff --git a/reference/print.orsf_summary_uni.html b/reference/print.orsf_summary_uni.html index cb8f09f0..8a1b5f42 100644 --- a/reference/print.orsf_summary_uni.html +++ b/reference/print.orsf_summary_uni.html @@ -102,24 +102,24 @@

Examples#> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 0.80 0.2299692 0.1278705 0.04826338 0.3588591 -#> 1.4 0.2513137 0.1470933 0.06061880 0.3812462 -#> 3.5 0.3639117 0.2809449 0.16351062 0.5379425 +#> 0.80 0.2316278 0.1228982 0.05258416 0.3549027 +#> 1.4 0.2531304 0.1516350 0.06971433 0.3852210 +#> 3.5 0.3674937 0.2823537 0.16739901 0.5484374 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 43 0.2612727 0.1415592 0.04971317 0.4565375 -#> 74 0.2794186 0.1534584 0.05670107 0.4771913 -#> 129 0.3342594 0.2176957 0.10551927 0.5351913 +#> 43 0.2637305 0.1533631 0.05272638 0.4503559 +#> 74 0.2824765 0.1634573 0.06315440 0.4787054 +#> 129 0.3360249 0.2274249 0.10921335 0.5462903 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> m 0.3462657 0.2350962 0.11603543 0.5549656 -#> f 0.2955408 0.1650527 0.05094048 0.5064862 +#> m 0.3509456 0.2353301 0.11765074 0.5681639 +#> f 0.2972260 0.1661089 0.05511715 0.5219512 #> #> Predicted risk at time t = 1788 for top 3 predictors diff --git a/search.json b/search.json index 10c6526c..06345240 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contributing to aorsf","title":"Contributing to aorsf","text":"Want contribute aorsf? Great! aorsf initially stable state development, great deal active subsequent development envisioned. outline propose change aorsf. detailed info contributing , tidyverse packages, please see development contributing guide.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"fixing-typos","dir":"","previous_headings":"","what":"Fixing typos","title":"Contributing to aorsf","text":"can fix typos, spelling mistakes, grammatical errors documentation directly using GitHub web interface, long changes made source file. generally means ’ll need edit roxygen2 comments .R, .Rd file. can find .R file generates .Rd reading comment first line.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"bigger-changes","dir":"","previous_headings":"","what":"Bigger changes","title":"Contributing to aorsf","text":"want make bigger change, ’s good idea first file issue make sure someone team agrees ’s needed. ’ve found bug, please file issue illustrates bug minimal reprex (also help write unit test, needed).","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"pull-request-process","dir":"","previous_headings":"Bigger changes","what":"Pull request process","title":"Contributing to aorsf","text":"Fork package clone onto computer. haven’t done , recommend using usethis::create_from_github(\"ropensci/aorsf\", fork = TRUE). Install development dependencies devtools::install_dev_deps(), make sure package passes R CMD check running devtools::check(). R CMD check doesn’t pass cleanly, ’s good idea ask help continuing. Create Git branch pull request (PR). recommend using usethis::pr_init(\"brief-description--change\"). Make changes, commit git, create PR running usethis::pr_push(), following prompts browser. title PR briefly describe change. body PR contain Fixes #issue-number. user-facing changes, add bullet top NEWS.md (.e. just first header). Follow style described https://style.tidyverse.org/news.html.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"code-style","dir":"","previous_headings":"Bigger changes","what":"Code style","title":"Contributing to aorsf","text":"New code follow tidyverse style guide. can use styler package apply styles, please don’t restyle code nothing PR. use roxygen2, Markdown syntax, documentation. use testthat unit tests. Contributions test cases included easier accept.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Contributing to aorsf","text":"Please note aorsf project released Contributor Code Conduct. contributing project agree abide terms.","code":""},{"path":"https://bcjaeger.github.io/aorsf/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2022 aorsf authors (Byron C. Jaeger, Sawyer Welden, Nicholas M. Pajewski) Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"background-orsf","dir":"Articles","previous_headings":"","what":"Background: ORSF","title":"Introduction to aorsf","text":"oblique random survival forest (ORSF) extension axis-based RSF algorithm. See orsf details ORSFs. see JCGS paper details algorithms used specifically aorsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"accelerated-orsf","dir":"Articles","previous_headings":"","what":"Accelerated ORSF","title":"Introduction to aorsf","text":"purpose aorsf (‘’ short accelerated) provide routines fit ORSFs scale adequately large data sets. fastest algorithm available package accelerated ORSF model, default method used orsf(): may notice first input aorsf data. design choice makes easier use orsf pipes (.e., %>% |>). instance,","code":"library(aorsf) set.seed(329) orsf_fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id) orsf_fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> ----------------------------------------- library(dplyr) orsf_fit <- pbc_orsf |> select(-id) |> orsf(formula = Surv(time, status) ~ .)"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"interpretation","dir":"Articles","previous_headings":"","what":"Interpretation","title":"Introduction to aorsf","text":"aorsf includes several functions dedicated interpretation ORSFs, estimation partial dependence variable importance.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"variable-importance","dir":"Articles","previous_headings":"Interpretation","what":"Variable importance","title":"Introduction to aorsf","text":"aorsf provides multiple ways compute variable importance. compute negation importance, ORSF multiplies coefficient variable -1 re-computes --sample (sometimes referred --bag) accuracy ORSF model. can also compute variable importance using permutation, classical approach. faster alternative permutation negation importance ANOVA importance, computes proportion times variable obtains low p-value (p < 0.01) forest grown.","code":"orsf_vi_negate(orsf_fit) #> bili copper sex stage protime albumin #> 0.126868625 0.047162286 0.036036494 0.024370032 0.024165418 0.022543554 #> age chol ascites ast spiders edema #> 0.021373110 0.015358846 0.013907057 0.011690468 0.007541334 0.007028412 #> hepato trt alk.phos trig platelet #> 0.004932193 0.004000817 0.003483106 0.003082097 0.000417310 orsf_vi_permute(orsf_fit) #> bili copper protime albumin ascites #> 0.0572499737 0.0230104735 0.0133869203 0.0128321618 0.0126923838 #> age stage chol ast spiders #> 0.0125921520 0.0114869475 0.0074350997 0.0065099370 0.0059679015 #> edema hepato sex alk.phos trig #> 0.0051010106 0.0026435147 0.0024594511 0.0011071433 0.0006267128 #> trt platelet #> -0.0002714461 -0.0008464102 orsf_vi_anova(orsf_fit) #> ascites bili copper edema albumin age protime #> 0.49453823 0.42999054 0.30285438 0.30172086 0.25564632 0.25478301 0.24861878 #> stage chol ast hepato spiders sex trig #> 0.20975354 0.19204981 0.17066015 0.16363636 0.16357504 0.14437500 0.13601630 #> alk.phos platelet trt #> 0.10744986 0.08044316 0.07594937"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"partial-dependence-pd","dir":"Articles","previous_headings":"Interpretation","what":"Partial dependence (PD)","title":"Introduction to aorsf","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. PD, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"individual-conditional-expectations-ice","dir":"Articles","previous_headings":"Interpretation","what":"Individual conditional expectations (ICE)","title":"Introduction to aorsf","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. ICE, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"what-about-the-original-orsf","dir":"Articles","previous_headings":"","what":"What about the original ORSF?","title":"Introduction to aorsf","text":"original ORSF (.e., obliqueRSF) used glmnet find linear combinations inputs. aorsf allows users implement approach using orsf_control_net() function: net forests fit lot faster original ORSF function obliqueRSF. However, net forests still much slower cph ones:","code":"orsf_net <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_net(), n_tree = 50) # tracking how long it takes to fit 50 glmnet trees print( t1 <- system.time( orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_net(), n_tree = 50) ) ) #> user system elapsed #> 5.140 0.000 5.142 # and how long it takes to fit 50 cph trees print( t2 <- system.time( orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_cph(), n_tree = 50) ) ) #> user system elapsed #> 0.053 0.000 0.054 t1['elapsed'] / t2['elapsed'] #> elapsed #> 95.22222"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"aorsf-and-other-machine-learning-software","dir":"Articles","previous_headings":"","what":"aorsf and other machine learning software","title":"Introduction to aorsf","text":"unique feature aorsf fast algorithms fit ORSF ensembles. RLT obliqueRSF fit oblique random survival forests, aorsf faster. ranger randomForestSRC fit survival forests, neither package supports oblique splitting. obliqueRF fits oblique random forests classification regression, survival. PPforest fits oblique random forests classification survival. Note: default prediction behavior aorsf models produce predicted risk specific prediction horizon, default ranger randomForestSRC. think change future, computing time independent predictions aorsf helpful.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"go-faster","dir":"Articles","previous_headings":"","what":"Go faster","title":"Tips to speed up computation","text":"Analyses can slow crawl models need hours run. article find tricks prevent bottleneck using orsf(). ’ll use flchain data survival demonstrate. flc data 7871 rows 11 columns:","code":"data(\"flchain\", package = 'survival') flc <- flchain # do this to avoid orsf() throwing an error about time to event = 0 flc <- flc[flc$futime > 0, ] # modify names names(flc)[names(flc) == 'futime'] <- 'time' names(flc)[names(flc) == 'death'] <- 'status' head(flc) #> age sex sample.yr kappa lambda flc.grp creatinine mgus time status #> 1 97 F 1997 5.70 4.860 10 1.7 0 85 1 #> 2 92 F 2000 0.87 0.683 1 0.9 0 1281 1 #> 3 94 F 1997 4.36 3.850 10 1.4 0 69 1 #> 4 92 F 1996 2.42 2.220 9 1.0 0 115 1 #> 5 93 F 1996 1.32 1.690 6 1.1 0 1039 1 #> 6 90 F 1997 2.01 1.860 9 1.0 0 1355 1 #> chapter #> 1 Circulatory #> 2 Neoplasms #> 3 Circulatory #> 4 Circulatory #> 5 Circulatory #> 6 Mental"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"use-orsf_control_fast","dir":"Articles","previous_headings":"","what":"Use orsf_control_fast()","title":"Tips to speed up computation","text":"default control value orsf() run-time compared approaches can striking. example:","code":"time_fast <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', control = orsf_control_fast(), n_tree = 10) ) time_net <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', control = orsf_control_net(), n_tree = 10) ) # control_fast() is much faster time_net['elapsed'] / time_fast['elapsed'] #> elapsed #> 34.96091"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"use-n_thread","dir":"Articles","previous_headings":"","what":"Use n_thread","title":"Tips to speed up computation","text":"n_thread argument uses multi-threading run aorsf functions parallel possible. know many threads want, e.g. want exactly 5, just say n_thread = 5. aren’t sure many threads available want use many can, say n_thread = 0 aorsf figure number . R single threaded language, multi-threading applied orsf() needs call R functions C++, occurs customized R function used find linear combination variables compute prediction accuracy.","code":"time_1_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 1, n_tree = 500) ) time_5_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 5, n_tree = 500) ) time_auto_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500) ) # 5 threads and auto thread are both about 3 times faster than one thread time_1_thread['elapsed'] / time_5_thread['elapsed'] #> elapsed #> 0.4437422 time_1_thread['elapsed'] / time_auto_thread['elapsed'] #> elapsed #> 0.7691316"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"do-less","dir":"Articles","previous_headings":"","what":"Do less","title":"Tips to speed up computation","text":"defaults orsf() can adjusted make run faster: set n_retry 0 instead 3 (default) set oobag_pred_type ‘none’ instead ‘surv’ (default) set ‘importance’ ‘none’ instead ‘anova’ (default) increase split_min_events, split_min_obs, leaf_min_events, leaf_min_obs make trees stop growing sooner increase split_min_stat make trees stop growing sooner Applying tips: default values make orsf() run slower, also usually make predictions accurate make fit easier interpret.","code":"time_lightweight <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500, n_retry = 0, oobag_pred_type = 'none', importance = 'none', split_min_events = 20, leaf_min_events = 10, split_min_stat = 10) ) # about two times faster than auto thread with defaults time_auto_thread['elapsed'] / time_lightweight['elapsed'] #> elapsed #> 2.439858"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"show-progress","dir":"Articles","previous_headings":"","what":"Show progress","title":"Tips to speed up computation","text":"Setting verbose_progress = TRUE doesn’t make anything run faster, can help make feel like things running less slow.","code":"verbose_fit <- orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500, verbose_progress = TRUE) #> Growing trees: 18%. ~ time remaining: 9 seconds. #> Growing trees: 35%. ~ time remaining: 7 seconds. #> Growing trees: 54%. ~ time remaining: 5 seconds. #> Growing trees: 72%. ~ time remaining: 3 seconds. #> Growing trees: 89%. ~ time remaining: 1 seconds. #> Growing trees: 100%. #> Computing predictions: 100%."},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"out-of-bag-data","dir":"Articles","previous_headings":"","what":"Out-of-bag data","title":"Out-of-bag predictions and evaluation","text":"random forests, tree grown bootstrapped version training set. bootstrap samples selected replacement, bootstrapped training set contains two-thirds instances original training set. ‘--bag’ data instances bootstrapped training set.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"out-of-bag-predictions-and-error","dir":"Articles","previous_headings":"","what":"Out-of-bag predictions and error","title":"Out-of-bag predictions and evaluation","text":"tree random forest can make predictions --bag data, --bag predictions can aggregated make ensemble --bag prediction. Since --bag data used grow tree, accuracy ensemble --bag predictions approximate generalization error random forest. --bag prediction error plays central role routines estimate variable importance, e.g. negation importance. Let’s fit oblique random survival forest plot distribution ensemble --bag predictions. surprisingly, survival predictions 0 1. Next, let’s check --bag accuracy fit: --bag estimate Harrell’s C-statistic (default method evaluate --bag predictions) 0.8438981.","code":"fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, oobag_pred_type = 'surv', oobag_pred_horizon = 2000) hist(fit$pred_oobag, main = 'Ensemble out-of-bag survival predictions at t=3,500') # what function is used to evaluate out-of-bag predictions? fit$eval_oobag$stat_type #> [1] \"Harrell's C-statistic\" # what is the output from this function? fit$eval_oobag$stat_values #> [,1] #> [1,] 0.8438981"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"monitoring-out-of-bag-error","dir":"Articles","previous_headings":"","what":"Monitoring out-of-bag error","title":"Out-of-bag predictions and evaluation","text":"--bag data set contains one-third training set, --bag error estimate usually converges stable value trees added forest. want monitor convergence --bag error oblique random survival forest, can set oobag_eval_every compute --bag error every oobag_eval_every tree. example, let’s compute --bag error fitting tree forest 50 trees: general, least 500 trees recommended random forest fit. ’re just using 50 case better illustration --bag error curve. Also, helps make run-times low whenever need re-compile package vignettes.","code":"fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_type = 'surv', oobag_pred_horizon = 2000, oobag_eval_every = 1) plot( x = seq(1, 50, by = 1), y = fit$eval_oobag$stat_values, main = 'Out-of-bag C-statistic computed after each new tree is grown.', xlab = 'Number of trees grown', ylab = fit$eval_oobag$stat_type )"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"user-supplied-out-of-bag-evaluation-functions","dir":"Articles","previous_headings":"","what":"User-supplied out-of-bag evaluation functions","title":"Out-of-bag predictions and evaluation","text":"cases, may want control --bag error estimated. example, let’s use Brier score SurvMetrics package: two ways apply function compute --bag error. First, can apply function --bag survival predictions stored ‘aorsf’ objects, e.g: Second, can pass function orsf(), used place Harrell’s C-statistic: can also compute time-dependent C-statistic instead Harrell’s C-statistic (default oob function):","code":"oobag_fun_brier <- function(y_mat, w_vec, s_vec){ # output is numeric vector of length 1 as.numeric( SurvMetrics::Brier( object = Surv(time = y_mat[, 1], event = y_mat[, 2]), pre_sp = s_vec, # t_star in Brier() should match oob_pred_horizon in orsf() t_star = 2000 ) ) } oobag_fun_brier(y_mat = pbc_orsf[,c('time', 'status')], s_vec = fit$pred_oobag) #> [1] 0.109413 fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_brier, oobag_eval_every = 1) plot( x = seq(1, 50, by = 1), y = fit$eval_oobag$stat_values, main = 'Out-of-bag error computed after each new tree is grown.', sub = 'For the Brier score, lower values indicate more accurate predictions', xlab = 'Number of trees grown', ylab = \"Brier score\" ) oobag_fun_tdep_cstat <- function(y_mat, w_vec, s_vec){ as.numeric( SurvMetrics::Cindex( object = Surv(time = y_mat[, 1], event = y_mat[, 2]), predicted = s_vec, t_star = 2000 ) ) } fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_tdep_cstat, oobag_eval_every = 1) plot( x = seq(50), y = fit$eval_oobag$stat_values, main = 'Out-of-bag time-dependent AUC\\ncomputed after each new tree is grown.', xlab = 'Number of trees grown', ylab = \"AUC at t = 2,000\" )"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"specific-instructions-on-user-supplied-functions","dir":"Articles","previous_headings":"User-supplied out-of-bag evaluation functions","what":"Specific instructions on user-supplied functions","title":"Out-of-bag predictions and evaluation","text":"User-supplied functions must: exactly three arguments named y_mat, w_vec, s_vec. return numeric output length 1 either conditions true, error occur. simple test make sure user-supplied function work aorsf package :","code":"# Helper code to make sure your oobag_fun function will work with aorsf # time and status values test_time <- seq(from = 1, to = 5, length.out = 100) test_status <- rep(c(0,1), each = 50) # y-matrix is presumed to contain time and status (with column names) y_mat <- cbind(time = test_time, status = test_status) # s_vec is presumed to be a vector of survival probabilities s_vec <- seq(0.9, 0.1, length.out = 100) # see 1 in the checklist above names(formals(oobag_fun_tdep_cstat)) == c(\"y_mat\", \"w_vec\", \"s_vec\") #> [1] TRUE TRUE TRUE test_output <- oobag_fun_tdep_cstat(y_mat = y_mat, w_vec = w_vec, s_vec = s_vec) # test output should be numeric is.numeric(test_output) #> [1] TRUE # test_output should be a numeric value of length 1 length(test_output) == 1 #> [1] TRUE"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"user-supplied-functions-for-negation-importance-","dir":"Articles","previous_headings":"","what":"User-supplied functions for negation importance.","title":"Out-of-bag predictions and evaluation","text":"Negation importance based --bag error, course may curious negation importance computed using different statistics. workflow exactly example , except two things: specify importance = 'negate' fit model. want use modified version C-stat, specifically 1 - C-stat, aorsf computes variable importance. Also, speed computations, going monitor --bag error .","code":"oobag_fun_tdep_cstat_inverse <- function(y_mat, w_vec, s_vec){ 1 - oobag_fun_tdep_cstat(y_mat, w_vec, s_vec) } fit_tdep_cstat <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 100, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_tdep_cstat_inverse, importance = 'negate') fit_tdep_cstat$importance #> bili copper sex stage protime albumin #> 0.123055740 0.050740630 0.044082730 0.031778910 0.025512840 0.022952200 #> chol age ascites ast spiders edema #> 0.016352160 0.015756850 0.012471920 0.011893780 0.011507280 0.006239915 #> hepato trt trig alk.phos platelet #> 0.005418660 0.004056760 0.002503870 0.002399810 0.001907740"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"notes","dir":"Articles","previous_headings":"","what":"Notes","title":"Out-of-bag predictions and evaluation","text":"evaluating --bag error: oobag_pred_horizon input orsf() determines prediction horizon --bag predictions. prediction horizon needs specified evaluate prediction accuracy cases, examples . sure check case using functions, , sure oobag_pred_horizon matches prediction horizon used custom function. functions expect predicted risk (.e., 1 - predicted survival), others expect predicted survival. cases, also able use function whatsoever compute --bag prediction error estimating negation permutation importance, assuming passes tests . Unfortunately, exception riskRegression::Score(), one favorites. experimented riskRegression::Score found work try run C++. sure case.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"partial-dependence-pd","dir":"Articles","previous_headings":"","what":"Partial dependence (PD)","title":"PD and ICE curves with ORSF","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. Begin fitting ORSF ensemble. Set prediction horizon 5 years fit ensemble aorsf function pass ensemble assume want compute predictions 5 years.","code":"library(aorsf) pred_horizon <- 365.25 * 5 set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = pred_horizon) fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 150 #> N events: 52 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 10 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.83 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"three-ways-to-compute-pd","dir":"Articles","previous_headings":"","what":"Three ways to compute PD","title":"PD and ICE curves with ORSF","text":"can compute PD three ways aorsf: using -bag predictions training data using --bag predictions training data using predictions new set data -bag PD indicates relationships model learned training. helpful goal interpret model. --bag PD indicates relationships model learned training using --bag data simulates application model new data. want test model’s reliability fairness new data don’t access large testing set. new data PD shows model predicts outcomes observations seen. helpful want test model’s reliability fairness. Let’s re-fit ORSF available data proceeding next sections.","code":"pd_inb <- orsf_pd_inb(fit, pred_spec = list(bili = 1:5)) pd_inb #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2051019 0.02133505 0.1041901 0.7767571 #> 2: 1826.25 2 0.2375037 0.03381034 0.1317682 0.8012817 #> 3: 1826.25 3 0.2789144 0.05481241 0.1837621 0.8168042 #> 4: 1826.25 4 0.3291518 0.09241597 0.2449438 0.8348067 #> 5: 1826.25 5 0.3646945 0.12594131 0.2830947 0.8379429 pd_oob <- orsf_pd_oob(fit, pred_spec = list(bili = 1:5)) pd_oob #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2057925 0.02172816 0.1123039 0.7770151 #> 2: 1826.25 2 0.2376552 0.03557858 0.1421651 0.7975343 #> 3: 1826.25 3 0.2783471 0.05443407 0.1808253 0.8059614 #> 4: 1826.25 4 0.3286654 0.09472187 0.2397779 0.8234719 #> 5: 1826.25 5 0.3637542 0.12856484 0.2807135 0.8243895 pd_test <- orsf_pd_new(fit, new_data = pbc_orsf_test, pred_spec = list(bili = 1:5)) pd_test #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2438990 0.02179705 0.1779682 0.8047647 #> 2: 1826.25 2 0.2754938 0.03964752 0.2152529 0.8222641 #> 3: 1826.25 3 0.3180577 0.06354033 0.2671143 0.8375648 #> 4: 1826.25 4 0.3688818 0.10422564 0.3255283 0.8540203 #> 5: 1826.25 5 0.4045088 0.13846933 0.3595994 0.8570826 set.seed(329730) fit <- orsf(pbc_orsf, Surv(time, status) ~ . -id, oobag_pred_horizon = pred_horizon)"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"one-variable-one-horizon","dir":"Articles","previous_headings":"","what":"One variable, one horizon","title":"PD and ICE curves with ORSF","text":"Computing PD single variable straightforward: output shows expected predicted mortality risk men substantially higher women 5 years baseline.","code":"pd_sex <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\"))) pd_sex #> pred_horizon sex mean lwr medn upr #> 1: 1826.25 m 0.3451974 0.0427366 0.2331537 0.9327978 #> 2: 1826.25 f 0.2978609 0.0136574 0.1579864 0.9440116"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"one-variable-moving-horizon","dir":"Articles","previous_headings":"","what":"One variable, moving horizon","title":"PD and ICE curves with ORSF","text":"effect predictor varies time? PD can show . inspection, can see males higher risk females difference risk grows time. can also seen viewing ratio expected risk time:","code":"pd_sex_tv <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\")), pred_horizon = seq(365, 365*5)) ggplot(pd_sex_tv, aes(x = pred_horizon, y = mean, color = sex)) + geom_line() + labs(x = 'Time since baseline', y = 'Expected risk') library(data.table) ratio_tv <- pd_sex_tv[ , .(ratio = mean[sex == 'm'] / mean[sex == 'f']), by = pred_horizon ] ggplot(ratio_tv, aes(x = pred_horizon, y = ratio)) + geom_line(color = 'grey') + geom_smooth(color = 'black', se = FALSE) + labs(x = 'time since baseline', y = 'ratio in expected risk for males versus females') #> `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = \"cs\")'"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"multiple-variables-marginally","dir":"Articles","previous_headings":"","what":"Multiple variables, marginally","title":"PD and ICE curves with ORSF","text":"want compute PD marginally multiple variables, just list variable values pred_spec specify expand_grid = FALSE. Now tedious wanted variables? bet. ’s made function . bonus, printed output sorted least important variables. ’s easy enough turn ‘summary’ object data.table downstream plotting tables.","code":"pd_two_vars <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\"), bili = 1:5), expand_grid = FALSE) pd_two_vars #> pred_horizon variable value level mean lwr medn upr #> 1: 1826.25 sex NA m 0.3451974 0.04273660 0.2331537 0.9327978 #> 2: 1826.25 sex NA f 0.2978609 0.01365740 0.1579864 0.9440116 #> 3: 1826.25 bili 1 0.2377429 0.01650482 0.1303688 0.8575800 #> 4: 1826.25 bili 2 0.2867698 0.04155204 0.1765653 0.8932449 #> 5: 1826.25 bili 3 0.3373077 0.06634432 0.2427874 0.9101957 #> 6: 1826.25 bili 4 0.3837022 0.09015452 0.3056544 0.9105841 #> 7: 1826.25 bili 5 0.4175154 0.12377812 0.3476088 0.9125227 pd_smry <- orsf_summarize_uni(fit) pd_smry #> #> -- bili (VI Rank: 1) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2327133 0.1276946 0.05237649 0.3619835 #> 1.4 0.2528210 0.1474908 0.06277984 0.3820733 #> 3.5 0.3642485 0.2821089 0.15739236 0.5383749 #> #> -- copper (VI Rank: 2) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2627892 0.1430477 0.05239847 0.4404427 #> 74 0.2818189 0.1623311 0.06048325 0.4828843 #> 129 0.3344419 0.2233296 0.10952284 0.5430557 #> #> -- sex (VI Rank: 3) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3451974 0.2331537 0.11147842 0.5720925 #> f 0.2978609 0.1579864 0.05257254 0.5329951 #> #> -- stage (VI Rank: 4) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 1 0.2568042 0.1364586 0.04826090 0.4308291 #> 2 0.2681925 0.1445437 0.04785007 0.4609626 #> 3 0.2924500 0.1646026 0.05226510 0.5065589 #> 4 0.3370752 0.2083311 0.08155862 0.5754540 #> #> -- albumin (VI Rank: 5) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 3.3 0.3189682 0.1890327 0.06882698 0.5634286 #> 3.5 0.2932022 0.1594218 0.05570448 0.5272234 #> 3.8 0.2762511 0.1513096 0.05220714 0.4862937 #> #> -- protime (VI Rank: 6) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 10 0.2804891 0.1543938 0.05164468 0.4924859 #> 11 0.2945915 0.1689627 0.05912412 0.5214456 #> 11 0.3162286 0.1898853 0.07036679 0.5532870 #> #> -- age (VI Rank: 7) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 42 0.2717577 0.1388202 0.05264347 0.4541974 #> 50 0.2985259 0.1797617 0.05562463 0.5285119 #> 57 0.3298805 0.2328557 0.07349113 0.5641154 #> #> -- ast (VI Rank: 8) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 82 0.2805643 0.1468324 0.05099136 0.5042377 #> 117 0.2974411 0.1529651 0.05662912 0.5347199 #> 153 0.3214486 0.1820013 0.06881978 0.5836435 #> #> -- ascites (VI Rank: 9) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2978562 0.1652968 0.05503683 0.5213956 #> 1 0.4612987 0.3958924 0.25509873 0.6458299 #> #> -- chol (VI Rank: 10) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 250 0.2861065 0.1528316 0.04722530 0.4946336 #> 310 0.2941216 0.1591265 0.05254708 0.4988147 #> 401 0.3154760 0.1890564 0.07563854 0.5148573 #> #> -- hepato (VI Rank: 11) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2862485 0.1593974 0.05157100 0.5025263 #> 1 0.3190555 0.1835008 0.07087698 0.5626892 #> #> -- edema (VI Rank: 12) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2934074 0.1619484 0.05366214 0.5174757 #> 0.5 0.3522489 0.2426686 0.10376815 0.5853984 #> 1 0.4561646 0.3621368 0.26357824 0.6406115 #> #> -- spiders (VI Rank: 13) --------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2918349 0.1561874 0.05157100 0.5115626 #> 1 0.3325745 0.2117035 0.08822863 0.5619282 #> #> -- trt (VI Rank: 14) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> d_penicill_main 0.3066250 0.1732905 0.06037907 0.5329951 #> placebo 0.3025089 0.1587980 0.05366214 0.5531033 #> #> -- trig (VI Rank: 15) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 85 0.2922057 0.1538922 0.05008490 0.5097474 #> 108 0.3009226 0.1647050 0.05206774 0.5217247 #> 151 0.3154298 0.1814550 0.06141081 0.5207955 #> #> -- alk.phos (VI Rank: 16) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 922 0.3034132 0.1650884 0.05647195 0.5507628 #> 1278 0.3041575 0.1668115 0.05783564 0.5506103 #> 2068 0.3080757 0.1681812 0.05979272 0.5577576 #> #> -- platelet (VI Rank: 17) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 200 0.3087603 0.1702265 0.05788128 0.5620491 #> 257 0.3028452 0.1611317 0.05491025 0.5524962 #> 318 0.2981837 0.1641031 0.05500888 0.5324483 #> #> Predicted risk at time t = 1826.25 for top 17 predictors head(as.data.table(pd_smry)) #> variable importance Value Mean Median 25th % 75th % #> 1: bili 0.12455311 0.80 0.2327133 0.1276946 0.05237649 0.3619835 #> 2: bili 0.12455311 1.4 0.2528210 0.1474908 0.06277984 0.3820733 #> 3: bili 0.12455311 3.5 0.3642485 0.2821089 0.15739236 0.5383749 #> 4: copper 0.05316189 43 0.2627892 0.1430477 0.05239847 0.4404427 #> 5: copper 0.05316189 74 0.2818189 0.1623311 0.06048325 0.4828843 #> 6: copper 0.05316189 129 0.3344419 0.2233296 0.10952284 0.5430557 #> pred_horizon level #> 1: 1826.25 #> 2: 1826.25 #> 3: 1826.25 #> 4: 1826.25 #> 5: 1826.25 #> 6: 1826.25 "},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"multiple-variables-jointly","dir":"Articles","previous_headings":"","what":"Multiple variables, jointly","title":"PD and ICE curves with ORSF","text":"PD can show expected value model’s predictions function specific predictor, function multiple predictors. instance, can estimate predicted risk joint function bili, edema, trt: inspection, model’s predictions indicate slightly lower risk placebo group, seem change much different values bili edema. clear increase predicted risk higher levels edema higher levels bili slope predicted risk function bili appears highest among patients edema 0.5. effect bili modified edema 0.5? quick sanity check coxph suggests .","code":"pred_spec = list(bili = seq(1, 5, length.out = 20), edema = levels(pbc_orsf_train$edema), trt = levels(pbc_orsf$trt)) pd_bili_edema <- orsf_pd_oob(fit, pred_spec) library(ggplot2) ggplot(pd_bili_edema, aes(x = bili, y = medn, col = trt, linetype = edema)) + geom_line() + labs(y = 'Expected predicted risk') library(survival) pbc_orsf$edema_05 <- ifelse(pbc_orsf$edema == '0.5', 'yes', 'no') fit_cph <- coxph(Surv(time,status) ~ edema_05 * bili, data = pbc_orsf) anova(fit_cph) #> Analysis of Deviance Table #> Cox model: response is Surv(time, status) #> Terms added sequentially (first to last) #> #> loglik Chisq Df Pr(>|Chi|) #> NULL -550.19 #> edema_05 -546.83 6.7248 1 0.009508 ** #> bili -513.59 66.4689 1 3.555e-16 *** #> edema_05:bili -510.54 6.1112 1 0.013433 * #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"individual-conditional-expectations-ice","dir":"Articles","previous_headings":"","what":"Individual conditional expectations (ICE)","title":"PD and ICE curves with ORSF","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. Just like PD, can compute ICE using -bag, --bag, testing data, principles apply. ’ll use --bag estimates .","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"visualizing-ice-curves","dir":"Articles","previous_headings":"","what":"Visualizing ICE curves","title":"PD and ICE curves with ORSF","text":"Inspecting ICE curves observation can help identify whether heterogeneity model’s predictions. .e., effect variable follow pattern data, groups variable impacts risk differently? going turn boundary checking orsf_ice_oob setting boundary_checks = FALSE, allow generate ICE curves go beyond 90th percentile bili. id_variable identifier current value variable(s) data. redundant one variable, helpful multiple variables. id_row identifier observation original data. used group observation’s predictions together plots. plots, helpful scale ICE data. subtract initial value predicted risk (.e., bili = 1) observation’s conditional expectation values. , Every curve start 0 plot shows change predicted risk function bili. Now can visualize curves. inspection figure, individual slopes cluster around overall trend - Good! small number individual slopes appear flat. may helpful investigate .","code":"pred_spec <- list(bili = seq(1, 10, length.out = 25)) ice_oob <- orsf_ice_oob(fit, pred_spec, boundary_checks = FALSE) ice_oob #> id_variable id_row pred_horizon bili pred #> 1: 1 1 1826.25 1 0.8765990 #> 2: 1 2 1826.25 1 0.1130416 #> 3: 1 3 1826.25 1 0.7143673 #> 4: 1 4 1826.25 1 0.3291217 #> 5: 1 5 1826.25 1 0.1019858 #> --- #> 6896: 25 272 1826.25 10 0.2732672 #> 6897: 25 273 1826.25 10 0.4605414 #> 6898: 25 274 1826.25 10 0.4609702 #> 6899: 25 275 1826.25 10 0.2830265 #> 6900: 25 276 1826.25 10 0.5527966 ice_oob[, pred_subtract := rep(pred[id_variable==1], times=25)] ice_oob[, pred := pred - pred_subtract] library(ggplot2) ggplot(ice_oob, aes(x = bili, y = pred, group = id_row)) + geom_line(alpha = 0.15) + labs(y = 'Change in predicted risk') + geom_smooth(se = FALSE, aes(group = 1)) #> `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = \"cs\")'"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"limitations-of-pd","dir":"Articles","previous_headings":"","what":"Limitations of PD","title":"PD and ICE curves with ORSF","text":"Partial dependence number known limitations assumptions users aware (see Hooker, 2021). particular, partial dependence less intuitive >2 predictors examined jointly, assumed feature(s) partial dependence computed correlated features (likely true many cases). Accumulated local effect plots can used (see ) case feature independence valid assumption.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"references","dir":"Articles","previous_headings":"","what":"References","title":"PD and ICE curves with ORSF","text":"Giles Hooker, Lucas Mentch, Siyu Zhou. Unrestricted Permutation forces Extrapolation: Variable Importance Requires least One Model, Free Variable Importance. arXiv e-prints 2021 Oct; arXiv-1905. URL: https://doi.org/10.48550/arXiv.1905.03151","code":""},{"path":"https://bcjaeger.github.io/aorsf/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Byron Jaeger. Author, maintainer. Nicholas Pajewski. Contributor. Sawyer Welden. Contributor. Christopher Jackson. Reviewer. Marvin Wright. Reviewer. Lukas Burk. Reviewer.","code":""},{"path":"https://bcjaeger.github.io/aorsf/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Jaeger et al. (2022). aorsf: R package supervised learning using oblique random survival forest. Journal Open Source Software, 7(77), 4705. https://doi.org/10.21105/joss.04705. Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics. 2023 Aug 3:1-6. Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique Random Survival Forests. Annals Applied Statistics. 13(3): 1847-1883. URL https://doi.org/10.1214/19-AOAS1261 DOI: 10.1214/19-AOAS1261","code":"@Article{, title = {aorsf: An R package for supervised learning using the oblique random survival forest}, author = {Byron C. Jaeger and Sawyer Welden and Kristin Lenoir and Nicholas M. Pajewski}, journal = {Journal of Open Source Software}, year = {2022}, volume = {7}, number = {77}, pages = {4705}, url = {https://doi.org/10.21105/joss.04705}, } @Article{, title = {Accelerated and interpretable oblique random survival forests}, author = {Byron C. Jaeger and Sawyer Welden and Kristin Lenoir and Jaime L. Speiser and Matthew W. Segar and Ambarish Pandey and Nicholas M. Pajewski}, journal = {Journal of Computational and Graphical Statistics}, year = {2023}, url = {https://doi.org/10.1080/10618600.2023.2231048}, } @Article{, title = {Oblique Random Survival Forests}, author = {Byron C. Jaeger and D. Leann Long and Dustin M. Long and Mario Sims and Jeff M. Szychowski and Yuan-I Min and Leslie A. Mcclure and George Howard and Noah Simon}, journal = {Annals of Applied Statistics}, year = {2019}, volume = {13}, number = {3}, pages = {1847--1883}, url = {https://doi.org/10.1214/19-AOAS1261}, }"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"aorsf-","dir":"","previous_headings":"","what":"Accelerated Oblique Random Survival Forests","title":"Accelerated Oblique Random Survival Forests","text":"Fit, interpret, make predictions oblique random survival forests (ORSFs).","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"why-aorsf","dir":"","previous_headings":"","what":"Why aorsf?","title":"Accelerated Oblique Random Survival Forests","text":"Hundreds times faster obliqueRSF.1 Accurate predictions censored outcomes.2 Negation importance, novel technique estimate variable importance ORSFs.2 Intuitive API formula based interface. Extensive input checks informative error messages.","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Accelerated Oblique Random Survival Forests","text":"can install aorsf CRAN using can install development version aorsf GitHub :","code":"install.packages(\"aorsf\") # install.packages(\"remotes\") remotes::install_github(\"ropensci/aorsf\")"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"what-is-an-oblique-decision-tree","dir":"","previous_headings":"","what":"What is an oblique decision tree?","title":"Accelerated Oblique Random Survival Forests","text":"Decision trees developed splitting set training data two new subsets, goal similarity within new subsets . splitting process repeated resulting subsets data stopping criterion met. new subsets data formed based single predictor, decision tree said axis-based splits data appear perpendicular axis predictor. linear combinations variables used instead single variable, tree oblique splits data neither parallel right angle axis. Figure: Decision trees classification axis-based splitting (left) oblique splitting (right). Cases orange squares; controls purple circles. trees partition predictor space defined variables X1 X2, oblique splits better job separating two classes.","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"examples","dir":"","previous_headings":"","what":"Examples","title":"Accelerated Oblique Random Survival Forests","text":"orsf() function can fit several types ORSF ensembles. personal favorite accelerated ORSF great combination prediction accuracy computational efficiency (see JCGS paper).2","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5)"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"inspect","dir":"","previous_headings":"Examples","what":"Inspect","title":"Accelerated Oblique Random Survival Forests","text":"Printing output orsf() give information descriptive statistics ensemble. See print.orsf_fit description line printed output. See orsf examples details controlling ORSF ensemble fits using prediction modeling workflows.","code":"fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 150 #> N events: 52 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 12 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.83 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"variable-importance","dir":"","previous_headings":"Examples","what":"Variable importance","title":"Accelerated Oblique Random Survival Forests","text":"importance individual variables can estimated three ways using aorsf: negation2: variable assessed separately multiplying variable’s coefficients -1 determining much model’s performance changes. worse model’s performance negating coefficients given variable, important variable. technique promising b/c require permutation emphasizes variables larger coefficients linear combinations, also relatively new hasn’t studied much permutation importance. See Jaeger, 2023 details technique. permutation: variable assessed separately randomly permuting variable’s values determining much model’s performance changes. worse model’s performance permuting values given variable, important variable. technique flexible, intuitive, frequently used. also several known limitations analysis variance (ANOVA)3: p-value computed coefficient linear combination variables decision tree. Importance individual predictor variable proportion times p-value coefficient < 0.01. technique efficient computationally, may effective permutation negation terms selecting signal noise variables. See Menze, 2011 details technique. can supply R function estimate --bag error using negation permutation importance (see oob vignette)","code":"orsf_vi_negate(fit) #> bili sex copper ast age #> 0.1190290560 0.0619448918 0.0290622719 0.0260108174 0.0251263919 #> stage protime edema ascites hepato #> 0.0237725455 0.0158527871 0.0117258458 0.0105685230 0.0092045115 #> albumin chol trt alk.phos spiders #> 0.0082732463 0.0041510636 0.0036632967 0.0010256161 -0.0003298163 #> trig platelet #> -0.0011060747 -0.0045517701 orsf_vi_permute(fit) #> bili copper ast age sex #> 0.0514033622 0.0170611427 0.0142515581 0.0140224052 0.0131459748 #> stage protime ascites edema albumin #> 0.0119768965 0.0102950158 0.0098067817 0.0081730899 0.0080652857 #> hepato chol alk.phos trig spiders #> 0.0069734562 0.0032811220 0.0015862128 0.0014943484 0.0007825752 #> trt platelet #> -0.0007067631 -0.0022338286 orsf_vi_anova(fit) #> ascites bili edema sex copper age ast #> 0.39107612 0.36316990 0.36316238 0.24720893 0.20547180 0.19213732 0.19029233 #> albumin stage hepato trig chol protime alk.phos #> 0.17219680 0.17068758 0.16126761 0.13379872 0.12964021 0.12659698 0.12352611 #> spiders platelet trt #> 0.11728395 0.08997135 0.07305095"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"partial-dependence-pd","dir":"","previous_headings":"Examples","what":"Partial dependence (PD)","title":"Accelerated Oblique Random Survival Forests","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. summary function, orsf_summarize_uni(), computes PD many variables ask , using sensible values. PD, see vignette","code":"orsf_summarize_uni(fit, n_variables = 2) #> #> -- bili (VI Rank: 1) ---------------------------- #> #> |----------------- Risk -----------------| #> Value Mean Median 25th % 75th % #> 0.70 0.2094827 0.09046313 0.03827429 0.3184979 #> 1.3 0.2283358 0.11078307 0.05347112 0.3492104 #> 3.2 0.3090977 0.21368937 0.11889617 0.4412656 #> #> -- sex (VI Rank: 2) ----------------------------- #> #> |----------------- Risk -----------------| #> Value Mean Median 25th % 75th % #> m 0.3667488 0.2614335 0.15611841 0.5836574 #> f 0.2507675 0.1051310 0.04355687 0.3596206 #> #> Predicted risk at time t = 1826.25 for top 2 predictors"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"individual-conditional-expectations-ice","dir":"","previous_headings":"Examples","what":"Individual conditional expectations (ICE)","title":"Accelerated Oblique Random Survival Forests","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. ICE, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"comparison-to-existing-software","dir":"","previous_headings":"","what":"Comparison to existing software","title":"Accelerated Oblique Random Survival Forests","text":"Comparisons aorsf existing software presented JCGS paper. paper: describes aorsf detail summary procedures used tree fitting algorithm runs general benchmark comparing aorsf obliqueRSF several learners reports prediction accuracy computational efficiency learners. runs simulation study comparing variable importance techniques ORSFs, axis based RSFs, boosted trees. reports probability variable importance technique rank relevant variable higher importance irrelevant variable. hands-comparison aorsf R packages provided orsf examples","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"references","dir":"","previous_headings":"","what":"References","title":"Accelerated Oblique Random Survival Forests","text":"Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique random survival forests. Annals applied statistics 2019 Sep; 13(3):1847-83. DOI: 10.1214/19-AOAS1261 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. URL: https://doi.org/10.1080/10618600.2023.2231048 Menze BH, Kelm BM, Splitthoff DN, Koethe U, Hamprecht FA. oblique random forests. Joint European Conference Machine Learning Knowledge Discovery Databases 2011 Sep 4; pp. 453-469. DOI: 10.1007/978-3-642-23783-6_29","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"funding","dir":"","previous_headings":"","what":"Funding","title":"Accelerated Oblique Random Survival Forests","text":"developers aorsf receive financial support Center Biomedical Informatics, Wake Forest University School Medicine. also receive support National Center Advancing Translational Sciences National Institutes Health Award Number UL1TR001420. content solely responsibility authors necessarily represent official views National Institutes Health.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/aorsf-package.html","id":null,"dir":"Reference","previous_headings":"","what":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","title":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","text":"Fit, interpret, make predictions oblique random survival forests. Oblique decision trees notoriously slow compared axis based counterparts, 'aorsf' runs fast faster axis-based decision tree algorithms right-censored time--event outcomes. Methods accelerate interpret oblique random survival forest described Jaeger et al., (2023) doi:10.1080/10618600.2023.2231048 .","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/aorsf-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","text":"Maintainer: Byron Jaeger bjaeger@wakehealth.edu (ORCID) contributors: Nicholas Pajewski [contributor] Sawyer Welden swelden@wakehealth.edu [contributor] Christopher Jackson chris.jackson@mrc-bsu.cam.ac.uk [reviewer] Marvin Wright [reviewer] Lukas Burk [reviewer]","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce to data.table — as.data.table.orsf_summary_uni","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"Convert 'orsf_summary' object data.table object.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"","code":"# S3 method for orsf_summary_uni as.data.table(x, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"x object class 'orsf_summary_uni' ... used","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"data.table","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"","code":"library(data.table) object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) smry <- orsf_summarize_uni(object, n_variables = 3) as.data.table(smry) #> variable importance value mean medn lwr upr #> 1: bili 0.11862305 0.80 0.2346974 0.1235689 0.05458337 0.3570445 #> 2: bili 0.11862305 1.4 0.2572898 0.1375330 0.06579158 0.3982177 #> 3: bili 0.11862305 3.5 0.3669482 0.2867627 0.16523700 0.5326230 #> 4: copper 0.05409179 43 0.2618045 0.1460566 0.05106986 0.4577305 #> 5: copper 0.05409179 74 0.2827343 0.1589601 0.06168608 0.4784359 #> 6: copper 0.05409179 129 0.3379671 0.2260433 0.11046273 0.5473944 #> 7: sex 0.03398356 m 0.3490559 0.2433929 0.11417578 0.5746041 #> 8: sex 0.03398356 f 0.2992297 0.1627853 0.05595057 0.5332348 #> pred_horizon level #> 1: 1788 #> 2: 1788 #> 3: 1788 #> 4: 1788 #> 5: 1788 #> 6: 1788 #> 7: 1788 m #> 8: 1788 f"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":null,"dir":"Reference","previous_headings":"","what":"Oblique Random Survival Forest (ORSF) — orsf","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Fit oblique random survival forest","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"","code":"orsf( data, formula, control = orsf_control_fast(), weights = NULL, n_tree = 500, n_split = 5, n_retry = 3, n_thread = 1, mtry = NULL, sample_with_replacement = TRUE, sample_fraction = 0.632, leaf_min_events = 1, leaf_min_obs = 5, split_rule = \"logrank\", split_min_events = 5, split_min_obs = 10, split_min_stat = switch(split_rule, logrank = 3.841459, cstat = 0.5), oobag_pred_type = \"surv\", oobag_pred_horizon = NULL, oobag_eval_every = n_tree, oobag_fun = NULL, importance = \"anova\", group_factors = TRUE, tree_seeds = NULL, attach_data = TRUE, no_fit = FALSE, na_action = \"fail\", verbose_progress = FALSE, ... ) orsf_train(object)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"data data.frame, tibble, data.table contains relevant variables. formula (formula) response left hand side include time variable, followed status variable, may written inside call Surv (see examples). terms right names predictor variables. control (orsf_control) object returned one orsf_control functions: orsf_control_fast (default) uses single iteration Newton Raphson scoring identify linear combination predictors. orsf_control_cph uses Newton Raphson scoring convergence criteria met. orsf_control_net uses glmnet identify linear combinations predictors, similar Jaeger (2019). orsf_control_custom allows user apply function create linear combinations predictors. weights (numeric vector) Optional. given, input length equal nrow(data). Values weights treated like replication weights, .e., value 2 thing 2 observations data, containing copy corresponding person's data. Use weights cautiously, orsf count number observations events prior growing node tree, higher values weights lead deeper trees. n_tree (integer) number trees grow. Default n_tree = 500. n_split (integer) number cut-points assessed splitting node decision trees. Default n_split = 5. n_retry (integer) node can split, current linear combination inputs unable provide valid split, orsf try new linear combination based different set randomly selected predictors, n_retry times. Default n_retry = 3. Set n_retry = 0 prevent retries. n_thread (integer) number threads use growing trees, computing predictions, computing importance. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. mtry (integer) Number predictors randomly included candidates splitting node. default smallest integer greater square root number total predictors, .e., mtry = ceiling(sqrt(number predictors)) sample_with_replacement (logical) TRUE (default), observations sampled replacement -bag sample created decision tree. FALSE, observations sampled without replacement tree -bag sample containing sample_fraction% original sample. sample_fraction (double) proportion observations trees' -bag sample contain, relative number rows data. used sample_with_replacement FALSE. Default value 0.632. leaf_min_events (integer) minimum number events leaf node. Default leaf_min_events = 1 leaf_min_obs (integer) minimum number observations leaf node. Default leaf_min_obs = 5. split_rule (character) assess quality potential splitting rule node. Valid options 'logrank' : log-rank test statistic. 'cstat' : Harrell's concordance statistic. split_min_events (integer) minimum number events required node consider splitting . Default split_min_events = 5 split_min_obs (integer) minimum number observations required node consider splitting . Default split_min_obs = 10. split_min_stat (double) minimum test statistic required split node. Default 3.841459 split_rule = 'logrank' 0.50 split_rule = 'cstat'. splits found statistic exceeding split_min_stat, given node either becomes leaf retry occurs (n_retry retries). oobag_pred_type (character) type --bag predictions compute fitting ensemble. Valid options 'none' : compute --bag predictions 'risk' : probability event occurring oobag_pred_horizon. 'surv' : 1 - risk. 'chf' : cumulative hazard function oobag_pred_horizon. 'mort' : mortality, .e., number events expected observations training data identical given observation. oobag_pred_horizon (numeric) numeric value indicating time used --bag predictions. Default median observed times, .e., oobag_pred_horizon = median(time). oobag_eval_every (integer) --bag performance ensemble checked every oobag_eval_every trees. , oobag_eval_every = 10, --bag performance checked growing 10th tree, 20th tree, . Default oobag_eval_every = n_tree. oobag_fun (function) used evaluating --bag prediction accuracy every oobag_eval_every trees. oobag_fun = NULL (default), Harrell's C-statistic (1982) used evaluate accuracy. use oobag_fun note following: oobag_fun two inputs: y_mat s_vec y_mat two column matrix first column named 'time', second named 'status' s_vec numeric vector containing predicted survival probabilities. oobag_fun return numeric output length 1 details, see --bag vignette. importance (character) Indicate method variable importance: 'none': variable importance computed. 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance details methods, see orsf_vi. group_factors (logical) relevant variable importance estimated. TRUE, importance factor variables reported overall aggregating importance individual levels factor. FALSE, importance individual factor levels returned. tree_seeds (integer vector) Optional. specified, random seeds set using values tree_seeds[] growing tree . Two forests grown number trees seeds exact --bag samples, making --bag error estimates forests comparable. NULL (default), seeds set training process. attach_data (logical) TRUE, copy training data attached output. helpful plan using functions like orsf_pd_oob orsf_summarize_uni interpret forest using training data. Default TRUE. no_fit (logical) TRUE, model fitting steps defined saved, training initiated. object returned can directly submitted orsf_train() long attach_data TRUE. na_action (character) happen data contains missing values (.e., NA values). Valid options : 'fail' : error thrown data contains NA values 'omit' : rows data incomplete data dropped 'impute_meanmode' : missing values continuous categorical variables data imputed using mean mode, respectively. Note option selected attach_data TRUE, data attached output imputed version data. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. ... arguments passed methods (currently used). object untrained 'aorsf' object, created setting no_fit = TRUE orsf().","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"accelerated oblique RSF object (aorsf)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"function based similar ORSF function obliqueRSF R package. primary difference function runs much faster. speed increase attributable better management memory (.e., unnecessary copies inputs) using Newton Raphson scoring algorithm identify linear combinations inputs rather performing penalized regression using routines glmnet.modified Newton Raphson scoring algorithm function applies adaptation C++ routine developed Terry M. Therneau fits Cox proportional hazards models (see survival::coxph() specifically survival::coxph.fit()).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"details-on-inputs","dir":"Reference","previous_headings":"","what":"Details on inputs","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"formula: response formula can survival object returned Surv function, can also just time status variables. .e., Surv(time, status) ~ . works just like time + status ~ . . symbol right hand side short-hand using variables data (omitting left hand side formula) predictors. order variables left hand side matters. .e., writing status + time ~ . make orsf assume status variable actually time variable. response variable can survival object stored data. example, y ~ . valid formula data$y inherits Surv class. Although can fit oblique random survival forest 1 predictor variable, formula least 2 predictors. reason recommendation linear combination predictors trivial one predictor. mtry: mtry parameter may temporarily reduced ensure least 2 events per predictor variable. occurs using orsf_control_cph coefficients Newton Raphson scoring algorithm may become unstable number covariates greater equal number events. reduction occur using orsf_control_net. oobag_fun: oobag_fun specified, used compute negation importance permutation importance, role ANOVA importance. n_thread: R function must called C++ (.e., user-supplied function compute --bag error identify linear combinations variables), n_thread automatically set 1 attempting run R functions multiple threads cause R session crash.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"what-is-an-oblique-decision-tree-","dir":"Reference","previous_headings":"","what":"What is an oblique decision tree?","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Decision trees developed splitting set training data two new subsets, goal similarity within new subsets . splitting process repeated resulting subsets data stopping criterion met. new subsets data formed based single predictor, decision tree said axis-based splits data appear perpendicular axis predictor. linear combinations variables used instead single variable, tree oblique splits data neither parallel right angle axis Figure : Decision trees classification axis-based splitting (left) oblique splitting (right). Cases orange squares; controls purple circles. trees partition predictor space defined variables X1 X2, oblique splits better job separating two classes.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"what-is-a-random-forest-","dir":"Reference","previous_headings":"","what":"What is a random forest?","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Random forests collections de-correlated decision trees. Predictions tree aggregated make ensemble prediction forest. details, see Breiman el, 2001.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"training-out-of-bag-error-and-testing","dir":"Reference","previous_headings":"","what":"Training, out-of-bag error, and testing","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"random forests, tree grown bootstrapped version training set. bootstrap samples selected replacement, bootstrapped training set contains two-thirds instances original training set. '--bag' data instances bootstrapped training set. tree random forest can make predictions --bag data, --bag predictions can aggregated make ensemble --bag prediction. Since --bag data used grow tree, accuracy ensemble --bag predictions approximate generalization error random forest. Generalization error refers error random forest's predictions applied predict outcomes data used train , .e., testing data.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"missing-data","dir":"Reference","previous_headings":"","what":"Missing data","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Data passed aorsf functions allowed missing values. user impute missing values using R package purpose, recipes mlr3pipelines.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"First load relevant packages entry-point aorsf standard call orsf(): printing fit provides quick descriptive summaries:","code":"set.seed(329730) suppressPackageStartupMessages({ library(aorsf) library(survival) library(tidymodels) library(tidyverse) library(randomForestSRC) library(ranger) library(riskRegression) library(obliqueRSF) }) fit <- orsf(pbc_orsf, Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"model-control","dir":"Reference","previous_headings":"","what":"Model control","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"examples make use orsf_control_ functions build compare models based --bag predictions. also standardize --bag samples using input argument tree_seeds","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"accelerated-linear-combinations","dir":"Reference","previous_headings":"","what":"Accelerated linear combinations","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"accelerated ORSF ensemble default nice balance computational speed prediction accuracy. runs single iteration Newton Raphson scoring Cox partial likelihood function find linear combinations predictors.","code":"fit_accel <- orsf(pbc_orsf, control = orsf_control_fast(), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-cox-regression","dir":"Reference","previous_headings":"","what":"Linear combinations with Cox regression","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"orsf_control_cph runs Cox regression non-terminal node survival tree, using regression coefficients create linear combinations predictors:","code":"fit_cph <- orsf(pbc_orsf, control = orsf_control_cph(), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-penalized-cox-regression","dir":"Reference","previous_headings":"","what":"Linear combinations with penalized cox regression","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"orsf_control_net runs penalized Cox regression non-terminal node survival tree, using regression coefficients create linear combinations predictors. can really helpful want feature selection within node, lot slower options.","code":"# select 3 predictors out of 5 to be used in # each linear combination of predictors. fit_net <- orsf(pbc_orsf, control = orsf_control_net(df_target = 3), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-your-own-function","dir":"Reference","previous_headings":"","what":"Linear combinations with your own function","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Let’s make two customized functions identify linear combinations predictors. first uses random coefficients second derives coefficients principal component analysis. third uses orsf() inside orsf(). can plug functions orsf_control_custom(), pass result orsf(): fit seems work best example? Let’s find evaluating --bag survival predictions. AUC values, highest lowest: indices prediction accuracy: inspection, net, accel, rlt high discrimination index prediction accuracy. rando pca less well, aren’t bad.","code":"f_rando <- function(x_node, y_node, w_node){ matrix(runif(ncol(x_node)), ncol=1) } f_pca <- function(x_node, y_node, w_node) { # estimate two principal components. pca <- stats::prcomp(x_node, rank. = 2) # use the second principal component to split the node pca$rotation[, 1L, drop = FALSE] } # This approach is known as reinforcement learning trees. # some special care is taken to prevent your R session from crashing. # Specifically, random coefficients are used when n_obs <= 10 # or n_events <= 5. f_aorsf <- function(x_node, y_node, w_node){ colnames(y_node) <- c('time', 'status') colnames(x_node) <- paste(\"x\", seq(ncol(x_node)), sep = '') data <- as.data.frame(cbind(y_node, x_node)) if(nrow(data) <= 10 || sum(y_node[,'status']) <= 5) return(matrix(runif(ncol(x_node)), ncol = 1)) fit <- orsf(data, time + status ~ ., weights = as.numeric(w_node), n_tree = 25, importance = 'permute') out <- orsf_vi(fit) # drop the least two important variables n_vars <- length(out) out[c(n_vars, n_vars-1)] <- 0 # ensure out has same variable order as input out <- out[colnames(x_node)] matrix(out, ncol = 1) } fit_rando <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_rando), tree_seeds = 329) fit_pca <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_pca), tree_seeds = 329) fit_rlt <- orsf(pbc_orsf, time + status ~ . - id, control = orsf_control_custom(beta_fun = f_aorsf), tree_seeds = 329) risk_preds <- list( accel = 1 - fit_accel$pred_oobag, cph = 1 - fit_cph$pred_oobag, net = 1 - fit_net$pred_oobag, rando = 1 - fit_rando$pred_oobag, pca = 1 - fit_pca$pred_oobag, rlt = 1 - fit_rlt$pred_oobag ) sc <- Score(object = risk_preds, formula = Surv(time, status) ~ 1, data = pbc_orsf, summary = 'IPA', times = fit_accel$pred_horizon) sc$AUC$score[order(-AUC)] ## model times AUC se lower upper ## 1: net 1788 0.9179396 0.02012887 0.8784877 0.9573915 ## 2: accel 1788 0.9106396 0.02076004 0.8699507 0.9513286 ## 3: cph 1788 0.9061167 0.02277540 0.8614777 0.9507556 ## 4: rlt 1788 0.9012605 0.02178982 0.8585533 0.9439678 ## 5: rando 1788 0.8997729 0.02201363 0.8566270 0.9429188 ## 6: pca 1788 0.8996927 0.02245483 0.8556821 0.9437034 sc$Brier$score[order(-IPA), .(model, times, IPA)] ## model times IPA ## 1: net 1788 0.5020652 ## 2: cph 1788 0.4759061 ## 3: accel 1788 0.4743392 ## 4: pca 1788 0.4398468 ## 5: rlt 1788 0.4373910 ## 6: rando 1788 0.4219209 ## 7: Null model 1788 0.0000000"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"tidymodels","dir":"Reference","previous_headings":"","what":"tidymodels","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"example uses tidymodels functions stops short using official tidymodels workflow. working getting aorsf pulled censored package update real workflows happens!","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"comparing-orsf-with-other-learners","dir":"Reference","previous_headings":"","what":"Comparing ORSF with other learners","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Start recipe pre-process data Next create 10-fold cross validation object pre-process data: Define functions ‘workflow’ randomForestSRC, ranger, aorsf. Run ‘workflows’ fold: Next unnest column get back tibble testing data predictions. finish aggregating predictions computing performance testing data. Note computing one statistic predictions instead computing one statistic fold. approach fine smaller testing sets /small event counts. inspection, aorsf obtained slightly higher discrimination (AUC) aorsf obtained higher index prediction accuracy (IPA)","code":"imputer <- recipe(pbc_orsf, formula = time + status ~ .) %>% step_impute_mean(all_numeric_predictors()) %>% step_impute_mode(all_nominal_predictors()) # 10-fold cross validation; make a container for the pre-processed data analyses <- vfold_cv(data = pbc_orsf, v = 10) %>% mutate(recipe = map(splits, ~prep(imputer, training = training(.x))), train = map(recipe, juice), test = map2(splits, recipe, ~bake(.y, new_data = testing(.x)))) analyses ## # 10-fold cross-validation ## # A tibble: 10 x 5 ## splits id recipe train test ## ## 1 Fold01 ## 2 Fold02 ## 3 Fold03 ## 4 Fold04 ## 5 Fold05 ## 6 Fold06 ## 7 Fold07 ## 8 Fold08 ## 9 Fold09 ## 10 Fold10 rfsrc_wf <- function(train, test, pred_horizon){ # rfsrc does not like tibbles, so cast input data into data.frames train <- as.data.frame(train) test <- as.data.frame(test) rfsrc(formula = Surv(time, status) ~ ., data = train) %>% predictRisk(newdata = test, times = pred_horizon) %>% as.numeric() } ranger_wf <- function(train, test, pred_horizon){ ranger(Surv(time, status) ~ ., data = train) %>% predictRisk(newdata = test, times = pred_horizon) %>% as.numeric() } aorsf_wf <- function(train, test, pred_horizon){ train %>% orsf(Surv(time, status) ~ .,) %>% predict(new_data = test, pred_horizon = pred_horizon) %>% as.numeric() } # 5 year risk prediction ph <- 365.25 * 5 results <- analyses %>% transmute(test, pred_aorsf = map2(train, test, aorsf_wf, pred_horizon = ph), pred_rfsrc = map2(train, test, rfsrc_wf, pred_horizon = ph), pred_ranger = map2(train, test, ranger_wf, pred_horizon = ph)) results <- results %>% unnest(everything()) glimpse(results) ## Rows: 276 ## Columns: 23 ## $ id 16, 29, 43, 62, 79, 82, 103, 105, 111, 114, 115, 139, 141,~ ## $ trt placebo, placebo, d_penicill_main, placebo, d_penicill_mai~ ## $ age 40.44353, 63.87680, 48.87064, 60.70637, 46.51608, 67.31006~ ## $ sex f, f, f, f, f, f, f, f, f, m, f, f, f, f, f, f, f, f, f, f~ ## $ ascites 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0~ ## $ hepato 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1~ ## $ spiders 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1~ ## $ edema 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~ ## $ bili 0.7, 0.7, 1.1, 1.3, 0.8, 4.5, 2.5, 1.1, 5.5, 3.2, 0.7, 1.1~ ## $ chol 204, 370, 361, 302, 315, 472, 188, 464, 528, 259, 303, 328~ ## $ albumin 3.66, 3.78, 3.64, 2.75, 4.24, 4.09, 3.67, 4.20, 4.18, 4.30~ ## $ copper 28, 24, 36, 58, 13, 154, 57, 38, 77, 208, 81, 159, 59, 76,~ ## $ alk.phos 685.0, 5833.0, 5430.2, 1523.0, 1637.0, 1580.0, 1273.0, 164~ ## $ ast 72.85, 73.53, 67.08, 43.40, 170.50, 117.80, 119.35, 151.90~ ## $ trig 58, 86, 89, 112, 70, 272, 102, 102, 78, 78, 156, 134, 56, ~ ## $ platelet 198, 390, 203, 329, 426, 412, 110, 348, 467, 268, 307, 142~ ## $ protime 10.8, 10.6, 10.6, 13.2, 10.9, 11.1, 11.1, 10.3, 10.7, 11.7~ ## $ stage 3, 2, 2, 4, 3, 3, 4, 3, 3, 3, 3, 4, 2, 2, 3, 4, 2, 3, 4, 4~ ## $ time 3672, 4509, 4556, 3090, 3707, 3574, 110, 3092, 2350, 3395,~ ## $ status 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0~ ## $ pred_aorsf 0.02210163, 0.12510110, 0.07571520, 0.59580668, 0.12839078~ ## $ pred_rfsrc 0.01861595, 0.15632904, 0.07635485, 0.62281617, 0.19145913~ ## $ pred_ranger 0.02143363, 0.13367920, 0.05892584, 0.54481330, 0.21380654~ Score( object = list(aorsf = results$pred_aorsf, rfsrc = results$pred_rfsrc, ranger = results$pred_ranger), formula = Surv(time, status) ~ 1, data = results, summary = 'IPA', times = ph ) ## ## Metric AUC: ## ## Results by model: ## ## model times AUC lower upper ## 1: aorsf 1826 91.0 86.8 95.2 ## 2: rfsrc 1826 89.2 84.8 93.7 ## 3: ranger 1826 89.6 85.3 94.0 ## ## Results of model comparisons: ## ## times model reference delta.AUC lower upper p ## 1: 1826 rfsrc aorsf -1.7 -3.4 -0.1 0.04 ## 2: 1826 ranger aorsf -1.3 -2.9 0.2 0.08 ## 3: 1826 ranger rfsrc 0.4 -0.8 1.6 0.52 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The higher AUC the better. ## ## Metric Brier: ## ## Results by model: ## ## model times Brier lower upper IPA ## 1: Null model 1826.25 20.5 18.1 22.9 0.0 ## 2: aorsf 1826.25 10.9 8.7 13.1 46.9 ## 3: rfsrc 1826.25 12.0 9.9 14.2 41.3 ## 4: ranger 1826.25 12.0 9.9 14.1 41.5 ## ## Results of model comparisons: ## ## times model reference delta.Brier lower upper p ## 1: 1826.25 aorsf Null model -9.6 -12.2 -7.0 9.364941e-13 ## 2: 1826.25 rfsrc Null model -8.5 -10.7 -6.2 2.074175e-13 ## 3: 1826.25 ranger Null model -8.5 -10.8 -6.2 3.712823e-13 ## 4: 1826.25 rfsrc aorsf 1.1 0.3 2.0 1.075856e-02 ## 5: 1826.25 ranger aorsf 1.1 0.3 1.9 4.825778e-03 ## 6: 1826.25 ranger rfsrc -0.1 -0.6 0.5 8.429772e-01 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The lower Brier the better, the higher IPA the better."},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"mlr-pipelines","dir":"Reference","previous_headings":"","what":"mlr3 pipelines","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Warning: code may may run depending current version mlr3proba. First load additional mlr3 libraries. Next ’ll define tasks learners engage . Now can make benchmark designed compare three favorite learners: Let’s look overall results: inspection, aorsf higher expected value ‘surv.cindex’ (higher better) aorsf lower expected value ‘surv.graf’ (lower better)","code":"suppressPackageStartupMessages({ library(mlr3verse) library(mlr3proba) library(mlr3extralearners) library(mlr3viz) library(mlr3benchmark) }) # Mayo Clinic Primary Biliary Cholangitis Data task_pbc <- TaskSurv$new( id = 'pbc', backend = select(pbc_orsf, -id) %>% mutate(stage = as.numeric(stage)), time = \"time\", event = \"status\" ) # Veteran's Administration Lung Cancer Trial data(veteran, package = \"randomForestSRC\") task_veteran <- TaskSurv$new( id = 'veteran', backend = veteran, time = \"time\", event = \"status\" ) # NKI 70 gene signature data_nki <- OpenML::getOMLDataSet(data.id = 1228) task_nki <- TaskSurv$new( id = 'nki', backend = data_nki$data, time = \"time\", event = \"event\" ) # Gene Expression-Based Survival Prediction in Lung Adenocarcinoma data_lung <- OpenML::getOMLDataSet(data.id = 1245) task_lung <- TaskSurv$new( id = 'nki', backend = data_lung$data %>% mutate(OS_event = as.numeric(OS_event) -1), time = \"OS_years\", event = \"OS_event\" ) # Chemotherapy for Stage B/C colon cancer # (there are two rows per person, one for death # and the other for recurrence, hence the two tasks) task_colon_death <- TaskSurv$new( id = 'colon_death', backend = survival::colon %>% filter(etype == 2) %>% drop_na() %>% # drop id, redundant variables select(-id, -study, -node4, -etype), mutate(OS_event = as.numeric(OS_event) -1), time = \"time\", event = \"status\" ) task_colon_recur <- TaskSurv$new( id = 'colon_death', backend = survival::colon %>% filter(etype == 1) %>% drop_na() %>% # drop id, redundant variables select(-id, -study, -node4, -etype), mutate(OS_event = as.numeric(OS_event) -1), time = \"time\", event = \"status\" ) # putting them all together tasks <- list(task_pbc, task_veteran, task_nki, task_lung, task_colon_death, task_colon_recur, # add a few more pre-made ones tsk(\"actg\"), tsk('gbcs'), tsk('grace'), tsk(\"unemployment\"), tsk(\"whas\")) # Learners with default parameters learners <- lrns(c(\"surv.ranger\", \"surv.rfsrc\", \"surv.aorsf\")) # Brier (Graf) score, c-index and training time as measures measures <- msrs(c(\"surv.graf\", \"surv.cindex\", \"time_train\")) # Benchmark with 5-fold CV design <- benchmark_grid( tasks = tasks, learners = learners, resamplings = rsmps(\"cv\", folds = 5) ) benchmark_result <- benchmark(design) bm_scores <- benchmark_result$score(measures, predict_sets = \"test\") bm_scores %>% select(task_id, learner_id, surv.graf, surv.cindex, time_train) %>% group_by(learner_id) %>% filter(!is.infinite(surv.graf)) %>% summarize( across( .cols = c(surv.graf, surv.cindex, time_train), .fns = mean, na.rm = TRUE ) ) ## # A tibble: 3 x 4 ## learner_id surv.graf surv.cindex time_train ## ## 1 surv.aorsf 0.152 0.733 1.41 ## 2 surv.ranger 0.166 0.712 1.95 ## 3 surv.rfsrc 0.155 0.723 0.745"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Harrell FE, Califf RM, Pryor DB, Lee KL, Rosati RA. Evaluating Yield Medical Tests. JAMA 1982; 247(18):2543-2546. DOI: 10.1001/jama.1982.03320430047030 Breiman L. Random forests. Machine learning 2001 Oct; 45(1):5-32. DOI: 10.1023/:1010933404324 Ishwaran H, Kogalur UB, Blackstone EH, Lauer MS. Random survival forests. Annals applied statistics 2008 Sep; 2(3):841-60. DOI: 10.1214/08-AOAS169 Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique random survival forests. Annals applied statistics 2019 Sep; 13(3):1847-83. DOI: 10.1214/19-AOAS1261 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. DOI: 10.1080/10618600.2023.2231048","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":null,"dir":"Reference","previous_headings":"","what":"Cox regression ORSF control — orsf_control_cph","title":"Cox regression ORSF control — orsf_control_cph","text":"Use coefficients proportional hazards model create linear combinations predictor variables fitting orsf model.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cox regression ORSF control — orsf_control_cph","text":"","code":"orsf_control_cph(method = \"efron\", eps = 1e-09, iter_max = 20, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cox regression ORSF control — orsf_control_cph","text":"method (character) character string specifying method tie handling. ties, methods equivalent. Valid options 'breslow' 'efron'. Efron approximation default accurate dealing tied event times similar computational efficiency compared Breslow method. eps (double) using Newton Raphson scoring identify linear combinations inputs, iteration continues algorithm relative change log partial likelihood less eps, absolute change less sqrt(eps). Must positive. default value 1e-09 used consistency survival::coxph.control. iter_max (integer) iteration continues convergence (see eps ) number attempted iterations equal iter_max. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cox regression ORSF control — orsf_control_cph","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cox regression ORSF control — orsf_control_cph","text":"code survival package modified make routine. details Cox proportional hazards model, see coxph /Therneau Grambsch (2000).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Cox regression ORSF control — orsf_control_cph","text":"Therneau T.M., Grambsch P.M. (2000) Cox Model. : Modeling Survival Data: Extending Cox Model. Statistics Biology Health. Springer, New York, NY. DOI: 10.1007/978-1-4757-3294-8_3","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cox regression ORSF control — orsf_control_cph","text":"","code":"orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_cph()) #> ---------- Oblique random survival forest #> #> Linear combinations: Cox regression #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":null,"dir":"Reference","previous_headings":"","what":"Custom ORSF control — orsf_control_custom","title":"Custom ORSF control — orsf_control_custom","text":"Custom ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Custom ORSF control — orsf_control_custom","text":"","code":"orsf_control_custom(beta_fun, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Custom ORSF control — orsf_control_custom","text":"beta_fun (function) function define coefficients used linear combinations predictor variables. beta_fun must accept three inputs named x_node, y_node w_node, expect following types dimensions: x_node (matrix; n rows, p columns) y_node (matrix; n rows, 2 columns) w_node (matrix; n rows, 1 column) addition, beta_fun must return matrix p rows 1 column. conditions met, orsf_control_custom() let know. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Custom ORSF control — orsf_control_custom","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Custom ORSF control — orsf_control_custom","text":"Two customized functions identify linear combinations predictors shown . first uses random coefficients second derives coefficients principal component analysis.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"random-coefficients","dir":"Reference","previous_headings":"","what":"Random coefficients","title":"Custom ORSF control — orsf_control_custom","text":"f_rando() function get random coefficients: can plug f_rando orsf_control_custom(), pass result orsf():","code":"f_rando <- function(x_node, y_node, w_node){ matrix(runif(ncol(x_node)), ncol=1) } library(aorsf) fit_rando <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_rando), n_tree = 500) fit_rando ## ---------- Oblique random survival forest ## ## Linear combinations: Custom user function ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 20 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"principal-components","dir":"Reference","previous_headings":"","what":"Principal components","title":"Custom ORSF control — orsf_control_custom","text":"Follow steps , starting custom function: plug function orsf_control_custom() pass result orsf():","code":"f_pca <- function(x_node, y_node, w_node) { # estimate two principal components. pca <- stats::prcomp(x_node, rank. = 2) # use the second principal component to split the node pca$rotation[, 2L, drop = FALSE] } fit_pca <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_pca), n_tree = 500)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"evaluate","dir":"Reference","previous_headings":"","what":"Evaluate","title":"Custom ORSF control — orsf_control_custom","text":"well two customized ORSFs ? Let’s compute indices prediction accuracy based --bag predictions: PCA ORSF quite well! (higher IPA better)","code":"library(riskRegression) library(survival) risk_preds <- list(rando = 1 - fit_rando$pred_oobag, pca = 1 - fit_pca$pred_oobag) sc <- Score(object = risk_preds, formula = Surv(time, status) ~ 1, data = pbc_orsf, summary = 'IPA', times = fit_pca$pred_horizon) sc$Brier ## ## Results by model: ## ## model times Brier lower upper IPA ## 1: Null model 1788 20.479 18.090 22.868 0.000 ## 2: rando 1788 11.604 9.535 13.673 43.339 ## 3: pca 1788 12.870 10.872 14.869 37.154 ## ## Results of model comparisons: ## ## times model reference delta.Brier lower upper p ## 1: 1788 rando Null model -8.875 -11.063 -6.688 1.852437e-15 ## 2: 1788 pca Null model -7.609 -9.351 -5.866 1.143284e-17 ## 3: 1788 pca rando 1.267 0.449 2.084 2.381056e-03 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The lower Brier the better, the higher IPA the better."},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":null,"dir":"Reference","previous_headings":"","what":"Accelerated ORSF control — orsf_control_fast","title":"Accelerated ORSF control — orsf_control_fast","text":"Accelerated ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Accelerated ORSF control — orsf_control_fast","text":"","code":"orsf_control_fast(method = \"efron\", do_scale = TRUE, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Accelerated ORSF control — orsf_control_fast","text":"method (character) character string specifying method tie handling. ties, methods equivalent. Valid options 'breslow' 'efron'. Efron approximation default accurate dealing tied event times similar computational efficiency compared Breslow method. do_scale (logical) TRUE, values predictors scaled prior instance Newton Raphson scoring, using summary values data current node decision tree. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Accelerated ORSF control — orsf_control_fast","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Accelerated ORSF control — orsf_control_fast","text":"code survival package modified make routine. Adjust do_scale risk. Setting do_scale = FALSE reduce computation time also make orsf model dependent scale data, default value TRUE. good idea center scale predictors prior running orsf() plan setting do_scale = FALSE.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Accelerated ORSF control — orsf_control_fast","text":"","code":"orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_fast()) #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Penalized Cox regression ORSF control — orsf_control_net","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"Penalized Cox regression ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"","code":"orsf_control_net(alpha = 1/2, df_target = NULL, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"alpha (double) elastic net mixing parameter. value 1 gives lasso penalty, value 0 gives ridge penalty. multiple values alpha given, penalized model fit using alpha value prior splitting node. df_target (integer) Preferred number variables used linear combination. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"df_target less mtry, separate argument orsf indicates number variables chosen random prior finding linear combination variables.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"Simon N, Friedman J, Hastie T, Tibshirani R. Regularization paths Cox's proportional hazards model via coordinate descent. Journal statistical software 2011 Mar; 39(5):1. DOI: 10.18637/jss.v039.i05","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"","code":"# orsf_control_net() is considerably slower than orsf_control_cph(), # The example uses n_tree = 25 so that my examples run faster, # but you should use at least 500 trees in applied settings. orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 25, control = orsf_control_net()) #> ---------- Oblique random survival forest #> #> Linear combinations: Penalized Cox regression #> N observations: 276 #> N events: 111 #> N trees: 25 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 25 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.83 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF Individual Conditional Expectations — orsf_ice_oob","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"Compute individual conditional expectations ORSF model. Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. can compute individual conditional expectations three ways using random forest: using -bag predictions training data using --bag predictions training data using predictions new set data See examples details","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"","code":"orsf_ice_oob( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... ) orsf_ice_inb( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... ) orsf_ice_new( object, pred_spec, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"object (orsf_fit) trained oblique random survival forest (see orsf). pred_spec (named list data.frame). pred_spec named list, item list vector values used points partial dependence function. name item list indicate variable modified take corresponding values. pred_spec data.frame, columns indicate variable names, values indicate variable values, partial dependence computed using inputs row. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction expand_grid (logical) TRUE, partial dependence computed possible combinations inputs pred_spec. FALSE, partial dependence computed variable pred_spec, separately. boundary_checks (logical) TRUE, pred_spec checked make sure requested values 10th 90th percentile object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. ... arguments passed methods (currently used). new_data data.frame, tibble, data.table compute predictions . na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'omit' : rows new_data incomplete data dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"data.table containing individual conditional expectations specified variable(s) specified prediction horizon(s).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"Begin fitting ORSF ensemble Use ensemble compute ICE values using --bag predictions: Much detailed examples given vignette","code":"library(aorsf) set.seed(329) fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## ----------------------------------------- pred_spec <- list(bili = seq(1, 10, length.out = 25)) ice_oob <- orsf_ice_oob(fit, pred_spec, boundary_checks = FALSE) ice_oob ## id_variable id_row pred_horizon bili pred ## 1: 1 1 1788 1 0.9295584 ## 2: 1 2 1788 1 0.1422392 ## 3: 1 3 1788 1 0.7047846 ## 4: 1 4 1788 1 0.3845760 ## 5: 1 5 1788 1 0.1206201 ## --- ## 6896: 25 272 1788 10 0.3878561 ## 6897: 25 273 1788 10 0.4854526 ## 6898: 25 274 1788 10 0.4389557 ## 6899: 25 275 1788 10 0.3639220 ## 6900: 25 276 1788 10 0.5461205"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF partial dependence — orsf_pd_oob","title":"ORSF partial dependence — orsf_pd_oob","text":"Compute partial dependence ORSF model. Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model's prediction. can compute partial dependence three ways using random forest: using -bag predictions training data using --bag predictions training data using predictions new set data See examples details","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF partial dependence — orsf_pd_oob","text":"","code":"orsf_pd_oob( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... ) orsf_pd_inb( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... ) orsf_pd_new( object, pred_spec, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF partial dependence — orsf_pd_oob","text":"object (orsf_fit) trained oblique random survival forest (see orsf). pred_spec (named list data.frame). pred_spec named list, item list vector values used points partial dependence function. name item list indicate variable modified take corresponding values. pred_spec data.frame, columns indicate variable names, values indicate variable values, partial dependence computed using inputs row. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction expand_grid (logical) TRUE, partial dependence computed possible combinations inputs pred_spec. FALSE, partial dependence computed variable pred_spec, separately. prob_values (numeric) vector values 0 1, indicating quantiles used summarize partial dependence values set inputs. prob_values length prob_labels. quantiles calculated based predictions object set values indicated pred_spec. prob_labels (character) vector labels length prob_values, label indicating corresponding value prob_values labelled summarized outputs. prob_labels length prob_values. boundary_checks (logical) TRUE, pred_spec checked make sure requested values 10th 90th percentile object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. ... arguments passed methods (currently used). new_data data.frame, tibble, data.table compute predictions . na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'omit' : rows new_data incomplete data dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF partial dependence — orsf_pd_oob","text":"data.table containing partial dependence values specified variable(s) specified prediction horizon(s).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF partial dependence — orsf_pd_oob","text":"Partial dependence number known limitations assumptions users aware (see Hooker, 2021). particular, partial dependence less intuitive >2 predictors examined jointly, assumed feature(s) partial dependence computed correlated features (likely true many cases). Accumulated local effect plots can used (see ) case feature independence valid assumption.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF partial dependence — orsf_pd_oob","text":"Begin fitting ORSF ensemble:","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"three-ways-to-compute-pd-and-ice","dir":"Reference","previous_headings":"","what":"Three ways to compute PD and ICE","title":"ORSF partial dependence — orsf_pd_oob","text":"can compute partial dependence ICE three ways aorsf: using -bag predictions training data using --bag predictions training data using predictions new set data -bag partial dependence indicates relationships model learned training. helpful goal interpret model. --bag partial dependence indicates relationships model learned training using --bag data simulates application model new data. want test model’s reliability fairness new data don’t access large testing set. new data partial dependence shows model predicts outcomes observations seen. helpful want test model’s reliability fairness.","code":"pd_train <- orsf_pd_inb(fit, pred_spec = list(bili = 1:5)) pd_train ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2188047 0.01435497 0.09604722 0.8243506 ## 2: 1826.25 2 0.2540831 0.03086042 0.13766124 0.8442959 ## 3: 1826.25 3 0.2982917 0.05324065 0.19470910 0.8578131 ## 4: 1826.25 4 0.3536969 0.09755193 0.27774884 0.8699063 ## 5: 1826.25 5 0.3955249 0.14622431 0.29945708 0.8775099 pd_train <- orsf_pd_oob(fit, pred_spec = list(bili = 1:5)) pd_train ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2182691 0.01218789 0.1008030 0.8304537 ## 2: 1826.25 2 0.2542021 0.02447359 0.1453580 0.8484741 ## 3: 1826.25 3 0.2980946 0.04854875 0.1997769 0.8640601 ## 4: 1826.25 4 0.3552203 0.10116417 0.2691853 0.8642393 ## 5: 1826.25 5 0.3959143 0.14768055 0.3264149 0.8737186 pd_test <- orsf_pd_new(fit, new_data = pbc_orsf_test, pred_spec = list(bili = 1:5)) pd_test ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2643662 0.01758300 0.2098936 0.8410357 ## 2: 1826.25 2 0.2990578 0.04063388 0.2516202 0.8553218 ## 3: 1826.25 3 0.3432503 0.06843859 0.3056799 0.8670726 ## 4: 1826.25 4 0.3968111 0.11801725 0.3593064 0.8725208 ## 5: 1826.25 5 0.4388962 0.16038177 0.4094224 0.8809027"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"ORSF partial dependence — orsf_pd_oob","text":"Giles Hooker, Lucas Mentch, Siyu Zhou. Unrestricted Permutation forces Extrapolation: Variable Importance Requires least One Model, Free Variable Importance. arXiv e-prints 2021 Oct; arXiv-1905. URL: https://doi.org/10.48550/arXiv.1905.03151","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":null,"dir":"Reference","previous_headings":"","what":"Scale input data — orsf_scale_cph","title":"Scale input data — orsf_scale_cph","text":"functions exported users may access internal routines used scale inputs orsf_control_cph used.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Scale input data — orsf_scale_cph","text":"","code":"orsf_scale_cph(x_mat, w_vec = NULL) orsf_unscale_cph(x_mat)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Scale input data — orsf_scale_cph","text":"x_mat (numeric matrix) matrix values scaled unscaled. Note orsf_unscale_cph accept x_mat inputs attribute containing transform values, added automatically orsf_scale_cph. w_vec (numeric vector) optional vector weights. weights supplied (default), observations equally weighted. supplied, w_vec must length equal nrow(x_mat).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Scale input data — orsf_scale_cph","text":"scaled unscaled x_mat.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Scale input data — orsf_scale_cph","text":"data transformed first subtracting mean multiplying scale. inverse transform can completed using orsf_unscale_cph dividing column corresponding scale adding mean. values means scales stored attribute output returned orsf_scale_cph (see examples)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Scale input data — orsf_scale_cph","text":"","code":"x_mat <- as.matrix(pbc_orsf[, c('bili', 'age', 'protime')]) head(x_mat) #> bili age protime #> 1 14.5 58.76523 12.2 #> 2 1.1 56.44627 10.6 #> 3 1.4 70.07255 12.0 #> 4 1.8 54.74059 10.3 #> 5 3.4 38.10541 10.9 #> 7 1.0 55.53457 9.7 x_scaled <- orsf_scale_cph(x_mat) head(x_scaled) #> bili age protime #> [1,] 3.77308887 1.0412574 1.9694656 #> [2,] -0.75476469 0.7719344 -0.1822316 #> [3,] -0.65339483 2.3544852 1.7005035 #> [4,] -0.51823502 0.5738373 -0.5856748 #> [5,] 0.02240421 -1.3581657 0.2212116 #> [6,] -0.78855464 0.6660494 -1.3925613 attributes(x_scaled) # note the transforms attribute #> $dim #> [1] 276 3 #> #> $dimnames #> $dimnames[[1]] #> NULL #> #> $dimnames[[2]] #> [1] \"bili\" \"age\" \"protime\" #> #> #> $transforms #> mean scale #> [1,] 3.333696 0.3378995 #> [2,] 49.799661 0.1161396 #> [3,] 10.735507 1.3448108 #> x_unscaled <- orsf_unscale_cph(x_scaled) head(x_unscaled) #> bili age protime #> [1,] 14.5 58.76523 12.2 #> [2,] 1.1 56.44627 10.6 #> [3,] 1.4 70.07255 12.0 #> [4,] 1.8 54.74059 10.3 #> [5,] 3.4 38.10541 10.9 #> [6,] 1.0 55.53457 9.7 # numeric difference in x_mat and x_unscaled should be practically 0 max(abs(x_mat - x_unscaled)) #> [1] 8.881784e-16"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF summary; univariate — orsf_summarize_uni","title":"ORSF summary; univariate — orsf_summarize_uni","text":"Summarize univariate information ORSF object","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF summary; univariate — orsf_summarize_uni","text":"","code":"orsf_summarize_uni( object, n_variables = NULL, pred_horizon = NULL, pred_type = \"risk\", importance = \"negate\", ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF summary; univariate — orsf_summarize_uni","text":"object (orsf_fit) trained oblique random survival forest (see orsf). n_variables (integer) many variables summarized? Setting input lower number reduce computation time. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction importance (character) Indicate method variable importance: 'none': variable importance computed. 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance details methods, see orsf_vi. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF summary; univariate — orsf_summarize_uni","text":"object class 'orsf_summary', includes data importance individual predictors. expected values predictions specific values predictors.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF summary; univariate — orsf_summarize_uni","text":"pred_horizon left unspecified, median value time--event variable object's training data used. recommended always specify prediction horizon, median time may especially meaningful horizon compute predicted risk values . object already variable importance values, can safely bypass computation variable importance function setting importance = 'none'.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF summary; univariate — orsf_summarize_uni","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) # since anova importance was used to make object, we can # safely say importance = 'none' and skip computation of # variable importance while running orsf_summarize_uni orsf_summarize_uni(object, n_variables = 3, importance = 'none') #> #> -- ascites (VI Rank: 1) ------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2985169 0.1728427 0.05831561 0.5261268 #> 1 0.4639118 0.3875167 0.26360880 0.6645048 #> #> -- bili (VI Rank: 2) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2314790 0.1236064 0.05259051 0.3518730 #> 1.4 0.2516602 0.1416471 0.06869545 0.3712867 #> 3.5 0.3648769 0.2869933 0.15709057 0.5412109 #> #> -- edema (VI Rank: 3) -------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2954611 0.1689789 0.05653026 0.5223284 #> 0.5 0.3505727 0.2464582 0.10963964 0.6045322 #> 1 0.4518496 0.3674278 0.25732223 0.6459015 #> #> Predicted risk at time t = 1788 for top 3 predictors # however, if we want to summarize object according to variables # ranked by negation importance, we can compute negation importance # within orsf_summarize_uni() as follows: orsf_summarize_uni(object, n_variables = 3, importance = 'negate') #> #> -- bili (VI Rank: 1) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2314790 0.1236064 0.05259051 0.3518730 #> 1.4 0.2516602 0.1416471 0.06869545 0.3712867 #> 3.5 0.3648769 0.2869933 0.15709057 0.5412109 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2600519 0.1467953 0.05330119 0.4338677 #> 74 0.2808002 0.1695624 0.06408187 0.4598569 #> 129 0.3371105 0.2267806 0.10763612 0.5351060 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3490918 0.2482039 0.12058440 0.5719038 #> f 0.2988549 0.1653388 0.05653026 0.5295326 #> #> Predicted risk at time t = 1788 for top 3 predictors"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":null,"dir":"Reference","previous_headings":"","what":"Estimate training time — orsf_time_to_train","title":"Estimate training time — orsf_time_to_train","text":"Estimate training time","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Estimate training time — orsf_time_to_train","text":"","code":"orsf_time_to_train(object, n_tree_subset = 50)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Estimate training time — orsf_time_to_train","text":"object untrained aorsf object n_tree_subset (integer) many trees fit order estimate time needed train object. default value 50, usually gives good enough approximation.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Estimate training time — orsf_time_to_train","text":"difftime object.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Estimate training time — orsf_time_to_train","text":"","code":"# specify but do not train the model by setting no_fit = TRUE. object <- orsf(pbc_orsf, Surv(time, status) ~ . - id, n_tree = 500, no_fit = TRUE) # grow 50 trees to approximate the time it will take to grow 500 trees time_estimated <- orsf_time_to_train(object, n_tree_subset = 50) print(time_estimated) #> Time difference of 0.264483 secs # let's see how close the approximation was time_true_start <- Sys.time() fit <- orsf_train(object) time_true_stop <- Sys.time() time_true <- time_true_stop - time_true_start print(time_true) #> Time difference of 0.2798018 secs # error abs(time_true - time_estimated) #> Time difference of 0.01531887 secs"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF variable importance — orsf_vi","title":"ORSF variable importance — orsf_vi","text":"Estimate importance individual variables using oblique random survival forests.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF variable importance — orsf_vi","text":"","code":"orsf_vi( object, group_factors = TRUE, importance = NULL, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_negate( object, group_factors = TRUE, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_permute( object, group_factors = TRUE, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_anova(object, group_factors = TRUE, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF variable importance — orsf_vi","text":"object (orsf_fit) trained oblique random survival forest (see orsf). group_factors (logical) TRUE, importance factor variables reported overall aggregating importance individual levels factor. FALSE, importance individual factor levels returned. importance (character) Indicate method variable importance: 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance oobag_fun (function) used evaluating --bag prediction accuracy negating coefficients (importance = 'negate') permuting values predictor (importance = 'permute') oobag_fun = NULL (default), Harrell's C-statistic (1982) used evaluate accuracy. use oobag_fun note following: oobag_fun two inputs: y_mat s_vec y_mat two column matrix first column named 'time', second named 'status' s_vec numeric vector containing predicted survival probabilities. oobag_fun return numeric output length 1 oobag_fun used created object initial value --bag prediction accuracy consistent values computed variable importance estimated. details, see --bag vignette. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF variable importance — orsf_vi","text":"orsf_vi functions return named numeric vector. Names vector predictor variables used object Values vector estimated importance given predictor. returned vector sorted highest lowest value, higher values indicating higher importance.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF variable importance — orsf_vi","text":"orsf_fit object fitted importance = 'anova', 'negate', 'permute', output vector importance values based requested type importance. However, may still want call orsf_vi() output want group factor levels one overall importance value. orsf_vi() general purpose function extract compute variable importance estimates 'orsf_fit' object (see orsf). orsf_vi_negate(), orsf_vi_permute(), orsf_vi_anova() wrappers orsf_vi(). way functions work depends whether object given already variable importance estimates (see examples).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"variable-importance-methods","dir":"Reference","previous_headings":"","what":"Variable importance methods","title":"ORSF variable importance — orsf_vi","text":"negation importance: variable assessed separately multiplying variable's coefficients -1 determining much model's performance changes. worse model's performance negating coefficients given variable, important variable. technique promising b/c require permutation emphasizes variables larger coefficients linear combinations, also relatively new studied much permutation importance. See Jaeger, (2023) details technique. permutation importance: variable assessed separately randomly permuting variable's values determining much model's performance changes. worse model's performance permuting values given variable, important variable. technique flexible, intuitive, frequently used. also several known limitations analysis variance (ANOVA) importance: p-value computed coefficient linear combination variables decision tree. Importance individual predictor variable proportion times p-value coefficient < 0.01. technique efficient computationally, may effective permutation negation terms selecting signal noise variables. See Menze, 2011 details technique.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"anova-importance","dir":"Reference","previous_headings":"","what":"ANOVA importance","title":"ORSF variable importance — orsf_vi","text":"default variable importance technique, ANOVA, calculated fit ORSF ensemble. ANOVA default fast, may decisive permutation negation techniques variable selection.","code":"fit <- orsf(pbc_orsf, Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"raw-vi-values","dir":"Reference","previous_headings":"","what":"Raw VI values","title":"ORSF variable importance — orsf_vi","text":"‘raw’ variable importance values can accessed fit object ‘raw’ values factors aggregated single value. Currently one value k-1 levels k level factor. example, can see edema_1 edema_0.5 importance values edema factor variable levels 0, 0.5, 1.","code":"attr(fit, 'importance_values') ## ascites_1 edema_1 bili copper albumin age ## 0.44989185 0.43936093 0.29908016 0.22471022 0.20573664 0.19373368 ## edema_0.5 protime chol stage spiders_1 ast ## 0.19096711 0.17582704 0.17527675 0.17057992 0.16721527 0.16061635 ## sex_f hepato_1 trig alk.phos platelet trt_placebo ## 0.14513788 0.14241390 0.12695468 0.12228332 0.10395510 0.09001406"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"collapse-vi-across-factor-levels","dir":"Reference","previous_headings":"","what":"Collapse VI across factor levels","title":"ORSF variable importance — orsf_vi","text":"get aggregated values across levels factor, access importance element orsf fit: use orsf_vi() group_factors set TRUE (default) Note can make default returned importance values ungrouped setting group_factors FALSE orsf_vi functions orsf function.","code":"fit$importance ## ascites bili edema copper albumin age protime ## 0.44989185 0.29908016 0.29150746 0.22471022 0.20573664 0.19373368 0.17582704 ## chol stage spiders ast sex hepato trig ## 0.17527675 0.17057992 0.16721527 0.16061635 0.14513788 0.14241390 0.12695468 ## alk.phos platelet trt ## 0.12228332 0.10395510 0.09001406 orsf_vi(fit) ## ascites bili edema copper albumin age protime ## 0.44989185 0.29908016 0.29150746 0.22471022 0.20573664 0.19373368 0.17582704 ## chol stage spiders ast sex hepato trig ## 0.17527675 0.17057992 0.16721527 0.16061635 0.14513788 0.14241390 0.12695468 ## alk.phos platelet trt ## 0.12228332 0.10395510 0.09001406"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"add-vi-to-an-orsf","dir":"Reference","previous_headings":"","what":"Add VI to an ORSF","title":"ORSF variable importance — orsf_vi","text":"can fit ORSF without VI, add VI later","code":"fit_no_vi <- orsf(pbc_orsf, Surv(time, status) ~ . - id, importance = 'none') # Note: you can't call orsf_vi_anova() on fit_no_vi because anova # VI can only be computed while the forest is being grown. orsf_vi_negate(fit_no_vi) ## bili copper sex stage protime age ## 0.117833946 0.046771025 0.038096005 0.026596235 0.023892153 0.022568331 ## albumin ascites chol ast edema hepato ## 0.020502226 0.015764542 0.013505575 0.011507061 0.007444267 0.007318432 ## trt spiders alk.phos trig platelet ## 0.006135388 0.005416366 0.003385460 0.003359579 0.001225734 orsf_vi_permute(fit_no_vi) ## bili copper age protime albumin ## 0.0557854459 0.0230058852 0.0142318894 0.0139189306 0.0138242166 ## ascites stage chol ast edema ## 0.0122576604 0.0122514140 0.0062628391 0.0060073065 0.0057933534 ## hepato spiders sex trig alk.phos ## 0.0052890246 0.0038620727 0.0031610738 0.0014580912 0.0009063636 ## platelet trt ## 0.0001124081 -0.0017971380"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"orsf-and-vi-all-at-once","dir":"Reference","previous_headings":"","what":"ORSF and VI all at once","title":"ORSF variable importance — orsf_vi","text":"fit ORSF compute vi time can still get negation VI fit, needs computed","code":"fit_permute_vi <- orsf(pbc_orsf, Surv(time, status) ~ . - id, importance = 'permute') # get the vi instantly (i.e., it doesn't need to be computed again) orsf_vi_permute(fit_permute_vi) ## bili copper age ascites protime ## 0.0537706105 0.0232845222 0.0135823364 0.0127916446 0.0125320108 ## albumin stage ast edema hepato ## 0.0115100144 0.0109035858 0.0063943212 0.0062769135 0.0048230621 ## chol spiders sex trig alk.phos ## 0.0042752565 0.0030699653 0.0025422803 0.0022410492 0.0010977282 ## platelet trt ## 0.0010972387 -0.0005947093 orsf_vi_negate(fit_permute_vi) ## bili copper sex age protime stage ## 0.120854614 0.046515980 0.036380485 0.022668834 0.021816803 0.021111101 ## albumin ascites ast chol edema spiders ## 0.018969867 0.014101778 0.013042103 0.011220170 0.008009693 0.006193354 ## trt hepato trig alk.phos platelet ## 0.005184060 0.005113622 0.003389060 0.003156121 0.002242597"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"ORSF variable importance — orsf_vi","text":"Harrell FE, Califf RM, Pryor DB, Lee KL, Rosati RA. Evaluating Yield Medical Tests. JAMA 1982; 247(18):2543-2546. DOI: 10.1001/jama.1982.03320430047030 Breiman L. Random forests. Machine learning 2001 Oct; 45(1):5-32. DOI: 10.1023/:1010933404324 Menze BH, Kelm BM, Splitthoff DN, Koethe U, Hamprecht FA. oblique random forests. Joint European Conference Machine Learning Knowledge Discovery Databases 2011 Sep 4; pp. 453-469. DOI: 10.1007/978-3-642-23783-6_29 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. DOI: 10.1080/10618600.2023.2231048","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":null,"dir":"Reference","previous_headings":"","what":"Variable selection — orsf_vs","title":"Variable selection — orsf_vs","text":"Variable selection","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Variable selection — orsf_vs","text":"","code":"orsf_vs(object, n_predictor_min = 3, verbose_progress = FALSE)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Variable selection — orsf_vs","text":"object (orsf_fit) trained oblique random survival forest (see orsf). n_predictor_min (integer) minimum number predictors allowed verbose_progress (logical) implemented yet. progress printed console?","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Variable selection — orsf_vs","text":"data.table four columns: n_predictors: number predictors used stat_value: --bag statistic predictors_included: names predictors included predictor_dropped: predictor selected dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Variable selection — orsf_vs","text":"tree_seeds specified object successive run orsf evaluated --bag samples initial run.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Variable selection — orsf_vs","text":"","code":"object <- orsf(formula = time + status ~ ., data = pbc_orsf, n_tree = 25, importance = 'anova', tree_seeds = 1:25) orsf_vs(object) #> n_predictors stat_value predictors_included #> 1: 3 0.7911870 ascites,edema,bili #> 2: 4 0.8144174 ascites,edema,bili,copper #> 3: 5 0.8244700 age,ascites,edema,bili,copper #> 4: 6 0.8238450 age,ascites,hepato,edema,bili,copper #> 5: 7 0.8130111 age,ascites,hepato,edema,bili,copper,... #> 6: 8 0.8252513 age,ascites,hepato,spiders,edema,bili,... #> 7: 9 0.8394187 age,ascites,hepato,spiders,edema,bili,... #> 8: 10 0.8418147 age,ascites,hepato,spiders,edema,bili,... #> 9: 11 0.8268139 age,ascites,hepato,spiders,edema,bili,... #> 10: 12 0.8340539 age,sex,ascites,hepato,spiders,edema,... #> 11: 13 0.8418147 age,sex,ascites,hepato,spiders,edema,... #> 12: 14 0.8392104 age,sex,ascites,hepato,spiders,edema,... #> 13: 15 0.8423876 age,sex,ascites,hepato,spiders,edema,... #> 14: 16 0.8237408 age,sex,ascites,hepato,spiders,edema,... #> 15: 17 0.8122298 id,age,sex,ascites,hepato,spiders,... #> 16: 18 0.8251992 id,trt,age,sex,ascites,hepato,... #> predictor_dropped #> 1: bili #> 2: copper #> 3: age #> 4: hepato #> 5: protime #> 6: spiders #> 7: chol #> 8: albumin #> 9: ast #> 10: sex #> 11: trig #> 12: stage #> 13: alk.phos #> 14: platelet #> 15: id #> 16: trt"},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":null,"dir":"Reference","previous_headings":"","what":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"data light modification survival::pbc data. modifications :","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"","code":"pbc_orsf"},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"data frame 276 rows 20 variables: id case number time number days registration earlier death, transplantion, study analysis July, 1986 status status endpoint, 0 censored transplant, 1 dead trt randomized treatment group: D-penicillmain placebo age years sex m/f ascites presence ascites hepato presence hepatomegaly enlarged liver spiders blood vessel malformations skin edema 0 edema, 0.5 untreated successfully treated, 1 edema despite diuretic therapy bili serum bilirubin (mg/dl) chol serum cholesterol (mg/dl) albumin serum albumin (g/dl) copper urine copper (ug/day) alk.phos alkaline phosphotase (U/liter) ast aspartate aminotransferase, called SGOT (U/ml) trig triglycerides (mg/dl) platelet platelet count protime standardized blood clotting time stage histologic stage disease (needs biopsy)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"T Therneau P Grambsch (2000), Modeling Survival Data: Extending Cox Model, Springer-Verlag, New York. ISBN: 0-387-98784-3.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"removed rows missing data converted status 0 censor transplant, 1 dead converted stage ordered factor. converted trt, ascites, hepato, spiders, edema factors.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute predictions using ORSF — predict.orsf_fit","title":"Compute predictions using ORSF — predict.orsf_fit","text":"Predicted risk, survival, hazard, mortality ORSF model.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute predictions using ORSF — predict.orsf_fit","text":"","code":"# S3 method for orsf_fit predict( object, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", boundary_checks = TRUE, n_thread = 1, verbose_progress = FALSE, pred_aggregate = TRUE, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute predictions using ORSF — predict.orsf_fit","text":"object (orsf_fit) trained oblique random survival forest (see orsf). new_data data.frame, tibble, data.table compute predictions . pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'pass' : output NA rows new_data 1 NA value predictors used object 'omit' : rows new_data incomplete data dropped 'impute_meanmode' : missing values continuous categorical variables new_data imputed using mean mode, respectively. clarify, mean mode used impute missing values training data object, new_data. boundary_checks (logical) TRUE, pred_horizon checked make sure requested values less maximum observed time object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. pred_aggregate (logical) TRUE (default), predictions aggregated trees taking mean. FALSE, returned output contain one row per observation one column tree. length pred_horizon two pred_aggregate FALSE, result list matrices, 'th item list corresponding 'th value pred_horizon. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute predictions using ORSF — predict.orsf_fit","text":"matrix predictions. Column j matrix corresponds value j pred_horizon. Row matrix corresponds row new_data.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute predictions using ORSF — predict.orsf_fit","text":"new_data must columns equivalent types data used train object. Also, factors new_data must levels data used train object. pred_horizon values exceed maximum follow-time object's training data, truly want , set boundary_checks = FALSE can use pred_horizon large want. Note predictions beyond maximum follow-time object's training data equal predictions maximum follow-time, aorsf estimate survival beyond maximum observed time. unspecified, pred_horizon may automatically specified value used oobag_pred_horizon object created (see orsf).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute predictions using ORSF — predict.orsf_fit","text":"Begin fitting ORSF ensemble: Predict risk, survival, cumulative hazard one several times: Predict mortality, defined number events forest’s population observations characteristics like current observation. type prediction require specify prediction horizon","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5) # predicted risk, the default predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'risk', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.49884105 0.77681319 0.91901860 ## [2,] 0.04475471 0.09161544 0.17682278 ## [3,] 0.12850458 0.27603519 0.41455070 ## [4,] 0.01279086 0.02980402 0.06458151 ## [5,] 0.01277317 0.02249769 0.04875677 # predicted survival, i.e., 1 - risk predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'surv', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.5011589 0.2231868 0.0809814 ## [2,] 0.9552453 0.9083846 0.8231772 ## [3,] 0.8714954 0.7239648 0.5854493 ## [4,] 0.9872091 0.9701960 0.9354185 ## [5,] 0.9872268 0.9775023 0.9512432 # predicted cumulative hazard function # (expected number of events for person i at time j) predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'chf', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.70860748 1.40641948 1.79893071 ## [2,] 0.04954335 0.11460828 0.24130253 ## [3,] 0.16616222 0.43287394 0.71524591 ## [4,] 0.01443848 0.03640393 0.08366798 ## [5,] 0.01435412 0.02680792 0.06203327 predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'mort') ## [,1] ## [1,] 81.23490 ## [2,] 27.69730 ## [3,] 41.52408 ## [4,] 15.79522 ## [5,] 10.65239"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":null,"dir":"Reference","previous_headings":"","what":"Inspect your ORSF model — print.orsf_fit","title":"Inspect your ORSF model — print.orsf_fit","text":"Printing ORSF model tells : Linear combinations: identified? N observations: Number rows training data N events: Number events training data N trees: Number trees forest N predictors total: Total number columns predictor matrix N predictors per node: Number variables used linear combinations Average leaves per tree: proxy depth trees Min observations leaf: See leaf_min_obs orsf Min events leaf: See leaf_min_events orsf OOB stat value: --bag error fitting trees OOB stat type: --bag error computed? Variable importance: variable importance computed?","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Inspect your ORSF model — print.orsf_fit","text":"","code":"# S3 method for orsf_fit print(x, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Inspect your ORSF model — print.orsf_fit","text":"x (orsf_fit) oblique random survival forest (ORSF; see orsf). ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Inspect your ORSF model — print.orsf_fit","text":"x, invisibly.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Inspect your ORSF model — print.orsf_fit","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id, n_tree = 5) print(object) #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 5 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.79 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"Print ORSF summary — print.orsf_summary_uni","title":"Print ORSF summary — print.orsf_summary_uni","text":"Print ORSF summary","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Print ORSF summary — print.orsf_summary_uni","text":"","code":"# S3 method for orsf_summary_uni print(x, n_variables = NULL, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Print ORSF summary — print.orsf_summary_uni","text":"x object class 'orsf_summary' n_variables number variables print ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Print ORSF summary — print.orsf_summary_uni","text":"invisibly, x","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Print ORSF summary — print.orsf_summary_uni","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) smry <- orsf_summarize_uni(object, n_variables = 3) print(smry) #> #> -- bili (VI Rank: 1) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2299692 0.1278705 0.04826338 0.3588591 #> 1.4 0.2513137 0.1470933 0.06061880 0.3812462 #> 3.5 0.3639117 0.2809449 0.16351062 0.5379425 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2612727 0.1415592 0.04971317 0.4565375 #> 74 0.2794186 0.1534584 0.05670107 0.4771913 #> 129 0.3342594 0.2176957 0.10551927 0.5351913 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3462657 0.2350962 0.11603543 0.5549656 #> f 0.2955408 0.1650527 0.05094048 0.5064862 #> #> Predicted risk at time t = 1788 for top 3 predictors"},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-010-unreleased","dir":"Changelog","previous_headings":"","what":"aorsf 0.1.0 (unreleased)","title":"aorsf 0.1.0 (unreleased)","text":"Re-worked internal C++ routines following design ranger. Re-worked progress printed console verbose_progress TRUE, following design ranger. Messages now indicate action taken, % complete, approximate time finishing action. Improved variable importance, following design ranger. Importance now computed tree--tree instead aggregate. Additionally, mortality type prediction used importance survival trees, since mortality depend pred_horizon. Allowed multi-threading performed orsf(), predict.orsf_fit(), functions orsf_vi() orsf_pd() family. Allowed sampling without replacement sampling specific fraction observations orsf() Included Harrell’s C-statistic option assessing goodness splits growing trees. Fixed issue uninformative error message occur pred_horizon > max(time) orsf_summarize_uni. Thanks @JyHao1 @DustinMLong finding !","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-007","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.7","title":"aorsf 0.0.7","text":"CRAN release: 2023-01-12 Additional changes internal testing avoid problems ATLAS","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-006","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.6","title":"aorsf 0.0.6","text":"CRAN release: 2023-01-06 Minor fix internal tests failing run ATLAS","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-005","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.5","title":"aorsf 0.0.5","text":"CRAN release: 2022-12-14 orsf() longer throws errors warnings try give single predictor. note added documentation details ?orsf explains using single predictor orsf() somewhat useless. done resolve https://github.com/mlr-org/mlr3extralearners/issues/259. predict.orsf_fit now accepts pred_horizon = 0 returns sensible values. Thanks @mattwarkentin feature request. added function perform variable selection, orsf_vs(). Made variable importance consistent respect group_factors. Originally, output orsf ungrouped VI values orsf_vi grouped values. update, orsf defaults grouped values. ungrouped values can still recovered. Fixed issue orsf_pd functions output data returned original scale.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-004","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.4","title":"aorsf 0.0.4","text":"CRAN release: 2022-11-07 orsf formulas now accepts Surv objects (see https://github.com/ropensci/aorsf/issues/11) Added verbose_progress input orsf, prints messages console indicating progress. Allowance missing values orsf. Mean mode imputation performed observations missing data. values can also used impute new data missing values. Centering scaling predictors now done prior growing forest.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-003","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.3","title":"aorsf 0.0.3","text":"CRAN release: 2022-10-09 Included rOpenSci reviewers Christopher Jackson, Marvin N Wright, Lukas Burk DESCRIPTION reviewers. Thank ! Added clarification docs pros/cons different variable importance techniques Added regression tests aorsf versus obliqueRSF (similar) Additional support tests functions long right hand sides Updated --bag vignette appropriate custom functions. Allow status values input data general, .e., just 0 1. Allow missing values predict functions, including partial dependence.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-002","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.2","title":"aorsf 0.0.2","text":"CRAN release: 2022-09-05 Modified unit tests compatibility extra checks run CRAN.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-001","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.1","title":"aorsf 0.0.1","text":"CRAN release: 2022-08-23 Added orsf_control_custom(), allows users submit custom functions identifying linear combinations inputs growing oblique decision trees. Added weights input orsf, allowing users fit orsf specific data training set. Added chf mort options predict.orsf_fit(). Mortality predictions fully implemented yet - supported partial dependence --bag error estimates. features added future update.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-0009000","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.0.9000","title":"aorsf 0.0.0.9000","text":"Core features implemented: fit, interpret, predict using oblique random survival forests. Vignettes + Readme covering usage core features. Website hosted GitHub pages, managed pkgdown.","code":""}] +[{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contributing to aorsf","title":"Contributing to aorsf","text":"Want contribute aorsf? Great! aorsf initially stable state development, great deal active subsequent development envisioned. outline propose change aorsf. detailed info contributing , tidyverse packages, please see development contributing guide.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"fixing-typos","dir":"","previous_headings":"","what":"Fixing typos","title":"Contributing to aorsf","text":"can fix typos, spelling mistakes, grammatical errors documentation directly using GitHub web interface, long changes made source file. generally means ’ll need edit roxygen2 comments .R, .Rd file. can find .R file generates .Rd reading comment first line.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"bigger-changes","dir":"","previous_headings":"","what":"Bigger changes","title":"Contributing to aorsf","text":"want make bigger change, ’s good idea first file issue make sure someone team agrees ’s needed. ’ve found bug, please file issue illustrates bug minimal reprex (also help write unit test, needed).","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"pull-request-process","dir":"","previous_headings":"Bigger changes","what":"Pull request process","title":"Contributing to aorsf","text":"Fork package clone onto computer. haven’t done , recommend using usethis::create_from_github(\"ropensci/aorsf\", fork = TRUE). Install development dependencies devtools::install_dev_deps(), make sure package passes R CMD check running devtools::check(). R CMD check doesn’t pass cleanly, ’s good idea ask help continuing. Create Git branch pull request (PR). recommend using usethis::pr_init(\"brief-description--change\"). Make changes, commit git, create PR running usethis::pr_push(), following prompts browser. title PR briefly describe change. body PR contain Fixes #issue-number. user-facing changes, add bullet top NEWS.md (.e. just first header). Follow style described https://style.tidyverse.org/news.html.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"code-style","dir":"","previous_headings":"Bigger changes","what":"Code style","title":"Contributing to aorsf","text":"New code follow tidyverse style guide. can use styler package apply styles, please don’t restyle code nothing PR. use roxygen2, Markdown syntax, documentation. use testthat unit tests. Contributions test cases included easier accept.","code":""},{"path":"https://bcjaeger.github.io/aorsf/CONTRIBUTING.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Contributing to aorsf","text":"Please note aorsf project released Contributor Code Conduct. contributing project agree abide terms.","code":""},{"path":"https://bcjaeger.github.io/aorsf/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2022 aorsf authors (Byron C. Jaeger, Sawyer Welden, Nicholas M. Pajewski) Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"background-orsf","dir":"Articles","previous_headings":"","what":"Background: ORSF","title":"Introduction to aorsf","text":"oblique random survival forest (ORSF) extension axis-based RSF algorithm. See orsf details ORSFs. see JCGS paper details algorithms used specifically aorsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"accelerated-orsf","dir":"Articles","previous_headings":"","what":"Accelerated ORSF","title":"Introduction to aorsf","text":"purpose aorsf (‘’ short accelerated) provide routines fit ORSFs scale adequately large data sets. fastest algorithm available package accelerated ORSF model, default method used orsf(): may notice first input aorsf data. design choice makes easier use orsf pipes (.e., %>% |>). instance,","code":"library(aorsf) set.seed(329) orsf_fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id) orsf_fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> ----------------------------------------- library(dplyr) orsf_fit <- pbc_orsf |> select(-id) |> orsf(formula = Surv(time, status) ~ .)"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"interpretation","dir":"Articles","previous_headings":"","what":"Interpretation","title":"Introduction to aorsf","text":"aorsf includes several functions dedicated interpretation ORSFs, estimation partial dependence variable importance.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"variable-importance","dir":"Articles","previous_headings":"Interpretation","what":"Variable importance","title":"Introduction to aorsf","text":"aorsf provides multiple ways compute variable importance. compute negation importance, ORSF multiplies coefficient variable -1 re-computes --sample (sometimes referred --bag) accuracy ORSF model. can also compute variable importance using permutation, classical approach. faster alternative permutation negation importance ANOVA importance, computes proportion times variable obtains low p-value (p < 0.01) forest grown.","code":"orsf_vi_negate(orsf_fit) #> bili copper sex stage protime albumin #> 0.126868625 0.047162286 0.036036494 0.024370032 0.024165418 0.022543554 #> age chol ascites ast spiders edema #> 0.021373110 0.015358846 0.013907057 0.011690468 0.007541334 0.007028412 #> hepato trt alk.phos trig platelet #> 0.004932193 0.004000817 0.003483106 0.003082097 0.000417310 orsf_vi_permute(orsf_fit) #> bili copper protime albumin ascites #> 0.0572499737 0.0230104735 0.0133869203 0.0128321618 0.0126923838 #> age stage chol ast spiders #> 0.0125921520 0.0114869475 0.0074350997 0.0065099370 0.0059679015 #> edema hepato sex alk.phos trig #> 0.0051010106 0.0026435147 0.0024594511 0.0011071433 0.0006267128 #> trt platelet #> -0.0002714461 -0.0008464102 orsf_vi_anova(orsf_fit) #> ascites bili copper edema albumin age protime #> 0.49453823 0.42999054 0.30285438 0.30172086 0.25564632 0.25478301 0.24861878 #> stage chol ast hepato spiders sex trig #> 0.20975354 0.19204981 0.17066015 0.16363636 0.16357504 0.14437500 0.13601630 #> alk.phos platelet trt #> 0.10744986 0.08044316 0.07594937"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"partial-dependence-pd","dir":"Articles","previous_headings":"Interpretation","what":"Partial dependence (PD)","title":"Introduction to aorsf","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. PD, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"individual-conditional-expectations-ice","dir":"Articles","previous_headings":"Interpretation","what":"Individual conditional expectations (ICE)","title":"Introduction to aorsf","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. ICE, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"what-about-the-original-orsf","dir":"Articles","previous_headings":"","what":"What about the original ORSF?","title":"Introduction to aorsf","text":"original ORSF (.e., obliqueRSF) used glmnet find linear combinations inputs. aorsf allows users implement approach using orsf_control_net() function: net forests fit lot faster original ORSF function obliqueRSF. However, net forests still much slower cph ones:","code":"orsf_net <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_net(), n_tree = 50) # tracking how long it takes to fit 50 glmnet trees print( t1 <- system.time( orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_net(), n_tree = 50) ) ) #> user system elapsed #> 4.076 0.000 4.077 # and how long it takes to fit 50 cph trees print( t2 <- system.time( orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_cph(), n_tree = 50) ) ) #> user system elapsed #> 0.041 0.000 0.041 t1['elapsed'] / t2['elapsed'] #> elapsed #> 99.43902"},{"path":"https://bcjaeger.github.io/aorsf/articles/aorsf.html","id":"aorsf-and-other-machine-learning-software","dir":"Articles","previous_headings":"","what":"aorsf and other machine learning software","title":"Introduction to aorsf","text":"unique feature aorsf fast algorithms fit ORSF ensembles. RLT obliqueRSF fit oblique random survival forests, aorsf faster. ranger randomForestSRC fit survival forests, neither package supports oblique splitting. obliqueRF fits oblique random forests classification regression, survival. PPforest fits oblique random forests classification survival. Note: default prediction behavior aorsf models produce predicted risk specific prediction horizon, default ranger randomForestSRC. think change future, computing time independent predictions aorsf helpful.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"go-faster","dir":"Articles","previous_headings":"","what":"Go faster","title":"Tips to speed up computation","text":"Analyses can slow crawl models need hours run. article find tricks prevent bottleneck using orsf(). ’ll use flchain data survival demonstrate. flc data 7871 rows 11 columns:","code":"data(\"flchain\", package = 'survival') flc <- flchain # do this to avoid orsf() throwing an error about time to event = 0 flc <- flc[flc$futime > 0, ] # modify names names(flc)[names(flc) == 'futime'] <- 'time' names(flc)[names(flc) == 'death'] <- 'status' head(flc) #> age sex sample.yr kappa lambda flc.grp creatinine mgus time status #> 1 97 F 1997 5.70 4.860 10 1.7 0 85 1 #> 2 92 F 2000 0.87 0.683 1 0.9 0 1281 1 #> 3 94 F 1997 4.36 3.850 10 1.4 0 69 1 #> 4 92 F 1996 2.42 2.220 9 1.0 0 115 1 #> 5 93 F 1996 1.32 1.690 6 1.1 0 1039 1 #> 6 90 F 1997 2.01 1.860 9 1.0 0 1355 1 #> chapter #> 1 Circulatory #> 2 Neoplasms #> 3 Circulatory #> 4 Circulatory #> 5 Circulatory #> 6 Mental"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"use-orsf_control_fast","dir":"Articles","previous_headings":"","what":"Use orsf_control_fast()","title":"Tips to speed up computation","text":"default control value orsf() run-time compared approaches can striking. example:","code":"time_fast <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', control = orsf_control_fast(), n_tree = 10) ) time_net <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', control = orsf_control_net(), n_tree = 10) ) # control_fast() is much faster time_net['elapsed'] / time_fast['elapsed'] #> elapsed #> 34.77959"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"use-n_thread","dir":"Articles","previous_headings":"","what":"Use n_thread","title":"Tips to speed up computation","text":"n_thread argument uses multi-threading run aorsf functions parallel possible. know many threads want, e.g. want exactly 5, just say n_thread = 5. aren’t sure many threads available want use many can, say n_thread = 0 aorsf figure number . R single threaded language, multi-threading applied orsf() needs call R functions C++, occurs customized R function used find linear combination variables compute prediction accuracy.","code":"time_1_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 1, n_tree = 500) ) time_5_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 5, n_tree = 500) ) time_auto_thread <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500) ) # 5 threads and auto thread are both about 3 times faster than one thread time_1_thread['elapsed'] / time_5_thread['elapsed'] #> elapsed #> 0.3299163 time_1_thread['elapsed'] / time_auto_thread['elapsed'] #> elapsed #> 0.773646"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"do-less","dir":"Articles","previous_headings":"","what":"Do less","title":"Tips to speed up computation","text":"defaults orsf() can adjusted make run faster: set n_retry 0 instead 3 (default) set oobag_pred_type ‘none’ instead ‘surv’ (default) set ‘importance’ ‘none’ instead ‘anova’ (default) increase split_min_events, split_min_obs, leaf_min_events, leaf_min_obs make trees stop growing sooner increase split_min_stat make trees stop growing sooner Applying tips: default values make orsf() run slower, also usually make predictions accurate make fit easier interpret.","code":"time_lightweight <- system.time( expr = orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500, n_retry = 0, oobag_pred_type = 'none', importance = 'none', split_min_events = 20, leaf_min_events = 10, split_min_stat = 10) ) # about two times faster than auto thread with defaults time_auto_thread['elapsed'] / time_lightweight['elapsed'] #> elapsed #> 2.361446"},{"path":"https://bcjaeger.github.io/aorsf/articles/fast.html","id":"show-progress","dir":"Articles","previous_headings":"","what":"Show progress","title":"Tips to speed up computation","text":"Setting verbose_progress = TRUE doesn’t make anything run faster, can help make feel like things running less slow.","code":"verbose_fit <- orsf(flc, time+status~., na_action = 'na_impute_meanmode', n_thread = 0, n_tree = 500, verbose_progress = TRUE) #> Growing trees: 20%. ~ time remaining: 8 seconds. #> Growing trees: 40%. ~ time remaining: 6 seconds. #> Growing trees: 63%. ~ time remaining: 3 seconds. #> Growing trees: 82%. ~ time remaining: 1 seconds. #> Growing trees: 100%. #> Computing predictions: 100%."},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"out-of-bag-data","dir":"Articles","previous_headings":"","what":"Out-of-bag data","title":"Out-of-bag predictions and evaluation","text":"random forests, tree grown bootstrapped version training set. bootstrap samples selected replacement, bootstrapped training set contains two-thirds instances original training set. ‘--bag’ data instances bootstrapped training set.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"out-of-bag-predictions-and-error","dir":"Articles","previous_headings":"","what":"Out-of-bag predictions and error","title":"Out-of-bag predictions and evaluation","text":"tree random forest can make predictions --bag data, --bag predictions can aggregated make ensemble --bag prediction. Since --bag data used grow tree, accuracy ensemble --bag predictions approximate generalization error random forest. --bag prediction error plays central role routines estimate variable importance, e.g. negation importance. Let’s fit oblique random survival forest plot distribution ensemble --bag predictions. surprisingly, survival predictions 0 1. Next, let’s check --bag accuracy fit: --bag estimate Harrell’s C-statistic (default method evaluate --bag predictions) 0.8399396.","code":"fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, oobag_pred_type = 'surv', oobag_pred_horizon = 2000) hist(fit$pred_oobag, main = 'Ensemble out-of-bag survival predictions at t=3,500') # what function is used to evaluate out-of-bag predictions? fit$eval_oobag$stat_type #> [1] \"Harrell's C-statistic\" # what is the output from this function? fit$eval_oobag$stat_values #> [,1] #> [1,] 0.8399396"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"monitoring-out-of-bag-error","dir":"Articles","previous_headings":"","what":"Monitoring out-of-bag error","title":"Out-of-bag predictions and evaluation","text":"--bag data set contains one-third training set, --bag error estimate usually converges stable value trees added forest. want monitor convergence --bag error oblique random survival forest, can set oobag_eval_every compute --bag error every oobag_eval_every tree. example, let’s compute --bag error fitting tree forest 50 trees: general, least 500 trees recommended random forest fit. ’re just using 50 case better illustration --bag error curve. Also, helps make run-times low whenever need re-compile package vignettes.","code":"fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_type = 'surv', oobag_pred_horizon = 2000, oobag_eval_every = 1) plot( x = seq(1, 50, by = 1), y = fit$eval_oobag$stat_values, main = 'Out-of-bag C-statistic computed after each new tree is grown.', xlab = 'Number of trees grown', ylab = fit$eval_oobag$stat_type )"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"user-supplied-out-of-bag-evaluation-functions","dir":"Articles","previous_headings":"","what":"User-supplied out-of-bag evaluation functions","title":"Out-of-bag predictions and evaluation","text":"cases, may want control --bag error estimated. example, let’s use Brier score SurvMetrics package: two ways apply function compute --bag error. First, can apply function --bag survival predictions stored ‘aorsf’ objects, e.g: Second, can pass function orsf(), used place Harrell’s C-statistic: can also compute time-dependent C-statistic instead Harrell’s C-statistic (default oob function):","code":"oobag_fun_brier <- function(y_mat, w_vec, s_vec){ # output is numeric vector of length 1 as.numeric( SurvMetrics::Brier( object = Surv(time = y_mat[, 1], event = y_mat[, 2]), pre_sp = s_vec, # t_star in Brier() should match oob_pred_horizon in orsf() t_star = 2000 ) ) } oobag_fun_brier(y_mat = pbc_orsf[,c('time', 'status')], s_vec = fit$pred_oobag) #> [1] 0.113472 fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_brier, oobag_eval_every = 1) plot( x = seq(1, 50, by = 1), y = fit$eval_oobag$stat_values, main = 'Out-of-bag error computed after each new tree is grown.', sub = 'For the Brier score, lower values indicate more accurate predictions', xlab = 'Number of trees grown', ylab = \"Brier score\" ) oobag_fun_tdep_cstat <- function(y_mat, w_vec, s_vec){ as.numeric( SurvMetrics::Cindex( object = Surv(time = y_mat[, 1], event = y_mat[, 2]), predicted = s_vec, t_star = 2000 ) ) } fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 50, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_tdep_cstat, oobag_eval_every = 1) plot( x = seq(50), y = fit$eval_oobag$stat_values, main = 'Out-of-bag time-dependent AUC\\ncomputed after each new tree is grown.', xlab = 'Number of trees grown', ylab = \"AUC at t = 2,000\" )"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"specific-instructions-on-user-supplied-functions","dir":"Articles","previous_headings":"User-supplied out-of-bag evaluation functions","what":"Specific instructions on user-supplied functions","title":"Out-of-bag predictions and evaluation","text":"User-supplied functions must: exactly three arguments named y_mat, w_vec, s_vec. return numeric output length 1 either conditions true, error occur. simple test make sure user-supplied function work aorsf package :","code":"# Helper code to make sure your oobag_fun function will work with aorsf # time and status values test_time <- seq(from = 1, to = 5, length.out = 100) test_status <- rep(c(0,1), each = 50) # y-matrix is presumed to contain time and status (with column names) y_mat <- cbind(time = test_time, status = test_status) # s_vec is presumed to be a vector of survival probabilities s_vec <- seq(0.9, 0.1, length.out = 100) # see 1 in the checklist above names(formals(oobag_fun_tdep_cstat)) == c(\"y_mat\", \"w_vec\", \"s_vec\") #> [1] TRUE TRUE TRUE test_output <- oobag_fun_tdep_cstat(y_mat = y_mat, w_vec = w_vec, s_vec = s_vec) # test output should be numeric is.numeric(test_output) #> [1] TRUE # test_output should be a numeric value of length 1 length(test_output) == 1 #> [1] TRUE"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"user-supplied-functions-for-negation-importance-","dir":"Articles","previous_headings":"","what":"User-supplied functions for negation importance.","title":"Out-of-bag predictions and evaluation","text":"Negation importance based --bag error, course may curious negation importance computed using different statistics. workflow exactly example , except two things: specify importance = 'negate' fit model. want use modified version C-stat, specifically 1 - C-stat, aorsf computes variable importance. Also, speed computations, going monitor --bag error .","code":"oobag_fun_tdep_cstat_inverse <- function(y_mat, w_vec, s_vec){ 1 - oobag_fun_tdep_cstat(y_mat, w_vec, s_vec) } fit_tdep_cstat <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 100, oobag_pred_horizon = 2000, oobag_fun = oobag_fun_tdep_cstat_inverse, importance = 'negate') fit_tdep_cstat$importance #> bili copper stage sex albumin age #> 0.11431938 0.04283192 0.03011800 0.02978767 0.02434698 0.02379080 #> protime chol ascites ast spiders edema #> 0.02289864 0.01823123 0.01264641 0.00986446 0.00913007 0.00769056 #> hepato trig alk.phos trt platelet #> 0.00636780 0.00619816 0.00258887 0.00046192 -0.00201958"},{"path":"https://bcjaeger.github.io/aorsf/articles/oobag.html","id":"notes","dir":"Articles","previous_headings":"","what":"Notes","title":"Out-of-bag predictions and evaluation","text":"evaluating --bag error: oobag_pred_horizon input orsf() determines prediction horizon --bag predictions. prediction horizon needs specified evaluate prediction accuracy cases, examples . sure check case using functions, , sure oobag_pred_horizon matches prediction horizon used custom function. functions expect predicted risk (.e., 1 - predicted survival), others expect predicted survival. cases, also able use function whatsoever compute --bag prediction error estimating negation permutation importance, assuming passes tests . Unfortunately, exception riskRegression::Score(), one favorites. experimented riskRegression::Score found work try run C++. sure case.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"partial-dependence-pd","dir":"Articles","previous_headings":"","what":"Partial dependence (PD)","title":"PD and ICE curves with ORSF","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. Begin fitting ORSF ensemble. Set prediction horizon 5 years fit ensemble aorsf function pass ensemble assume want compute predictions 5 years.","code":"library(aorsf) pred_horizon <- 365.25 * 5 set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = pred_horizon) fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 150 #> N events: 52 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 10 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.83 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"three-ways-to-compute-pd","dir":"Articles","previous_headings":"","what":"Three ways to compute PD","title":"PD and ICE curves with ORSF","text":"can compute PD three ways aorsf: using -bag predictions training data using --bag predictions training data using predictions new set data -bag PD indicates relationships model learned training. helpful goal interpret model. --bag PD indicates relationships model learned training using --bag data simulates application model new data. want test model’s reliability fairness new data don’t access large testing set. new data PD shows model predicts outcomes observations seen. helpful want test model’s reliability fairness. Let’s re-fit ORSF available data proceeding next sections.","code":"pd_inb <- orsf_pd_inb(fit, pred_spec = list(bili = 1:5)) pd_inb #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2051019 0.02133505 0.1041901 0.7767571 #> 2: 1826.25 2 0.2375037 0.03381034 0.1317682 0.8012817 #> 3: 1826.25 3 0.2789144 0.05481241 0.1837621 0.8168042 #> 4: 1826.25 4 0.3291518 0.09241597 0.2449438 0.8348067 #> 5: 1826.25 5 0.3646945 0.12594131 0.2830947 0.8379429 pd_oob <- orsf_pd_oob(fit, pred_spec = list(bili = 1:5)) pd_oob #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2057925 0.02172816 0.1123039 0.7770151 #> 2: 1826.25 2 0.2376552 0.03557858 0.1421651 0.7975343 #> 3: 1826.25 3 0.2783471 0.05443407 0.1808253 0.8059614 #> 4: 1826.25 4 0.3286654 0.09472187 0.2397779 0.8234719 #> 5: 1826.25 5 0.3637542 0.12856484 0.2807135 0.8243895 pd_test <- orsf_pd_new(fit, new_data = pbc_orsf_test, pred_spec = list(bili = 1:5)) pd_test #> pred_horizon bili mean lwr medn upr #> 1: 1826.25 1 0.2438990 0.02179705 0.1779682 0.8047647 #> 2: 1826.25 2 0.2754938 0.03964752 0.2152529 0.8222641 #> 3: 1826.25 3 0.3180577 0.06354033 0.2671143 0.8375648 #> 4: 1826.25 4 0.3688818 0.10422564 0.3255283 0.8540203 #> 5: 1826.25 5 0.4045088 0.13846933 0.3595994 0.8570826 set.seed(329730) fit <- orsf(pbc_orsf, Surv(time, status) ~ . -id, oobag_pred_horizon = pred_horizon)"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"one-variable-one-horizon","dir":"Articles","previous_headings":"","what":"One variable, one horizon","title":"PD and ICE curves with ORSF","text":"Computing PD single variable straightforward: output shows expected predicted mortality risk men substantially higher women 5 years baseline.","code":"pd_sex <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\"))) pd_sex #> pred_horizon sex mean lwr medn upr #> 1: 1826.25 m 0.3451974 0.0427366 0.2331537 0.9327978 #> 2: 1826.25 f 0.2978609 0.0136574 0.1579864 0.9440116"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"one-variable-moving-horizon","dir":"Articles","previous_headings":"","what":"One variable, moving horizon","title":"PD and ICE curves with ORSF","text":"effect predictor varies time? PD can show . inspection, can see males higher risk females difference risk grows time. can also seen viewing ratio expected risk time:","code":"pd_sex_tv <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\")), pred_horizon = seq(365, 365*5)) ggplot(pd_sex_tv, aes(x = pred_horizon, y = mean, color = sex)) + geom_line() + labs(x = 'Time since baseline', y = 'Expected risk') library(data.table) ratio_tv <- pd_sex_tv[ , .(ratio = mean[sex == 'm'] / mean[sex == 'f']), by = pred_horizon ] ggplot(ratio_tv, aes(x = pred_horizon, y = ratio)) + geom_line(color = 'grey') + geom_smooth(color = 'black', se = FALSE) + labs(x = 'time since baseline', y = 'ratio in expected risk for males versus females') #> `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = \"cs\")'"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"multiple-variables-marginally","dir":"Articles","previous_headings":"","what":"Multiple variables, marginally","title":"PD and ICE curves with ORSF","text":"want compute PD marginally multiple variables, just list variable values pred_spec specify expand_grid = FALSE. Now tedious wanted variables? bet. ’s made function . bonus, printed output sorted least important variables. ’s easy enough turn ‘summary’ object data.table downstream plotting tables.","code":"pd_two_vars <- orsf_pd_oob(fit, pred_spec = list(sex = c(\"m\", \"f\"), bili = 1:5), expand_grid = FALSE) pd_two_vars #> pred_horizon variable value level mean lwr medn upr #> 1: 1826.25 sex NA m 0.3451974 0.04273660 0.2331537 0.9327978 #> 2: 1826.25 sex NA f 0.2978609 0.01365740 0.1579864 0.9440116 #> 3: 1826.25 bili 1 0.2377429 0.01650482 0.1303688 0.8575800 #> 4: 1826.25 bili 2 0.2867698 0.04155204 0.1765653 0.8932449 #> 5: 1826.25 bili 3 0.3373077 0.06634432 0.2427874 0.9101957 #> 6: 1826.25 bili 4 0.3837022 0.09015452 0.3056544 0.9105841 #> 7: 1826.25 bili 5 0.4175154 0.12377812 0.3476088 0.9125227 pd_smry <- orsf_summarize_uni(fit) pd_smry #> #> -- bili (VI Rank: 1) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2327133 0.1276946 0.05237649 0.3619835 #> 1.4 0.2528210 0.1474908 0.06277984 0.3820733 #> 3.5 0.3642485 0.2821089 0.15739236 0.5383749 #> #> -- copper (VI Rank: 2) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2627892 0.1430477 0.05239847 0.4404427 #> 74 0.2818189 0.1623311 0.06048325 0.4828843 #> 129 0.3344419 0.2233296 0.10952284 0.5430557 #> #> -- sex (VI Rank: 3) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3451974 0.2331537 0.11147842 0.5720925 #> f 0.2978609 0.1579864 0.05257254 0.5329951 #> #> -- stage (VI Rank: 4) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 1 0.2568042 0.1364586 0.04826090 0.4308291 #> 2 0.2681925 0.1445437 0.04785007 0.4609626 #> 3 0.2924500 0.1646026 0.05226510 0.5065589 #> 4 0.3370752 0.2083311 0.08155862 0.5754540 #> #> -- albumin (VI Rank: 5) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 3.3 0.3189682 0.1890327 0.06882698 0.5634286 #> 3.5 0.2932022 0.1594218 0.05570448 0.5272234 #> 3.8 0.2762511 0.1513096 0.05220714 0.4862937 #> #> -- protime (VI Rank: 6) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 10 0.2804891 0.1543938 0.05164468 0.4924859 #> 11 0.2945915 0.1689627 0.05912412 0.5214456 #> 11 0.3162286 0.1898853 0.07036679 0.5532870 #> #> -- age (VI Rank: 7) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 42 0.2717577 0.1388202 0.05264347 0.4541974 #> 50 0.2985259 0.1797617 0.05562463 0.5285119 #> 57 0.3298805 0.2328557 0.07349113 0.5641154 #> #> -- ast (VI Rank: 8) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 82 0.2805643 0.1468324 0.05099136 0.5042377 #> 117 0.2974411 0.1529651 0.05662912 0.5347199 #> 153 0.3214486 0.1820013 0.06881978 0.5836435 #> #> -- ascites (VI Rank: 9) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2978562 0.1652968 0.05503683 0.5213956 #> 1 0.4612987 0.3958924 0.25509873 0.6458299 #> #> -- chol (VI Rank: 10) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 250 0.2861065 0.1528316 0.04722530 0.4946336 #> 310 0.2941216 0.1591265 0.05254708 0.4988147 #> 401 0.3154760 0.1890564 0.07563854 0.5148573 #> #> -- hepato (VI Rank: 11) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2862485 0.1593974 0.05157100 0.5025263 #> 1 0.3190555 0.1835008 0.07087698 0.5626892 #> #> -- edema (VI Rank: 12) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2934074 0.1619484 0.05366214 0.5174757 #> 0.5 0.3522489 0.2426686 0.10376815 0.5853984 #> 1 0.4561646 0.3621368 0.26357824 0.6406115 #> #> -- spiders (VI Rank: 13) --------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2918349 0.1561874 0.05157100 0.5115626 #> 1 0.3325745 0.2117035 0.08822863 0.5619282 #> #> -- trt (VI Rank: 14) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> d_penicill_main 0.3066250 0.1732905 0.06037907 0.5329951 #> placebo 0.3025089 0.1587980 0.05366214 0.5531033 #> #> -- trig (VI Rank: 15) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 85 0.2922057 0.1538922 0.05008490 0.5097474 #> 108 0.3009226 0.1647050 0.05206774 0.5217247 #> 151 0.3154298 0.1814550 0.06141081 0.5207955 #> #> -- alk.phos (VI Rank: 16) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 922 0.3034132 0.1650884 0.05647195 0.5507628 #> 1278 0.3041575 0.1668115 0.05783564 0.5506103 #> 2068 0.3080757 0.1681812 0.05979272 0.5577576 #> #> -- platelet (VI Rank: 17) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 200 0.3087603 0.1702265 0.05788128 0.5620491 #> 257 0.3028452 0.1611317 0.05491025 0.5524962 #> 318 0.2981837 0.1641031 0.05500888 0.5324483 #> #> Predicted risk at time t = 1826.25 for top 17 predictors head(as.data.table(pd_smry)) #> variable importance Value Mean Median 25th % 75th % #> 1: bili 0.12455311 0.80 0.2327133 0.1276946 0.05237649 0.3619835 #> 2: bili 0.12455311 1.4 0.2528210 0.1474908 0.06277984 0.3820733 #> 3: bili 0.12455311 3.5 0.3642485 0.2821089 0.15739236 0.5383749 #> 4: copper 0.05316189 43 0.2627892 0.1430477 0.05239847 0.4404427 #> 5: copper 0.05316189 74 0.2818189 0.1623311 0.06048325 0.4828843 #> 6: copper 0.05316189 129 0.3344419 0.2233296 0.10952284 0.5430557 #> pred_horizon level #> 1: 1826.25 #> 2: 1826.25 #> 3: 1826.25 #> 4: 1826.25 #> 5: 1826.25 #> 6: 1826.25 "},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"multiple-variables-jointly","dir":"Articles","previous_headings":"","what":"Multiple variables, jointly","title":"PD and ICE curves with ORSF","text":"PD can show expected value model’s predictions function specific predictor, function multiple predictors. instance, can estimate predicted risk joint function bili, edema, trt: inspection, model’s predictions indicate slightly lower risk placebo group, seem change much different values bili edema. clear increase predicted risk higher levels edema higher levels bili slope predicted risk function bili appears highest among patients edema 0.5. effect bili modified edema 0.5? quick sanity check coxph suggests .","code":"pred_spec = list(bili = seq(1, 5, length.out = 20), edema = levels(pbc_orsf_train$edema), trt = levels(pbc_orsf$trt)) pd_bili_edema <- orsf_pd_oob(fit, pred_spec) library(ggplot2) ggplot(pd_bili_edema, aes(x = bili, y = medn, col = trt, linetype = edema)) + geom_line() + labs(y = 'Expected predicted risk') library(survival) pbc_orsf$edema_05 <- ifelse(pbc_orsf$edema == '0.5', 'yes', 'no') fit_cph <- coxph(Surv(time,status) ~ edema_05 * bili, data = pbc_orsf) anova(fit_cph) #> Analysis of Deviance Table #> Cox model: response is Surv(time, status) #> Terms added sequentially (first to last) #> #> loglik Chisq Df Pr(>|Chi|) #> NULL -550.19 #> edema_05 -546.83 6.7248 1 0.009508 ** #> bili -513.59 66.4689 1 3.555e-16 *** #> edema_05:bili -510.54 6.1112 1 0.013433 * #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"individual-conditional-expectations-ice","dir":"Articles","previous_headings":"","what":"Individual conditional expectations (ICE)","title":"PD and ICE curves with ORSF","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. Just like PD, can compute ICE using -bag, --bag, testing data, principles apply. ’ll use --bag estimates .","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"visualizing-ice-curves","dir":"Articles","previous_headings":"","what":"Visualizing ICE curves","title":"PD and ICE curves with ORSF","text":"Inspecting ICE curves observation can help identify whether heterogeneity model’s predictions. .e., effect variable follow pattern data, groups variable impacts risk differently? going turn boundary checking orsf_ice_oob setting boundary_checks = FALSE, allow generate ICE curves go beyond 90th percentile bili. id_variable identifier current value variable(s) data. redundant one variable, helpful multiple variables. id_row identifier observation original data. used group observation’s predictions together plots. plots, helpful scale ICE data. subtract initial value predicted risk (.e., bili = 1) observation’s conditional expectation values. , Every curve start 0 plot shows change predicted risk function bili. Now can visualize curves. inspection figure, individual slopes cluster around overall trend - Good! small number individual slopes appear flat. may helpful investigate .","code":"pred_spec <- list(bili = seq(1, 10, length.out = 25)) ice_oob <- orsf_ice_oob(fit, pred_spec, boundary_checks = FALSE) ice_oob #> id_variable id_row pred_horizon bili pred #> 1: 1 1 1826.25 1 0.8765990 #> 2: 1 2 1826.25 1 0.1130416 #> 3: 1 3 1826.25 1 0.7143673 #> 4: 1 4 1826.25 1 0.3291217 #> 5: 1 5 1826.25 1 0.1019858 #> --- #> 6896: 25 272 1826.25 10 0.2732672 #> 6897: 25 273 1826.25 10 0.4605414 #> 6898: 25 274 1826.25 10 0.4609702 #> 6899: 25 275 1826.25 10 0.2830265 #> 6900: 25 276 1826.25 10 0.5527966 ice_oob[, pred_subtract := rep(pred[id_variable==1], times=25)] ice_oob[, pred := pred - pred_subtract] library(ggplot2) ggplot(ice_oob, aes(x = bili, y = pred, group = id_row)) + geom_line(alpha = 0.15) + labs(y = 'Change in predicted risk') + geom_smooth(se = FALSE, aes(group = 1)) #> `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = \"cs\")'"},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"limitations-of-pd","dir":"Articles","previous_headings":"","what":"Limitations of PD","title":"PD and ICE curves with ORSF","text":"Partial dependence number known limitations assumptions users aware (see Hooker, 2021). particular, partial dependence less intuitive >2 predictors examined jointly, assumed feature(s) partial dependence computed correlated features (likely true many cases). Accumulated local effect plots can used (see ) case feature independence valid assumption.","code":""},{"path":"https://bcjaeger.github.io/aorsf/articles/pd.html","id":"references","dir":"Articles","previous_headings":"","what":"References","title":"PD and ICE curves with ORSF","text":"Giles Hooker, Lucas Mentch, Siyu Zhou. Unrestricted Permutation forces Extrapolation: Variable Importance Requires least One Model, Free Variable Importance. arXiv e-prints 2021 Oct; arXiv-1905. URL: https://doi.org/10.48550/arXiv.1905.03151","code":""},{"path":"https://bcjaeger.github.io/aorsf/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Byron Jaeger. Author, maintainer. Nicholas Pajewski. Contributor. Sawyer Welden. Contributor. Christopher Jackson. Reviewer. Marvin Wright. Reviewer. Lukas Burk. Reviewer.","code":""},{"path":"https://bcjaeger.github.io/aorsf/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Jaeger et al. (2022). aorsf: R package supervised learning using oblique random survival forest. Journal Open Source Software, 7(77), 4705. https://doi.org/10.21105/joss.04705. Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics. 2023 Aug 3:1-6. Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique Random Survival Forests. Annals Applied Statistics. 13(3): 1847-1883. URL https://doi.org/10.1214/19-AOAS1261 DOI: 10.1214/19-AOAS1261","code":"@Article{, title = {aorsf: An R package for supervised learning using the oblique random survival forest}, author = {Byron C. Jaeger and Sawyer Welden and Kristin Lenoir and Nicholas M. Pajewski}, journal = {Journal of Open Source Software}, year = {2022}, volume = {7}, number = {77}, pages = {4705}, url = {https://doi.org/10.21105/joss.04705}, } @Article{, title = {Accelerated and interpretable oblique random survival forests}, author = {Byron C. Jaeger and Sawyer Welden and Kristin Lenoir and Jaime L. Speiser and Matthew W. Segar and Ambarish Pandey and Nicholas M. Pajewski}, journal = {Journal of Computational and Graphical Statistics}, year = {2023}, url = {https://doi.org/10.1080/10618600.2023.2231048}, } @Article{, title = {Oblique Random Survival Forests}, author = {Byron C. Jaeger and D. Leann Long and Dustin M. Long and Mario Sims and Jeff M. Szychowski and Yuan-I Min and Leslie A. Mcclure and George Howard and Noah Simon}, journal = {Annals of Applied Statistics}, year = {2019}, volume = {13}, number = {3}, pages = {1847--1883}, url = {https://doi.org/10.1214/19-AOAS1261}, }"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"aorsf-","dir":"","previous_headings":"","what":"Accelerated Oblique Random Survival Forests","title":"Accelerated Oblique Random Survival Forests","text":"Fit, interpret, make predictions oblique random survival forests (ORSFs).","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"why-aorsf","dir":"","previous_headings":"","what":"Why aorsf?","title":"Accelerated Oblique Random Survival Forests","text":"Hundreds times faster obliqueRSF.1 Accurate predictions censored outcomes.2 Negation importance, novel technique estimate variable importance ORSFs.2 Intuitive API formula based interface. Extensive input checks informative error messages.","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Accelerated Oblique Random Survival Forests","text":"can install aorsf CRAN using can install development version aorsf GitHub :","code":"install.packages(\"aorsf\") # install.packages(\"remotes\") remotes::install_github(\"ropensci/aorsf\")"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"what-is-an-oblique-decision-tree","dir":"","previous_headings":"","what":"What is an oblique decision tree?","title":"Accelerated Oblique Random Survival Forests","text":"Decision trees developed splitting set training data two new subsets, goal similarity within new subsets . splitting process repeated resulting subsets data stopping criterion met. new subsets data formed based single predictor, decision tree said axis-based splits data appear perpendicular axis predictor. linear combinations variables used instead single variable, tree oblique splits data neither parallel right angle axis. Figure: Decision trees classification axis-based splitting (left) oblique splitting (right). Cases orange squares; controls purple circles. trees partition predictor space defined variables X1 X2, oblique splits better job separating two classes.","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"examples","dir":"","previous_headings":"","what":"Examples","title":"Accelerated Oblique Random Survival Forests","text":"orsf() function can fit several types ORSF ensembles. personal favorite accelerated ORSF great combination prediction accuracy computational efficiency (see JCGS paper).2","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5)"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"inspect","dir":"","previous_headings":"Examples","what":"Inspect","title":"Accelerated Oblique Random Survival Forests","text":"Printing output orsf() give information descriptive statistics ensemble. See print.orsf_fit description line printed output. See orsf examples details controlling ORSF ensemble fits using prediction modeling workflows.","code":"fit #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 150 #> N events: 52 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 12 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.83 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"variable-importance","dir":"","previous_headings":"Examples","what":"Variable importance","title":"Accelerated Oblique Random Survival Forests","text":"importance individual variables can estimated three ways using aorsf: negation2: variable assessed separately multiplying variable’s coefficients -1 determining much model’s performance changes. worse model’s performance negating coefficients given variable, important variable. technique promising b/c require permutation emphasizes variables larger coefficients linear combinations, also relatively new hasn’t studied much permutation importance. See Jaeger, 2023 details technique. permutation: variable assessed separately randomly permuting variable’s values determining much model’s performance changes. worse model’s performance permuting values given variable, important variable. technique flexible, intuitive, frequently used. also several known limitations analysis variance (ANOVA)3: p-value computed coefficient linear combination variables decision tree. Importance individual predictor variable proportion times p-value coefficient < 0.01. technique efficient computationally, may effective permutation negation terms selecting signal noise variables. See Menze, 2011 details technique. can supply R function estimate --bag error using negation permutation importance (see oob vignette)","code":"orsf_vi_negate(fit) #> bili sex copper ast age #> 0.1190290560 0.0619448918 0.0290622719 0.0260108174 0.0251263919 #> stage protime edema ascites hepato #> 0.0237725455 0.0158527871 0.0117258458 0.0105685230 0.0092045115 #> albumin chol trt alk.phos spiders #> 0.0082732463 0.0041510636 0.0036632967 0.0010256161 -0.0003298163 #> trig platelet #> -0.0011060747 -0.0045517701 orsf_vi_permute(fit) #> bili copper ast age sex #> 0.0514033622 0.0170611427 0.0142515581 0.0140224052 0.0131459748 #> stage protime ascites edema albumin #> 0.0119768965 0.0102950158 0.0098067817 0.0081730899 0.0080652857 #> hepato chol alk.phos trig spiders #> 0.0069734562 0.0032811220 0.0015862128 0.0014943484 0.0007825752 #> trt platelet #> -0.0007067631 -0.0022338286 orsf_vi_anova(fit) #> ascites bili edema sex copper age ast #> 0.39107612 0.36316990 0.36316238 0.24720893 0.20547180 0.19213732 0.19029233 #> albumin stage hepato trig chol protime alk.phos #> 0.17219680 0.17068758 0.16126761 0.13379872 0.12964021 0.12659698 0.12352611 #> spiders platelet trt #> 0.11728395 0.08997135 0.07305095"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"partial-dependence-pd","dir":"","previous_headings":"Examples","what":"Partial dependence (PD)","title":"Accelerated Oblique Random Survival Forests","text":"Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model’s prediction. summary function, orsf_summarize_uni(), computes PD many variables ask , using sensible values. PD, see vignette","code":"orsf_summarize_uni(fit, n_variables = 2) #> #> -- bili (VI Rank: 1) ---------------------------- #> #> |----------------- Risk -----------------| #> Value Mean Median 25th % 75th % #> 0.70 0.2094827 0.09046313 0.03827429 0.3184979 #> 1.3 0.2283358 0.11078307 0.05347112 0.3492104 #> 3.2 0.3090977 0.21368937 0.11889617 0.4412656 #> #> -- sex (VI Rank: 2) ----------------------------- #> #> |----------------- Risk -----------------| #> Value Mean Median 25th % 75th % #> m 0.3667488 0.2614335 0.15611841 0.5836574 #> f 0.2507675 0.1051310 0.04355687 0.3596206 #> #> Predicted risk at time t = 1826.25 for top 2 predictors"},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"individual-conditional-expectations-ice","dir":"","previous_headings":"Examples","what":"Individual conditional expectations (ICE)","title":"Accelerated Oblique Random Survival Forests","text":"Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. ICE, see vignette","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"comparison-to-existing-software","dir":"","previous_headings":"","what":"Comparison to existing software","title":"Accelerated Oblique Random Survival Forests","text":"Comparisons aorsf existing software presented JCGS paper. paper: describes aorsf detail summary procedures used tree fitting algorithm runs general benchmark comparing aorsf obliqueRSF several learners reports prediction accuracy computational efficiency learners. runs simulation study comparing variable importance techniques ORSFs, axis based RSFs, boosted trees. reports probability variable importance technique rank relevant variable higher importance irrelevant variable. hands-comparison aorsf R packages provided orsf examples","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"references","dir":"","previous_headings":"","what":"References","title":"Accelerated Oblique Random Survival Forests","text":"Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique random survival forests. Annals applied statistics 2019 Sep; 13(3):1847-83. DOI: 10.1214/19-AOAS1261 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. URL: https://doi.org/10.1080/10618600.2023.2231048 Menze BH, Kelm BM, Splitthoff DN, Koethe U, Hamprecht FA. oblique random forests. Joint European Conference Machine Learning Knowledge Discovery Databases 2011 Sep 4; pp. 453-469. DOI: 10.1007/978-3-642-23783-6_29","code":""},{"path":"https://bcjaeger.github.io/aorsf/index.html","id":"funding","dir":"","previous_headings":"","what":"Funding","title":"Accelerated Oblique Random Survival Forests","text":"developers aorsf receive financial support Center Biomedical Informatics, Wake Forest University School Medicine. also receive support National Center Advancing Translational Sciences National Institutes Health Award Number UL1TR001420. content solely responsibility authors necessarily represent official views National Institutes Health.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/aorsf-package.html","id":null,"dir":"Reference","previous_headings":"","what":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","title":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","text":"Fit, interpret, make predictions oblique random survival forests. Oblique decision trees notoriously slow compared axis based counterparts, 'aorsf' runs fast faster axis-based decision tree algorithms right-censored time--event outcomes. Methods accelerate interpret oblique random survival forest described Jaeger et al., (2023) doi:10.1080/10618600.2023.2231048 .","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/aorsf-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"aorsf: Accelerated Oblique Random Survival Forests — aorsf-package","text":"Maintainer: Byron Jaeger bjaeger@wakehealth.edu (ORCID) contributors: Nicholas Pajewski [contributor] Sawyer Welden swelden@wakehealth.edu [contributor] Christopher Jackson chris.jackson@mrc-bsu.cam.ac.uk [reviewer] Marvin Wright [reviewer] Lukas Burk [reviewer]","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce to data.table — as.data.table.orsf_summary_uni","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"Convert 'orsf_summary' object data.table object.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"","code":"# S3 method for orsf_summary_uni as.data.table(x, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"x object class 'orsf_summary_uni' ... used","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"data.table","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/as.data.table.orsf_summary_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce to data.table — as.data.table.orsf_summary_uni","text":"","code":"library(data.table) object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) smry <- orsf_summarize_uni(object, n_variables = 3) as.data.table(smry) #> variable importance value mean medn lwr upr #> 1: bili 0.12854581 0.80 0.2302990 0.1256309 0.05140929 0.3631202 #> 2: bili 0.12854581 1.4 0.2516690 0.1350810 0.06896602 0.3901987 #> 3: bili 0.12854581 3.5 0.3660334 0.2818093 0.16458039 0.5451603 #> 4: copper 0.04413845 43 0.2648345 0.1439657 0.05404830 0.4484260 #> 5: copper 0.04413845 74 0.2819926 0.1609775 0.06500511 0.4938410 #> 6: copper 0.04413845 129 0.3356537 0.2289628 0.11126067 0.5509775 #> 7: sex 0.03834758 m 0.3499930 0.2388414 0.12549034 0.5735272 #> 8: sex 0.03834758 f 0.2966132 0.1509138 0.05842684 0.5287428 #> pred_horizon level #> 1: 1788 #> 2: 1788 #> 3: 1788 #> 4: 1788 #> 5: 1788 #> 6: 1788 #> 7: 1788 m #> 8: 1788 f"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":null,"dir":"Reference","previous_headings":"","what":"Oblique Random Survival Forest (ORSF) — orsf","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Fit oblique random survival forest","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"","code":"orsf( data, formula, control = orsf_control_fast(), weights = NULL, n_tree = 500, n_split = 5, n_retry = 3, n_thread = 1, mtry = NULL, sample_with_replacement = TRUE, sample_fraction = 0.632, leaf_min_events = 1, leaf_min_obs = 5, split_rule = \"logrank\", split_min_events = 5, split_min_obs = 10, split_min_stat = switch(split_rule, logrank = 3.841459, cstat = 0.5), oobag_pred_type = \"surv\", oobag_pred_horizon = NULL, oobag_eval_every = n_tree, oobag_fun = NULL, importance = \"anova\", group_factors = TRUE, tree_seeds = NULL, attach_data = TRUE, no_fit = FALSE, na_action = \"fail\", verbose_progress = FALSE, ... ) orsf_train(object)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"data data.frame, tibble, data.table contains relevant variables. formula (formula) response left hand side include time variable, followed status variable, may written inside call Surv (see examples). terms right names predictor variables. control (orsf_control) object returned one orsf_control functions: orsf_control_fast (default) uses single iteration Newton Raphson scoring identify linear combination predictors. orsf_control_cph uses Newton Raphson scoring convergence criteria met. orsf_control_net uses glmnet identify linear combinations predictors, similar Jaeger (2019). orsf_control_custom allows user apply function create linear combinations predictors. weights (numeric vector) Optional. given, input length equal nrow(data). Values weights treated like replication weights, .e., value 2 thing 2 observations data, containing copy corresponding person's data. Use weights cautiously, orsf count number observations events prior growing node tree, higher values weights lead deeper trees. n_tree (integer) number trees grow. Default n_tree = 500. n_split (integer) number cut-points assessed splitting node decision trees. Default n_split = 5. n_retry (integer) node can split, current linear combination inputs unable provide valid split, orsf try new linear combination based different set randomly selected predictors, n_retry times. Default n_retry = 3. Set n_retry = 0 prevent retries. n_thread (integer) number threads use growing trees, computing predictions, computing importance. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. mtry (integer) Number predictors randomly included candidates splitting node. default smallest integer greater square root number total predictors, .e., mtry = ceiling(sqrt(number predictors)) sample_with_replacement (logical) TRUE (default), observations sampled replacement -bag sample created decision tree. FALSE, observations sampled without replacement tree -bag sample containing sample_fraction% original sample. sample_fraction (double) proportion observations trees' -bag sample contain, relative number rows data. used sample_with_replacement FALSE. Default value 0.632. leaf_min_events (integer) minimum number events leaf node. Default leaf_min_events = 1 leaf_min_obs (integer) minimum number observations leaf node. Default leaf_min_obs = 5. split_rule (character) assess quality potential splitting rule node. Valid options 'logrank' : log-rank test statistic. 'cstat' : Harrell's concordance statistic. split_min_events (integer) minimum number events required node consider splitting . Default split_min_events = 5 split_min_obs (integer) minimum number observations required node consider splitting . Default split_min_obs = 10. split_min_stat (double) minimum test statistic required split node. Default 3.841459 split_rule = 'logrank' 0.50 split_rule = 'cstat'. splits found statistic exceeding split_min_stat, given node either becomes leaf retry occurs (n_retry retries). oobag_pred_type (character) type --bag predictions compute fitting ensemble. Valid options 'none' : compute --bag predictions 'risk' : probability event occurring oobag_pred_horizon. 'surv' : 1 - risk. 'chf' : cumulative hazard function oobag_pred_horizon. 'mort' : mortality, .e., number events expected observations training data identical given observation. oobag_pred_horizon (numeric) numeric value indicating time used --bag predictions. Default median observed times, .e., oobag_pred_horizon = median(time). oobag_eval_every (integer) --bag performance ensemble checked every oobag_eval_every trees. , oobag_eval_every = 10, --bag performance checked growing 10th tree, 20th tree, . Default oobag_eval_every = n_tree. oobag_fun (function) used evaluating --bag prediction accuracy every oobag_eval_every trees. oobag_fun = NULL (default), Harrell's C-statistic (1982) used evaluate accuracy. use oobag_fun note following: oobag_fun two inputs: y_mat s_vec y_mat two column matrix first column named 'time', second named 'status' s_vec numeric vector containing predicted survival probabilities. oobag_fun return numeric output length 1 details, see --bag vignette. importance (character) Indicate method variable importance: 'none': variable importance computed. 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance details methods, see orsf_vi. group_factors (logical) relevant variable importance estimated. TRUE, importance factor variables reported overall aggregating importance individual levels factor. FALSE, importance individual factor levels returned. tree_seeds (integer vector) Optional. specified, random seeds set using values tree_seeds[] growing tree . Two forests grown number trees seeds exact --bag samples, making --bag error estimates forests comparable. NULL (default), seeds set training process. attach_data (logical) TRUE, copy training data attached output. helpful plan using functions like orsf_pd_oob orsf_summarize_uni interpret forest using training data. Default TRUE. no_fit (logical) TRUE, model fitting steps defined saved, training initiated. object returned can directly submitted orsf_train() long attach_data TRUE. na_action (character) happen data contains missing values (.e., NA values). Valid options : 'fail' : error thrown data contains NA values 'omit' : rows data incomplete data dropped 'impute_meanmode' : missing values continuous categorical variables data imputed using mean mode, respectively. Note option selected attach_data TRUE, data attached output imputed version data. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. ... arguments passed methods (currently used). object untrained 'aorsf' object, created setting no_fit = TRUE orsf().","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"accelerated oblique RSF object (aorsf)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"function based similar ORSF function obliqueRSF R package. primary difference function runs much faster. speed increase attributable better management memory (.e., unnecessary copies inputs) using Newton Raphson scoring algorithm identify linear combinations inputs rather performing penalized regression using routines glmnet.modified Newton Raphson scoring algorithm function applies adaptation C++ routine developed Terry M. Therneau fits Cox proportional hazards models (see survival::coxph() specifically survival::coxph.fit()).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"details-on-inputs","dir":"Reference","previous_headings":"","what":"Details on inputs","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"formula: response formula can survival object returned Surv function, can also just time status variables. .e., Surv(time, status) ~ . works just like time + status ~ . . symbol right hand side short-hand using variables data (omitting left hand side formula) predictors. order variables left hand side matters. .e., writing status + time ~ . make orsf assume status variable actually time variable. response variable can survival object stored data. example, y ~ . valid formula data$y inherits Surv class. Although can fit oblique random survival forest 1 predictor variable, formula least 2 predictors. reason recommendation linear combination predictors trivial one predictor. mtry: mtry parameter may temporarily reduced ensure least 2 events per predictor variable. occurs using orsf_control_cph coefficients Newton Raphson scoring algorithm may become unstable number covariates greater equal number events. reduction occur using orsf_control_net. oobag_fun: oobag_fun specified, used compute negation importance permutation importance, role ANOVA importance. n_thread: R function must called C++ (.e., user-supplied function compute --bag error identify linear combinations variables), n_thread automatically set 1 attempting run R functions multiple threads cause R session crash.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"what-is-an-oblique-decision-tree-","dir":"Reference","previous_headings":"","what":"What is an oblique decision tree?","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Decision trees developed splitting set training data two new subsets, goal similarity within new subsets . splitting process repeated resulting subsets data stopping criterion met. new subsets data formed based single predictor, decision tree said axis-based splits data appear perpendicular axis predictor. linear combinations variables used instead single variable, tree oblique splits data neither parallel right angle axis Figure : Decision trees classification axis-based splitting (left) oblique splitting (right). Cases orange squares; controls purple circles. trees partition predictor space defined variables X1 X2, oblique splits better job separating two classes.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"what-is-a-random-forest-","dir":"Reference","previous_headings":"","what":"What is a random forest?","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Random forests collections de-correlated decision trees. Predictions tree aggregated make ensemble prediction forest. details, see Breiman el, 2001.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"training-out-of-bag-error-and-testing","dir":"Reference","previous_headings":"","what":"Training, out-of-bag error, and testing","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"random forests, tree grown bootstrapped version training set. bootstrap samples selected replacement, bootstrapped training set contains two-thirds instances original training set. '--bag' data instances bootstrapped training set. tree random forest can make predictions --bag data, --bag predictions can aggregated make ensemble --bag prediction. Since --bag data used grow tree, accuracy ensemble --bag predictions approximate generalization error random forest. Generalization error refers error random forest's predictions applied predict outcomes data used train , .e., testing data.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"missing-data","dir":"Reference","previous_headings":"","what":"Missing data","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Data passed aorsf functions allowed missing values. user impute missing values using R package purpose, recipes mlr3pipelines.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"First load relevant packages entry-point aorsf standard call orsf(): printing fit provides quick descriptive summaries:","code":"set.seed(329730) suppressPackageStartupMessages({ library(aorsf) library(survival) library(tidymodels) library(tidyverse) library(randomForestSRC) library(ranger) library(riskRegression) library(obliqueRSF) }) fit <- orsf(pbc_orsf, Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"model-control","dir":"Reference","previous_headings":"","what":"Model control","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"examples make use orsf_control_ functions build compare models based --bag predictions. also standardize --bag samples using input argument tree_seeds","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"accelerated-linear-combinations","dir":"Reference","previous_headings":"","what":"Accelerated linear combinations","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"accelerated ORSF ensemble default nice balance computational speed prediction accuracy. runs single iteration Newton Raphson scoring Cox partial likelihood function find linear combinations predictors.","code":"fit_accel <- orsf(pbc_orsf, control = orsf_control_fast(), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-cox-regression","dir":"Reference","previous_headings":"","what":"Linear combinations with Cox regression","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"orsf_control_cph runs Cox regression non-terminal node survival tree, using regression coefficients create linear combinations predictors:","code":"fit_cph <- orsf(pbc_orsf, control = orsf_control_cph(), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-penalized-cox-regression","dir":"Reference","previous_headings":"","what":"Linear combinations with penalized cox regression","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"orsf_control_net runs penalized Cox regression non-terminal node survival tree, using regression coefficients create linear combinations predictors. can really helpful want feature selection within node, lot slower options.","code":"# select 3 predictors out of 5 to be used in # each linear combination of predictors. fit_net <- orsf(pbc_orsf, control = orsf_control_net(df_target = 3), formula = Surv(time, status) ~ . - id, tree_seeds = 329)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"linear-combinations-with-your-own-function","dir":"Reference","previous_headings":"","what":"Linear combinations with your own function","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Let’s make two customized functions identify linear combinations predictors. first uses random coefficients second derives coefficients principal component analysis. third uses orsf() inside orsf(). can plug functions orsf_control_custom(), pass result orsf(): fit seems work best example? Let’s find evaluating --bag survival predictions. AUC values, highest lowest: indices prediction accuracy: inspection, net, accel, rlt high discrimination index prediction accuracy. rando pca less well, aren’t bad.","code":"f_rando <- function(x_node, y_node, w_node){ matrix(runif(ncol(x_node)), ncol=1) } f_pca <- function(x_node, y_node, w_node) { # estimate two principal components. pca <- stats::prcomp(x_node, rank. = 2) # use the second principal component to split the node pca$rotation[, 1L, drop = FALSE] } # This approach is known as reinforcement learning trees. # some special care is taken to prevent your R session from crashing. # Specifically, random coefficients are used when n_obs <= 10 # or n_events <= 5. f_aorsf <- function(x_node, y_node, w_node){ colnames(y_node) <- c('time', 'status') colnames(x_node) <- paste(\"x\", seq(ncol(x_node)), sep = '') data <- as.data.frame(cbind(y_node, x_node)) if(nrow(data) <= 10 || sum(y_node[,'status']) <= 5) return(matrix(runif(ncol(x_node)), ncol = 1)) fit <- orsf(data, time + status ~ ., weights = as.numeric(w_node), n_tree = 25, importance = 'permute') out <- orsf_vi(fit) # drop the least two important variables n_vars <- length(out) out[c(n_vars, n_vars-1)] <- 0 # ensure out has same variable order as input out <- out[colnames(x_node)] matrix(out, ncol = 1) } fit_rando <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_rando), tree_seeds = 329) fit_pca <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_pca), tree_seeds = 329) fit_rlt <- orsf(pbc_orsf, time + status ~ . - id, control = orsf_control_custom(beta_fun = f_aorsf), tree_seeds = 329) risk_preds <- list( accel = 1 - fit_accel$pred_oobag, cph = 1 - fit_cph$pred_oobag, net = 1 - fit_net$pred_oobag, rando = 1 - fit_rando$pred_oobag, pca = 1 - fit_pca$pred_oobag, rlt = 1 - fit_rlt$pred_oobag ) sc <- Score(object = risk_preds, formula = Surv(time, status) ~ 1, data = pbc_orsf, summary = 'IPA', times = fit_accel$pred_horizon) sc$AUC$score[order(-AUC)] ## model times AUC se lower upper ## 1: net 1788 0.9179396 0.02012887 0.8784877 0.9573915 ## 2: accel 1788 0.9106396 0.02076004 0.8699507 0.9513286 ## 3: cph 1788 0.9061167 0.02277540 0.8614777 0.9507556 ## 4: rlt 1788 0.9012605 0.02178982 0.8585533 0.9439678 ## 5: rando 1788 0.8997729 0.02201363 0.8566270 0.9429188 ## 6: pca 1788 0.8996927 0.02245483 0.8556821 0.9437034 sc$Brier$score[order(-IPA), .(model, times, IPA)] ## model times IPA ## 1: net 1788 0.5020652 ## 2: cph 1788 0.4759061 ## 3: accel 1788 0.4743392 ## 4: pca 1788 0.4398468 ## 5: rlt 1788 0.4373910 ## 6: rando 1788 0.4219209 ## 7: Null model 1788 0.0000000"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"tidymodels","dir":"Reference","previous_headings":"","what":"tidymodels","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"example uses tidymodels functions stops short using official tidymodels workflow. working getting aorsf pulled censored package update real workflows happens!","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"comparing-orsf-with-other-learners","dir":"Reference","previous_headings":"","what":"Comparing ORSF with other learners","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Start recipe pre-process data Next create 10-fold cross validation object pre-process data: Define functions ‘workflow’ randomForestSRC, ranger, aorsf. Run ‘workflows’ fold: Next unnest column get back tibble testing data predictions. finish aggregating predictions computing performance testing data. Note computing one statistic predictions instead computing one statistic fold. approach fine smaller testing sets /small event counts. inspection, aorsf obtained slightly higher discrimination (AUC) aorsf obtained higher index prediction accuracy (IPA)","code":"imputer <- recipe(pbc_orsf, formula = time + status ~ .) %>% step_impute_mean(all_numeric_predictors()) %>% step_impute_mode(all_nominal_predictors()) # 10-fold cross validation; make a container for the pre-processed data analyses <- vfold_cv(data = pbc_orsf, v = 10) %>% mutate(recipe = map(splits, ~prep(imputer, training = training(.x))), train = map(recipe, juice), test = map2(splits, recipe, ~bake(.y, new_data = testing(.x)))) analyses ## # 10-fold cross-validation ## # A tibble: 10 x 5 ## splits id recipe train test ## ## 1 Fold01 ## 2 Fold02 ## 3 Fold03 ## 4 Fold04 ## 5 Fold05 ## 6 Fold06 ## 7 Fold07 ## 8 Fold08 ## 9 Fold09 ## 10 Fold10 rfsrc_wf <- function(train, test, pred_horizon){ # rfsrc does not like tibbles, so cast input data into data.frames train <- as.data.frame(train) test <- as.data.frame(test) rfsrc(formula = Surv(time, status) ~ ., data = train) %>% predictRisk(newdata = test, times = pred_horizon) %>% as.numeric() } ranger_wf <- function(train, test, pred_horizon){ ranger(Surv(time, status) ~ ., data = train) %>% predictRisk(newdata = test, times = pred_horizon) %>% as.numeric() } aorsf_wf <- function(train, test, pred_horizon){ train %>% orsf(Surv(time, status) ~ .,) %>% predict(new_data = test, pred_horizon = pred_horizon) %>% as.numeric() } # 5 year risk prediction ph <- 365.25 * 5 results <- analyses %>% transmute(test, pred_aorsf = map2(train, test, aorsf_wf, pred_horizon = ph), pred_rfsrc = map2(train, test, rfsrc_wf, pred_horizon = ph), pred_ranger = map2(train, test, ranger_wf, pred_horizon = ph)) results <- results %>% unnest(everything()) glimpse(results) ## Rows: 276 ## Columns: 23 ## $ id 16, 29, 43, 62, 79, 82, 103, 105, 111, 114, 115, 139, 141,~ ## $ trt placebo, placebo, d_penicill_main, placebo, d_penicill_mai~ ## $ age 40.44353, 63.87680, 48.87064, 60.70637, 46.51608, 67.31006~ ## $ sex f, f, f, f, f, f, f, f, f, m, f, f, f, f, f, f, f, f, f, f~ ## $ ascites 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0~ ## $ hepato 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1~ ## $ spiders 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1~ ## $ edema 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~ ## $ bili 0.7, 0.7, 1.1, 1.3, 0.8, 4.5, 2.5, 1.1, 5.5, 3.2, 0.7, 1.1~ ## $ chol 204, 370, 361, 302, 315, 472, 188, 464, 528, 259, 303, 328~ ## $ albumin 3.66, 3.78, 3.64, 2.75, 4.24, 4.09, 3.67, 4.20, 4.18, 4.30~ ## $ copper 28, 24, 36, 58, 13, 154, 57, 38, 77, 208, 81, 159, 59, 76,~ ## $ alk.phos 685.0, 5833.0, 5430.2, 1523.0, 1637.0, 1580.0, 1273.0, 164~ ## $ ast 72.85, 73.53, 67.08, 43.40, 170.50, 117.80, 119.35, 151.90~ ## $ trig 58, 86, 89, 112, 70, 272, 102, 102, 78, 78, 156, 134, 56, ~ ## $ platelet 198, 390, 203, 329, 426, 412, 110, 348, 467, 268, 307, 142~ ## $ protime 10.8, 10.6, 10.6, 13.2, 10.9, 11.1, 11.1, 10.3, 10.7, 11.7~ ## $ stage 3, 2, 2, 4, 3, 3, 4, 3, 3, 3, 3, 4, 2, 2, 3, 4, 2, 3, 4, 4~ ## $ time 3672, 4509, 4556, 3090, 3707, 3574, 110, 3092, 2350, 3395,~ ## $ status 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0~ ## $ pred_aorsf 0.02210163, 0.12510110, 0.07571520, 0.59580668, 0.12839078~ ## $ pred_rfsrc 0.01861595, 0.15632904, 0.07635485, 0.62281617, 0.19145913~ ## $ pred_ranger 0.02143363, 0.13367920, 0.05892584, 0.54481330, 0.21380654~ Score( object = list(aorsf = results$pred_aorsf, rfsrc = results$pred_rfsrc, ranger = results$pred_ranger), formula = Surv(time, status) ~ 1, data = results, summary = 'IPA', times = ph ) ## ## Metric AUC: ## ## Results by model: ## ## model times AUC lower upper ## 1: aorsf 1826 91.0 86.8 95.2 ## 2: rfsrc 1826 89.2 84.8 93.7 ## 3: ranger 1826 89.6 85.3 94.0 ## ## Results of model comparisons: ## ## times model reference delta.AUC lower upper p ## 1: 1826 rfsrc aorsf -1.7 -3.4 -0.1 0.04 ## 2: 1826 ranger aorsf -1.3 -2.9 0.2 0.08 ## 3: 1826 ranger rfsrc 0.4 -0.8 1.6 0.52 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The higher AUC the better. ## ## Metric Brier: ## ## Results by model: ## ## model times Brier lower upper IPA ## 1: Null model 1826.25 20.5 18.1 22.9 0.0 ## 2: aorsf 1826.25 10.9 8.7 13.1 46.9 ## 3: rfsrc 1826.25 12.0 9.9 14.2 41.3 ## 4: ranger 1826.25 12.0 9.9 14.1 41.5 ## ## Results of model comparisons: ## ## times model reference delta.Brier lower upper p ## 1: 1826.25 aorsf Null model -9.6 -12.2 -7.0 9.364941e-13 ## 2: 1826.25 rfsrc Null model -8.5 -10.7 -6.2 2.074175e-13 ## 3: 1826.25 ranger Null model -8.5 -10.8 -6.2 3.712823e-13 ## 4: 1826.25 rfsrc aorsf 1.1 0.3 2.0 1.075856e-02 ## 5: 1826.25 ranger aorsf 1.1 0.3 1.9 4.825778e-03 ## 6: 1826.25 ranger rfsrc -0.1 -0.6 0.5 8.429772e-01 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The lower Brier the better, the higher IPA the better."},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"mlr-pipelines","dir":"Reference","previous_headings":"","what":"mlr3 pipelines","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Warning: code may may run depending current version mlr3proba. First load additional mlr3 libraries. Next ’ll define tasks learners engage . Now can make benchmark designed compare three favorite learners: Let’s look overall results: inspection, aorsf higher expected value ‘surv.cindex’ (higher better) aorsf lower expected value ‘surv.graf’ (lower better)","code":"suppressPackageStartupMessages({ library(mlr3verse) library(mlr3proba) library(mlr3extralearners) library(mlr3viz) library(mlr3benchmark) }) # Mayo Clinic Primary Biliary Cholangitis Data task_pbc <- TaskSurv$new( id = 'pbc', backend = select(pbc_orsf, -id) %>% mutate(stage = as.numeric(stage)), time = \"time\", event = \"status\" ) # Veteran's Administration Lung Cancer Trial data(veteran, package = \"randomForestSRC\") task_veteran <- TaskSurv$new( id = 'veteran', backend = veteran, time = \"time\", event = \"status\" ) # NKI 70 gene signature data_nki <- OpenML::getOMLDataSet(data.id = 1228) task_nki <- TaskSurv$new( id = 'nki', backend = data_nki$data, time = \"time\", event = \"event\" ) # Gene Expression-Based Survival Prediction in Lung Adenocarcinoma data_lung <- OpenML::getOMLDataSet(data.id = 1245) task_lung <- TaskSurv$new( id = 'nki', backend = data_lung$data %>% mutate(OS_event = as.numeric(OS_event) -1), time = \"OS_years\", event = \"OS_event\" ) # Chemotherapy for Stage B/C colon cancer # (there are two rows per person, one for death # and the other for recurrence, hence the two tasks) task_colon_death <- TaskSurv$new( id = 'colon_death', backend = survival::colon %>% filter(etype == 2) %>% drop_na() %>% # drop id, redundant variables select(-id, -study, -node4, -etype), mutate(OS_event = as.numeric(OS_event) -1), time = \"time\", event = \"status\" ) task_colon_recur <- TaskSurv$new( id = 'colon_death', backend = survival::colon %>% filter(etype == 1) %>% drop_na() %>% # drop id, redundant variables select(-id, -study, -node4, -etype), mutate(OS_event = as.numeric(OS_event) -1), time = \"time\", event = \"status\" ) # putting them all together tasks <- list(task_pbc, task_veteran, task_nki, task_lung, task_colon_death, task_colon_recur, # add a few more pre-made ones tsk(\"actg\"), tsk('gbcs'), tsk('grace'), tsk(\"unemployment\"), tsk(\"whas\")) # Learners with default parameters learners <- lrns(c(\"surv.ranger\", \"surv.rfsrc\", \"surv.aorsf\")) # Brier (Graf) score, c-index and training time as measures measures <- msrs(c(\"surv.graf\", \"surv.cindex\", \"time_train\")) # Benchmark with 5-fold CV design <- benchmark_grid( tasks = tasks, learners = learners, resamplings = rsmps(\"cv\", folds = 5) ) benchmark_result <- benchmark(design) bm_scores <- benchmark_result$score(measures, predict_sets = \"test\") bm_scores %>% select(task_id, learner_id, surv.graf, surv.cindex, time_train) %>% group_by(learner_id) %>% filter(!is.infinite(surv.graf)) %>% summarize( across( .cols = c(surv.graf, surv.cindex, time_train), .fns = mean, na.rm = TRUE ) ) ## # A tibble: 3 x 4 ## learner_id surv.graf surv.cindex time_train ## ## 1 surv.aorsf 0.152 0.733 1.41 ## 2 surv.ranger 0.166 0.712 1.95 ## 3 surv.rfsrc 0.155 0.723 0.745"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Oblique Random Survival Forest (ORSF) — orsf","text":"Harrell FE, Califf RM, Pryor DB, Lee KL, Rosati RA. Evaluating Yield Medical Tests. JAMA 1982; 247(18):2543-2546. DOI: 10.1001/jama.1982.03320430047030 Breiman L. Random forests. Machine learning 2001 Oct; 45(1):5-32. DOI: 10.1023/:1010933404324 Ishwaran H, Kogalur UB, Blackstone EH, Lauer MS. Random survival forests. Annals applied statistics 2008 Sep; 2(3):841-60. DOI: 10.1214/08-AOAS169 Jaeger BC, Long DL, Long DM, Sims M, Szychowski JM, Min YI, Mcclure LA, Howard G, Simon N. Oblique random survival forests. Annals applied statistics 2019 Sep; 13(3):1847-83. DOI: 10.1214/19-AOAS1261 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. DOI: 10.1080/10618600.2023.2231048","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":null,"dir":"Reference","previous_headings":"","what":"Cox regression ORSF control — orsf_control_cph","title":"Cox regression ORSF control — orsf_control_cph","text":"Use coefficients proportional hazards model create linear combinations predictor variables fitting orsf model.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cox regression ORSF control — orsf_control_cph","text":"","code":"orsf_control_cph(method = \"efron\", eps = 1e-09, iter_max = 20, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cox regression ORSF control — orsf_control_cph","text":"method (character) character string specifying method tie handling. ties, methods equivalent. Valid options 'breslow' 'efron'. Efron approximation default accurate dealing tied event times similar computational efficiency compared Breslow method. eps (double) using Newton Raphson scoring identify linear combinations inputs, iteration continues algorithm relative change log partial likelihood less eps, absolute change less sqrt(eps). Must positive. default value 1e-09 used consistency survival::coxph.control. iter_max (integer) iteration continues convergence (see eps ) number attempted iterations equal iter_max. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cox regression ORSF control — orsf_control_cph","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cox regression ORSF control — orsf_control_cph","text":"code survival package modified make routine. details Cox proportional hazards model, see coxph /Therneau Grambsch (2000).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Cox regression ORSF control — orsf_control_cph","text":"Therneau T.M., Grambsch P.M. (2000) Cox Model. : Modeling Survival Data: Extending Cox Model. Statistics Biology Health. Springer, New York, NY. DOI: 10.1007/978-1-4757-3294-8_3","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_cph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cox regression ORSF control — orsf_control_cph","text":"","code":"orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_cph()) #> ---------- Oblique random survival forest #> #> Linear combinations: Cox regression #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":null,"dir":"Reference","previous_headings":"","what":"Custom ORSF control — orsf_control_custom","title":"Custom ORSF control — orsf_control_custom","text":"Custom ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Custom ORSF control — orsf_control_custom","text":"","code":"orsf_control_custom(beta_fun, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Custom ORSF control — orsf_control_custom","text":"beta_fun (function) function define coefficients used linear combinations predictor variables. beta_fun must accept three inputs named x_node, y_node w_node, expect following types dimensions: x_node (matrix; n rows, p columns) y_node (matrix; n rows, 2 columns) w_node (matrix; n rows, 1 column) addition, beta_fun must return matrix p rows 1 column. conditions met, orsf_control_custom() let know. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Custom ORSF control — orsf_control_custom","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Custom ORSF control — orsf_control_custom","text":"Two customized functions identify linear combinations predictors shown . first uses random coefficients second derives coefficients principal component analysis.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"random-coefficients","dir":"Reference","previous_headings":"","what":"Random coefficients","title":"Custom ORSF control — orsf_control_custom","text":"f_rando() function get random coefficients: can plug f_rando orsf_control_custom(), pass result orsf():","code":"f_rando <- function(x_node, y_node, w_node){ matrix(runif(ncol(x_node)), ncol=1) } library(aorsf) fit_rando <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_rando), n_tree = 500) fit_rando ## ---------- Oblique random survival forest ## ## Linear combinations: Custom user function ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 20 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"principal-components","dir":"Reference","previous_headings":"","what":"Principal components","title":"Custom ORSF control — orsf_control_custom","text":"Follow steps , starting custom function: plug function orsf_control_custom() pass result orsf():","code":"f_pca <- function(x_node, y_node, w_node) { # estimate two principal components. pca <- stats::prcomp(x_node, rank. = 2) # use the second principal component to split the node pca$rotation[, 2L, drop = FALSE] } fit_pca <- orsf(pbc_orsf, Surv(time, status) ~ . - id, control = orsf_control_custom(beta_fun = f_pca), n_tree = 500)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_custom.html","id":"evaluate","dir":"Reference","previous_headings":"","what":"Evaluate","title":"Custom ORSF control — orsf_control_custom","text":"well two customized ORSFs ? Let’s compute indices prediction accuracy based --bag predictions: PCA ORSF quite well! (higher IPA better)","code":"library(riskRegression) library(survival) risk_preds <- list(rando = 1 - fit_rando$pred_oobag, pca = 1 - fit_pca$pred_oobag) sc <- Score(object = risk_preds, formula = Surv(time, status) ~ 1, data = pbc_orsf, summary = 'IPA', times = fit_pca$pred_horizon) sc$Brier ## ## Results by model: ## ## model times Brier lower upper IPA ## 1: Null model 1788 20.479 18.090 22.868 0.000 ## 2: rando 1788 11.604 9.535 13.673 43.339 ## 3: pca 1788 12.870 10.872 14.869 37.154 ## ## Results of model comparisons: ## ## times model reference delta.Brier lower upper p ## 1: 1788 rando Null model -8.875 -11.063 -6.688 1.852437e-15 ## 2: 1788 pca Null model -7.609 -9.351 -5.866 1.143284e-17 ## 3: 1788 pca rando 1.267 0.449 2.084 2.381056e-03 ## ## NOTE: Values are multiplied by 100 and given in %. ## NOTE: The lower Brier the better, the higher IPA the better."},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":null,"dir":"Reference","previous_headings":"","what":"Accelerated ORSF control — orsf_control_fast","title":"Accelerated ORSF control — orsf_control_fast","text":"Accelerated ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Accelerated ORSF control — orsf_control_fast","text":"","code":"orsf_control_fast(method = \"efron\", do_scale = TRUE, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Accelerated ORSF control — orsf_control_fast","text":"method (character) character string specifying method tie handling. ties, methods equivalent. Valid options 'breslow' 'efron'. Efron approximation default accurate dealing tied event times similar computational efficiency compared Breslow method. do_scale (logical) TRUE, values predictors scaled prior instance Newton Raphson scoring, using summary values data current node decision tree. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Accelerated ORSF control — orsf_control_fast","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Accelerated ORSF control — orsf_control_fast","text":"code survival package modified make routine. Adjust do_scale risk. Setting do_scale = FALSE reduce computation time also make orsf model dependent scale data, default value TRUE. good idea center scale predictors prior running orsf() plan setting do_scale = FALSE.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_fast.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Accelerated ORSF control — orsf_control_fast","text":"","code":"orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, control = orsf_control_fast()) #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 500 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 21 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.84 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Penalized Cox regression ORSF control — orsf_control_net","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"Penalized Cox regression ORSF control","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"","code":"orsf_control_net(alpha = 1/2, df_target = NULL, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"alpha (double) elastic net mixing parameter. value 1 gives lasso penalty, value 0 gives ridge penalty. multiple values alpha given, penalized model fit using alpha value prior splitting node. df_target (integer) Preferred number variables used linear combination. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"object class 'orsf_control', used input control argument orsf.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"df_target less mtry, separate argument orsf indicates number variables chosen random prior finding linear combination variables.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"Simon N, Friedman J, Hastie T, Tibshirani R. Regularization paths Cox's proportional hazards model via coordinate descent. Journal statistical software 2011 Mar; 39(5):1. DOI: 10.18637/jss.v039.i05","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_control_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Penalized Cox regression ORSF control — orsf_control_net","text":"","code":"# orsf_control_net() is considerably slower than orsf_control_cph(), # The example uses n_tree = 25 so that my examples run faster, # but you should use at least 500 trees in applied settings. orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id, n_tree = 25, control = orsf_control_net()) #> ---------- Oblique random survival forest #> #> Linear combinations: Penalized Cox regression #> N observations: 276 #> N events: 111 #> N trees: 25 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 24 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.82 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF Individual Conditional Expectations — orsf_ice_oob","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"Compute individual conditional expectations ORSF model. Unlike partial dependence, shows expected prediction function one multiple predictors, individual conditional expectations (ICE) show prediction individual observation function predictor. can compute individual conditional expectations three ways using random forest: using -bag predictions training data using --bag predictions training data using predictions new set data See examples details","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"","code":"orsf_ice_oob( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... ) orsf_ice_inb( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... ) orsf_ice_new( object, pred_spec, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", expand_grid = TRUE, boundary_checks = TRUE, n_thread = 1, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"object (orsf_fit) trained oblique random survival forest (see orsf). pred_spec (named list data.frame). pred_spec named list, item list vector values used points partial dependence function. name item list indicate variable modified take corresponding values. pred_spec data.frame, columns indicate variable names, values indicate variable values, partial dependence computed using inputs row. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction expand_grid (logical) TRUE, partial dependence computed possible combinations inputs pred_spec. FALSE, partial dependence computed variable pred_spec, separately. boundary_checks (logical) TRUE, pred_spec checked make sure requested values 10th 90th percentile object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. ... arguments passed methods (currently used). new_data data.frame, tibble, data.table compute predictions . na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'omit' : rows new_data incomplete data dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"data.table containing individual conditional expectations specified variable(s) specified prediction horizon(s).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_ice_oob.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF Individual Conditional Expectations — orsf_ice_oob","text":"Begin fitting ORSF ensemble Use ensemble compute ICE values using --bag predictions: Much detailed examples given vignette","code":"library(aorsf) set.seed(329) fit <- orsf(data = pbc_orsf, formula = Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## ----------------------------------------- pred_spec <- list(bili = seq(1, 10, length.out = 25)) ice_oob <- orsf_ice_oob(fit, pred_spec, boundary_checks = FALSE) ice_oob ## id_variable id_row pred_horizon bili pred ## 1: 1 1 1788 1 0.9295584 ## 2: 1 2 1788 1 0.1422392 ## 3: 1 3 1788 1 0.7047846 ## 4: 1 4 1788 1 0.3845760 ## 5: 1 5 1788 1 0.1206201 ## --- ## 6896: 25 272 1788 10 0.3878561 ## 6897: 25 273 1788 10 0.4854526 ## 6898: 25 274 1788 10 0.4389557 ## 6899: 25 275 1788 10 0.3639220 ## 6900: 25 276 1788 10 0.5461205"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF partial dependence — orsf_pd_oob","title":"ORSF partial dependence — orsf_pd_oob","text":"Compute partial dependence ORSF model. Partial dependence (PD) shows expected prediction model function single predictor multiple predictors. expectation marginalized values predictors, giving something like multivariable adjusted estimate model's prediction. can compute partial dependence three ways using random forest: using -bag predictions training data using --bag predictions training data using predictions new set data See examples details","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF partial dependence — orsf_pd_oob","text":"","code":"orsf_pd_oob( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... ) orsf_pd_inb( object, pred_spec, pred_horizon = NULL, pred_type = \"risk\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... ) orsf_pd_new( object, pred_spec, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", expand_grid = TRUE, prob_values = c(0.025, 0.5, 0.975), prob_labels = c(\"lwr\", \"medn\", \"upr\"), boundary_checks = TRUE, n_thread = 1, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF partial dependence — orsf_pd_oob","text":"object (orsf_fit) trained oblique random survival forest (see orsf). pred_spec (named list data.frame). pred_spec named list, item list vector values used points partial dependence function. name item list indicate variable modified take corresponding values. pred_spec data.frame, columns indicate variable names, values indicate variable values, partial dependence computed using inputs row. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction expand_grid (logical) TRUE, partial dependence computed possible combinations inputs pred_spec. FALSE, partial dependence computed variable pred_spec, separately. prob_values (numeric) vector values 0 1, indicating quantiles used summarize partial dependence values set inputs. prob_values length prob_labels. quantiles calculated based predictions object set values indicated pred_spec. prob_labels (character) vector labels length prob_values, label indicating corresponding value prob_values labelled summarized outputs. prob_labels length prob_values. boundary_checks (logical) TRUE, pred_spec checked make sure requested values 10th 90th percentile object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. ... arguments passed methods (currently used). new_data data.frame, tibble, data.table compute predictions . na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'omit' : rows new_data incomplete data dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF partial dependence — orsf_pd_oob","text":"data.table containing partial dependence values specified variable(s) specified prediction horizon(s).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF partial dependence — orsf_pd_oob","text":"Partial dependence number known limitations assumptions users aware (see Hooker, 2021). particular, partial dependence less intuitive >2 predictors examined jointly, assumed feature(s) partial dependence computed correlated features (likely true many cases). Accumulated local effect plots can used (see ) case feature independence valid assumption.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF partial dependence — orsf_pd_oob","text":"Begin fitting ORSF ensemble:","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"three-ways-to-compute-pd-and-ice","dir":"Reference","previous_headings":"","what":"Three ways to compute PD and ICE","title":"ORSF partial dependence — orsf_pd_oob","text":"can compute partial dependence ICE three ways aorsf: using -bag predictions training data using --bag predictions training data using predictions new set data -bag partial dependence indicates relationships model learned training. helpful goal interpret model. --bag partial dependence indicates relationships model learned training using --bag data simulates application model new data. want test model’s reliability fairness new data don’t access large testing set. new data partial dependence shows model predicts outcomes observations seen. helpful want test model’s reliability fairness.","code":"pd_train <- orsf_pd_inb(fit, pred_spec = list(bili = 1:5)) pd_train ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2188047 0.01435497 0.09604722 0.8243506 ## 2: 1826.25 2 0.2540831 0.03086042 0.13766124 0.8442959 ## 3: 1826.25 3 0.2982917 0.05324065 0.19470910 0.8578131 ## 4: 1826.25 4 0.3536969 0.09755193 0.27774884 0.8699063 ## 5: 1826.25 5 0.3955249 0.14622431 0.29945708 0.8775099 pd_train <- orsf_pd_oob(fit, pred_spec = list(bili = 1:5)) pd_train ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2182691 0.01218789 0.1008030 0.8304537 ## 2: 1826.25 2 0.2542021 0.02447359 0.1453580 0.8484741 ## 3: 1826.25 3 0.2980946 0.04854875 0.1997769 0.8640601 ## 4: 1826.25 4 0.3552203 0.10116417 0.2691853 0.8642393 ## 5: 1826.25 5 0.3959143 0.14768055 0.3264149 0.8737186 pd_test <- orsf_pd_new(fit, new_data = pbc_orsf_test, pred_spec = list(bili = 1:5)) pd_test ## pred_horizon bili mean lwr medn upr ## 1: 1826.25 1 0.2643662 0.01758300 0.2098936 0.8410357 ## 2: 1826.25 2 0.2990578 0.04063388 0.2516202 0.8553218 ## 3: 1826.25 3 0.3432503 0.06843859 0.3056799 0.8670726 ## 4: 1826.25 4 0.3968111 0.11801725 0.3593064 0.8725208 ## 5: 1826.25 5 0.4388962 0.16038177 0.4094224 0.8809027"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_pd_oob.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"ORSF partial dependence — orsf_pd_oob","text":"Giles Hooker, Lucas Mentch, Siyu Zhou. Unrestricted Permutation forces Extrapolation: Variable Importance Requires least One Model, Free Variable Importance. arXiv e-prints 2021 Oct; arXiv-1905. URL: https://doi.org/10.48550/arXiv.1905.03151","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":null,"dir":"Reference","previous_headings":"","what":"Scale input data — orsf_scale_cph","title":"Scale input data — orsf_scale_cph","text":"functions exported users may access internal routines used scale inputs orsf_control_cph used.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Scale input data — orsf_scale_cph","text":"","code":"orsf_scale_cph(x_mat, w_vec = NULL) orsf_unscale_cph(x_mat)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Scale input data — orsf_scale_cph","text":"x_mat (numeric matrix) matrix values scaled unscaled. Note orsf_unscale_cph accept x_mat inputs attribute containing transform values, added automatically orsf_scale_cph. w_vec (numeric vector) optional vector weights. weights supplied (default), observations equally weighted. supplied, w_vec must length equal nrow(x_mat).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Scale input data — orsf_scale_cph","text":"scaled unscaled x_mat.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Scale input data — orsf_scale_cph","text":"data transformed first subtracting mean multiplying scale. inverse transform can completed using orsf_unscale_cph dividing column corresponding scale adding mean. values means scales stored attribute output returned orsf_scale_cph (see examples)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_scale_cph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Scale input data — orsf_scale_cph","text":"","code":"x_mat <- as.matrix(pbc_orsf[, c('bili', 'age', 'protime')]) head(x_mat) #> bili age protime #> 1 14.5 58.76523 12.2 #> 2 1.1 56.44627 10.6 #> 3 1.4 70.07255 12.0 #> 4 1.8 54.74059 10.3 #> 5 3.4 38.10541 10.9 #> 7 1.0 55.53457 9.7 x_scaled <- orsf_scale_cph(x_mat) head(x_scaled) #> bili age protime #> [1,] 3.77308887 1.0412574 1.9694656 #> [2,] -0.75476469 0.7719344 -0.1822316 #> [3,] -0.65339483 2.3544852 1.7005035 #> [4,] -0.51823502 0.5738373 -0.5856748 #> [5,] 0.02240421 -1.3581657 0.2212116 #> [6,] -0.78855464 0.6660494 -1.3925613 attributes(x_scaled) # note the transforms attribute #> $dim #> [1] 276 3 #> #> $dimnames #> $dimnames[[1]] #> NULL #> #> $dimnames[[2]] #> [1] \"bili\" \"age\" \"protime\" #> #> #> $transforms #> mean scale #> [1,] 3.333696 0.3378995 #> [2,] 49.799661 0.1161396 #> [3,] 10.735507 1.3448108 #> x_unscaled <- orsf_unscale_cph(x_scaled) head(x_unscaled) #> bili age protime #> [1,] 14.5 58.76523 12.2 #> [2,] 1.1 56.44627 10.6 #> [3,] 1.4 70.07255 12.0 #> [4,] 1.8 54.74059 10.3 #> [5,] 3.4 38.10541 10.9 #> [6,] 1.0 55.53457 9.7 # numeric difference in x_mat and x_unscaled should be practically 0 max(abs(x_mat - x_unscaled)) #> [1] 8.881784e-16"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF summary; univariate — orsf_summarize_uni","title":"ORSF summary; univariate — orsf_summarize_uni","text":"Summarize univariate information ORSF object","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF summary; univariate — orsf_summarize_uni","text":"","code":"orsf_summarize_uni( object, n_variables = NULL, pred_horizon = NULL, pred_type = \"risk\", importance = \"negate\", ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF summary; univariate — orsf_summarize_uni","text":"object (orsf_fit) trained oblique random survival forest (see orsf). n_variables (integer) many variables summarized? Setting input lower number reduce computation time. pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction importance (character) Indicate method variable importance: 'none': variable importance computed. 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance details methods, see orsf_vi. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF summary; univariate — orsf_summarize_uni","text":"object class 'orsf_summary', includes data importance individual predictors. expected values predictions specific values predictors.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF summary; univariate — orsf_summarize_uni","text":"pred_horizon left unspecified, median value time--event variable object's training data used. recommended always specify prediction horizon, median time may especially meaningful horizon compute predicted risk values . object already variable importance values, can safely bypass computation variable importance function setting importance = 'none'.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_summarize_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ORSF summary; univariate — orsf_summarize_uni","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) # since anova importance was used to make object, we can # safely say importance = 'none' and skip computation of # variable importance while running orsf_summarize_uni orsf_summarize_uni(object, n_variables = 3, importance = 'none') #> #> -- ascites (VI Rank: 1) ------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2974993 0.1668487 0.05454388 0.5259085 #> 1 0.4579390 0.3820835 0.25074536 0.6566922 #> #> -- bili (VI Rank: 2) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2313449 0.1293462 0.05073845 0.3566123 #> 1.4 0.2544022 0.1476311 0.06971180 0.3835024 #> 3.5 0.3635348 0.2774100 0.16195402 0.5324600 #> #> -- edema (VI Rank: 3) -------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2935192 0.1610494 0.05237834 0.5296468 #> 0.5 0.3519232 0.2369798 0.09665895 0.6015010 #> 1 0.4622315 0.3650044 0.27045456 0.6556335 #> #> Predicted risk at time t = 1788 for top 3 predictors # however, if we want to summarize object according to variables # ranked by negation importance, we can compute negation importance # within orsf_summarize_uni() as follows: orsf_summarize_uni(object, n_variables = 3, importance = 'negate') #> #> -- bili (VI Rank: 1) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2313449 0.1293462 0.05073845 0.3566123 #> 1.4 0.2544022 0.1476311 0.06971180 0.3835024 #> 3.5 0.3635348 0.2774100 0.16195402 0.5324600 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2619929 0.1365139 0.05090145 0.4492814 #> 74 0.2825179 0.1620146 0.06617925 0.4929247 #> 129 0.3367013 0.2266116 0.11206856 0.5523793 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.348476 0.2366336 0.10853117 0.5770516 #> f 0.297822 0.1655279 0.05429487 0.5193798 #> #> Predicted risk at time t = 1788 for top 3 predictors"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":null,"dir":"Reference","previous_headings":"","what":"Estimate training time — orsf_time_to_train","title":"Estimate training time — orsf_time_to_train","text":"Estimate training time","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Estimate training time — orsf_time_to_train","text":"","code":"orsf_time_to_train(object, n_tree_subset = 50)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Estimate training time — orsf_time_to_train","text":"object untrained aorsf object n_tree_subset (integer) many trees fit order estimate time needed train object. default value 50, usually gives good enough approximation.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Estimate training time — orsf_time_to_train","text":"difftime object.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_time_to_train.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Estimate training time — orsf_time_to_train","text":"","code":"# specify but do not train the model by setting no_fit = TRUE. object <- orsf(pbc_orsf, Surv(time, status) ~ . - id, n_tree = 500, no_fit = TRUE) # grow 50 trees to approximate the time it will take to grow 500 trees time_estimated <- orsf_time_to_train(object, n_tree_subset = 50) print(time_estimated) #> Time difference of 0.2212784 secs # let's see how close the approximation was time_true_start <- Sys.time() fit <- orsf_train(object) time_true_stop <- Sys.time() time_true <- time_true_stop - time_true_start print(time_true) #> Time difference of 0.2066715 secs # error abs(time_true - time_estimated) #> Time difference of 0.01460695 secs"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":null,"dir":"Reference","previous_headings":"","what":"ORSF variable importance — orsf_vi","title":"ORSF variable importance — orsf_vi","text":"Estimate importance individual variables using oblique random survival forests.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ORSF variable importance — orsf_vi","text":"","code":"orsf_vi( object, group_factors = TRUE, importance = NULL, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_negate( object, group_factors = TRUE, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_permute( object, group_factors = TRUE, oobag_fun = NULL, n_thread = 1, verbose_progress = FALSE, ... ) orsf_vi_anova(object, group_factors = TRUE, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ORSF variable importance — orsf_vi","text":"object (orsf_fit) trained oblique random survival forest (see orsf). group_factors (logical) TRUE, importance factor variables reported overall aggregating importance individual levels factor. FALSE, importance individual factor levels returned. importance (character) Indicate method variable importance: 'anova': compute analysis variance (ANOVA) importance 'negate': compute negation importance 'permute': compute permutation importance oobag_fun (function) used evaluating --bag prediction accuracy negating coefficients (importance = 'negate') permuting values predictor (importance = 'permute') oobag_fun = NULL (default), Harrell's C-statistic (1982) used evaluate accuracy. use oobag_fun note following: oobag_fun two inputs: y_mat s_vec y_mat two column matrix first column named 'time', second named 'status' s_vec numeric vector containing predicted survival probabilities. oobag_fun return numeric output length 1 oobag_fun used created object initial value --bag prediction accuracy consistent values computed variable importance estimated. details, see --bag vignette. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ORSF variable importance — orsf_vi","text":"orsf_vi functions return named numeric vector. Names vector predictor variables used object Values vector estimated importance given predictor. returned vector sorted highest lowest value, higher values indicating higher importance.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ORSF variable importance — orsf_vi","text":"orsf_fit object fitted importance = 'anova', 'negate', 'permute', output vector importance values based requested type importance. However, may still want call orsf_vi() output want group factor levels one overall importance value. orsf_vi() general purpose function extract compute variable importance estimates 'orsf_fit' object (see orsf). orsf_vi_negate(), orsf_vi_permute(), orsf_vi_anova() wrappers orsf_vi(). way functions work depends whether object given already variable importance estimates (see examples).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"variable-importance-methods","dir":"Reference","previous_headings":"","what":"Variable importance methods","title":"ORSF variable importance — orsf_vi","text":"negation importance: variable assessed separately multiplying variable's coefficients -1 determining much model's performance changes. worse model's performance negating coefficients given variable, important variable. technique promising b/c require permutation emphasizes variables larger coefficients linear combinations, also relatively new studied much permutation importance. See Jaeger, (2023) details technique. permutation importance: variable assessed separately randomly permuting variable's values determining much model's performance changes. worse model's performance permuting values given variable, important variable. technique flexible, intuitive, frequently used. also several known limitations analysis variance (ANOVA) importance: p-value computed coefficient linear combination variables decision tree. Importance individual predictor variable proportion times p-value coefficient < 0.01. technique efficient computationally, may effective permutation negation terms selecting signal noise variables. See Menze, 2011 details technique.","code":""},{"path":[]},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"anova-importance","dir":"Reference","previous_headings":"","what":"ANOVA importance","title":"ORSF variable importance — orsf_vi","text":"default variable importance technique, ANOVA, calculated fit ORSF ensemble. ANOVA default fast, may decisive permutation negation techniques variable selection.","code":"fit <- orsf(pbc_orsf, Surv(time, status) ~ . - id) fit ## ---------- Oblique random survival forest ## ## Linear combinations: Accelerated ## N observations: 276 ## N events: 111 ## N trees: 500 ## N predictors total: 17 ## N predictors per node: 5 ## Average leaves per tree: 25 ## Min observations in leaf: 5 ## Min events in leaf: 1 ## OOB stat value: 0.84 ## OOB stat type: Harrell's C-statistic ## Variable importance: anova ## ## -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"raw-vi-values","dir":"Reference","previous_headings":"","what":"Raw VI values","title":"ORSF variable importance — orsf_vi","text":"‘raw’ variable importance values can accessed fit object ‘raw’ values factors aggregated single value. Currently one value k-1 levels k level factor. example, can see edema_1 edema_0.5 importance values edema factor variable levels 0, 0.5, 1.","code":"attr(fit, 'importance_values') ## ascites_1 edema_1 bili copper albumin age ## 0.44989185 0.43936093 0.29908016 0.22471022 0.20573664 0.19373368 ## edema_0.5 protime chol stage spiders_1 ast ## 0.19096711 0.17582704 0.17527675 0.17057992 0.16721527 0.16061635 ## sex_f hepato_1 trig alk.phos platelet trt_placebo ## 0.14513788 0.14241390 0.12695468 0.12228332 0.10395510 0.09001406"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"collapse-vi-across-factor-levels","dir":"Reference","previous_headings":"","what":"Collapse VI across factor levels","title":"ORSF variable importance — orsf_vi","text":"get aggregated values across levels factor, access importance element orsf fit: use orsf_vi() group_factors set TRUE (default) Note can make default returned importance values ungrouped setting group_factors FALSE orsf_vi functions orsf function.","code":"fit$importance ## ascites bili edema copper albumin age protime ## 0.44989185 0.29908016 0.29150746 0.22471022 0.20573664 0.19373368 0.17582704 ## chol stage spiders ast sex hepato trig ## 0.17527675 0.17057992 0.16721527 0.16061635 0.14513788 0.14241390 0.12695468 ## alk.phos platelet trt ## 0.12228332 0.10395510 0.09001406 orsf_vi(fit) ## ascites bili edema copper albumin age protime ## 0.44989185 0.29908016 0.29150746 0.22471022 0.20573664 0.19373368 0.17582704 ## chol stage spiders ast sex hepato trig ## 0.17527675 0.17057992 0.16721527 0.16061635 0.14513788 0.14241390 0.12695468 ## alk.phos platelet trt ## 0.12228332 0.10395510 0.09001406"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"add-vi-to-an-orsf","dir":"Reference","previous_headings":"","what":"Add VI to an ORSF","title":"ORSF variable importance — orsf_vi","text":"can fit ORSF without VI, add VI later","code":"fit_no_vi <- orsf(pbc_orsf, Surv(time, status) ~ . - id, importance = 'none') # Note: you can't call orsf_vi_anova() on fit_no_vi because anova # VI can only be computed while the forest is being grown. orsf_vi_negate(fit_no_vi) ## bili copper sex stage protime age ## 0.117833946 0.046771025 0.038096005 0.026596235 0.023892153 0.022568331 ## albumin ascites chol ast edema hepato ## 0.020502226 0.015764542 0.013505575 0.011507061 0.007444267 0.007318432 ## trt spiders alk.phos trig platelet ## 0.006135388 0.005416366 0.003385460 0.003359579 0.001225734 orsf_vi_permute(fit_no_vi) ## bili copper age protime albumin ## 0.0557854459 0.0230058852 0.0142318894 0.0139189306 0.0138242166 ## ascites stage chol ast edema ## 0.0122576604 0.0122514140 0.0062628391 0.0060073065 0.0057933534 ## hepato spiders sex trig alk.phos ## 0.0052890246 0.0038620727 0.0031610738 0.0014580912 0.0009063636 ## platelet trt ## 0.0001124081 -0.0017971380"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"orsf-and-vi-all-at-once","dir":"Reference","previous_headings":"","what":"ORSF and VI all at once","title":"ORSF variable importance — orsf_vi","text":"fit ORSF compute vi time can still get negation VI fit, needs computed","code":"fit_permute_vi <- orsf(pbc_orsf, Surv(time, status) ~ . - id, importance = 'permute') # get the vi instantly (i.e., it doesn't need to be computed again) orsf_vi_permute(fit_permute_vi) ## bili copper age ascites protime ## 0.0537706105 0.0232845222 0.0135823364 0.0127916446 0.0125320108 ## albumin stage ast edema hepato ## 0.0115100144 0.0109035858 0.0063943212 0.0062769135 0.0048230621 ## chol spiders sex trig alk.phos ## 0.0042752565 0.0030699653 0.0025422803 0.0022410492 0.0010977282 ## platelet trt ## 0.0010972387 -0.0005947093 orsf_vi_negate(fit_permute_vi) ## bili copper sex age protime stage ## 0.120854614 0.046515980 0.036380485 0.022668834 0.021816803 0.021111101 ## albumin ascites ast chol edema spiders ## 0.018969867 0.014101778 0.013042103 0.011220170 0.008009693 0.006193354 ## trt hepato trig alk.phos platelet ## 0.005184060 0.005113622 0.003389060 0.003156121 0.002242597"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vi.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"ORSF variable importance — orsf_vi","text":"Harrell FE, Califf RM, Pryor DB, Lee KL, Rosati RA. Evaluating Yield Medical Tests. JAMA 1982; 247(18):2543-2546. DOI: 10.1001/jama.1982.03320430047030 Breiman L. Random forests. Machine learning 2001 Oct; 45(1):5-32. DOI: 10.1023/:1010933404324 Menze BH, Kelm BM, Splitthoff DN, Koethe U, Hamprecht FA. oblique random forests. Joint European Conference Machine Learning Knowledge Discovery Databases 2011 Sep 4; pp. 453-469. DOI: 10.1007/978-3-642-23783-6_29 Jaeger BC, Welden S, Lenoir K, Speiser JL, Segar MW, Pandey , Pajewski NM. Accelerated interpretable oblique random survival forests. Journal Computational Graphical Statistics Published online 08 Aug 2023. DOI: 10.1080/10618600.2023.2231048","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":null,"dir":"Reference","previous_headings":"","what":"Variable selection — orsf_vs","title":"Variable selection — orsf_vs","text":"Variable selection","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Variable selection — orsf_vs","text":"","code":"orsf_vs(object, n_predictor_min = 3, verbose_progress = FALSE)"},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Variable selection — orsf_vs","text":"object (orsf_fit) trained oblique random survival forest (see orsf). n_predictor_min (integer) minimum number predictors allowed verbose_progress (logical) implemented yet. progress printed console?","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Variable selection — orsf_vs","text":"data.table four columns: n_predictors: number predictors used stat_value: --bag statistic predictors_included: names predictors included predictor_dropped: predictor selected dropped","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Variable selection — orsf_vs","text":"tree_seeds specified object successive run orsf evaluated --bag samples initial run.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/orsf_vs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Variable selection — orsf_vs","text":"","code":"object <- orsf(formula = time + status ~ ., data = pbc_orsf, n_tree = 25, importance = 'anova', tree_seeds = 1:25) orsf_vs(object) #> n_predictors stat_value predictors_included #> 1: 3 0.7911870 ascites,edema,bili #> 2: 4 0.8144174 ascites,edema,bili,copper #> 3: 5 0.8244700 age,ascites,edema,bili,copper #> 4: 6 0.8238450 age,ascites,hepato,edema,bili,copper #> 5: 7 0.8130111 age,ascites,hepato,edema,bili,copper,... #> 6: 8 0.8252513 age,ascites,hepato,spiders,edema,bili,... #> 7: 9 0.8394187 age,ascites,hepato,spiders,edema,bili,... #> 8: 10 0.8418147 age,ascites,hepato,spiders,edema,bili,... #> 9: 11 0.8268139 age,ascites,hepato,spiders,edema,bili,... #> 10: 12 0.8340539 age,sex,ascites,hepato,spiders,edema,... #> 11: 13 0.8418147 age,sex,ascites,hepato,spiders,edema,... #> 12: 14 0.8392104 age,sex,ascites,hepato,spiders,edema,... #> 13: 15 0.8423876 age,sex,ascites,hepato,spiders,edema,... #> 14: 16 0.8237408 age,sex,ascites,hepato,spiders,edema,... #> 15: 17 0.8122298 id,age,sex,ascites,hepato,spiders,... #> 16: 18 0.8251992 id,trt,age,sex,ascites,hepato,... #> predictor_dropped #> 1: bili #> 2: copper #> 3: age #> 4: hepato #> 5: protime #> 6: spiders #> 7: chol #> 8: albumin #> 9: ast #> 10: sex #> 11: trig #> 12: stage #> 13: alk.phos #> 14: platelet #> 15: id #> 16: trt"},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":null,"dir":"Reference","previous_headings":"","what":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"data light modification survival::pbc data. modifications :","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"","code":"pbc_orsf"},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"data frame 276 rows 20 variables: id case number time number days registration earlier death, transplantion, study analysis July, 1986 status status endpoint, 0 censored transplant, 1 dead trt randomized treatment group: D-penicillmain placebo age years sex m/f ascites presence ascites hepato presence hepatomegaly enlarged liver spiders blood vessel malformations skin edema 0 edema, 0.5 untreated successfully treated, 1 edema despite diuretic therapy bili serum bilirubin (mg/dl) chol serum cholesterol (mg/dl) albumin serum albumin (g/dl) copper urine copper (ug/day) alk.phos alkaline phosphotase (U/liter) ast aspartate aminotransferase, called SGOT (U/ml) trig triglycerides (mg/dl) platelet platelet count protime standardized blood clotting time stage histologic stage disease (needs biopsy)","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"T Therneau P Grambsch (2000), Modeling Survival Data: Extending Cox Model, Springer-Verlag, New York. ISBN: 0-387-98784-3.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/pbc_orsf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Mayo Clinic Primary Biliary Cholangitis Data — pbc_orsf","text":"removed rows missing data converted status 0 censor transplant, 1 dead converted stage ordered factor. converted trt, ascites, hepato, spiders, edema factors.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute predictions using ORSF — predict.orsf_fit","title":"Compute predictions using ORSF — predict.orsf_fit","text":"Predicted risk, survival, hazard, mortality ORSF model.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute predictions using ORSF — predict.orsf_fit","text":"","code":"# S3 method for orsf_fit predict( object, new_data, pred_horizon = NULL, pred_type = \"risk\", na_action = \"fail\", boundary_checks = TRUE, n_thread = 1, verbose_progress = FALSE, pred_aggregate = TRUE, ... )"},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute predictions using ORSF — predict.orsf_fit","text":"object (orsf_fit) trained oblique random survival forest (see orsf). new_data data.frame, tibble, data.table compute predictions . pred_horizon (double) value vector indicating time(s) predictions calibrated . E.g., predicting risk incident heart failure within next 10 years, pred_horizon = 10. pred_horizon can NULL pred_type 'mort', since mortality predictions aggregated event times pred_type (character) type predictions compute. Valid options 'risk' : probability event pred_horizon. 'surv' : 1 - risk. 'chf': cumulative hazard function 'mort': mortality prediction na_action (character) happen new_data contains missing values (.e., NA values). Valid options : 'fail' : error thrown new_data contains NA values 'pass' : output NA rows new_data 1 NA value predictors used object 'omit' : rows new_data incomplete data dropped 'impute_meanmode' : missing values continuous categorical variables new_data imputed using mean mode, respectively. clarify, mean mode used impute missing values training data object, new_data. boundary_checks (logical) TRUE, pred_horizon checked make sure requested values less maximum observed time object's training data. FALSE, checks skipped. n_thread (integer) number threads use computing predictions. Default one thread. use maximum number threads system provides concurrent execution, set n_thread = 0. verbose_progress (logical) TRUE, progress messages printed console. FALSE (default), nothing printed. pred_aggregate (logical) TRUE (default), predictions aggregated trees taking mean. FALSE, returned output contain one row per observation one column tree. length pred_horizon two pred_aggregate FALSE, result list matrices, 'th item list corresponding 'th value pred_horizon. ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute predictions using ORSF — predict.orsf_fit","text":"matrix predictions. Column j matrix corresponds value j pred_horizon. Row matrix corresponds row new_data.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute predictions using ORSF — predict.orsf_fit","text":"new_data must columns equivalent types data used train object. Also, factors new_data must levels data used train object. pred_horizon values exceed maximum follow-time object's training data, truly want , set boundary_checks = FALSE can use pred_horizon large want. Note predictions beyond maximum follow-time object's training data equal predictions maximum follow-time, aorsf estimate survival beyond maximum observed time. unspecified, pred_horizon may automatically specified value used oobag_pred_horizon object created (see orsf).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/predict.orsf_fit.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute predictions using ORSF — predict.orsf_fit","text":"Begin fitting ORSF ensemble: Predict risk, survival, cumulative hazard one several times: Predict mortality, defined number events forest’s population observations characteristics like current observation. type prediction require specify prediction horizon","code":"library(aorsf) set.seed(329730) index_train <- sample(nrow(pbc_orsf), 150) pbc_orsf_train <- pbc_orsf[index_train, ] pbc_orsf_test <- pbc_orsf[-index_train, ] fit <- orsf(data = pbc_orsf_train, formula = Surv(time, status) ~ . - id, oobag_pred_horizon = 365.25 * 5) # predicted risk, the default predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'risk', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.49884105 0.77681319 0.91901860 ## [2,] 0.04475471 0.09161544 0.17682278 ## [3,] 0.12850458 0.27603519 0.41455070 ## [4,] 0.01279086 0.02980402 0.06458151 ## [5,] 0.01277317 0.02249769 0.04875677 # predicted survival, i.e., 1 - risk predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'surv', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.5011589 0.2231868 0.0809814 ## [2,] 0.9552453 0.9083846 0.8231772 ## [3,] 0.8714954 0.7239648 0.5854493 ## [4,] 0.9872091 0.9701960 0.9354185 ## [5,] 0.9872268 0.9775023 0.9512432 # predicted cumulative hazard function # (expected number of events for person i at time j) predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'chf', pred_horizon = c(500, 1000, 1500)) ## [,1] [,2] [,3] ## [1,] 0.70860748 1.40641948 1.79893071 ## [2,] 0.04954335 0.11460828 0.24130253 ## [3,] 0.16616222 0.43287394 0.71524591 ## [4,] 0.01443848 0.03640393 0.08366798 ## [5,] 0.01435412 0.02680792 0.06203327 predict(fit, new_data = pbc_orsf_test[1:5, ], pred_type = 'mort') ## [,1] ## [1,] 81.23490 ## [2,] 27.69730 ## [3,] 41.52408 ## [4,] 15.79522 ## [5,] 10.65239"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":null,"dir":"Reference","previous_headings":"","what":"Inspect your ORSF model — print.orsf_fit","title":"Inspect your ORSF model — print.orsf_fit","text":"Printing ORSF model tells : Linear combinations: identified? N observations: Number rows training data N events: Number events training data N trees: Number trees forest N predictors total: Total number columns predictor matrix N predictors per node: Number variables used linear combinations Average leaves per tree: proxy depth trees Min observations leaf: See leaf_min_obs orsf Min events leaf: See leaf_min_events orsf OOB stat value: --bag error fitting trees OOB stat type: --bag error computed? Variable importance: variable importance computed?","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Inspect your ORSF model — print.orsf_fit","text":"","code":"# S3 method for orsf_fit print(x, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Inspect your ORSF model — print.orsf_fit","text":"x (orsf_fit) oblique random survival forest (ORSF; see orsf). ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Inspect your ORSF model — print.orsf_fit","text":"x, invisibly.","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_fit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Inspect your ORSF model — print.orsf_fit","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id, n_tree = 5) print(object) #> ---------- Oblique random survival forest #> #> Linear combinations: Accelerated #> N observations: 276 #> N events: 111 #> N trees: 5 #> N predictors total: 17 #> N predictors per node: 5 #> Average leaves per tree: 20 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.75 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> #> -----------------------------------------"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":null,"dir":"Reference","previous_headings":"","what":"Print ORSF summary — print.orsf_summary_uni","title":"Print ORSF summary — print.orsf_summary_uni","text":"Print ORSF summary","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Print ORSF summary — print.orsf_summary_uni","text":"","code":"# S3 method for orsf_summary_uni print(x, n_variables = NULL, ...)"},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Print ORSF summary — print.orsf_summary_uni","text":"x object class 'orsf_summary' n_variables number variables print ... arguments passed methods (currently used).","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Print ORSF summary — print.orsf_summary_uni","text":"invisibly, x","code":""},{"path":"https://bcjaeger.github.io/aorsf/reference/print.orsf_summary_uni.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Print ORSF summary — print.orsf_summary_uni","text":"","code":"object <- orsf(pbc_orsf, Surv(time, status) ~ . - id) smry <- orsf_summarize_uni(object, n_variables = 3) print(smry) #> #> -- bili (VI Rank: 1) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2316278 0.1228982 0.05258416 0.3549027 #> 1.4 0.2531304 0.1516350 0.06971433 0.3852210 #> 3.5 0.3674937 0.2823537 0.16739901 0.5484374 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2637305 0.1533631 0.05272638 0.4503559 #> 74 0.2824765 0.1634573 0.06315440 0.4787054 #> 129 0.3360249 0.2274249 0.10921335 0.5462903 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3509456 0.2353301 0.11765074 0.5681639 #> f 0.2972260 0.1661089 0.05511715 0.5219512 #> #> Predicted risk at time t = 1788 for top 3 predictors"},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-010-unreleased","dir":"Changelog","previous_headings":"","what":"aorsf 0.1.0 (unreleased)","title":"aorsf 0.1.0 (unreleased)","text":"CRAN release: 2023-10-13 Re-worked internal C++ routines following design ranger. Re-worked progress printed console verbose_progress TRUE, following design ranger. Messages now indicate action taken, % complete, approximate time finishing action. Improved variable importance, following design ranger. Importance now computed tree--tree instead aggregate. Additionally, mortality type prediction used importance survival trees, since mortality depend pred_horizon. Allowed multi-threading performed orsf(), predict.orsf_fit(), functions orsf_vi() orsf_pd() family. Allowed sampling without replacement sampling specific fraction observations orsf() Included Harrell’s C-statistic option assessing goodness splits growing trees. Fixed issue uninformative error message occur pred_horizon > max(time) orsf_summarize_uni. Thanks @JyHao1 @DustinMLong finding !","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-007","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.7","title":"aorsf 0.0.7","text":"CRAN release: 2023-01-12 Additional changes internal testing avoid problems ATLAS","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-006","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.6","title":"aorsf 0.0.6","text":"CRAN release: 2023-01-06 Minor fix internal tests failing run ATLAS","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-005","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.5","title":"aorsf 0.0.5","text":"CRAN release: 2022-12-14 orsf() longer throws errors warnings try give single predictor. note added documentation details ?orsf explains using single predictor orsf() somewhat useless. done resolve https://github.com/mlr-org/mlr3extralearners/issues/259. predict.orsf_fit now accepts pred_horizon = 0 returns sensible values. Thanks @mattwarkentin feature request. added function perform variable selection, orsf_vs(). Made variable importance consistent respect group_factors. Originally, output orsf ungrouped VI values orsf_vi grouped values. update, orsf defaults grouped values. ungrouped values can still recovered. Fixed issue orsf_pd functions output data returned original scale.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-004","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.4","title":"aorsf 0.0.4","text":"CRAN release: 2022-11-07 orsf formulas now accepts Surv objects (see https://github.com/ropensci/aorsf/issues/11) Added verbose_progress input orsf, prints messages console indicating progress. Allowance missing values orsf. Mean mode imputation performed observations missing data. values can also used impute new data missing values. Centering scaling predictors now done prior growing forest.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-003","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.3","title":"aorsf 0.0.3","text":"CRAN release: 2022-10-09 Included rOpenSci reviewers Christopher Jackson, Marvin N Wright, Lukas Burk DESCRIPTION reviewers. Thank ! Added clarification docs pros/cons different variable importance techniques Added regression tests aorsf versus obliqueRSF (similar) Additional support tests functions long right hand sides Updated --bag vignette appropriate custom functions. Allow status values input data general, .e., just 0 1. Allow missing values predict functions, including partial dependence.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-002","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.2","title":"aorsf 0.0.2","text":"CRAN release: 2022-09-05 Modified unit tests compatibility extra checks run CRAN.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-001","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.1","title":"aorsf 0.0.1","text":"CRAN release: 2022-08-23 Added orsf_control_custom(), allows users submit custom functions identifying linear combinations inputs growing oblique decision trees. Added weights input orsf, allowing users fit orsf specific data training set. Added chf mort options predict.orsf_fit(). Mortality predictions fully implemented yet - supported partial dependence --bag error estimates. features added future update.","code":""},{"path":"https://bcjaeger.github.io/aorsf/news/index.html","id":"aorsf-0009000","dir":"Changelog","previous_headings":"","what":"aorsf 0.0.0.9000","title":"aorsf 0.0.0.9000","text":"Core features implemented: fit, interpret, predict using oblique random survival forests. Vignettes + Readme covering usage core features. Website hosted GitHub pages, managed pkgdown.","code":""}]