From e2b9f63e15169b8aa2813b5292c32139e55a6108 Mon Sep 17 00:00:00 2001 From: bcjaeger Date: Sun, 8 Oct 2023 00:20:12 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20ropensci?= =?UTF-8?q?/aorsf@dbe816a4dd8929045fdec5d9e4360e050191bb0b=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/oobag.html | 20 +++++------ .../figure-html/unnamed-chunk-2-1.png | Bin 27695 -> 27695 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 46155 -> 44597 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 45076 -> 49824 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 49003 -> 49078 bytes 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 +- 14 files changed, 55 insertions(+), 55 deletions(-) diff --git a/articles/aorsf.html b/articles/aorsf.html index c6792ff9..f46eb27c 100644 --- a/articles/aorsf.html +++ b/articles/aorsf.html @@ -258,7 +258,7 @@

What about the original ORSF?) ) #> user system elapsed -#> 4.17 0.00 4.17 +#> 4.761 0.000 4.763 # and how long it takes to fit 50 cph trees print( @@ -270,11 +270,11 @@

What about the original ORSF?) ) #> user system elapsed -#> 0.048 0.000 0.049 +#> 0.057 0.000 0.056 t1['elapsed'] / t2['elapsed'] #> elapsed -#> 85.10204 +#> 85.05357

aorsf and other machine learning software diff --git a/articles/oobag.html b/articles/oobag.html index 21a44c34..4a827831 100644 --- a/articles/oobag.html +++ b/articles/oobag.html @@ -137,10 +137,10 @@

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

+#> [,1] +#> [1,] 0.8402

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

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

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

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

+#> [1] 0.114175

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

@@ -326,12 +326,12 @@ 

User-supplied function importance = 'negate') fit_tdep_cstat$importance -#> bili copper sex stage age albumin protime -#> 0.13843137 0.05020553 0.03331993 0.02437494 0.02285846 0.02101822 0.01917581 -#> ascites chol ast trt spiders edema platelet -#> 0.01856438 0.01169694 0.01135199 0.00994496 0.00991561 0.00854793 0.00673601 -#> alk.phos trig hepato -#> 0.00549073 0.00506433 0.00399993

+#> bili copper sex albumin stage age protime +#> 0.11862710 0.04108374 0.03530545 0.02378750 0.02226001 0.02160303 0.02054956 +#> ascites ast chol edema trt alk.phos spiders +#> 0.01639546 0.01302929 0.01137357 0.00849547 0.00805117 0.00660429 0.00492053 +#> trig hepato platelet +#> 0.00485534 0.00277577 0.00270581

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 f9715af5d05e8ec58c67c31d124bc65a9ca81667..6e140e256d56692e675c04c2bb126a006ac6fdb5 100644 GIT binary patch literal 27695 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 j_w|b_xBoYc#*7 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 literal 46155 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

Examples#> N trees: 25 #> N predictors total: 17 #> N predictors per node: 5 -#> Average leaves per tree: 24 +#> Average leaves per tree: 25 #> Min observations in leaf: 5 #> Min events in leaf: 1 -#> OOB stat value: 0.83 +#> OOB stat value: 0.82 #> OOB stat type: Harrell's C-statistic #> Variable importance: anova #> diff --git a/reference/orsf_summarize_uni.html b/reference/orsf_summarize_uni.html index 4b69ba9c..71632ce2 100644 --- a/reference/orsf_summarize_uni.html +++ b/reference/orsf_summarize_uni.html @@ -150,25 +150,25 @@

Examples#> -- ascites (VI Rank: 1) ------------------------ #> #> |---------------- Risk ----------------| -#> Value Mean Median 25th % 75th % -#> 0 0.3054610 0.1547724 0.05108483 0.556265 -#> 1 0.4734227 0.3813219 0.27036084 0.669148 +#> Value Mean Median 25th % 75th % +#> 0 0.3047843 0.1637069 0.05226266 0.5469657 +#> 1 0.4858833 0.4113245 0.27915530 0.6790398 #> #> -- edema (VI Rank: 2) -------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 0 0.2996925 0.1510063 0.04933705 0.5563717 -#> 0.5 0.3673892 0.2525438 0.10202867 0.6425889 -#> 1 0.4720727 0.3781677 0.26981243 0.6840828 +#> 0 0.2998844 0.1518340 0.05226266 0.5359524 +#> 0.5 0.3675580 0.2785013 0.10723648 0.6241415 +#> 1 0.4671421 0.3753541 0.26564706 0.6707662 #> #> -- bili (VI Rank: 3) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 0.80 0.2441609 0.1252016 0.04477218 0.3860143 -#> 1.4 0.2701326 0.1549543 0.06756255 0.4365146 -#> 3.5 0.3849337 0.3074800 0.17617226 0.5689861 +#> 0.80 0.2419418 0.1270135 0.04978223 0.3738446 +#> 1.4 0.2661741 0.1522038 0.06592000 0.4118022 +#> 3.5 0.3818928 0.2935343 0.16919073 0.5622295 #> #> Predicted risk at time t = 1788 for top 3 predictors @@ -182,24 +182,24 @@

Examples#> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 0.80 0.2441609 0.1252016 0.04477218 0.3860143 -#> 1.4 0.2701326 0.1549543 0.06756255 0.4365146 -#> 3.5 0.3849337 0.3074800 0.17617226 0.5689861 +#> 0.80 0.2419418 0.1270135 0.04978223 0.3738446 +#> 1.4 0.2661741 0.1522038 0.06592000 0.4118022 +#> 3.5 0.3818928 0.2935343 0.16919073 0.5622295 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 43 0.2703248 0.1466578 0.04480841 0.4750340 -#> 74 0.2918194 0.1663319 0.05918382 0.5115061 -#> 129 0.3496861 0.2432000 0.12038443 0.5721610 +#> 43 0.2722129 0.1414672 0.04735708 0.4672510 +#> 74 0.2927321 0.1686414 0.05627768 0.4953317 +#> 129 0.3474980 0.2267060 0.10990191 0.5757057 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> m 0.3653795 0.2479792 0.12332794 0.6164236 -#> f 0.3050887 0.1524639 0.04911655 0.5465384 +#> m 0.3667014 0.2519309 0.12426351 0.5918595 +#> f 0.3041314 0.1589559 0.05226266 0.5609994 #> #> Predicted risk at time t = 1788 for top 3 predictors diff --git a/reference/orsf_time_to_train.html b/reference/orsf_time_to_train.html index a92729fe..d297a2a8 100644 --- a/reference/orsf_time_to_train.html +++ b/reference/orsf_time_to_train.html @@ -94,7 +94,7 @@

Examplestime_estimated <- orsf_time_to_train(object, n_tree_subset = 50) print(time_estimated) -#> Time difference of 0.2377543 secs +#> Time difference of 0.2753775 secs # let's see how close the approximation was time_true_start <- Sys.time() @@ -104,11 +104,11 @@

Examplestime_true <- time_true_stop - time_true_start print(time_true) -#> Time difference of 0.2118137 secs +#> Time difference of 0.2575102 secs # error abs(time_true - time_estimated) -#> Time difference of 0.02594066 secs +#> Time difference of 0.01786733 secs

j741i__ia8;k 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 K*PIHv{XYOy{dd~{ diff --git a/articles/oobag_files/figure-html/unnamed-chunk-7-1.png b/articles/oobag_files/figure-html/unnamed-chunk-7-1.png index 9273aa729ef85bc41f9fbcf5cc85452c92648b52..bdffbaa45e042863972a85652218644c7af9d492 100644 GIT binary patch literal 49824 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%0A6i@6kNe!YUv&`L$GAAO;E$kVsTrrE%+$QK3{d) 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 literal 45076 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 CSE-o* 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 914b4273b2c13d84a9ca9f53f075f5f074e822b9..e056267f94d85f93ed50b9eb49de548f68fe1a06 100644 GIT binary patch literal 49078 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 F{{vp&PjdhO literal 49003 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 as.data.table(smry) #> variable importance value mean medn lwr upr -#> 1: bili 0.11129195 0.80 0.2441259 0.1275061 0.04859563 0.3875465 -#> 2: bili 0.11129195 1.4 0.2675444 0.1550867 0.06657737 0.4258693 -#> 3: bili 0.11129195 3.5 0.3872868 0.2999023 0.17484350 0.5762343 -#> 4: copper 0.04693953 43 0.2741482 0.1481543 0.04728766 0.4884716 -#> 5: copper 0.04693953 74 0.2948686 0.1774546 0.05915012 0.5289892 -#> 6: copper 0.04693953 129 0.3507715 0.2443191 0.11000737 0.5842346 -#> 7: sex 0.04060868 m 0.3682221 0.2696968 0.12006392 0.6158303 -#> 8: sex 0.04060868 f 0.3054308 0.1465211 0.05099855 0.5754642 +#> 1: bili 0.12478145 0.80 0.2387097 0.1185211 0.04597625 0.3711118 +#> 2: bili 0.12478145 1.4 0.2636596 0.1387588 0.06735307 0.4151819 +#> 3: bili 0.12478145 3.5 0.3879317 0.3123973 0.17546359 0.5597512 +#> 4: copper 0.04689443 43 0.2744652 0.1441594 0.04830920 0.4869403 +#> 5: copper 0.04689443 74 0.2955633 0.1625094 0.06139512 0.5304120 +#> 6: copper 0.04689443 129 0.3457171 0.2216481 0.11311177 0.5722855 +#> 7: sex 0.03560065 m 0.3697353 0.2387903 0.12575565 0.6124547 +#> 8: sex 0.03560065 f 0.3037857 0.1525007 0.05106312 0.5547252 #> pred_horizon level #> 1: 1788 <NA> #> 2: 1788 <NA> diff --git a/reference/orsf_control_net.html b/reference/orsf_control_net.html index 5ef517e1..76e9a33c 100644 --- a/reference/orsf_control_net.html +++ b/reference/orsf_control_net.html @@ -125,10 +125,10 @@

diff --git a/reference/print.orsf_fit.html b/reference/print.orsf_fit.html index 4106c1b8..0f413396 100644 --- a/reference/print.orsf_fit.html +++ b/reference/print.orsf_fit.html @@ -135,10 +135,10 @@

Examples#> N trees: 5 #> N predictors total: 17 #> N predictors per node: 5 -#> Average leaves per tree: 24 +#> Average leaves per tree: 25 #> Min observations in leaf: 5 #> Min events in leaf: 1 -#> OOB stat value: 0.80 +#> OOB stat value: 0.79 #> 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 893b6b1a..cb9d4a98 100644 --- a/reference/print.orsf_summary_uni.html +++ b/reference/print.orsf_summary_uni.html @@ -101,24 +101,24 @@

Examples#> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 0.80 0.2447516 0.1288283 0.04116305 0.3954487 -#> 1.4 0.2681348 0.1491873 0.06213303 0.4164320 -#> 3.5 0.3830183 0.2958040 0.17122411 0.5747286 +#> 0.80 0.2448896 0.1265555 0.04360762 0.3829553 +#> 1.4 0.2681646 0.1519257 0.06265129 0.4266253 +#> 3.5 0.3829742 0.2931962 0.16143458 0.5806385 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> 43 0.2701033 0.1446276 0.04359689 0.4800884 -#> 74 0.2923737 0.1633737 0.05283174 0.5200698 -#> 129 0.3508942 0.2393747 0.11326921 0.5928263 +#> 43 0.2721926 0.1410419 0.04413890 0.4732827 +#> 74 0.2928929 0.1630429 0.05658785 0.5167348 +#> 129 0.3431857 0.2317872 0.10269499 0.5673647 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % -#> m 0.3683379 0.2464519 0.12620791 0.6191956 -#> f 0.3044020 0.1584914 0.04549548 0.5380205 +#> m 0.3660044 0.2528903 0.12318686 0.5876368 +#> f 0.3030760 0.1555301 0.04572718 0.5385975 #> #> Predicted risk at time t = 1788 for top 3 predictors diff --git a/search.json b/search.json index 418be22d..c579856d 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 arXiv 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: 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 #> #> ----------------------------------------- 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 age protime stage #> 0.121621567 0.047727757 0.036002033 0.023469251 0.023015475 0.020971782 #> albumin ascites ast chol edema trt #> 0.019397629 0.014492331 0.011663708 0.011557300 0.007728836 0.006915897 #> spiders alk.phos hepato trig platelet #> 0.004759847 0.003466967 0.003096219 0.002773073 0.001744811 orsf_vi_permute(orsf_fit) #> bili copper stage age protime #> 0.0563382689 0.0223553029 0.0141044701 0.0136840332 0.0125594010 #> ascites albumin ast edema chol #> 0.0114588381 0.0112551183 0.0063896381 0.0058597754 0.0050008533 #> spiders sex alk.phos trig hepato #> 0.0046071325 0.0029557681 0.0020509537 0.0013510330 0.0009279290 #> platelet trt #> 0.0002097984 -0.0010695131 orsf_vi_anova(orsf_fit) #> ascites bili edema copper age albumin protime #> 0.42926829 0.30005133 0.28307417 0.21974605 0.20161698 0.19367284 0.18475384 #> stage ast chol sex spiders hepato trig #> 0.16479913 0.15931052 0.15823438 0.15274199 0.14765751 0.13382443 0.12667896 #> alk.phos platelet trt #> 0.12193232 0.10931900 0.09903714"},{"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.17 0.00 4.17 # 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.048 0.000 0.049 t1['elapsed'] / t2['elapsed'] #> elapsed #> 85.10204"},{"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/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.839002.","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.839002"},{"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.107441 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 age albumin protime #> 0.13843137 0.05020553 0.03331993 0.02437494 0.02285846 0.02101822 0.01917581 #> ascites chol ast trt spiders edema platelet #> 0.01856438 0.01169694 0.01135199 0.00994496 0.00991561 0.00854793 0.00673601 #> alk.phos trig hepato #> 0.00549073 0.00506433 0.00399993"},{"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: 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/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.2169365 0.01432475 0.09392366 0.8248506 #> 2: 1826.25 2 0.2522145 0.03084190 0.13395628 0.8447959 #> 3: 1826.25 3 0.2964879 0.05324065 0.19270846 0.8583131 #> 4: 1826.25 4 0.3519108 0.09798050 0.27469327 0.8704063 #> 5: 1826.25 5 0.3937398 0.14573200 0.29927004 0.8781099 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.2162646 0.01183390 0.09914356 0.8304537 #> 2: 1826.25 2 0.2523075 0.02447359 0.14112126 0.8484741 #> 3: 1826.25 3 0.2961994 0.04854875 0.19900751 0.8640601 #> 4: 1826.25 4 0.3533472 0.10111235 0.26784789 0.8642393 #> 5: 1826.25 5 0.3941090 0.14768055 0.32236393 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.2644124 0.01758300 0.2098936 0.8412690 #> 2: 1826.25 2 0.2990357 0.04063388 0.2514774 0.8549774 #> 3: 1826.25 3 0.3432235 0.06843859 0.3059299 0.8667282 #> 4: 1826.25 4 0.3967971 0.11801725 0.3595564 0.8723581 #> 5: 1826.25 5 0.4388230 0.16038177 0.4095296 0.8802471 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.3621269 0.047543778 0.2442488 0.9519270 #> 2: 1826.25 f 0.3021948 0.008894017 0.1527339 0.9531449"},{"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.3621269 0.047543778 0.2442488 0.9519270 #> 2: 1826.25 sex NA f 0.3021948 0.008894017 0.1527339 0.9531449 #> 3: 1826.25 bili 1 0.2472124 0.011899134 0.1307416 0.9002107 #> 4: 1826.25 bili 2 0.2980598 0.036796592 0.1872691 0.9201374 #> 5: 1826.25 bili 3 0.3534198 0.064844153 0.2594576 0.9317436 #> 6: 1826.25 bili 4 0.4002423 0.093495905 0.3212078 0.9422651 #> 7: 1826.25 bili 5 0.4358465 0.114171537 0.3644818 0.9445660 pd_smry <- orsf_summarize_uni(fit) pd_smry #> #> -- bili (VI Rank: 1) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2413366 0.1264835 0.04952446 0.3911641 #> 1.4 0.2636808 0.1498767 0.06480148 0.4142433 #> 3.5 0.3800514 0.2977525 0.17104541 0.5685303 #> #> -- copper (VI Rank: 2) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2696123 0.1373523 0.04875058 0.4697054 #> 74 0.2902176 0.1617484 0.05880460 0.4973208 #> 129 0.3458558 0.2265405 0.11704033 0.5799732 #> #> -- sex (VI Rank: 3) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3621269 0.2442488 0.12996259 0.5848015 #> f 0.3021948 0.1527339 0.04999531 0.5447268 #> #> -- age (VI Rank: 4) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 42 0.2759633 0.1326070 0.04566777 0.4645078 #> 50 0.3093313 0.1830533 0.05229240 0.5303232 #> 57 0.3445924 0.2423311 0.07570254 0.5763141 #> #> -- protime (VI Rank: 5) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 10 0.2865049 0.1425036 0.05144412 0.5113836 #> 11 0.3031622 0.1643701 0.05785659 0.5300208 #> 11 0.3279104 0.1907731 0.07466802 0.5749059 #> #> -- stage (VI Rank: 6) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 1 0.6276309 0.573638 0.4698768 0.7816817 #> 2 0.6276309 0.573638 0.4698768 0.7816817 #> 3 0.6276309 0.573638 0.4698768 0.7816817 #> 4 0.6276309 0.573638 0.4698768 0.7816817 #> #> -- albumin (VI Rank: 7) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 3.3 0.3245868 0.1992516 0.05587867 0.6029765 #> 3.5 0.3018658 0.1728900 0.05035617 0.5601409 #> 3.8 0.2869526 0.1549416 0.05105937 0.5044447 #> #> -- ascites (VI Rank: 8) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.3028017 0.1590364 0.05032645 0.5642973 #> 1 0.4796166 0.3998211 0.27745007 0.6582242 #> #> -- ast (VI Rank: 9) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 82 0.2895056 0.1507709 0.04801166 0.5190614 #> 117 0.3077159 0.1709646 0.05464761 0.5457827 #> 153 0.3295798 0.1870541 0.06726646 0.5976546 #> #> -- chol (VI Rank: 10) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 250 0.2933346 0.1533755 0.04529566 0.4902194 #> 310 0.3028094 0.1689194 0.05128427 0.5236692 #> 401 0.3257335 0.1958659 0.07451783 0.5546558 #> #> -- trt (VI Rank: 11) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> d_penicill_main 0.3149810 0.1796199 0.05912379 0.5748093 #> placebo 0.3083441 0.1638691 0.05063983 0.5559098 #> #> -- edema (VI Rank: 12) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2980994 0.1494682 0.04999531 0.5500652 #> 0.5 0.3640998 0.2531299 0.10516249 0.6108659 #> 1 0.4715927 0.3812587 0.27589029 0.6612100 #> #> -- hepato (VI Rank: 13) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2941602 0.1636152 0.04740782 0.5234831 #> 1 0.3263838 0.1965858 0.06385857 0.5802145 #> #> -- trig (VI Rank: 14) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 85 0.3029060 0.1606924 0.05306785 0.5293148 #> 108 0.3091471 0.1630904 0.05365611 0.5272644 #> 151 0.3234126 0.1881145 0.06109949 0.5445899 #> #> -- spiders (VI Rank: 15) --------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2996997 0.1557687 0.04905994 0.5531772 #> 1 0.3449860 0.2241601 0.09618222 0.5894420 #> #> -- alk.phos (VI Rank: 16) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 922 0.3110808 0.1720786 0.05216288 0.5848530 #> 1278 0.3113050 0.1741084 0.05255735 0.5740111 #> 2068 0.3146600 0.1721491 0.05546745 0.5806536 #> #> -- platelet (VI Rank: 17) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 200 0.3165620 0.1712887 0.05820478 0.5751032 #> 257 0.3105712 0.1667868 0.05237467 0.5788644 #> 318 0.3059001 0.1734972 0.05328713 0.5525496 #> #> 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.11628571 0.80 0.2413366 0.1264835 0.04952446 0.3911641 #> 2: bili 0.11628571 1.4 0.2636808 0.1498767 0.06480148 0.4142433 #> 3: bili 0.11628571 3.5 0.3800514 0.2977525 0.17104541 0.5685303 #> 4: copper 0.04762655 43 0.2696123 0.1373523 0.04875058 0.4697054 #> 5: copper 0.04762655 74 0.2902176 0.1617484 0.05880460 0.4973208 #> 6: copper 0.04762655 129 0.3458558 0.2265405 0.11704033 0.5799732 #> 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.9249698 #> 2: 1 2 1826.25 1 0.1041671 #> 3: 1 3 1826.25 1 0.7439860 #> 4: 1 4 1826.25 1 0.3805933 #> 5: 1 5 1826.25 1 0.1188328 #> --- #> 6896: 25 272 1826.25 10 0.3407691 #> 6897: 25 273 1826.25 10 0.4858345 #> 6898: 25 274 1826.25 10 0.5247851 #> 6899: 25 275 1826.25 10 0.2836209 #> 6900: 25 276 1826.25 10 0.5501822 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 arXiv 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, 2022 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.1190578208 0.0619364315 0.0290605798 0.0260108174 0.0251162396 #> stage protime edema ascites hepato #> 0.0237810058 0.0158443269 0.0117270641 0.0105685230 0.0092028195 #> albumin chol trt alk.phos spiders #> 0.0082647861 0.0041510636 0.0036548364 0.0010239241 -0.0003298163 #> trig platelet #> -0.0011111508 -0.0045314656 orsf_vi_permute(fit) #> bili copper ast age sex #> 0.0514084384 0.0170611427 0.0142227933 0.0140274813 0.0131527430 #> stage protime ascites edema albumin #> 0.0119752045 0.0102865556 0.0098067817 0.0081730899 0.0080568255 #> hepato chol alk.phos trig spiders #> 0.0069734562 0.0032811220 0.0015862128 0.0014909643 0.0007811902 #> trt platelet #> -0.0007067631 -0.0022135241 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.2074286 0.09039332 0.03827337 0.3146957 #> 1.3 0.2261739 0.10784929 0.04915971 0.3425934 #> 3.2 0.3071951 0.21242141 0.11889617 0.4358309 #> #> -- sex (VI Rank: 2) ----------------------------- #> #> |----------------- risk -----------------| #> Value Mean Median 25th % 75th % #> m 0.3648659 0.2572239 0.15554270 0.5735661 #> f 0.2479179 0.1021787 0.04161796 0.3591612 #> #> 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 arXiv 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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129 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., (2022) arXiv:2208.01129.","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.11129195 0.80 0.2441259 0.1275061 0.04859563 0.3875465 #> 2: bili 0.11129195 1.4 0.2675444 0.1550867 0.06657737 0.4258693 #> 3: bili 0.11129195 3.5 0.3872868 0.2999023 0.17484350 0.5762343 #> 4: copper 0.04693953 43 0.2741482 0.1481543 0.04728766 0.4884716 #> 5: copper 0.04693953 74 0.2948686 0.1774546 0.05915012 0.5289892 #> 6: copper 0.04693953 129 0.3507715 0.2443191 0.11000737 0.5842346 #> 7: sex 0.04060868 m 0.3682221 0.2696968 0.12006392 0.6158303 #> 8: sex 0.04060868 f 0.3054308 0.1465211 0.05099855 0.5754642 #> 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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129","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: 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_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) ## riskRegression version 2023.03.22 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.153 ## ## 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.136928e-17 ## 3: 1788 pca rando 1.267 0.449 2.084 2.384937e-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: 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_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.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.1412476 ## 3: 1 3 1788 1 0.7047846 ## 4: 1 4 1788 1 0.3673939 ## 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.5409864"},{"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.2167954 0.01432475 0.0946650 0.8243506 ## 2: 1826.25 2 0.2520765 0.03084190 0.1333465 0.8442959 ## 3: 1826.25 3 0.2964487 0.05324065 0.1937964 0.8578131 ## 4: 1826.25 4 0.3518250 0.09798050 0.2751326 0.8699063 ## 5: 1826.25 5 0.3936739 0.14573200 0.2984227 0.8781099 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.2161745 0.01183390 0.1001640 0.8304537 ## 2: 1826.25 2 0.2521996 0.02447359 0.1419482 0.8484741 ## 3: 1826.25 3 0.2961802 0.04854875 0.1992512 0.8640601 ## 4: 1826.25 4 0.3532215 0.10111235 0.2666702 0.8642393 ## 5: 1826.25 5 0.3940203 0.14768055 0.3270825 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.2643571 0.01758300 0.2098936 0.8410357 ## 2: 1826.25 2 0.2990417 0.04063388 0.2516202 0.8547441 ## 3: 1826.25 3 0.3432271 0.06843859 0.3056799 0.8664949 ## 4: 1826.25 4 0.3967879 0.11801725 0.3593064 0.8721247 ## 5: 1826.25 5 0.4388518 0.16038177 0.4094224 0.8800138"},{"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.3054610 0.1547724 0.05108483 0.556265 #> 1 0.4734227 0.3813219 0.27036084 0.669148 #> #> -- edema (VI Rank: 2) -------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2996925 0.1510063 0.04933705 0.5563717 #> 0.5 0.3673892 0.2525438 0.10202867 0.6425889 #> 1 0.4720727 0.3781677 0.26981243 0.6840828 #> #> -- bili (VI Rank: 3) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2441609 0.1252016 0.04477218 0.3860143 #> 1.4 0.2701326 0.1549543 0.06756255 0.4365146 #> 3.5 0.3849337 0.3074800 0.17617226 0.5689861 #> #> 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.2441609 0.1252016 0.04477218 0.3860143 #> 1.4 0.2701326 0.1549543 0.06756255 0.4365146 #> 3.5 0.3849337 0.3074800 0.17617226 0.5689861 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2703248 0.1466578 0.04480841 0.4750340 #> 74 0.2918194 0.1663319 0.05918382 0.5115061 #> 129 0.3496861 0.2432000 0.12038443 0.5721610 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3653795 0.2479792 0.12332794 0.6164236 #> f 0.3050887 0.1524639 0.04911655 0.5465384 #> #> 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.2377543 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.2118137 secs # error abs(time_true - time_estimated) #> Time difference of 0.02594066 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, 2022 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.117812588 0.046758641 0.038085253 0.026584826 0.023881400 0.022583421 ## albumin ascites chol ast edema hepato ## 0.020499282 0.015799793 0.013503968 0.011507068 0.007446917 0.007302135 ## trt spiders alk.phos trig platelet ## 0.006136687 0.005411473 0.003425486 0.003358903 0.001218844 orsf_vi_permute(fit_no_vi) ## bili copper age protime albumin ## 0.0557765573 0.0229935033 0.0142175615 0.0138958680 0.0138130775 ## ascites stage chol ast edema ## 0.0122566919 0.0122549383 0.0062487607 0.0060082953 0.0057947595 ## hepato spiders sex trig alk.phos ## 0.0052884525 0.0038391405 0.0031617255 0.0014482532 0.0009073479 ## platelet trt ## 0.0001091183 -0.0018037065"},{"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.0537366984 0.0232882267 0.0135861353 0.0127592970 0.0125356157 ## albumin stage ast edema hepato ## 0.0114480445 0.0108792612 0.0063934776 0.0062786593 0.0048395390 ## chol spiders sex trig platelet ## 0.0042838996 0.0030700999 0.0025439674 0.0022397137 0.0010979018 ## alk.phos trt ## 0.0010942194 -0.0006194685 orsf_vi_negate(fit_permute_vi) ## bili copper sex age protime stage ## 0.120813894 0.046517819 0.036351782 0.022681350 0.021826811 0.021032630 ## albumin ascites ast chol edema spiders ## 0.018906444 0.014062700 0.013029040 0.011226505 0.008009926 0.006151980 ## trt hepato trig alk.phos platelet ## 0.005108172 0.005105800 0.003378537 0.003155270 0.002240910"},{"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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129","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.7901974 ascites,edema,bili #> 2: 4 0.8059013 ascites,edema,bili,albumin #> 3: 5 0.8122558 ascites,edema,bili,albumin,copper #> 4: 6 0.8055628 ascites,hepato,edema,bili,albumin,copper #> 5: 7 0.8166050 ascites,hepato,spiders,edema,bili,albumin,... #> 6: 8 0.8109277 ascites,hepato,spiders,edema,bili,chol,... #> 7: 9 0.8191833 age,ascites,hepato,spiders,edema,bili,... #> 8: 10 0.8374134 age,ascites,hepato,spiders,edema,bili,... #> 9: 11 0.8362675 age,sex,ascites,hepato,spiders,edema,... #> 10: 12 0.8349133 age,sex,ascites,hepato,spiders,edema,... #> 11: 13 0.8206938 age,sex,ascites,hepato,spiders,edema,... #> 12: 14 0.8416845 age,sex,ascites,hepato,spiders,edema,... #> 13: 15 0.8278556 id,age,sex,ascites,hepato,spiders,... #> 14: 16 0.8170998 id,age,sex,ascites,hepato,spiders,... #> 15: 17 0.8204334 id,trt,age,sex,ascites,hepato,... #> 16: 18 0.8354862 id,trt,age,sex,ascites,hepato,... #> predictor_dropped #> 1: bili #> 2: albumin #> 3: copper #> 4: hepato #> 5: spiders #> 6: chol #> 7: age #> 8: protime #> 9: sex #> 10: ast #> 11: trig #> 12: alk.phos #> 13: id #> 14: stage #> 15: trt #> 16: platelet"},{"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.49828550 0.77570208 0.91812971 ## [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.5017145 0.2242979 0.08187029 ## [2,] 0.9552453 0.9083846 0.82317722 ## [3,] 0.8714954 0.7239648 0.58544930 ## [4,] 0.9872091 0.9701960 0.93541849 ## [5,] 0.9872268 0.9775023 0.95124323 # 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.70791303 1.40367742 1.79658865 ## [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.19473 ## [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: 24 #> Min observations in leaf: 5 #> Min events in leaf: 1 #> OOB stat value: 0.80 #> 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.2447516 0.1288283 0.04116305 0.3954487 #> 1.4 0.2681348 0.1491873 0.06213303 0.4164320 #> 3.5 0.3830183 0.2958040 0.17122411 0.5747286 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2701033 0.1446276 0.04359689 0.4800884 #> 74 0.2923737 0.1633737 0.05283174 0.5200698 #> 129 0.3508942 0.2393747 0.11326921 0.5928263 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3683379 0.2464519 0.12620791 0.6191956 #> f 0.3044020 0.1584914 0.04549548 0.5380205 #> #> 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. 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 arXiv 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: 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 #> #> ----------------------------------------- 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 age protime stage #> 0.121621567 0.047727757 0.036002033 0.023469251 0.023015475 0.020971782 #> albumin ascites ast chol edema trt #> 0.019397629 0.014492331 0.011663708 0.011557300 0.007728836 0.006915897 #> spiders alk.phos hepato trig platelet #> 0.004759847 0.003466967 0.003096219 0.002773073 0.001744811 orsf_vi_permute(orsf_fit) #> bili copper stage age protime #> 0.0563382689 0.0223553029 0.0141044701 0.0136840332 0.0125594010 #> ascites albumin ast edema chol #> 0.0114588381 0.0112551183 0.0063896381 0.0058597754 0.0050008533 #> spiders sex alk.phos trig hepato #> 0.0046071325 0.0029557681 0.0020509537 0.0013510330 0.0009279290 #> platelet trt #> 0.0002097984 -0.0010695131 orsf_vi_anova(orsf_fit) #> ascites bili edema copper age albumin protime #> 0.42926829 0.30005133 0.28307417 0.21974605 0.20161698 0.19367284 0.18475384 #> stage ast chol sex spiders hepato trig #> 0.16479913 0.15931052 0.15823438 0.15274199 0.14765751 0.13382443 0.12667896 #> alk.phos platelet trt #> 0.12193232 0.10931900 0.09903714"},{"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.761 0.000 4.763 # 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.057 0.000 0.056 t1['elapsed'] / t2['elapsed'] #> elapsed #> 85.05357"},{"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/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.8402.","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.8402"},{"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.114175 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 albumin stage age protime #> 0.11862710 0.04108374 0.03530545 0.02378750 0.02226001 0.02160303 0.02054956 #> ascites ast chol edema trt alk.phos spiders #> 0.01639546 0.01302929 0.01137357 0.00849547 0.00805117 0.00660429 0.00492053 #> trig hepato platelet #> 0.00485534 0.00277577 0.00270581"},{"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: 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/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.2169365 0.01432475 0.09392366 0.8248506 #> 2: 1826.25 2 0.2522145 0.03084190 0.13395628 0.8447959 #> 3: 1826.25 3 0.2964879 0.05324065 0.19270846 0.8583131 #> 4: 1826.25 4 0.3519108 0.09798050 0.27469327 0.8704063 #> 5: 1826.25 5 0.3937398 0.14573200 0.29927004 0.8781099 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.2162646 0.01183390 0.09914356 0.8304537 #> 2: 1826.25 2 0.2523075 0.02447359 0.14112126 0.8484741 #> 3: 1826.25 3 0.2961994 0.04854875 0.19900751 0.8640601 #> 4: 1826.25 4 0.3533472 0.10111235 0.26784789 0.8642393 #> 5: 1826.25 5 0.3941090 0.14768055 0.32236393 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.2644124 0.01758300 0.2098936 0.8412690 #> 2: 1826.25 2 0.2990357 0.04063388 0.2514774 0.8549774 #> 3: 1826.25 3 0.3432235 0.06843859 0.3059299 0.8667282 #> 4: 1826.25 4 0.3967971 0.11801725 0.3595564 0.8723581 #> 5: 1826.25 5 0.4388230 0.16038177 0.4095296 0.8802471 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.3621269 0.047543778 0.2442488 0.9519270 #> 2: 1826.25 f 0.3021948 0.008894017 0.1527339 0.9531449"},{"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.3621269 0.047543778 0.2442488 0.9519270 #> 2: 1826.25 sex NA f 0.3021948 0.008894017 0.1527339 0.9531449 #> 3: 1826.25 bili 1 0.2472124 0.011899134 0.1307416 0.9002107 #> 4: 1826.25 bili 2 0.2980598 0.036796592 0.1872691 0.9201374 #> 5: 1826.25 bili 3 0.3534198 0.064844153 0.2594576 0.9317436 #> 6: 1826.25 bili 4 0.4002423 0.093495905 0.3212078 0.9422651 #> 7: 1826.25 bili 5 0.4358465 0.114171537 0.3644818 0.9445660 pd_smry <- orsf_summarize_uni(fit) pd_smry #> #> -- bili (VI Rank: 1) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2413366 0.1264835 0.04952446 0.3911641 #> 1.4 0.2636808 0.1498767 0.06480148 0.4142433 #> 3.5 0.3800514 0.2977525 0.17104541 0.5685303 #> #> -- copper (VI Rank: 2) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2696123 0.1373523 0.04875058 0.4697054 #> 74 0.2902176 0.1617484 0.05880460 0.4973208 #> 129 0.3458558 0.2265405 0.11704033 0.5799732 #> #> -- sex (VI Rank: 3) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3621269 0.2442488 0.12996259 0.5848015 #> f 0.3021948 0.1527339 0.04999531 0.5447268 #> #> -- age (VI Rank: 4) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 42 0.2759633 0.1326070 0.04566777 0.4645078 #> 50 0.3093313 0.1830533 0.05229240 0.5303232 #> 57 0.3445924 0.2423311 0.07570254 0.5763141 #> #> -- protime (VI Rank: 5) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 10 0.2865049 0.1425036 0.05144412 0.5113836 #> 11 0.3031622 0.1643701 0.05785659 0.5300208 #> 11 0.3279104 0.1907731 0.07466802 0.5749059 #> #> -- stage (VI Rank: 6) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 1 0.6276309 0.573638 0.4698768 0.7816817 #> 2 0.6276309 0.573638 0.4698768 0.7816817 #> 3 0.6276309 0.573638 0.4698768 0.7816817 #> 4 0.6276309 0.573638 0.4698768 0.7816817 #> #> -- albumin (VI Rank: 7) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 3.3 0.3245868 0.1992516 0.05587867 0.6029765 #> 3.5 0.3018658 0.1728900 0.05035617 0.5601409 #> 3.8 0.2869526 0.1549416 0.05105937 0.5044447 #> #> -- ascites (VI Rank: 8) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.3028017 0.1590364 0.05032645 0.5642973 #> 1 0.4796166 0.3998211 0.27745007 0.6582242 #> #> -- ast (VI Rank: 9) -------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 82 0.2895056 0.1507709 0.04801166 0.5190614 #> 117 0.3077159 0.1709646 0.05464761 0.5457827 #> 153 0.3295798 0.1870541 0.06726646 0.5976546 #> #> -- chol (VI Rank: 10) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 250 0.2933346 0.1533755 0.04529566 0.4902194 #> 310 0.3028094 0.1689194 0.05128427 0.5236692 #> 401 0.3257335 0.1958659 0.07451783 0.5546558 #> #> -- trt (VI Rank: 11) ------------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> d_penicill_main 0.3149810 0.1796199 0.05912379 0.5748093 #> placebo 0.3083441 0.1638691 0.05063983 0.5559098 #> #> -- edema (VI Rank: 12) ----------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2980994 0.1494682 0.04999531 0.5500652 #> 0.5 0.3640998 0.2531299 0.10516249 0.6108659 #> 1 0.4715927 0.3812587 0.27589029 0.6612100 #> #> -- hepato (VI Rank: 13) ---------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2941602 0.1636152 0.04740782 0.5234831 #> 1 0.3263838 0.1965858 0.06385857 0.5802145 #> #> -- trig (VI Rank: 14) ------------------------------------ #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 85 0.3029060 0.1606924 0.05306785 0.5293148 #> 108 0.3091471 0.1630904 0.05365611 0.5272644 #> 151 0.3234126 0.1881145 0.06109949 0.5445899 #> #> -- spiders (VI Rank: 15) --------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2996997 0.1557687 0.04905994 0.5531772 #> 1 0.3449860 0.2241601 0.09618222 0.5894420 #> #> -- alk.phos (VI Rank: 16) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 922 0.3110808 0.1720786 0.05216288 0.5848530 #> 1278 0.3113050 0.1741084 0.05255735 0.5740111 #> 2068 0.3146600 0.1721491 0.05546745 0.5806536 #> #> -- platelet (VI Rank: 17) -------------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 200 0.3165620 0.1712887 0.05820478 0.5751032 #> 257 0.3105712 0.1667868 0.05237467 0.5788644 #> 318 0.3059001 0.1734972 0.05328713 0.5525496 #> #> 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.11628571 0.80 0.2413366 0.1264835 0.04952446 0.3911641 #> 2: bili 0.11628571 1.4 0.2636808 0.1498767 0.06480148 0.4142433 #> 3: bili 0.11628571 3.5 0.3800514 0.2977525 0.17104541 0.5685303 #> 4: copper 0.04762655 43 0.2696123 0.1373523 0.04875058 0.4697054 #> 5: copper 0.04762655 74 0.2902176 0.1617484 0.05880460 0.4973208 #> 6: copper 0.04762655 129 0.3458558 0.2265405 0.11704033 0.5799732 #> 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.9249698 #> 2: 1 2 1826.25 1 0.1041671 #> 3: 1 3 1826.25 1 0.7439860 #> 4: 1 4 1826.25 1 0.3805933 #> 5: 1 5 1826.25 1 0.1188328 #> --- #> 6896: 25 272 1826.25 10 0.3407691 #> 6897: 25 273 1826.25 10 0.4858345 #> 6898: 25 274 1826.25 10 0.5247851 #> 6899: 25 275 1826.25 10 0.2836209 #> 6900: 25 276 1826.25 10 0.5501822 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 arXiv 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, 2022 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.1190578208 0.0619364315 0.0290605798 0.0260108174 0.0251162396 #> stage protime edema ascites hepato #> 0.0237810058 0.0158443269 0.0117270641 0.0105685230 0.0092028195 #> albumin chol trt alk.phos spiders #> 0.0082647861 0.0041510636 0.0036548364 0.0010239241 -0.0003298163 #> trig platelet #> -0.0011111508 -0.0045314656 orsf_vi_permute(fit) #> bili copper ast age sex #> 0.0514084384 0.0170611427 0.0142227933 0.0140274813 0.0131527430 #> stage protime ascites edema albumin #> 0.0119752045 0.0102865556 0.0098067817 0.0081730899 0.0080568255 #> hepato chol alk.phos trig spiders #> 0.0069734562 0.0032811220 0.0015862128 0.0014909643 0.0007811902 #> trt platelet #> -0.0007067631 -0.0022135241 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.2074286 0.09039332 0.03827337 0.3146957 #> 1.3 0.2261739 0.10784929 0.04915971 0.3425934 #> 3.2 0.3071951 0.21242141 0.11889617 0.4358309 #> #> -- sex (VI Rank: 2) ----------------------------- #> #> |----------------- risk -----------------| #> Value Mean Median 25th % 75th % #> m 0.3648659 0.2572239 0.15554270 0.5735661 #> f 0.2479179 0.1021787 0.04161796 0.3591612 #> #> 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 arXiv 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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129 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., (2022) arXiv:2208.01129.","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.12478145 0.80 0.2387097 0.1185211 0.04597625 0.3711118 #> 2: bili 0.12478145 1.4 0.2636596 0.1387588 0.06735307 0.4151819 #> 3: bili 0.12478145 3.5 0.3879317 0.3123973 0.17546359 0.5597512 #> 4: copper 0.04689443 43 0.2744652 0.1441594 0.04830920 0.4869403 #> 5: copper 0.04689443 74 0.2955633 0.1625094 0.06139512 0.5304120 #> 6: copper 0.04689443 129 0.3457171 0.2216481 0.11311177 0.5722855 #> 7: sex 0.03560065 m 0.3697353 0.2387903 0.12575565 0.6124547 #> 8: sex 0.03560065 f 0.3037857 0.1525007 0.05106312 0.5547252 #> 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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129","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: 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_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) ## riskRegression version 2023.03.22 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.153 ## ## 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.136928e-17 ## 3: 1788 pca rando 1.267 0.449 2.084 2.384937e-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: 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_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.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.1412476 ## 3: 1 3 1788 1 0.7047846 ## 4: 1 4 1788 1 0.3673939 ## 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.5409864"},{"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.2167954 0.01432475 0.0946650 0.8243506 ## 2: 1826.25 2 0.2520765 0.03084190 0.1333465 0.8442959 ## 3: 1826.25 3 0.2964487 0.05324065 0.1937964 0.8578131 ## 4: 1826.25 4 0.3518250 0.09798050 0.2751326 0.8699063 ## 5: 1826.25 5 0.3936739 0.14573200 0.2984227 0.8781099 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.2161745 0.01183390 0.1001640 0.8304537 ## 2: 1826.25 2 0.2521996 0.02447359 0.1419482 0.8484741 ## 3: 1826.25 3 0.2961802 0.04854875 0.1992512 0.8640601 ## 4: 1826.25 4 0.3532215 0.10111235 0.2666702 0.8642393 ## 5: 1826.25 5 0.3940203 0.14768055 0.3270825 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.2643571 0.01758300 0.2098936 0.8410357 ## 2: 1826.25 2 0.2990417 0.04063388 0.2516202 0.8547441 ## 3: 1826.25 3 0.3432271 0.06843859 0.3056799 0.8664949 ## 4: 1826.25 4 0.3967879 0.11801725 0.3593064 0.8721247 ## 5: 1826.25 5 0.4388518 0.16038177 0.4094224 0.8800138"},{"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.3047843 0.1637069 0.05226266 0.5469657 #> 1 0.4858833 0.4113245 0.27915530 0.6790398 #> #> -- edema (VI Rank: 2) -------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0 0.2998844 0.1518340 0.05226266 0.5359524 #> 0.5 0.3675580 0.2785013 0.10723648 0.6241415 #> 1 0.4671421 0.3753541 0.26564706 0.6707662 #> #> -- bili (VI Rank: 3) --------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 0.80 0.2419418 0.1270135 0.04978223 0.3738446 #> 1.4 0.2661741 0.1522038 0.06592000 0.4118022 #> 3.5 0.3818928 0.2935343 0.16919073 0.5622295 #> #> 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.2419418 0.1270135 0.04978223 0.3738446 #> 1.4 0.2661741 0.1522038 0.06592000 0.4118022 #> 3.5 0.3818928 0.2935343 0.16919073 0.5622295 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2722129 0.1414672 0.04735708 0.4672510 #> 74 0.2927321 0.1686414 0.05627768 0.4953317 #> 129 0.3474980 0.2267060 0.10990191 0.5757057 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3667014 0.2519309 0.12426351 0.5918595 #> f 0.3041314 0.1589559 0.05226266 0.5609994 #> #> 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.2753775 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.2575102 secs # error abs(time_true - time_estimated) #> Time difference of 0.01786733 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, 2022 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.117812588 0.046758641 0.038085253 0.026584826 0.023881400 0.022583421 ## albumin ascites chol ast edema hepato ## 0.020499282 0.015799793 0.013503968 0.011507068 0.007446917 0.007302135 ## trt spiders alk.phos trig platelet ## 0.006136687 0.005411473 0.003425486 0.003358903 0.001218844 orsf_vi_permute(fit_no_vi) ## bili copper age protime albumin ## 0.0557765573 0.0229935033 0.0142175615 0.0138958680 0.0138130775 ## ascites stage chol ast edema ## 0.0122566919 0.0122549383 0.0062487607 0.0060082953 0.0057947595 ## hepato spiders sex trig alk.phos ## 0.0052884525 0.0038391405 0.0031617255 0.0014482532 0.0009073479 ## platelet trt ## 0.0001091183 -0.0018037065"},{"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.0537366984 0.0232882267 0.0135861353 0.0127592970 0.0125356157 ## albumin stage ast edema hepato ## 0.0114480445 0.0108792612 0.0063934776 0.0062786593 0.0048395390 ## chol spiders sex trig platelet ## 0.0042838996 0.0030700999 0.0025439674 0.0022397137 0.0010979018 ## alk.phos trt ## 0.0010942194 -0.0006194685 orsf_vi_negate(fit_permute_vi) ## bili copper sex age protime stage ## 0.120813894 0.046517819 0.036351782 0.022681350 0.021826811 0.021032630 ## albumin ascites ast chol edema spiders ## 0.018906444 0.014062700 0.013029040 0.011226505 0.008009926 0.006151980 ## trt hepato trig alk.phos platelet ## 0.005108172 0.005105800 0.003378537 0.003155270 0.002240910"},{"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. arXiv e-prints 2022 Aug; arXiv-2208. URL: https://arxiv.org/abs/2208.01129","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.7901974 ascites,edema,bili #> 2: 4 0.8059013 ascites,edema,bili,albumin #> 3: 5 0.8122558 ascites,edema,bili,albumin,copper #> 4: 6 0.8055628 ascites,hepato,edema,bili,albumin,copper #> 5: 7 0.8166050 ascites,hepato,spiders,edema,bili,albumin,... #> 6: 8 0.8109277 ascites,hepato,spiders,edema,bili,chol,... #> 7: 9 0.8191833 age,ascites,hepato,spiders,edema,bili,... #> 8: 10 0.8374134 age,ascites,hepato,spiders,edema,bili,... #> 9: 11 0.8362675 age,sex,ascites,hepato,spiders,edema,... #> 10: 12 0.8349133 age,sex,ascites,hepato,spiders,edema,... #> 11: 13 0.8206938 age,sex,ascites,hepato,spiders,edema,... #> 12: 14 0.8416845 age,sex,ascites,hepato,spiders,edema,... #> 13: 15 0.8278556 id,age,sex,ascites,hepato,spiders,... #> 14: 16 0.8170998 id,age,sex,ascites,hepato,spiders,... #> 15: 17 0.8204334 id,trt,age,sex,ascites,hepato,... #> 16: 18 0.8354862 id,trt,age,sex,ascites,hepato,... #> predictor_dropped #> 1: bili #> 2: albumin #> 3: copper #> 4: hepato #> 5: spiders #> 6: chol #> 7: age #> 8: protime #> 9: sex #> 10: ast #> 11: trig #> 12: alk.phos #> 13: id #> 14: stage #> 15: trt #> 16: platelet"},{"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.49828550 0.77570208 0.91812971 ## [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.5017145 0.2242979 0.08187029 ## [2,] 0.9552453 0.9083846 0.82317722 ## [3,] 0.8714954 0.7239648 0.58544930 ## [4,] 0.9872091 0.9701960 0.93541849 ## [5,] 0.9872268 0.9775023 0.95124323 # 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.70791303 1.40367742 1.79658865 ## [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.19473 ## [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: 25 #> 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.2448896 0.1265555 0.04360762 0.3829553 #> 1.4 0.2681646 0.1519257 0.06265129 0.4266253 #> 3.5 0.3829742 0.2931962 0.16143458 0.5806385 #> #> -- copper (VI Rank: 2) ------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> 43 0.2721926 0.1410419 0.04413890 0.4732827 #> 74 0.2928929 0.1630429 0.05658785 0.5167348 #> 129 0.3431857 0.2317872 0.10269499 0.5673647 #> #> -- sex (VI Rank: 3) ---------------------------- #> #> |---------------- Risk ----------------| #> Value Mean Median 25th % 75th % #> m 0.3660044 0.2528903 0.12318686 0.5876368 #> f 0.3030760 0.1555301 0.04572718 0.5385975 #> #> 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. 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":""}]