TLS Model Report
One expression-only TLS model for Visium spots and bulk RNA-seq · validation on held-out, out-of-distribution and immunotherapy cohorts · aggregates only
Summary
One expression-only model reads tertiary lymphoid structures (TLS) from a Visium spot or from a bulk RNA-seq sample, one sample at a time. It was trained on spot annotations from spatial transcriptomics together with pathologist TLS calls on bulk tumours, selected by grouped cross-validation, and checked once on two locked out-of-distribution (OOD) cohorts. It was then frozen and scored in 2,689 patients treated with immune checkpoint inhibitors (ICI).
- Spots work. Held-out Visium patients: AUROC 0.930 [0.886, 0.960].
- Bulk ranks TLS across cancer types, weakly within one. Held-out bulk, pooled: AUROC 0.757 [0.679, 0.827]; within a cohort 0.45–0.70 with wide intervals. Every model family, published signatures included, stays near 0.55–0.65 here.
- OOD, scored once. Internal lung 0.855 [0.742, 0.950], CPTAC-PAAD 0.641 [0.543, 0.738].
- Immunotherapy. A higher score goes with longer survival and more responses, but the effect is small (pooled OS HR 0.92 per SD), and the model is not better than the 12-chemokine signature: added on top of it, it contributes nothing (likelihood-ratio tests near null). A positive interaction of the two scores appears in bladder cancer (IMvigor210) and ccRCC; it is uncorrected for multiplicity and is a hypothesis.
Background
A TLS is an ectopic lymphoid organ that forms inside chronically inflamed tissue, tumours included: a B-cell follicle (mature TLS carry a germinal centre and follicular dendritic cells), a T-cell zone and high endothelial venules. In 540 tumours treated with anti-PD-1 / PD-L1, mature TLS predicted objective response (43.1% vs 19.6%), PFS and OS independently of PD-L1 and CD8 density (Vanhersecke et al., Nat Cancer 2021, doi:10.1038/s43018-021-00232-6).
TLS are scored on H&E, multiplex immunofluorescence or spatial transcriptomics: accurate, but slow and costly. Bulk RNA-seq is routine, yet bulk TLS signatures are imprecise against pathologist calls. This project trains one model on both worlds so that the same model scores a spot or a bulk sample.
Data
Bulk cohorts and their roles. TLS+ counts are pathologist calls except TCGA-BRCA and part of TCGA-LUAD, where HookNet-TLS labels (CNN) were used for training only; every test and OOD metric uses pathologist labels.
| cohort | n | tls_pos | maturity_known | mature | pathologist | cnn | role |
|---|---|---|---|---|---|---|---|
| CPTAC-PAAD | 129 | 54.000 | 54 | 11.000 | 129 | 0 | OOD (locked) |
| CPTAC-ccRCC | 86 | 25.000 | 0 | 0.000 | 86 | 0 | train/test |
| Internal_lung | 47 | 17.000 | 0 | 0.000 | 47 | 0 | OOD (locked) |
| MGH_LUAD_DagogoJack | 12 | 9.000 | 9 | 1.000 | 12 | 0 | train/test |
| TCGA-BRCA | 420 | 203 | 89 | 9.000 | 153 | 267 | train/test |
| TCGA-KIRC/KIRP/KICH | 210 | 23.000 | 0 | 0.000 | 210 | 0 | train/test |
| TCGA-LUAD | 451 | 345 | 158 | 21.000 | 221 | 230 | train/test |
| TCGA-PAAD | 118 | 89.000 | 89 | 17.000 | 118 | 0 | train/test |
Visium: GSE175540 (ccRCC, 23 sections, FFPE and frozen; Meylan Immunity 2022) and USZ (8 FFPE kidney and lung sections; Zenodo 14620362, CC-BY-4.0). Splits are by patient: about 25% of Visium patients and 20% of bulk patients per cohort are held out. Non-public cohorts (Internal lung, MGH) stay outside the repository.
Label ceiling, TCGA-LUAD: two pathologists agree almost perfectly with each other (κ 0.96), while two runs of the public HookNet-TLS model (HookNet-TLS_a, HookNet-TLS_b) agree with pathologists only moderately (κ 0.20–0.51) and with each other poorly (κ 0.20). A model trained partly on these CNN labels cannot be expected to beat that agreement.
| source_a | source_b | n | agreement | kappa |
|---|---|---|---|---|
| HookNet-TLS_a#3 | HookNet-TLS_b#4 | 431 | 0.845 | 0.198 |
| HookNet-TLS_a#3 | pathologist_HE#1 | 165 | 0.770 | 0.388 |
| HookNet-TLS_a#3 | pathologist_HE#2 | 197 | 0.817 | 0.514 |
| HookNet-TLS_b#4 | pathologist_HE#1 | 159 | 0.755 | 0.195 |
| HookNet-TLS_b#4 | pathologist_HE#2 | 188 | 0.771 | 0.244 |
| pathologist_HE#1 | pathologist_HE#2 | 139 | 0.986 | 0.964 |
Methods
Model
- Units. A bulk sample, a Visium spot, an aggregate of k neighbouring spots (k = 1, 7, 19) and a whole-section pseudo-bulk; all share one gene panel (16,788 genes detected on every platform).
- Features. Within-sample ranks (chosen in stage A over log2(TPM+1); the bulk↔Visium platform offset did not help and was dropped), ssGSEA of 30 public signatures, their pairwise products and products of the top signature genes chosen inside each fold.
- Ladder. Signature baseline, elastic-net logistic regression, k-top-scoring pairs, LightGBM; feature selection by correlation or by mean |SHAP|, both inside folds.
- Selection. Grouped 5-fold CV over training patients; the score weighs mean within-cohort bulk AUROC (pooled AUROC rewards telling cancer types apart) and spot AUROC. Winner: LightGBM with SHAP selection.
- Calibration. Platt scaling on out-of-fold predictions, separately for bulk and spot units; spot probabilities corrected for the TLS-enriched sampling of training spots.
- Evaluation. Held-out patients; bootstrap 95% CI for every metric; OOD cohorts scored once, with nothing tuned afterwards; leave-one-cohort-out reported for robustness only.
Signature scores (baselines)
- Gene sets. Cabrita TLS signature (Cabrita et al., Nature 2020; 9 genes: CD1D, CETP, LAT, SKAP1, CCR6, RBP5, CD79B, EIF1AY, PTGDS). 12-chemokine (Coppola et al., Am J Pathol 2011; CXCL9, CXCL10, CXCL11, CXCL13, CCL2, CCL3, CCL4, CCL5, CCL8, CCL18, CCL19, CCL21). TLS imprint (Meylan et al., Immunity 2022; 29 genes as listed in Nat Commun 2025, PMC12059173; PTLP is not an HGNC symbol and is absent, so 28 genes are scored).
- Method. Single-sample GSEA (Barbie et al., Nature 2009), one sample at a time, no reference cohort. Genes of a sample are ranked by expression (average ranks for ties); with rank r and weight w = r0.25, the score is the weighted mean rank of the set's genes minus the mean rank of all other genes. This is the closed form of the ssGSEA running sum, unnormalised (no rescaling to the range of a cohort). Genes of a set missing from the matrix are skipped.
- Input. log2(TPM+1). ICI cohorts: all 20,062 genes shared by the 28 studies. Bulk ROC: all 20,062 genes of the bulk matrix. Visium spots: only the model's gene panel (5,049 genes), so spot-level signature scores are an approximation.
- Scale in outcome models. Each score, ours included (ours on the logit scale of P(TLS)), is z-scored within cohort before modelling, so effects read per 1 SD inside a study.
- The same ssGSEA implementation computes the 30 signature features inside our model.
Immunotherapy validation
- Cohorts. 28 published or internal ICI studies; regimens containing an ICI only (ICI with TKI, bevacizumab or chemotherapy kept; TKI / mTOR / EGFR-only arms dropped); duplicate samples removed.
- Scores. Our P(TLS) on the logit scale, and three published TLS signatures as baselines: Cabrita (Nature 2020), 12-chemokine (Coppola, AJP 2011) and the TLS imprint (Meylan, Immunity 2022; 29 genes), all ssGSEA on log2(TPM+1). Every score is z-scored within cohort, so HR and OR are per 1 SD.
- Endpoints. OS and PFS (Cox, stratified by cohort; lifelines); objective response from RECIST (CR/PR vs SD/PD; study-annotated R/NR only where RECIST is missing) and disease control (CR/PR/SD vs PD) by logistic regression with cohort fixed effects (statsmodels).
- Confounders in every model: ICI class, age, sex, stage, site, location. A missing category is its own level; missing age is median-imputed with a missing indicator; covariates without variation inside cohorts are dropped.
- Comparison. ΔC-index (OS, PFS) and ΔAUC (response, DCR) between models on the same patients, with a paired bootstrap: patients resampled within cohort, every model refitted, 20 replicates.
- TMB and PD-L1. TMB-high = ≥ 10 mut/Mb (studies reporting raw mutation counts excluded); PD-L1 = tumour-cell IHC category TC0 / TC1 / TC2+ as an ordinal covariate. Pooled always; a diagnosis alone only with ≥ 30 OS events.
- Added value over the 12-chemokine signature. Nested models with the same confounders on complete cases. a 12-chemokine + ours vs 12-chemokine; b 12-chemokine + ours + 12-chemokine × ours vs 12-chemokine, and vs a. On the TMB + PD-L1 subset (both as covariates, never in an interaction): c ours over TMB + PD-L1; d ours over TMB + PD-L1 + 12-chemokine; e with the 12-chemokine × ours term, vs the d base and vs d. The primary statistic is the likelihood-ratio test of each nested pair; Δ and HR / OR are descriptive.
Course of the work
- Plan. One model with a TLS head and a maturity head; OOD cohorts locked before any training.
- First run, three fixes. The elastic-net solver was slow and over-shrunk (replaced by SGD). The maturity head looked inverted on bulk because all mature positives fell into one or two folds (fixed by stratifying folds by data block and label). Bulk model selection moved to within-cohort AUROC.
- Stage A. Rank features beat log-expression; the platform offset did not help.
- Stage B. LightGBM with SHAP selection had the best selection score; signature baselines were close.
- Review. Calibration by unit type, lymph-node spots removed before aggregation, unknown labels made explicit; leave-one-cohort-out kept as a robustness table only.
- Maturity head removed. Bulk maturity showed no signal.
- OOD scored once and reported as is.
- Immunotherapy. Model frozen; 28 studies harmonised; baselines, Cox and logistic models, TMB + PD-L1 subset.
- Added value. Nested models with the 12-chemokine signature and its interaction with our score.
Model results
Cross-validation
| representation | offset | bulk AUROC, within cohort | spot AUROC | bulk AUROC, pooled | selection score |
|---|---|---|---|---|---|
| rank | False | 0.637 | 0.784 | 0.728 | 0.710 |
| log | False | 0.606 | 0.719 | 0.727 | 0.662 |
| rank | True | 0.588 | 0.736 | 0.739 | 0.662 |
| log | True | 0.633 | 0.664 | 0.677 | 0.649 |
| candidate | bulk AUROC, within cohort | spot AUROC | bulk AUROC, pooled | selection score |
|---|---|---|---|---|
| lgbm|shap | 0.610 | 0.853 | 0.772 | 0.731 |
| enet|corr | 0.637 | 0.784 | 0.728 | 0.710 |
| lgbm|corr | 0.585 | 0.834 | 0.767 | 0.709 |
| ktsp|corr | 0.632 | 0.785 | 0.783 | 0.709 |
| signature|- | 0.627 | 0.782 | 0.779 | 0.705 |
| ktsp|shap | 0.568 | 0.777 | 0.767 | 0.672 |
| prev_panel|- | 0.601 | 0.587 | 0.712 | 0.594 |
| enet|shap | 0.524 | 0.513 | 0.455 | 0.518 |
Held-out test and OOD
| evaluation | block | n | TLS+ | AUROC | AUPRC | Brier |
|---|---|---|---|---|---|---|
| test | bulk:CPTAC-ccRCC | 17 | 5 | 0.700 [0.433, 0.933] | 0.444 [0.200, 0.900] | 0.210 [0.110, 0.332] |
| test | bulk:MGH_LUAD_DagogoJack | 3 | 2 | 1.000 [1.000, 1.000] | 1.000 [1.000, 1.000] | 0.088 [0.070, 0.126] |
| test | bulk:TCGA-BRCA | 31 | 18 | 0.491 [0.242, 0.702] | 0.599 [0.415, 0.817] | 0.245 [0.195, 0.295] |
| test | bulk:TCGA-KIRC/KIRP/KICH | 42 | 5 | 0.584 [0.214, 0.976] | 0.385 [0.056, 0.859] | 0.114 [0.060, 0.173] |
| test | bulk:TCGA-LUAD | 45 | 32 | 0.466 [0.278, 0.669] | 0.693 [0.537, 0.879] | 0.220 [0.168, 0.276] |
| test | bulk:TCGA-PAAD | 24 | 18 | 0.454 [0.195, 0.719] | 0.796 [0.626, 0.943] | 0.209 [0.128, 0.293] |
| test | bulk:all | 162 | 80 | 0.757 [0.679, 0.827] | 0.705 [0.600, 0.808] | 0.192 [0.163, 0.225] |
| test | visium:spots | 25206 | 374 | 0.930 [0.886, 0.960] | 0.306 [0.143, 0.492] | 0.013 [0.006, 0.022] |
| test | visium:sections | 7 | 6 | 1.000 [1.000, 1.000] | 1.000 [1.000, 1.000] | 0.339 [0.164, 0.449] |
| test | visium:section_spearman | <NA> | <NA> | – | – | – |
| ood | bulk:CPTAC-PAAD | 129 | 54 | 0.641 [0.543, 0.738] | 0.610 [0.492, 0.726] | 0.248 [0.230, 0.266] |
| ood | bulk:Internal_lung | 47 | 17 | 0.855 [0.742, 0.950] | 0.797 [0.613, 0.929] | 0.211 [0.176, 0.248] |
| ood | bulk:all | 176 | 71 | 0.705 [0.630, 0.780] | 0.655 [0.547, 0.758] | 0.238 [0.221, 0.255] |
Bulk maturity (pooled held-out): AUROC 0.441 [0.254, 0.635] — no usable signal, which is why the maturity output was removed.
| left_out | n | n_pos | auroc |
|---|---|---|---|
| CPTAC-ccRCC | 86 | 25 | 0.534 |
| MGH_LUAD_DagogoJack | 12 | 9 | 0.926 |
| TCGA-BRCA | 153 | 89 | 0.579 |
| TCGA-KIRC/KIRP/KICH | 210 | 23 | 0.615 |
| TCGA-LUAD | 221 | 158 | 0.628 |
| TCGA-PAAD | 118 | 89 | 0.554 |
ROC by cohort (interactive)
Pathologist TLS labels on held-out patients and the two OOD cohorts; our final model against the three published signatures (ssGSEA on bulk; on spots the signatures use only the model's gene panel). Pick a cohort; hover a curve for its AUROC.
Our model leads on Visium spots, on the Internal lung OOD cohort and on bulk pooled across cohorts. Inside single held-out bulk cohorts (17–45 patients each) a published signature is often as good or better, e.g. the 12-chemokine signature in TCGA-PAAD and CPTAC-ccRCC; these cohorts are small and their intervals wide.
Immunotherapy cohorts
| diagnosis | n | cohorts | OS n / events | PFS n / events | response n / R | DCR n / DC | age % | sex % | stage % | site % | location % | TMB-high n | PD-L1 n |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| BLCA | 347 | 1 | 347 / 231 | 0 / 0 | 298 / 68 | 298 / 131 | 0 | 100 | 0 | 0 | 0 | 271 | 346 |
| COREAD | 190 | 2 | 0 / 0 | 188 / 39 | 183 / 111 | 183 / 165 | 0 | 100 | 0 | 0 | 0 | 0 | 0 |
| ESGA | 34 | 1 | 0 / 0 | 0 / 0 | 34 / 11 | 34 / 20 | 0 | 100 | 0 | 0 | 0 | 0 | 0 |
| NSCLC | 606 | 8 | 573 / 365 | 606 / 490 | 571 / 236 | 205 / 134 | 46 | 46 | 29 | 0 | 0 | 141 | 198 |
| SKCM | 348 | 10 | 249 / 124 | 174 / 113 | 330 / 138 | 298 / 168 | 49 | 59 | 34 | 59 | 62 | 0 | 0 |
| ccRCC | 1164 | 7 | 250 / 147 | 977 / 585 | 765 / 254 | 765 / 547 | 33 | 96 | 17 | 52 | 0 | 0 | 36 |
| diagnosis | cohort | n | regimen | os | pfs | response | dcr | response_from |
|---|---|---|---|---|---|---|---|---|
| BLCA | PUB_BLCA_Mariathasan_EGAS00001002556 | 347 | anti-PD(L)1 | 347 | 0 | 298 | 298 | RECIST |
| COREAD | ImmunoMSI | 108 | anti-CTLA4+anti-PD(L)1, anti-PD(L)1 | 0 | 106 | 105 | 105 | RECIST |
| COREAD | Nipicol | 82 | anti-CTLA4+anti-PD(L)1 | 0 | 82 | 78 | 78 | RECIST |
| ESGA | Kim_PRJEB25780 | 34 | anti-PD(L)1 | 0 | 0 | 34 | 34 | RECIST |
| NSCLC | INOVA_antiPD(L)1 | 20 | anti-PD(L)1 | 16 | 20 | 13 | 13 | RECIST |
| NSCLC | INOVA_antiPD(L)1+Chemo | 18 | anti-PD(L)1+chemo | 18 | 18 | 9 | 9 | RECIST |
| NSCLC | Jung_antiPD(L)1 | 27 | anti-PD(L)1 | 0 | 27 | 27 | 0 | annotated R/NR |
| NSCLC | Lee_antiPD(L)1 | 328 | anti-PD(L)1 | 328 | 328 | 328 | 0 | annotated R/NR |
| NSCLC | Luke_antiPD(L)1 | 34 | anti-PD(L)1 | 34 | 34 | 28 | 28 | RECIST |
| NSCLC | Luke_antiPD(L)1+Chemo | 43 | anti-PD(L)1+chemo | 43 | 43 | 36 | 36 | RECIST |
| NSCLC | Mark_antiPD(L)1 | 70 | anti-PD(L)1 | 68 | 70 | 64 | 64 | RECIST |
| NSCLC | PUB_NSCLC_Banchereau_EGAS00001004343 | 66 | anti-PD(L)1 | 66 | 66 | 66 | 55 | RECIST, annotated R/NR |
| SKCM | Auslander_antiPD1 | 5 | anti-CTLA4, anti-CTLA4+anti-PD(L)1 | 0 | 0 | 5 | 0 | annotated R/NR |
| SKCM | Freeman_antiCTLA4+antiPD1 | 26 | anti-CTLA4, anti-CTLA4+anti-PD(L)1, anti-PD(L)1 | 0 | 0 | 26 | 0 | annotated R/NR |
| SKCM | Gide_antiCTLA4+antiPD1 | 73 | anti-CTLA4+anti-PD(L)1, anti-PD(L)1 | 73 | 73 | 73 | 73 | RECIST |
| SKCM | Hugo_antiPD1 | 19 | anti-PD(L)1 | 19 | 0 | 19 | 19 | RECIST |
| SKCM | Khan_antiPD1 | 14 | anti-PD(L)1 | 14 | 0 | 0 | 0 | – |
| SKCM | Liang_antiCTLA4 | 17 | anti-CTLA4, anti-PD(L)1 | 17 | 0 | 17 | 17 | RECIST |
| SKCM | Liu_antiPD1 | 67 | anti-PD(L)1 | 67 | 67 | 65 | 65 | RECIST |
| SKCM | Riaz_antiPD1 | 25 | anti-PD(L)1 | 25 | 0 | 23 | 23 | RECIST |
| SKCM | Ribaz_antiCTLA4 | 68 | anti-CTLA4, anti-CTLA4+anti-PD(L)1, anti-PD(L)1, sequential anti-CTLA4/anti-PD(L)1 | 0 | 0 | 68 | 68 | RECIST |
| SKCM | VanAllen_antiCTLA4 | 34 | anti-CTLA4 | 34 | 34 | 34 | 33 | RECIST, annotated R/NR |
| ccRCC | CheckMates | 181 | anti-PD(L)1 | 181 | 181 | 172 | 172 | RECIST |
| ccRCC | JAVELIN | 354 | anti-PD(L)1+antiangiogenic | 0 | 354 | 0 | 0 | – |
| ccRCC | PUB_RCC_VanAllen_phs001493_Batch1 | 16 | anti-PD(L)1 | 16 | 16 | 16 | 16 | RECIST |
| ccRCC | PUB_RCC_VanAllen_phs001493_Batch2 | 16 | anti-CTLA4+anti-PD(L)1, anti-PD(L)1 | 16 | 16 | 16 | 16 | RECIST |
| ccRCC | PUB_ccRCC_Immotion150 | 173 | anti-PD(L)1, anti-PD(L)1+antiangiogenic | 0 | 0 | 164 | 164 | RECIST |
| ccRCC | PUB_ccRCC_Immotion151 | 387 | anti-PD(L)1+antiangiogenic | 0 | 387 | 362 | 362 | RECIST |
| ccRCC | RNDonly_WU_ccRCC_RCCTC | 37 | anti-CTLA4+anti-PD(L)1 | 37 | 23 | 35 | 35 | RECIST |
| diagnosis | Cabrita (TLS_SKCM) | 12-chemokine (TLS_Chem) | TLS imprint (Meylan 2022) |
|---|---|---|---|
| BLCA | 0.620 | 0.620 | 0.830 |
| COREAD | 0.540 | 0.210 | 0.640 |
| ESGA | 0.490 | 0.240 | 0.720 |
| NSCLC | 0.640 | 0.520 | 0.690 |
| SKCM | 0.550 | 0.570 | 0.750 |
| ccRCC | 0.350 | 0.540 | 0.750 |
UMAP of ICI-treated samples (interactive)
Shown: 1,679 of 2,689 ICI-treated samples: studies whose data-use terms do not allow sharing per-patient values are left out here (they are in every aggregate table above). Embedding computed on all samples: log2(TPM+1) of the 2,000 most variable genes, standardised, 50 principal components, UMAP. Samples group mainly by study; colour by cohort shows the batch structure that within-cohort z-scoring and cohort strata remove from the outcome models.
Association with outcome
HR (OS, PFS) or OR (response, DCR) per 1 SD, adjusted; bold when the 95% CI excludes 1. HR < 1 means longer survival, OR > 1 more responses.
| endpoint | diagnosis | TLS model (ours) | 12-chemokine (TLS_Chem) | Cabrita (TLS_SKCM) | TLS imprint (Meylan 2022) |
|---|---|---|---|---|---|
| OS | BLCA | 0.90 [0.79, 1.03] | 0.88 [0.78, 1.00] | 0.99 [0.86, 1.15] | 0.95 [0.83, 1.08] |
| OS | COREAD | – | – | – | – |
| OS | ESGA | – | – | – | – |
| OS | NSCLC | 0.92 [0.83, 1.02] | 0.82 [0.74, 0.91] | 0.90 [0.81, 1.00] | 0.88 [0.79, 0.98] |
| OS | SKCM | 0.73 [0.59, 0.90] | 0.67 [0.55, 0.81] | 0.72 [0.58, 0.89] | 0.69 [0.58, 0.83] |
| OS | ccRCC | 1.07 [0.92, 1.24] | 1.06 [0.91, 1.24] | 0.87 [0.72, 1.05] | 1.08 [0.91, 1.27] |
| OS | All | 0.92 [0.86, 0.99] | 0.86 [0.80, 0.91] | 0.90 [0.84, 0.97] | 0.91 [0.85, 0.97] |
| PFS | BLCA | – | – | – | – |
| PFS | COREAD | 0.82 [0.60, 1.12] | 0.87 [0.63, 1.18] | 0.98 [0.72, 1.35] | 1.01 [0.74, 1.38] |
| PFS | ESGA | – | – | – | – |
| PFS | NSCLC | 0.93 [0.85, 1.02] | 0.81 [0.75, 0.89] | 0.88 [0.80, 0.97] | 0.89 [0.81, 0.98] |
| PFS | SKCM | 0.93 [0.77, 1.14] | 0.75 [0.61, 0.91] | 0.73 [0.59, 0.92] | 0.77 [0.64, 0.92] |
| PFS | ccRCC | 0.93 [0.86, 1.01] | 0.93 [0.86, 1.01] | 0.92 [0.83, 1.01] | 0.94 [0.87, 1.01] |
| PFS | All | 0.94 [0.89, 0.99] | 0.87 [0.82, 0.92] | 0.90 [0.85, 0.96] | 0.91 [0.86, 0.96] |
| Response | BLCA | 1.06 [0.82, 1.39] | 1.26 [0.96, 1.66] | 0.82 [0.59, 1.12] | 0.93 [0.71, 1.21] |
| Response | COREAD | 1.05 [0.76, 1.46] | 1.24 [0.89, 1.71] | 1.33 [0.94, 1.88] | 0.94 [0.67, 1.30] |
| Response | ESGA | 1.43 [0.65, 3.16] | 6.00 [1.57, 23.01] | 0.89 [0.43, 1.83] | 1.39 [0.61, 3.15] |
| Response | NSCLC | 1.06 [0.89, 1.26] | 1.41 [1.17, 1.69] | 1.13 [0.95, 1.35] | 1.09 [0.91, 1.30] |
| Response | SKCM | 1.04 [0.82, 1.32] | 1.29 [1.01, 1.64] | 1.13 [0.88, 1.45] | 1.25 [0.98, 1.60] |
| Response | ccRCC | 1.30 [1.11, 1.53] | 1.29 [1.10, 1.51] | 1.18 [0.98, 1.42] | 1.28 [1.08, 1.52] |
| Response | All | 1.15 [1.05, 1.26] | 1.33 [1.21, 1.46] | 1.11 [1.01, 1.23] | 1.15 [1.04, 1.26] |
| DCR | BLCA | 1.30 [1.04, 1.64] | 1.37 [1.08, 1.72] | 1.20 [0.94, 1.53] | 1.16 [0.92, 1.47] |
| DCR | COREAD | 1.24 [0.75, 2.04] | 0.98 [0.60, 1.61] | 1.33 [0.78, 2.26] | 1.08 [0.66, 1.76] |
| DCR | ESGA | 1.96 [0.86, 4.44] | 2.14 [0.97, 4.70] | 1.18 [0.59, 2.35] | 1.99 [0.87, 4.54] |
| DCR | NSCLC | 0.95 [0.70, 1.30] | 1.06 [0.77, 1.46] | 1.20 [0.85, 1.67] | 1.17 [0.86, 1.60] |
| DCR | SKCM | 1.01 [0.78, 1.30] | 1.26 [0.98, 1.62] | 1.19 [0.91, 1.55] | 1.13 [0.88, 1.45] |
| DCR | ccRCC | 0.97 [0.82, 1.15] | 1.11 [0.94, 1.30] | 1.15 [0.95, 1.38] | 1.02 [0.87, 1.21] |
| DCR | All | 1.08 [0.97, 1.20] | 1.19 [1.07, 1.32] | 1.17 [1.04, 1.31] | 1.10 [0.99, 1.22] |
Discrimination: ours vs each signature
ΔC-index or ΔAUC of the model with our score minus the model with the signature, same patients; bold when the bootstrap CI excludes 0.
| endpoint | diagnosis | 12-chemokine (TLS_Chem) | Cabrita (TLS_SKCM) | TLS imprint (Meylan 2022) | covariates only |
|---|---|---|---|---|---|
| OS | BLCA | +0.001 [-0.022, +0.029] | +0.019 [+0.004, +0.069] | +0.012 [-0.001, +0.036] | +0.030 [+0.011, +0.057] |
| OS | NSCLC | -0.045 [-0.076, -0.004] | -0.017 [-0.058, +0.024] | -0.016 [-0.048, +0.012] | +0.013 [-0.011, +0.043] |
| OS | SKCM | -0.025 [-0.052, +0.014] | +0.008 [-0.014, +0.041] | -0.013 [-0.032, +0.023] | +0.052 [-0.004, +0.090] |
| OS | ccRCC | -0.002 [-0.030, +0.018] | +0.016 [-0.031, +0.052] | -0.008 [-0.033, +0.024] | +0.003 [-0.016, +0.036] |
| OS | All | -0.020 [-0.039, +0.001] | +0.002 [-0.012, +0.021] | +0.002 [-0.008, +0.022] | +0.022 [+0.002, +0.043] |
| PFS | COREAD | +0.007 [-0.043, +0.041] | +0.032 [-0.067, +0.051] | +0.008 [-0.063, +0.057] | +0.013 [-0.005, +0.057] |
| PFS | NSCLC | -0.047 [-0.086, -0.019] | -0.023 [-0.051, +0.001] | -0.007 [-0.056, +0.013] | +0.019 [-0.010, +0.046] |
| PFS | SKCM | -0.042 [-0.070, +0.000] | -0.027 [-0.049, +0.003] | -0.035 [-0.054, -0.003] | -0.001 [-0.007, +0.024] |
| PFS | ccRCC | -0.009 [-0.020, +0.004] | -0.012 [-0.029, +0.004] | -0.005 [-0.015, +0.004] | +0.005 [-0.014, +0.018] |
| PFS | All | -0.021 [-0.032, -0.006] | -0.015 [-0.034, -0.005] | -0.006 [-0.014, +0.005] | -0.000 [-0.018, +0.017] |
| Response | BLCA | -0.013 [-0.070, +0.011] | +0.032 [-0.078, +0.102] | +0.047 [-0.024, +0.113] | +0.041 [-0.005, +0.081] |
| Response | COREAD | -0.008 [-0.058, +0.015] | -0.025 [-0.050, +0.005] | +0.003 [-0.021, +0.015] | +0.001 [-0.006, +0.028] |
| Response | ESGA | -0.217 [-0.270, -0.102] | +0.126 [-0.107, +0.148] | +0.024 [-0.052, +0.126] | +0.071 [+0.010, +0.198] |
| Response | NSCLC | -0.034 [-0.063, -0.016] | -0.015 [-0.037, +0.017] | -0.004 [-0.023, +0.006] | +0.004 [-0.008, +0.027] |
| Response | SKCM | -0.009 [-0.029, +0.013] | -0.001 [-0.013, +0.013] | -0.007 [-0.014, +0.008] | -0.003 [-0.002, +0.012] |
| Response | ccRCC | -0.001 [-0.010, +0.020] | +0.019 [+0.002, +0.031] | +0.006 [-0.020, +0.014] | +0.018 [+0.005, +0.041] |
| Response | All | -0.014 [-0.022, -0.006] | +0.003 [-0.002, +0.005] | +0.001 [-0.002, +0.004] | +0.006 [+0.001, +0.013] |
| DCR | BLCA | -0.004 [-0.049, +0.047] | +0.024 [-0.016, +0.061] | +0.023 [-0.006, +0.044] | +0.074 [+0.020, +0.130] |
| DCR | COREAD | +0.016 [-0.035, +0.080] | -0.006 [-0.034, +0.036] | +0.001 [-0.030, +0.042] | +0.011 [-0.005, +0.066] |
| DCR | ESGA | -0.068 [-0.218, +0.121] | +0.061 [-0.082, +0.220] | +0.021 [-0.172, +0.125] | +0.107 [+0.032, +0.269] |
| DCR | NSCLC | +0.005 [-0.030, +0.028] | +0.002 [-0.025, +0.023] | -0.004 [-0.029, +0.031] | +0.006 [-0.005, +0.037] |
| DCR | SKCM | -0.006 [-0.038, +0.017] | -0.003 [-0.017, +0.009] | +0.001 [-0.017, +0.010] | -0.000 [-0.007, +0.019] |
| DCR | ccRCC | -0.006 [-0.010, +0.010] | -0.001 [-0.015, +0.016] | -0.001 [-0.007, +0.008] | +0.000 [-0.001, +0.014] |
| DCR | All | -0.006 [-0.008, +0.000] | -0.003 [-0.005, +0.001] | -0.001 [-0.003, +0.002] | +0.001 [+0.000, +0.004] |
Each score vs the confounders-only model:
| endpoint | diagnosis | 12-chemokine (TLS_Chem) | Cabrita (TLS_SKCM) | TLS imprint (Meylan 2022) | TLS model (ours) |
|---|---|---|---|---|---|
| OS | BLCA | +0.029 [+0.007, +0.047] | +0.011 [-0.021, +0.034] | +0.018 [-0.006, +0.046] | +0.030 [+0.011, +0.057] |
| OS | NSCLC | +0.057 [+0.001, +0.077] | +0.030 [+0.001, +0.061] | +0.029 [+0.003, +0.062] | +0.013 [-0.011, +0.043] |
| OS | SKCM | +0.077 [+0.022, +0.110] | +0.043 [-0.002, +0.069] | +0.065 [+0.004, +0.087] | +0.052 [-0.004, +0.090] |
| OS | ccRCC | +0.004 [-0.006, +0.044] | -0.013 [-0.023, +0.027] | +0.011 [-0.016, +0.051] | +0.003 [-0.016, +0.036] |
| OS | All | +0.042 [+0.015, +0.059] | +0.020 [-0.008, +0.038] | +0.019 [+0.000, +0.039] | +0.022 [+0.002, +0.043] |
| PFS | COREAD | +0.007 [-0.011, +0.068] | -0.019 [-0.028, +0.076] | +0.005 [-0.015, +0.072] | +0.013 [-0.005, +0.057] |
| PFS | NSCLC | +0.066 [+0.031, +0.102] | +0.043 [+0.014, +0.064] | +0.027 [-0.002, +0.067] | +0.019 [-0.010, +0.046] |
| PFS | SKCM | +0.041 [-0.001, +0.078] | +0.025 [-0.003, +0.064] | +0.033 [+0.000, +0.065] | -0.001 [-0.007, +0.024] |
| PFS | ccRCC | +0.014 [-0.008, +0.031] | +0.016 [-0.009, +0.036] | +0.009 [-0.009, +0.029] | +0.005 [-0.014, +0.018] |
| PFS | All | +0.021 [+0.005, +0.043] | +0.015 [+0.002, +0.036] | +0.005 [-0.015, +0.029] | -0.000 [-0.018, +0.017] |
| Response | BLCA | +0.054 [+0.012, +0.110] | +0.009 [-0.027, +0.087] | -0.006 [-0.040, +0.040] | +0.041 [-0.005, +0.081] |
| Response | COREAD | +0.009 [-0.007, +0.058] | +0.026 [-0.000, +0.074] | -0.002 [-0.003, +0.039] | +0.001 [-0.006, +0.028] |
| Response | ESGA | +0.289 [+0.211, +0.362] | -0.055 [-0.045, +0.178] | +0.047 [+0.002, +0.184] | +0.071 [+0.010, +0.198] |
| Response | NSCLC | +0.038 [+0.028, +0.077] | +0.019 [-0.013, +0.047] | +0.008 [-0.004, +0.041] | +0.004 [-0.008, +0.027] |
| Response | SKCM | +0.006 [-0.004, +0.030] | -0.002 [-0.004, +0.014] | +0.004 [-0.003, +0.016] | -0.003 [-0.002, +0.012] |
| Response | ccRCC | +0.019 [+0.003, +0.030] | -0.001 [-0.006, +0.020] | +0.012 [+0.003, +0.049] | +0.018 [+0.005, +0.041] |
| Response | All | +0.020 [+0.009, +0.030] | +0.003 [+0.000, +0.011] | +0.005 [+0.000, +0.013] | +0.006 [+0.001, +0.013] |
| DCR | BLCA | +0.078 [+0.024, +0.102] | +0.050 [-0.001, +0.099] | +0.051 [+0.007, +0.094] | +0.074 [+0.020, +0.130] |
| DCR | COREAD | -0.005 [-0.017, +0.039] | +0.017 [-0.004, +0.050] | +0.010 [-0.016, +0.039] | +0.011 [-0.005, +0.066] |
| DCR | ESGA | +0.175 [+0.068, +0.328] | +0.046 [-0.026, +0.237] | +0.086 [-0.015, +0.234] | +0.107 [+0.032, +0.269] |
| DCR | NSCLC | +0.001 [-0.007, +0.035] | +0.005 [-0.004, +0.031] | +0.011 [-0.002, +0.043] | +0.006 [-0.005, +0.037] |
| DCR | SKCM | +0.005 [-0.005, +0.035] | +0.003 [-0.006, +0.016] | -0.002 [-0.001, +0.019] | -0.000 [-0.007, +0.019] |
| DCR | ccRCC | +0.006 [-0.004, +0.013] | +0.001 [-0.005, +0.016] | +0.001 [-0.004, +0.012] | +0.000 [-0.001, +0.014] |
| DCR | All | +0.007 [+0.002, +0.010] | +0.004 [-0.000, +0.008] | +0.002 [+0.000, +0.006] | +0.001 [+0.000, +0.004] |
TMB-high + PD-L1 subset
Patients with both a TMB call and PD-L1 IHC (271 BLCA, 106 NSCLC). Base model = confounders + TMB-high + PD-L1.
| endpoint | diagnosis | TLS model (ours) | 12-chemokine (TLS_Chem) | Cabrita (TLS_SKCM) | TLS imprint (Meylan 2022) |
|---|---|---|---|---|---|
| OS | BLCA | 0.83 [0.71, 0.96] | 0.81 [0.69, 0.94] | 0.83 [0.70, 0.99] | 0.89 [0.78, 1.03] |
| OS | NSCLC | 0.91 [0.63, 1.32] | 0.89 [0.57, 1.41] | 0.98 [0.68, 1.42] | 0.88 [0.63, 1.25] |
| OS | All | 0.84 [0.73, 0.97] | 0.82 [0.71, 0.95] | 0.88 [0.76, 1.03] | 0.90 [0.80, 1.03] |
| PFS | BLCA | – | – | – | – |
| PFS | NSCLC | 0.90 [0.66, 1.22] | 0.81 [0.57, 1.15] | 0.90 [0.65, 1.24] | 0.81 [0.60, 1.10] |
| PFS | All | 0.90 [0.66, 1.22] | 0.81 [0.57, 1.15] | 0.90 [0.65, 1.24] | 0.81 [0.60, 1.10] |
| Response | BLCA | 1.14 [0.83, 1.56] | 1.22 [0.88, 1.68] | 0.91 [0.63, 1.33] | 0.94 [0.69, 1.28] |
| Response | NSCLC | 0.61 [0.35, 1.04] | 0.87 [0.50, 1.51] | 0.68 [0.40, 1.14] | 0.88 [0.53, 1.46] |
| Response | All | 0.95 [0.74, 1.23] | 1.10 [0.84, 1.45] | 0.82 [0.61, 1.10] | 0.91 [0.70, 1.17] |
| DCR | BLCA | 1.46 [1.11, 1.93] | 1.43 [1.08, 1.90] | 1.38 [1.02, 1.88] | 1.20 [0.91, 1.57] |
| DCR | NSCLC | 0.72 [0.41, 1.26] | 0.94 [0.52, 1.73] | 0.73 [0.40, 1.31] | 1.07 [0.58, 1.98] |
| DCR | All | 1.26 [0.99, 1.61] | 1.32 [1.02, 1.69] | 1.19 [0.92, 1.55] | 1.16 [0.91, 1.49] |
| endpoint | diagnosis | 12-chemokine (TLS_Chem) | Cabrita (TLS_SKCM) | TLS imprint (Meylan 2022) | TLS model (ours) |
|---|---|---|---|---|---|
| OS | BLCA | +0.024 [-0.000, +0.066] | +0.015 [+0.000, +0.052] | +0.014 [-0.004, +0.046] | +0.021 [+0.006, +0.056] |
| OS | NSCLC | +0.001 [-0.046, +0.105] | +0.006 [-0.017, +0.066] | +0.001 [-0.021, +0.077] | +0.003 [-0.028, +0.056] |
| OS | All | +0.034 [-0.003, +0.058] | +0.020 [+0.001, +0.034] | +0.019 [-0.006, +0.039] | +0.033 [-0.004, +0.052] |
| PFS | NSCLC | +0.002 [-0.021, +0.104] | +0.027 [-0.015, +0.150] | +0.022 [-0.033, +0.096] | +0.023 [-0.024, +0.103] |
| PFS | All | +0.002 [-0.021, +0.104] | +0.027 [-0.015, +0.150] | +0.022 [-0.033, +0.096] | +0.023 [-0.024, +0.103] |
| Response | BLCA | +0.022 [-0.004, +0.045] | -0.000 [-0.014, +0.030] | +0.001 [-0.008, +0.035] | +0.015 [-0.007, +0.040] |
| Response | NSCLC | +0.009 [-0.007, +0.062] | +0.028 [-0.004, +0.108] | +0.009 [-0.004, +0.056] | +0.045 [+0.001, +0.114] |
| Response | All | +0.004 [-0.005, +0.025] | +0.003 [-0.008, +0.028] | +0.004 [-0.006, +0.022] | -0.006 [-0.009, +0.022] |
| DCR | BLCA | +0.036 [+0.003, +0.087] | +0.028 [+0.005, +0.070] | +0.017 [-0.006, +0.068] | +0.049 [+0.010, +0.079] |
| DCR | NSCLC | +0.009 [-0.011, +0.062] | +0.027 [-0.024, +0.050] | -0.002 [-0.003, +0.051] | +0.024 [-0.012, +0.051] |
| DCR | All | +0.028 [+0.003, +0.045] | +0.017 [-0.006, +0.023] | +0.017 [-0.001, +0.032] | +0.029 [+0.009, +0.038] |
Added value over 12-chemokine
Δ (bigger − smaller nested model) with bootstrap CI, then the likelihood-ratio p. Bold: p < 0.05, uncorrected. Comparisons a–e are defined in Methods.
| endpoint | diagnosis | a | b | b vs a | c | d | e | e vs d |
|---|---|---|---|---|---|---|---|---|
| OS | BLCA | +0.001 [-0.003, +0.026] · p=0.81 | +0.010 [-0.001, +0.063] · p=0.051 | +0.009 [-0.003, +0.059] · p=0.015 | +0.021 [+0.006, +0.056] · p=0.013 | +0.000 [-0.002, +0.023] · p=0.52 | +0.021 [+0.001, +0.063] · p=0.0072 | +0.021 [+0.001, +0.056] · p=0.0021 |
| OS | NSCLC | +0.000 [-0.012, +0.008] · p=0.84 | -0.000 [-0.016, +0.012] · p=0.97 | -0.000 [-0.010, +0.011] · p=0.86 | +0.003 [-0.028, +0.056] · p=0.63 | -0.011 [-0.020, +0.066] · p=0.78 | +0.000 [-0.037, +0.069] · p=0.56 | +0.011 [-0.051, +0.059] · p=0.3 |
| OS | SKCM | -0.002 [-0.012, +0.016] · p=0.34 | +0.006 [-0.016, +0.019] · p=0.31 | +0.008 [-0.013, +0.008] · p=0.23 | – | – | – | – |
| OS | ccRCC | -0.001 [-0.016, +0.030] · p=0.61 | +0.003 [-0.015, +0.059] · p=0.048 | +0.004 [-0.014, +0.042] · p=0.016 | – | – | – | – |
| OS | All | -0.000 [-0.003, +0.004] · p=0.74 | +0.004 [-0.002, +0.017] · p=0.25 | +0.005 [-0.002, +0.016] · p=0.1 | +0.033 [-0.004, +0.052] · p=0.016 | +0.002 [-0.003, +0.017] · p=0.47 | +0.015 [+0.001, +0.049] · p=0.025 | +0.013 [-0.006, +0.036] · p=0.0089 |
| PFS | COREAD | +0.003 [-0.018, +0.045] · p=0.27 | +0.005 [-0.017, +0.050] · p=0.25 | +0.002 [-0.004, +0.043] · p=0.22 | – | – | – | – |
| PFS | NSCLC | -0.001 [-0.006, +0.004] · p=0.5 | -0.001 [-0.016, +0.008] · p=0.76 | +0.001 [-0.011, +0.005] · p=0.78 | +0.023 [-0.024, +0.103] | +0.003 [-0.013, +0.073] | +0.001 [-0.012, +0.089] | -0.001 [-0.010, +0.034] |
| PFS | SKCM | +0.011 [-0.005, +0.041] · p=0.19 | +0.009 [-0.008, +0.040] · p=0.39 | -0.002 [-0.006, +0.013] · p=0.71 | – | – | – | – |
| PFS | ccRCC | -0.006 [-0.014, +0.010] · p=0.41 | +0.002 [-0.018, +0.028] · p=0.063 | +0.007 [-0.005, +0.026] · p=0.027 | – | – | – | – |
| PFS | All | +0.001 [-0.002, +0.006] | +0.002 [-0.002, +0.010] | +0.001 [-0.001, +0.005] | +0.023 [-0.024, +0.103] | +0.003 [-0.013, +0.073] | +0.001 [-0.012, +0.089] | -0.001 [-0.010, +0.034] |
| Response | BLCA | -0.002 [-0.009, +0.066] · p=0.41 | +0.006 [-0.005, +0.078] · p=0.23 | +0.008 [-0.004, +0.048] · p=0.13 | +0.015 [-0.007, +0.040] · p=0.42 | -0.001 [-0.005, +0.021] · p=0.97 | +0.019 [-0.001, +0.053] · p=0.099 | +0.019 [-0.000, +0.047] · p=0.032 |
| Response | COREAD | +0.001 [-0.001, +0.017] · p=0.95 | +0.003 [-0.004, +0.023] · p=0.96 | +0.002 [-0.003, +0.011] · p=0.78 | – | – | – | – |
| Response | ESGA | +0.000 [-0.016, +0.062] · p=0.99 | -0.008 [-0.034, +0.074] · p=0.97 | -0.008 [-0.019, +0.023] · p=0.82 | – | – | – | – |
| Response | NSCLC | +0.005 [-0.001, +0.017] · p=0.17 | +0.007 [-0.002, +0.028] · p=0.27 | +0.002 [-0.001, +0.014] · p=0.39 | +0.045 [+0.001, +0.114] · p=0.052 | +0.036 [-0.009, +0.076] · p=0.037 | +0.035 [-0.001, +0.089] · p=0.11 | -0.001 [-0.005, +0.024] · p=0.8 |
| Response | SKCM | +0.002 [-0.003, +0.022] · p=0.3 | +0.006 [+0.000, +0.043] · p=0.4 | +0.004 [-0.003, +0.034] · p=0.39 | – | – | – | – |
| Response | ccRCC | +0.003 [-0.000, +0.020] · p=0.078 | +0.007 [+0.000, +0.020] · p=0.092 | +0.003 [-0.003, +0.009] · p=0.2 | – | – | – | – |
| Response | All | -0.000 [-0.000, +0.001] · p=0.78 | +0.000 [-0.000, +0.005] · p=0.41 | +0.001 [-0.000, +0.006] · p=0.19 | -0.006 [-0.009, +0.022] · p=0.72 | +0.004 [-0.007, +0.030] · p=0.26 | +0.008 [+0.001, +0.049] · p=0.12 | +0.005 [-0.000, +0.029] · p=0.085 |
| DCR | BLCA | +0.007 [-0.002, +0.046] · p=0.48 | +0.006 [-0.003, +0.065] · p=0.44 | -0.002 [-0.008, +0.028] · p=0.28 | +0.049 [+0.010, +0.079] · p=0.0064 | +0.014 [-0.003, +0.025] · p=0.18 | +0.019 [-0.005, +0.051] · p=0.071 | +0.005 [-0.005, +0.038] · p=0.062 |
| DCR | COREAD | +0.020 [-0.013, +0.094] · p=0.37 | +0.021 [-0.008, +0.085] · p=0.52 | +0.001 [-0.015, +0.046] · p=0.48 | – | – | – | – |
| DCR | ESGA | +0.014 [+0.005, +0.113] · p=0.28 | +0.007 [-0.002, +0.136] · p=0.35 | -0.007 [-0.045, +0.055] · p=0.34 | – | – | – | – |
| DCR | NSCLC | +0.007 [-0.005, +0.032] · p=0.56 | +0.010 [-0.004, +0.031] · p=0.71 | +0.003 [-0.004, +0.020] · p=0.56 | +0.024 [-0.012, +0.051] · p=0.24 | +0.020 [-0.010, +0.053] · p=0.19 | +0.012 [-0.002, +0.102] · p=0.39 | -0.008 [-0.007, +0.067] · p=0.71 |
| DCR | SKCM | +0.004 [-0.001, +0.032] · p=0.21 | +0.005 [-0.001, +0.042] · p=0.43 | +0.001 [-0.001, +0.028] · p=0.72 | – | – | – | – |
| DCR | ccRCC | +0.003 [-0.003, +0.014] · p=0.23 | +0.006 [-0.002, +0.017] · p=0.13 | +0.003 [-0.002, +0.012] · p=0.11 | – | – | – | – |
| DCR | All | +0.000 [-0.000, +0.002] · p=0.58 | +0.002 [+0.000, +0.005] · p=0.4 | +0.001 [-0.000, +0.004] · p=0.22 | +0.029 [+0.009, +0.038] · p=0.062 | +0.004 [-0.008, +0.015] · p=0.6 | +0.010 [-0.003, +0.035] · p=0.28 | +0.006 [-0.001, +0.029] · p=0.13 |
Our score adds nothing over the 12-chemokine signature (a, d). On the TMB + PD-L1 subset it adds to TMB and PD-L1 alone (c), mostly in bladder cancer. The interaction term (b vs a, e vs d) reaches p < 0.05 in bladder cancer and ccRCC OS: patients high on both scores fare better than either score predicts. The subset and the bladder cohort are largely the same IMvigor210 patients, so these are not independent confirmations.
Limitations
- Bulk within one cohort is weak (AUROC about 0.55–0.65 for every model family, signatures included); bulk probabilities over-call TLS on a new cohort, so use the ranking there.
- No maturity output: the maturity head showed no signal.
- For immunotherapy outcome the model is at best equal to the 12-chemokine signature.
- Bootstrap uses 20 replicates: intervals are rough and occasionally do not contain the point estimate.
- No correction for multiplicity across diagnoses × endpoints × comparisons; the interaction finding is a hypothesis.
- Pooled PFS and the TMB + PD-L1 PFS models needed a small ridge penalty to converge; no likelihood-ratio test is reported for them.
- Confounder coverage is uneven: age, stage and site are missing for most studies; TMB and PD-L1 exist for two diagnoses only.
- Several studies carry restricted-use terms; this report holds aggregates only and is not for public release.