From df038d658e66313dafb7f7d1ab08436e49ddc330 Mon Sep 17 00:00:00 2001 From: huaichao <42494083+Huaichao2018@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:19:59 +0800 Subject: [PATCH 1/2] add read me --- README.md | 347 +++++++++++++++++++++++++++++++++++++++++++ man/figures/logo.png | Bin 0 -> 30411 bytes 2 files changed, 347 insertions(+) create mode 100644 README.md create mode 100644 man/figures/logo.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..39ccebb --- /dev/null +++ b/README.md @@ -0,0 +1,347 @@ + +# icare icare logo + + +**I**ntelligent **C**linl**A**bomics **R**esearch **E**xpedition + +A modular R framework that takes clinical / omics data all the way from +raw table to publication-ready figures: statistics and missing-data +handling, feature selection, machine-learning benchmarking, unsupervised +subtyping (K-means, NMF, latent profile analysis), and prognostic / +survival modeling — each with an interactive Shiny deployment layer. + +[![License: GPL-3](https://img.shields.io/badge/License-GPL--3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +![R](https://img.shields.io/badge/R-%3E%3D3.5.0-276DC3?logo=r) +![Status](https://img.shields.io/badge/status-active--development-yellow) + +**Maintainer:** Huaichao Luo (luohc@uestc.edu.cn) — +[Google Scholar](https://scholar.google.com/citations?user=XNKOGaIAAAAJ) | +[ResearchGate](https://www.researchgate.net/profile/Huaichao-Luo) | +[Lab Twitter/X](https://x.com/Luo_lab) + +**Contributor:** Guangchuang Yu — [Lab website (yulab-smu.top)](https://yulab-smu.top) + +--- + +## Contents + +- [Overview](#overview) +- [Installation](#installation) +- [The four modules](#the-four-modules) +- [Essential Commands](#essential-commands) + - [Module 1 — Data cleaning (`Stat`)](#module-1--data-cleaning-stat) + - [Module 2 — Modeling (`Train_Model`)](#module-2--modeling-train_model) + - [Module 3 — Subtyping (`Subtyping`)](#module-3--subtyping-subtyping) + - [Module 4 — Survival / Prognosis (`PrognosiX`)](#module-4--survival--prognosis-prognosix) +- [Quick start](#quick-start) +- [Getting help](#getting-help) +- [Citation](#citation) +- [License](#license) + +--- + +## Overview + +icare organizes an analysis as a pipeline of **S4 objects**, one per stage, +each produced by converting the previous one with `ConvertObject()`: + +``` +raw data.frame + │ CreateStatObject() + ▼ + Stat object ──────────────► baseline table, group comparisons, DEG + │ ConvertObject(to = "Train_Model") ConvertObject(to = "Subtyping") Stat_to_PrognosiX() + ▼ ▼ ▼ +Train_Model object Subtyping object PrognosiX object +(classification / (K-means / NMF / LPA) (Cox / RSF / mlr3proba + regression, caret) survival learners) + │ │ │ + ▼ ▼ ▼ + ModelDeployment() New_Sub_Manager() New_Prog_Manager() + │ │ │ + ▼ ▼ ▼ +deploy_clinlab_app() launch_sub_deploy_app() launch_prog_deploy_app() +``` + +Every stage keeps a record of what was done to the data (imputation +values, scaling parameters, selected features, trained models) inside the +object itself, so the *exact same* transformation can be replayed on new +patients at prediction time. + +## Installation + +```r +# install.packages("remotes") +remotes::install_github("/icare") +``` + +icare depends on a large number of Bioconductor/CRAN packages (`caret`, +`mlr3` + `mlr3proba`/`mlr3tuning`, `survival`, `NMF`, `mclust`, `DALEX`, +`ComplexHeatmap`, `shiny`, …) — see `DESCRIPTION` for the full list. A +plain `remotes::install_github()` will pull in the required CRAN +dependencies; Bioconductor packages (e.g. `ComplexHeatmap`) may need to be +installed separately first with `BiocManager::install()`. + +## The four modules + +| # | Module | S4 object | What it does | +|---|--------|-----------|---------------| +| 1 | **Data cleaning** | `Stat` | Type detection, missing-value imputation, outlier handling, one-hot encoding, normalization, differential-feature testing, baseline ("Table 1") reports | +| 2 | **Modeling** | `Train_Model` | Feature selection (RFE/GA/SA/built-in importance), train/test split, multi-algorithm benchmarking via `caret`, ensembling, hyperparameter tuning, SHAP/DALEX explainability, clinical thresholds & NRI/IDI | +| 3 | **Subtyping** | `Subtyping` | Unsupervised clustering (K-means, NMF, latent profile analysis), cluster validation & cross-method agreement, marker-feature discovery, t-SNE/UMAP visualization | +| 4 | **Survival / Prognosis** | `PrognosiX` | Cox / random-survival-forest / other `mlr3proba` learners, univariate + LASSO feature selection, risk stratification & KM curves, nomograms, decision-curve analysis | + +Each module ships with a **QUICKSTART** vignette (minimal, sensible +defaults) and an **ADVANCED** vignette (every option, publication-style +figures) under `vignettes/` — start there for runnable, end-to-end +examples on real data. + +--- + +## Essential Commands + +The tables below are a fast reference for the functions you'll use most +often in each module, grouped the way you'd actually call them in a +script. They mirror the shape of a normal icare analysis — see the +[Quick start](#quick-start) section for a compact end-to-end example, and +the vignettes for fully worked ones. + +### Module 1 — Data cleaning (`Stat`) + +```r +# Build the container --------------------------------------------------- +stat_obj <- CreateStatObject(raw.data = mat, info.data = inf, + group_col = "group", na.action = "allow") + +# Clean it, one step per line ------------------------------------------- +stat_obj <- stat_diagnose_variable_type(stat_obj) # detect numeric vs. categorical +stat_obj <- stat_convert_variables(stat_obj) # apply those types +stat_obj <- stat_miss_processed(stat_obj, impute_method = "median_mode") # impute +stat_obj <- stat_detect_and_mark_outliers(stat_obj, method = "iqr") # flag outliers +stat_obj <- stat_handle_outliers(stat_obj, method = "impute") # fix them +stat_obj <- stat_onehot_encode(stat_obj) # encode categoricals +stat_obj <- stat_normalize_process(stat_obj, method = "auto") # normalize + +# Explore & compare groups ----------------------------------------------- +PlotGroupedDistribution(stat_obj, features = numeric_vars, group_col = "group") +PlotPCA(stat_obj, color_by = "group", ellipse = TRUE) +stat_obj <- stat_var_feature(stat_obj, p_threshold = 0.05) # differential features +deg_result <- ExtractLastTestSig(stat_obj) +stat_obj <- stat_gaze_analysis(stat_obj, save_word = TRUE) # baseline "Table 1" + +# Hand off to Module 2 / 3 ------------------------------------------------ +saveRDS(stat_obj, "stat_obj.rds") +``` + +| Command | Purpose | +|---|---| +| `CreateStatObject()` | Wrap a raw data matrix + metadata into a `Stat` object | +| `InspectObject()` | Print a structured summary of any icare S4 object | +| `stat_diagnose_variable_type()` / `stat_convert_variables()` | Detect and coerce numeric vs. categorical columns | +| `stat_miss_processed()` | Impute missing values (`"median_mode"`, `"mice"`, `"knn"`, …) | +| `stat_detect_and_mark_outliers()` / `stat_handle_outliers()` | Flag and remediate outliers (IQR, Z-score, …) | +| `stat_onehot_encode()` | One-hot encode categorical variables | +| `stat_normalize_process()` | Normalize numeric variables (`"auto"`, `"z_score"`, `"min_max"`, …) | +| `stat_var_feature()` / `batch_Wilcoxon()` / `ExtractLastTestSig()` | Univariate group-difference testing (differential features) | +| `stat_gaze_analysis()` | Publication-style baseline characteristics table | +| `PlotGroupedDistribution()`, `PlotPCA()` | Quick group-comparison and ordination plots | + +### Module 2 — Modeling (`Train_Model`) + +```r +# Convert & select features ----------------------------------------------- +model_obj <- ConvertObject(stat_obj, to = "Train_Model") +builtin <- FeatureSelectBuiltin(model_obj, models = c("rf", "glm"), top_n = 15) +model_obj <- ApplyFeatureSelection(model_obj, builtin$importance_table$Feature) + +# Split + scale (fit on train, apply to test — no leakage) ---------------- +idx <- caret::createDataPartition(model_obj@clean.df[[model_obj@group_col]], p = 0.7, list = FALSE) +model_obj@split.data <- list(training = model_obj@clean.df[idx, ], + testing = model_obj@clean.df[-idx, ]) +preProc <- caret::preProcess(model_obj@split.data$training, method = c("center", "scale")) +model_obj@split.scale.data <- list(training = predict(preProc, model_obj@split.data$training), + testing = predict(preProc, model_obj@split.data$testing)) +model_obj@filtered.set <- model_obj@split.scale.data + +# Train, compare, ensemble, tune ------------------------------------------- +model_obj <- ModelTrainAnalysis(model_obj, methods = c("glmnet", "rf", "gbm")) +model_obj <- SelectBestModel(model_obj, metric = "auc") +model_obj <- TrainEnsemble(model_obj, strategy = "stacking", top_n = 4) +model_obj <- FineTuneModel(model_obj, method = "rf", bounds = BuildTuningBounds(mtry = c(2, 15))) + +# Explain & apply clinically ----------------------------------------------- +explainer <- CreateExplainer(model_obj) +ExplainSHAPBeeswarm(explainer) +thresh <- CalculateThresholds(model_obj, target_ppv = 0.9) + +# Deploy --------------------------------------------------------------------- +deploy_manager <- ModelDeployment(model_obj, preproc = preProc, + class_labels = c("Negative", "Positive")) +deploy_clinlab_app(deploy_manager) +``` + +| Command | Purpose | +|---|---| +| `ConvertObject(x, to = "Train_Model")` | Turn a cleaned `Stat` object into a modeling object | +| `FeatureSelectBuiltin()` / `FeatureSelectionPipeline()` (`ga`/`rfe`/`sa`) / `run_feature_elimination()` | Feature selection: built-in importance, GA/RFE/SA, or performance-elbow elimination | +| `ApplyFeatureSelection()` | Commit to a final feature set | +| `PreprocessingBenchmark()` / `LogisticDiagnosticBenchmark()` | Compare imputation × normalization × algorithm combinations by CV performance | +| `ModelTrainAnalysis()` | Train and cross-validate multiple `caret` algorithms at once | +| `SelectBestModel()` | Pick the top-performing trained model | +| `TrainEnsemble()` | Combine models: `"stacking"`, `"average"`, `"weighted"`, `"voting"` | +| `FineTuneModel()` + `BuildTuningBounds()` / `InspectHyperParams()` | Bayesian hyperparameter search around a chosen algorithm | +| `CreateExplainer()` + `ExplainSHAP*()` / `ExplainVariableImportance()` / `ExplainPartialDependence()` | DALEX/SHAP-based model explainability | +| `CalculateThresholds()` / `ApplyThreshold()` / `ClinicalThreshold()` | PPV/NPV/Youden decision thresholds | +| `ClinicalCorrelation()` / `PlotSubgroupForest()` / `PlotConfounderForest()` | Clinical covariate correlation, subgroup and confounder-adjusted forest plots | +| `CalculateCategoryNRI()` / `PlotIDICurve()` / `NRI_IDI_Analysis()` | Reclassification analysis (NRI/IDI) between two models | +| `PlotMultiROC()`, `PlotConfusionMatrix()`, `PlotCalibration()`, `PlotFeatureImportance()` | Standard performance visualizations | +| `ModelDeployment()` + `deploy_clinlab_app()` | Wrap trained model(s) + preprocessing into a predict function and Shiny app | + +### Module 3 — Subtyping (`Subtyping`) + +```r +# Convert & normalize (min-max keeps values non-negative, required by NMF) -- +sub_obj <- ConvertObject(stat_obj, to = "Subtyping") +sub_obj <- Sub_normalize_process(sub_obj, normalize_method = "min_max", group_col = "group") +sub_obj@scale.data <- remove_constant_columns(sub_obj@scale.data) + +# Cluster: NMF (primary; produces a re-usable model) ------------------------- +sub_obj <- Sub_nmf_estimate(sub_obj, rank_range = 2:6, nrun = 5, method = "brunet") +sub_obj <- Sub_nmf_best_rank(sub_obj, nrun = 5, method = "brunet") +sub_obj <- Sub_nmf_assign_subtypes(sub_obj) + +# ... or K-means / LPA, and cross-compare ------------------------------------- +sub_obj <- Sub_kmeans_with_optimal_k(sub_obj, k.max = 8) +sub_obj <- Sub_lpa_with_optimal_k(sub_obj, max_clusters = 3) +compare_clusterings(sub_obj, methods = c("cluster_kmeans", "cluster_lpa", "cluster_nmf")) + +# Visualize, validate, find markers -------------------------------------------- +sub_obj <- Sub_tsne_analyse(sub_obj, use_scaled_data = TRUE) +PlotDimReduction(sub_obj, reduction = "tsne", color_by = "cluster_nmf") +eval_result <- Sub_evaluation_results(sub_obj) +multi_deg <- batch_Wilcoxon_MultiClass(mat = deg_df, group_col = "subtype") +PlotClusterHeatmap(sub_obj, deg_df = multi_deg, group_by = "cluster_nmf", top_n = 5) + +# Deploy ------------------------------------------------------------------------ +sub_manager <- New_Sub_Manager(sub_obj) +launch_sub_deploy_app(sub_manager) +``` + +| Command | Purpose | +|---|---| +| `ConvertObject(x, to = "Subtyping")` | Turn a cleaned `Stat` object into a subtyping object | +| `Sub_normalize_process()` / `Sub_extract_norm_params()` / `Sub_apply_norm_params()` | Fit normalization on training data and replay it on validation/new data | +| `SplitSubtypingObject()` | Stratified train/validation split for cluster validation | +| `Sub_kmeans_with_optimal_k()` | K-means with automatic k selection | +| `Sub_lpa_with_optimal_k()` | Latent profile analysis (Gaussian mixture) | +| `Sub_nmf_estimate()` → `Sub_nmf_best_rank()` → `Sub_nmf_assign_subtypes()` → `Sub_nmf_train_model()` | Non-negative matrix factorization pipeline, including a re-usable model | +| `Sub_predict_subtypes()` | Assign new/validation samples to existing subtypes | +| `Sub_tsne_analyse()` / `Sub_umap_analyse()` + `PlotDimReduction()` | Dimensionality reduction for visualization | +| `Sub_evaluation_results()` | Cluster-quality metrics (silhouette, etc.) | +| `compare_clusterings()` / `plot_clustering_comparison()` | Adjusted Rand Index agreement between methods | +| `batch_Wilcoxon_MultiClass()` + `PlotClusterHeatmap()` / `PlotGroupMeanHeatmap()` | Subtype-specific marker discovery and heatmaps | +| `PlotSilhouette()` / `PlotMultiAlluvial()` | Separation diagnostics and multi-method/outcome alluvial plots | +| `New_Sub_Manager()` + `launch_sub_deploy_app()` | Deploy the trained subtyping model as a Shiny app | + +### Module 4 — Survival / Prognosis (`PrognosiX`) + +```r +# Convert (moves time/status into info.data, keeps numeric features) -------- +stat <- CreateStatObject(raw.data = df, group_col = NULL, na.action = "allow") +prog <- Stat_to_PrognosiX(stat, time_col = "time", status_col = "status", min_events = 10) + +# Feature selection: univariate Cox + LASSO ----------------------------------- +feat_sel <- surv_feature_selection_multi(prog, methods = c("uni_cox", "lasso"), combine = "union") +prog@survival.var <- list(selected = feat_sel$selected) + +# Train/validation split (mlr3 tasks) ------------------------------------------ +task <- surv_extract_task(prog)$select(feat_sel$selected) +train_task <- task$clone()$filter(train_idx) +val_task <- task$clone()$filter(val_idx) + +# Benchmark algorithms, then train and tune the winner -------------------------- +bmr <- surv_run_algorithm_benchmark(train_task, learners_list = c("surv.coxph", "surv.ranger")) +learner <- surv_get_learner("surv.ranger", train_task) +learner$train(train_task) +tuned <- surv_train_and_tune(train_task, "surv.ranger") + +# Evaluate, stratify risk, and validate ----------------------------------------- +surv_evaluate_model(learner, val_task) +km <- surv_plot_risk_km(learner, train_task, cutoff_method = "median", risk_table = TRUE) +nom <- surv_generate_nomogram(prog, features = feat_sel$selected) # includes a PH check + +# Predict for new patients and deploy --------------------------------------------- +predict_prognosix(prog, new_patients) +predict_risk_groups(prog, new_patients, cutoff_method = "median") +prog_manager <- New_Prog_Manager(prog) +launch_prog_deploy_app(prog_manager) +``` + +| Command | Purpose | +|---|---| +| `Stat_to_PrognosiX()` | Convert a `Stat` object into a survival-modeling (`PrognosiX`) object | +| `surv_feature_selection_multi()` | Univariate Cox / LASSO feature selection (`combine = "union"`/`"intersect"`) | +| `surv_extract_task()` | Build an `mlr3proba::TaskSurv` from a `PrognosiX` object | +| `surv_get_learner()` / `surv_run_algorithm_benchmark()` | Instantiate or cross-validate `mlr3proba` survival learners (Cox, RSF, `surv.ranger`, …) | +| `surv_train_and_tune()` | Hyperparameter tuning of a survival learner | +| `surv_evaluate_model()` | C-index / Brier score / time-dependent AUC evaluation | +| `surv_plot_risk_km()` | Kaplan–Meier risk stratification (`"median"`, `"tertile"`, `"quartile"`, `"p_optimize"`, `"custom"`) | +| `surv_generate_nomogram()` | Cox-based nomogram, with an automatic proportional-hazards (`cox.zph`) check | +| `predict_prognosix()` / `predict_risk_groups()` | Score and risk-classify new patients | +| `run_prognosis_pipeline()` | End-to-end orchestration of the steps above in one call | +| `New_Prog_Manager()` + `launch_prog_deploy_app()` | Deploy the trained survival model as a Shiny app | + +> **Methodological note.** Several of the "essential commands" above only +> report an unbiased estimate of performance when you actually pass a +> held-out split (`val_task`, `split.data$testing`, …) rather than +> re-using the data a model was trained/tuned on — e.g. `surv_plot_risk_km()` +> and `surv_generate_nomogram()` will happily run on the training task, but +> the resulting p-values/HRs should then be treated as descriptive, not +> confirmatory. See each function's documentation for details. + +--- + +## Quick start + +The fastest way to see the whole pipeline end-to-end is the QUICKSTART +vignette for each module, in order: + +```r +library(icare) + +# Module 1: raw data -> cleaned Stat object -> stat_obj.rds +source(system.file("vignettes", "01_module1_data_cleaning_QUICKSTART.R", package = "icare")) + +# Module 2: stat_obj.rds -> trained/evaluated Train_Model -> model_obj.rds +source(system.file("vignettes", "02_module2_modeling_QUICKSTART.R", package = "icare")) + +# Module 3: stat_obj.rds -> NMF subtypes -> subtyping_obj.rds +source(system.file("vignettes", "03_module3_subtyping_QUICKSTART.R", package = "icare")) + +# Module 4: your own time/status data.frame -> survival model + KM/risk groups +source(system.file("vignettes", "04_module4_survival_QUICKSTART.R", package = "icare")) +``` + +Each QUICKSTART script points to its ADVANCED counterpart for the full +option set (multi-method feature selection, ensembling, tuning, +SHAP/DALEX explanations, clinical thresholds & NRI/IDI, cluster +cross-validation, survival benchmarking, decision-curve analysis, and +the Shiny deployment apps). + +## Getting help + +- Function-level help: `?FunctionName` inside R, or `InspectObject(x)` to + inspect any icare S4 object's current state. +- Bug reports and feature requests: please open a + [GitHub issue](../../issues) with a minimal reproducible example. + +## Citation + +``` +Luo H, Yu G, Long F, Lin H. icare: Intelligent ClinlAbomics Research +Expedition. R package version 1.0.0. +``` + +## License + +GPL-3 © Huaichao Luo, Guangchuang Yu, Fei Long, Hongyan Lin diff --git a/man/figures/logo.png b/man/figures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c64f5725639603d2c3145b4ad369edc276d7b6 GIT binary patch literal 30411 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 A;s5{u literal 0 HcmV?d00001 From 6450d233a4f03cc9898076aa56d7099d9fd5fe22 Mon Sep 17 00:00:00 2001 From: huaichao <42494083+Huaichao2018@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:33:41 +0800 Subject: [PATCH 2/2] add read me --- DESCRIPTION | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5975136..3e3b4ca 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: icare Type: Package Title: Intelligent ClinlAbomics Research Expedition Version: 1.0.0 -Author: Huaichao Luo,Guanchuang Yu,Fei Long,Hongyan Lin +Author: Huaichao Luo,Fei Long,Hongyan Lin,Jian Huang,Guanchuang Yu Maintainer: Huaichao Luo Description: A modular framework for clinical statistics, missing-data handling, feature selection, machine learning, unsupervised subtyping diff --git a/README.md b/README.md index 39ccebb..a98c08a 100644 --- a/README.md +++ b/README.md @@ -338,10 +338,10 @@ the Shiny deployment apps). ## Citation ``` -Luo H, Yu G, Long F, Lin H. icare: Intelligent ClinlAbomics Research +Luo H,Long F,Lin H,Jian H,Yu G. icare: Intelligent ClinlAbomics Research Expedition. R package version 1.0.0. ``` ## License -GPL-3 © Huaichao Luo, Guangchuang Yu, Fei Long, Hongyan Lin +GPL-3 © Huaichao Luo,Fei Long, Hongyan Lin,Jian Huang,Guangchuang Yu