kreview evaluation report

Findings are derived automatically from this run. Methods & interpretation →
Click a row for the per-evaluator deep-dive (models, CI, ROC, folds, subgroups).

Per-model detail

What runs, and in what order

Detail
__PIPELINE_METHODS__

One Nextflow DAG. Work scatters per feature family after extraction and gathers once in fuse; open any node for the processes behind it.

Definitions

The 5-tier ctDNA label. Each plasma sample is paired with the patient's tumor sequencing where available. True ctDNA+ — plasma variants confirmed against the tumor. Possible ctDNA+ — plasma evidence below the confirmation bar. Possible ctDNA− — no qualifying plasma evidence. Healthy Normal — donors. Undetermined — insufficient evidence, excluded from modeling. The binary target is True + Possible ctDNA+ vs the rest.

Qualified true negative (the MRD anchor) — a sample meeting all three: label is Possible ctDNA−, the patient's tumor was sequenced (has_paired_impact), and zero of that tumor's variants were found in plasma (n_impact_confirmed == 0). We knew exactly which mutations to hunt for, looked, and found none — a verified negative. Samples in the same tier without paired tumor sequencing are unlabeled, not negative: nobody looked, because nobody knew what to look for. Pooling the two inflates performance (the report shows both numbers).

Two anchors, two questions. Specificity against qualified true negatives answers the MRD question — can we tell shedding from non-shedding within cancer patients, who carry inflammation, treatment effects and comorbidity. Specificity against healthy donors answers the screening question, and is a much easier contrast. They are never blended.

Why the donor number is a one-sided bound. Its threshold is the maximum score among a few dozen donors. Resample those donors and the maximum can only fall, so sensitivity can only rise — a symmetric confidence interval for it is inconsistent by construction. The observed value is reported as a lower bound.

Out-of-fold (OOF). Every curve, subgroup metric and operating point comes from predictions made on samples the model did not train on. Holdout refits on all of train and scores a patient-disjoint 20% — no patient contributes to both sides.

Winner's curse. Picking the best of many evaluator×model cells inflates the winner by roughly 0.01–0.02 AUC. The report shows the pre-registered primary (declared in ANALYSIS_PLAN.md) beside the run's argmax for that reason.

What each tab computes

Cohort & labels

Every plasma sample is labeled on the 5-tier ctDNA taxonomy by pairing it with the patient's tumor sequencing (cBioPortal): True ctDNA+ (variant-confirmed), Possible ctDNA+/− (evidence-weighted), Healthy Normal (donors), and Undetermined (insufficient data — excluded from modeling). The binary target for every model is True + Possible ctDNA+ vs the rest.

The 80/20 train/test split is grouped by patient (StratifiedGroupKFold on PATIENT_ID): all of a patient's timepoints land on one side, so holdout metrics are on fully unseen patients. Healthy donors carry one sample each. The evaluator-AUC overview ranks each feature family by its best model's cross-validated AUC.

Scoreboard (single evaluators)

One row per evaluator — a fragmentomics feature family (fragment sizes, TFBS/WPS nucleosome protection, end motifs, ATAC accessibility, …). Per evaluator: features are selected by mRMR (top 10%, relevance − redundancy), then up to 7 models (LR/RF/XGB on CPU; TabPFN/TabICL ± fine-tuning on GPU) are trained with stratified cross-validation. Every metric comes from out-of-fold predictions — never refit-on-everything scores.

AUC (holdout) refits on all of train and scores the patient-disjoint 20%; Δ overfit = CV − holdout (≈0 means the CV numbers are honest). sens@100h = sensitivity at the threshold set by the highest-scoring healthy donor — the screening operating point. A “–” means that value's source artifact was absent (recorded in the scoreboard's missing_fields, never silently defaulted). Click any row for per-model detail, ROC/PR, calibration, decision curves and subgroups.

Multimodal

Stacking: each (evaluator, model) pair's out-of-fold probabilities become one column of the stacking matrix (26 evaluators × up to 6 models). A meta-learner (each row of the table is one) is then cross-validated on those columns — it learns to weigh the evaluators' opinions, including where they disagree. Raw rows are the same meta-learners trained directly on GrootCV-selected raw features from the fused super-matrix — the no-stacking baseline.

The leave-one-evaluator-out ablation removes one evaluator's columns at a time and retrains the best stacking model: the AUC drop is that family's unique contribution (a small drop means its signal is covered by the others, not that it is weak alone).

Run diagnostics

Parsed from the Nextflow execution trace: one row per pipeline process with task counts, failures and the maximum attempt number. Failures that equal the retry count were transient (wall-time/memory) and recovered by the resource ladder; the trace only exists after the workflow ends, so an in-pipeline render leaves this tab empty until kreview report is re-run on the published output.

Reading the numbers honestly

Operating points before the tumor-informed anchor, and holdout numbers before the patient-grouped split, are not comparable to later runs. Subgroup cells have an n ≥ 30 floor. Absent values render as “–”: the source artifact was missing, and the scoreboard's missing_fields column names which. The page carries aggregates only — no sample identifiers, by construction.

Pipeline run map

__PIPELINE_DIAGNOSTICS__

Each node carries this run's task counts. Nodes covering more than one Nextflow process report how many — open one for its processes, their failures and their slowest task.

Process outcomes

Longest tasks

__PIPELINE_MINIS__