Automated survival-analysis, binary-classification, continuous-outcome, and ordinal-outcome machine-learning combination models in R. Train and compare model variants on multi-cohort data with a single call, select models by outcome-appropriate out-of-fold metrics, and report integrated diagnostics.
Status: 1.0.0 release candidate. Survival, binary, continuous, and ordinal workflows are available with cohort-aware preparation, 18-variant default candidate pools, single-/two-model combination search, HTML reports, CSV audit tables, publication-style figures, and automated tests.
AutoMLR is a multi-outcome biomedical modeling framework. The survival workflow is designed to answer one question end-to-end:
Given multiple cohorts with survival outcomes, which single model (or combination) gives the most robust prognostic signature, and how confident am I?
| # | Family | Algorithm | Package |
|---|---|---|---|
| 1 | Penalised Cox | Lasso Cox | glmnet |
| 2 | Penalised Cox | Ridge Cox | glmnet |
| 3 | Penalised Cox | Elastic Net Cox | glmnet |
| 4 | Classic Cox | Stepwise Cox | survival |
| 5 | Boosted Cox | CoxBoost | CoxBoost |
| 6 | Dimension-reduced | plsRcox (partial least squares) | plsRcox |
| 7 | Dimension-reduced | SuperPC | superpc |
| 8 | Tree-boosted | GBM-Cox | gbm |
| 9 | Kernel | survival-SVM | survivalsvm |
| 10 | Tree-ensemble | Random Survival Forest (RSF) | randomForestSRC |
# install from a local source checkout
remotes::install_local("AutoMLR", dependencies = c("Depends", "Imports"))
# or load directly from a local checkout:
# pkgload::load_all("AutoMLR")AutoMLR keeps heavyweight model engines as optional suggested dependencies so the package can be installed even on machines where some modelling packages are hard to compile. Missing backends skip only the affected model variants while the remaining algorithms and reports continue to run.
deps <- check_automlr_dependencies()
deps
# Install only the optional engines you need.
install.packages(c("glmnet", "gbm", "randomForestSRC", "timeROC"))Progress messages are mirrored to a session log when logging is enabled:
initialize_auto_logging("automlr_logs")
# Run AutoMLR analysis here.
disable_auto_logging()Model-evaluation and ensemble-fitting messages such as Evaluating ... and
Fitting ... are then written to the log file as well as the console.
library(AutoMLR)
# Use the canonical CRAN survival::lung dataset.
data("cancer", package = "survival")
lung <- na.omit(lung)
lung$cohort <- rep(c("A", "B"), length.out = nrow(lung))
prep <- prepare_cohort_input(
data = lung,
cohort = "cohort",
time = "time",
status = "status"
)
report_cohort_intersection(prep)
params <- automlr_parameters()
list_surv_algorithms()
# `prep` can be passed directly; cohort labels are then used automatically for
# stability diagnostics in the combination table.
ens <- fit_surv_ensemble(
prep,
params = automlr_parameters(algorithms = "lasso_cox", verbose = FALSE),
min_models = 1,
max_models = 1
)
export_surv_results(
ens,
output_dir = "results/lung_example",
formats = c("pdf", "png")
)This verifies: data contract, cohort intersection, parameter defaults, and the
10-algorithm registry load. list_model_variants() shows the concrete
algorithm + hyperparameter candidates; count_surv_combinations() reports how
many combinations will be searched. Single-model fitting, all-subsets
combination ranking, and weighted ensemble fitting. By default, combinations
are searched across distinct base algorithm families rather than pairing two
thresholds from the same algorithm.
Combination tables keep C-index as the primary rank by default while reporting
queue / subsample stability, member failure rate, risk spread, and optional
time-dependent AUC diagnostics. When fit_surv_ensemble() receives the
automlr_input object returned by prepare_cohort_input(), the original cohort
labels are wired into stability_groups automatically.
The surv_svm candidate is evaluated with k-fold resampling by default because
the optional survivalsvm backend can fail on single-row predictions during
leave-one-out cross-validation. Users can restore the old behavior with
automlr_parameters(surv_svm_resampling = "loocv") or exclude the model via
the algorithms argument.
export_surv_results() writes a batch result bundle with an HTML report,
publication figures, diagnostic figures, CSV tables, fitted RDS objects, and
session metadata. It also exports per-sample risk scores plus time-dependent
AUC / ROC tables when timeROC is installed, and writes bilingual English /
Chinese Markdown summaries for data preparation, base-model screening, and
ensemble selection under summaries/. The current regular survival report has
four step-specific interpretation files: data_summary.md,
base_model_summary.md, ensemble_summary.md, and
explainability_summary.md. The last one explains feature importance,
SHAP-style approximations, nomogram, calibration, DCA, and model forest-plot
outputs. The default publication bundle is
deduplicated to a final figure set: an all-single-model cohort C-index heatmap,
an IRLS-style combination-by-cohort benchmark matrix with mean C-index side
bars, multi-cohort Kaplan-Meier panels when risk groups are estimable, and
multi-cohort timeROC panels when timeROC is available.
Publication heatmaps omit rows with no finite metric values, keep partial
missing cells as explicit NA tiles, and adapt color scales to the finite
metric range so small differences remain visible.
For a figure-rich walkthrough with standalone code blocks, see
inst/tutorials/AutoMLR_tutorial.md after installing or unpacking the package.
Prepared cohort objects can be converted to modeling matrices without using
internal ::: calls:
xy <- automlr_input_to_surv_xy(prep)
single <- evaluate_algorithm_loocv(
"lasso_cox",
X = xy$X,
y = xy$y,
params = automlr_parameters(algorithms = "lasso_cox", verbose = FALSE)
)The same convenience pattern is available for the other workflows:
automlr_input_to_binary_xy(), automlr_input_to_continuous_xy(), and
automlr_input_to_ordinal_xy().
For threshold-style ensemble selection, users may keep fixed cutoffs or ask AutoMLR to recommend a data-adaptive cutoff from the candidate metric distribution:
params_auto <- automlr_parameters(
algorithms = c("lasso_cox", "ridge_cox"),
auto_min_cindex = TRUE,
auto_quantile = 0.50,
verbose = FALSE
)
ens_auto <- fit_surv_ensemble(
prep,
params = params_auto,
strategy = "threshold"
)
ens_auto$selection_thresholdauto_quantile = 0.50 uses the median candidate C-index; larger values such
as 0.75 are more selective. Analogous controls are available as
auto_min_auc, auto_min_r2, and auto_min_qwk for binary, continuous, and
ordinal workflows.
The binary workflow mirrors the survival workflow but uses positive-class probabilities and ROC AUC:
data(iris)
iris2 <- iris[iris$Species != "setosa", ]
iris2$cohort <- rep(c("A", "B"), length.out = nrow(iris2))
iris2$sample_id <- paste0("iris_", seq_len(nrow(iris2)))
prep_bin <- prepare_binary_cohort_input(
iris2,
cohort = "cohort",
outcome = "Species",
id = "sample_id",
positive_class = "versicolor",
negative_class = "virginica"
)
params_bin <- binarymlr_parameters(
resampling = "loocv",
verbose = FALSE
)
count_binary_combinations(params_bin, min_size = 1, max_size = 2)
bin_fit <- fit_binary_ensemble(
prep_bin,
params = params_bin,
min_models = 1,
max_models = 2,
rank_by = "auc"
)
export_binary_results(
bin_fit,
output_dir = "results/iris_binary",
formats = c("png", "pdf"),
summary_language = "bilingual"
)The default binary pool contains 18 model variants across penalized logistic,
standard / stepwise logistic, GBM, random forest, PCA-logistic, and Gaussian
naive Bayes families. The default search includes single models and two-model
probability combinations while excluding same-algorithm variant pairs.
export_binary_results() writes ROC/PR curves, cohort AUC heatmaps,
combination benchmark matrices, calibration, DCA, confusion matrix, feature
importance, a model-performance forest plot, predicted probabilities,
threshold metrics, preprocessing audit tables, resampling manifests, and the
same four step-specific bilingual interpretation documents used by the
survival report. Multi-class outcomes are rejected by default to avoid
accidental "positive vs all other" analyses; set collapse_other = TRUE only
when that collapse is intentional. Exported prediction tables distinguish
apparent probabilities from out-of-fold probabilities, and the default report
uses the out-of-fold probabilities for model diagnostics.
The continuous workflow targets numeric outcomes and ranks models by out-of-fold RMSE by default:
d <- mtcars
d$sample_id <- rownames(mtcars)
d$cohort <- rep(c("A", "B"), length.out = nrow(d))
prep_cont <- prepare_continuous_cohort_input(
d,
cohort = "cohort",
outcome = "mpg",
id = "sample_id"
)
params_cont <- continuousmlr_parameters(
resampling = "kfold",
k_folds = 5,
verbose = FALSE
)
cont_fit <- fit_continuous_ensemble(
prep_cont,
params = params_cont,
min_models = 1,
max_models = 2,
rank_by = "rmse"
)
export_continuous_results(
cont_fit,
output_dir = "results/mtcars_continuous",
formats = c("png", "pdf")
)The default pool contains 18 regression variants. Exported outputs include single-model and combination rankings, predictions, cohort-level RMSE / MAE / R-squared diagnostics, observed-vs-predicted plots, residual distributions, feature importance, preprocessing audits, fitted objects, session metadata, and an HTML report.
The ordinal workflow targets ordered categorical outcomes and ranks models by out-of-fold quadratic weighted kappa:
data(iris)
iris$cohort <- rep(c("A", "B", "C"), length.out = nrow(iris))
iris$sample_id <- paste0("iris_", seq_len(nrow(iris)))
prep_ord <- prepare_ordinal_cohort_input(
iris,
cohort = "cohort",
outcome = "Species",
id = "sample_id",
ordered_levels = c("setosa", "versicolor", "virginica")
)
params_ord <- ordinalmlr_parameters(
resampling = "kfold",
k_folds = 5,
verbose = FALSE
)
ord_fit <- fit_ordinal_ensemble(
prep_ord,
params = params_ord,
min_models = 1,
max_models = 2,
rank_by = "qwk"
)
export_ordinal_results(
ord_fit,
output_dir = "results/iris_ordinal",
formats = c("png", "pdf")
)Ordinal exports include QWK rankings, predicted ordered classes, cohort
performance, confusion matrices, observed-score plots, feature importance,
preprocessing audits, fitted objects, session metadata, and an HTML report.
Users should supply ordered_levels whenever the natural order is not already
encoded in an ordered factor.
For exploratory upper-bound analysis, extreme_surv_screen() first fits all
candidate variants on the full dataset and evaluates them on the same samples
to rank apparent single- or two-model combinations. It then carries only the
top N combinations into a real stratified train/validation seed search.
extreme <- extreme_surv_screen(
prep,
top_n = 10,
seeds = 1:500,
train_fraction = 0.70,
min_models = 1,
max_models = 2,
rank_by = "apparent_cindex"
)
extreme$combination_summary
extreme$top_combinations
extreme$best
export_extreme_screen_results(
extreme,
output_dir = "results/lung_extreme_screen",
formats = c("png", "pdf"),
summary_language = "bilingual"
)The first stage is intentionally optimistic and is meant to estimate the
dataset's apparent ceiling, not external validation performance. The second
stage reports the best random seed, model combination, train C-index,
validation C-index, and cohort-level validation diagnostics when cohorts are
available. export_extreme_screen_results() writes complete audit tables plus
Morandi-toned PNG/PDF figures for apparent ranking, seed-search distributions,
seed-by-combination heatmaps, best-by-seed trajectories, apparent-vs-validation
gaps, and cohort-level top-row diagnostics. It also writes a bilingual English
/ Chinese summary_report.md by default, or a single-language report with
summary_language = "zh" or "en", summarizing the current best apparent model,
best validation seed,
train / validation C-index, top seed-search rows, combination-level stability,
and any failed seed-search fits.
AutoMLR 1.0.0 includes survival, binary, continuous, and ordinal workflows; cohort-aware input preparation; 18-variant default candidate pools; single- and two-model combination search; publication figures; HTML reports; fitted objects; CSV audit tables; bilingual summaries for survival and binary workflows; and automated tests covering the main exported interfaces.
Single long-format data frame:
- One row per sample.
- A
cohortcolumn (character / factor) identifying dataset membership. timecolumn (numeric, > 0).statuscolumn (0/1, where 1 = event).- All remaining columns treated as candidate features.
prepare_cohort_input() splits by cohort and returns the feature
intersection across cohorts, along with a diagnostic report.
MIT (see LICENSE).