OSCR

Machine-learning assisted subclassification of glioblastoma by developing an endoplasmic reticulum stress-related methylation signature.

Code ↔ Paper

4 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 4 matches
  1. [1] § Material and methods › GBM methylation data collection ↔ Preprocessing/config.R, lines 68–119 · score 0.86 · Raw IDAT, batch corrected, EPIC, FFPE, ambiguous, frozen
  2. [2] § Material and methods › GBM methylation data collection ↔ Preprocessing/main.R, lines 145–184 · score 0.75 · removeBatchEffect, batch corrected, limma, log2, unmethylated, preprocessing
  3. [3] § Material and methods › Feature selection ↔ RFECV/main.py, lines 94–174 · score 0.71 · Random Forest, XGBoost, feature selection, RFECV, voting, classification
  4. [4] § Material and methods › Feature selection ↔ RFECV/main.py, lines 94–174 · score 0.68 · multiple iterations, feature selection, RFECV, fold, training, stratified

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 373 lines · 14 KB · no license · 2 matches

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ===============================================================================
  5. Project: GBM Gene Feature Selection via Ensemble RFE Voting
  6. ===============================================================================
  7. """
  8. import logging
  9. import json
  10. import pickle
  11. from pathlib import Path
  12. from typing import Dict, List, Optional
  13. from datetime import datetime
  14. import pandas as pd
  15. import numpy as np
  16. from sklearn.ensemble import RandomForestClassifier
  17. from sklearn.svm import SVC
  18. from sklearn.feature_selection import RFECV
  19. from sklearn.model_selection import StratifiedKFold
  20. from sklearn.base import clone
  21. import xgboost as xgb
  22. # :: Configure Logging
  23. log_timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  24. logging.basicConfig(
  25. level=logging.INFO,
  26. format='%(asctime)s - %(levelname)s - %(message)s',
  27. handlers=[
  28. logging.FileHandler(f"pipeline_{log_timestamp}.log"),
  29. logging.StreamHandler()
  30. ]
  31. )
  32. logger = logging.getLogger(__name__)
  33. class ConfigManager:
  34. """Handles loading and validating configuration settings."""
  35. def __init__(self, config_path: str = "config.json"):
  36. self.script_dir = Path(__file__).parent.resolve()
  37. self.config_path = self.script_dir / config_path
  38. self.config = self._load_config()
  39. self._resolve_paths()
  40. def _load_config(self) -> Dict:
  41. if not self.config_path.exists():
  42. logger.warning(f"Config file not found at {self.config_path}. Creating default...")
  43. self._create_default_config()
  44. with open(self.config_path, 'r', encoding='utf-8') as f:
  45. return json.load(f)
  46. def _create_default_config(self):
  47. default = {
  48. "paths": {
  49. "input_data": "data/GBM_NMF_group4.csv",
  50. "cache_dir": "cache",
  51. "output_dir": "results",
  52. "output_prefix": "GBM_group4"
  53. },
  54. "params": {
  55. "iteration_list": [10, 20, 30, 40, 50],
  56. "cv_splits": 5,
  57. "scoring": "accuracy",
  58. "vote_threshold": 1.0
  59. },
  60. "models": {
  61. "rf": {"type": "RandomForest", "random_state": 42},
  62. "svm": {"type": "SVC", "kernel": "linear", "random_state": 42},
  63. "xgb": {"type": "XGB", "random_state": 42, "use_label_encoder": False}
  64. }
  65. }
  66. with open(self.config_path, 'w', encoding='utf-8') as f:
  67. json.dump(default, f, indent=4)
  68. logger.info(f"Default config created at {self.config_path}")
  69. def _resolve_paths(self):
  70. """Converts relative paths in config to absolute paths based on script location."""
  71. for key, value in self.config['paths'].items():
  72. if isinstance(value, str):
  73. abs_path = self.script_dir / value
  74. self.config['paths'][key] = abs_path
  75. def get(self, *keys):
  76. """Nested access to config values."""
  77. val = self.config
  78. for k in keys:
  79. val = val[k]
  80. return val
  81. class EnsembleFeatureSelector:
  82. """
  83. Performs ensemble feature selection using RFE voting across multiple models.
  84. Supports multiple iteration counts for stability analysis.
  85. """
  86. def __init__(self, pd.DataFrame, config: ConfigManager, n_iterations: int):
  87. self.data = data
  88. self.config = config
  89. self.n_iterations = n_iterations
  90. self.X = None
  91. self.y = None
  92. self.voting_matrix = None
  93. self.feature_names = None
  94. def prepare_data(self):
  95. """Separate features and target labels."""
  96. if 'cluster' not in self.data.columns:
  97. raise ValueError("Target column 'cluster' not found in data.")
  98. self.X = self.data.drop(columns=['cluster'])
  99. self.y = self.data['cluster']
  100. self.feature_names = self.X.columns.tolist()
  101. logger.info(f"Data prepared. Features: {self.X.shape[1]}, Samples: {self.X.shape[0]}")
  102. def _get_estimator(self, model_name: str):
  103. """Factory method to create model instances based on config."""
  104. model_cfg = self.config.get('models', model_name)
  105. model_type = model_cfg.get('type')
  106. params = {k: v for k, v in model_cfg.items() if k != 'type'}
  107. if model_type == 'RandomForest':
  108. return RandomForestClassifier(**params)
  109. elif model_type == 'SVC':
  110. return SVC(**params)
  111. elif model_type == 'XGB':
  112. return xgb.XGBClassifier(**params)
  113. else:
  114. raise ValueError(f"Unknown model type: {model_type}")
  115. def _run_single_model_rfe(self, model_name: str) -> np.ndarray:
  116. """
  117. Run iterative RFECV for a single model type.
  118. Returns a matrix of shape (n_iterations, n_features) with rankings.
  119. """
  120. logger.info(f"Starting {self.n_iterations} RFE iterations for model: {model_name}")
  121. rankings = []
  122. cv_splits = self.config.get('params', 'cv_splits')
  123. scoring = self.config.get('params', 'scoring')
  124. cv = StratifiedKFold(n_splits=cv_splits, shuffle=True)
  125. for i in range(1, self.n_iterations + 1):
  126. estimator = self._get_estimator(model_name)
  127. if hasattr(estimator, 'random_state'):
  128. estimator.set_params(random_state=i)
  129. rfecv = RFECV(
  130. estimator=estimator,
  131. cv=cv,
  132. scoring=scoring,
  133. n_jobs=-1
  134. )
  135. y_train = self.y
  136. if model_name == 'xgb':
  137. y_train = self.y - 1
  138. try:
  139. rfecv.fit(self.X, y_train)
  140. rankings.append(rfecv.ranking_)
  141. except Exception as e:
  142. logger.warning(f"Iteration {i} failed for {model_name}: {e}")
  143. rankings.append(np.ones(len(self.feature_names)) * 2)
  144. return np.array(rankings)
  145. def run_ensemble_selection(self) -> pd.DataFrame:
  146. """Execute feature selection across all configured models."""
  147. cache_dir = Path(self.config.get('paths', 'cache_dir'))
  148. cache_dir.mkdir(parents=True, exist_ok=True)
  149. # Cache file name includes iteration count for differentiation
  150. cache_file = cache_dir / f"rfe_cache_iter{self.n_iterations}.pkl"
  151. # Try loading from cache
  152. if cache_file.exists():
  153. try:
  154. logger.info(f"Loading cached results from {cache_file}")
  155. with open(cache_file, 'rb') as f:
  156. cache_data = pickle.load(f)
  157. self.voting_matrix = cache_data['voting_matrix']
  158. self.feature_names = cache_data['feature_names']
  159. return self._process_votes()
  160. except Exception as e:
  161. logger.warning(f"Cache loading failed: {e}. Recomputing...")
  162. # Compute fresh results
  163. if self.X is None:
  164. self.prepare_data()
  165. all_rankings = []
  166. model_names = list(self.config.config['models'].keys())
  167. for name in model_names:
  168. rankings = self._run_single_model_rfe(name)
  169. all_rankings.append(rankings)
  170. self.voting_matrix = np.vstack(all_rankings)
  171. logger.info(f"Total voting matrix shape: {self.voting_matrix.shape}")
  172. # Save to cache
  173. try:
  174. with open(cache_file, 'wb') as f:
  175. pickle.dump({
  176. 'voting_matrix': self.voting_matrix,
  177. 'feature_names': self.feature_names
  178. }, f)
  179. logger.info(f"Results cached to {cache_file}")
  180. except Exception as e:
  181. logger.error(f"Failed to save cache: {e}")
  182. return self._process_votes()
  183. def _process_votes(self) -> pd.DataFrame:
  184. """Calculate vote counts and filter features based on threshold."""
  185. vote_counts = np.sum(self.voting_matrix == 1, axis=0)
  186. max_possible_votes = self.voting_matrix.shape[0]
  187. threshold_ratio = self.config.get('params', 'vote_threshold')
  188. threshold_count = int(max_possible_votes * threshold_ratio)
  189. logger.info(f"Total votes possible: {max_possible_votes}, Threshold: {threshold_count}")
  190. selected_indices = np.where(vote_counts >= threshold_count)[0]
  191. selected_features = [self.feature_names[i] for i in selected_indices]
  192. logger.info(f"Selected {len(selected_features)} features out of {len(self.feature_names)}")
  193. return self.data[selected_features + ['cluster']]
  194. def save_results(self, result_df: pd.DataFrame):
  195. """Save the final selected features and the list of names."""
  196. output_dir = Path(self.config.get('paths', 'output_dir'))
  197. output_dir.mkdir(parents=True, exist_ok=True)
  198. prefix = self.config.get('paths', 'output_prefix')
  199. threshold = int(self.config.get('params', 'vote_threshold') * 100)
  200. # File names include iteration count for differentiation
  201. file_name = f"{prefix}_iter{self.n_iterations}_selected_{threshold}pct.csv"
  202. result_path = output_dir / file_name
  203. result_df.to_csv(result_path, index=True)
  204. logger.info(f"Dataset saved to {result_path}")
  205. probe_list = [col for col in result_df.columns if col != 'cluster']
  206. probe_path = output_dir / f"{prefix}_iter{self.n_iterations}_probes_{threshold}pct.csv"
  207. pd.Series(probe_list).to_csv(probe_path, index=False, header=False)
  208. logger.info(f"Probe list saved to {probe_path}")
  209. return {
  210. 'n_iterations': self.n_iterations,
  211. 'n_selected': len(probe_list),
  212. 'n_total_features': len(self.feature_names),
  213. 'file_path': str(result_path)
  214. }
  215. class MultiIterationRunner:
  216. """
  217. Orchestrates multiple feature selection runs with different iteration counts.
  218. Generates summary statistics across all iterations.
  219. """
  220. def __init__(self, pd.DataFrame, config: ConfigManager):
  221. self.data = data
  222. self.config = config
  223. self.results_summary = []
  224. def run_all_iterations(self) -> pd.DataFrame:
  225. """Run feature selection for all configured iteration counts."""
  226. iteration_list = self.config.get('params', 'iteration_list')
  227. logger.info(f"Starting batch run for iterations: {iteration_list}")
  228. for n_iter in iteration_list:
  229. logger.info(f"{'='*60}")
  230. logger.info(f"Running iteration count: {n_iter}")
  231. logger.info(f"{'='*60}")
  232. selector = EnsembleFeatureSelector(self.data, self.config, n_iter)
  233. selected_data = selector.run_ensemble_selection()
  234. result_info = selector.save_results(selected_data)
  235. self.results_summary.append(result_info)
  236. # Optional: Add delay between runs to prevent resource exhaustion
  237. # time.sleep(1)
  238. # Generate summary report
  239. self._generate_summary_report()
  240. return pd.DataFrame(self.results_summary)
  241. def _generate_summary_report(self):
  242. """Generate and save a summary report of all iteration runs."""
  243. output_dir = Path(self.config.get('paths', 'output_dir'))
  244. output_dir.mkdir(parents=True, exist_ok=True)
  245. summary_df = pd.DataFrame(self.results_summary)
  246. summary_path = output_dir / "iteration_summary.csv"
  247. summary_df.to_csv(summary_path, index=False)
  248. logger.info(f"Summary report saved to {summary_path}")
  249. # Log summary statistics
  250. logger.info("\n" + "="*60)
  251. logger.info("ITERATION SUMMARY")
  252. logger.info("="*60)
  253. logger.info(summary_df.to_string(index=False))
  254. logger.info("="*60)
  255. # Generate stability analysis (optional)
  256. self._analyze_feature_stability()
  257. def _analyze_feature_stability(self):
  258. """
  259. Analyze how feature selection stabilizes across different iteration counts.
  260. """
  261. output_dir = Path(self.config.get('paths', 'output_dir'))
  262. output_dir.mkdir(parents=True, exist_ok=True)
  263. stability_data = []
  264. iteration_list = self.config.get('params', 'iteration_list')
  265. for result in self.results_summary:
  266. stability_data.append({
  267. 'iterations': result['n_iterations'],
  268. 'selected_features': result['n_selected'],
  269. 'selection_ratio': result['n_selected'] / result['n_total_features']
  270. })
  271. stability_df = pd.DataFrame(stability_data)
  272. stability_path = output_dir / "feature_stability_analysis.csv"
  273. stability_df.to_csv(stability_path, index=False)
  274. logger.info(f"Stability analysis saved to {stability_path}")
  275. def main():
  276. """Main execution pipeline."""
  277. logger.info("=== Starting Feature Selection Pipeline ===")
  278. logger.info(f"Script running from: {Path(__file__).parent.resolve()}")
  279. # 1. Load Configuration
  280. config = ConfigManager()
  281. # 2. Load Data
  282. input_path = Path(config.get('paths', 'input_data'))
  283. if not input_path.exists():
  284. logger.error(f"Input file not found: {input_path}")
  285. logger.error("Please ensure your data is placed correctly or update config.json")
  286. return
  287. try:
  288. data = pd.read_csv(input_path, sep=',', index_col=0, header=0)
  289. logger.info(f"Data loaded: {data.shape}")
  290. except Exception as e:
  291. logger.error(f"Failed to load {e}")
  292. return
  293. # 3. Initialize Multi-Iteration Runner
  294. runner = MultiIterationRunner(data, config)
  295. # 4. Run All Iterations
  296. summary = runner.run_all_iterations()
  297. # 5. Final Report
  298. logger.info("\n=== Pipeline Completed Successfully ===")
  299. logger.info(f"Total runs completed: {len(summary)}")
  300. logger.info(f"Results saved to: {config.get('paths', 'output_dir')}")
  301. if __name__ == "__main__":
  302. main()

main.py at commit 9e08935, no license · at the source

Overview

Authors: Jinyi Zhao1, Menglong Li1, Xuemei Pu1, Yanzhi Guo1
  1. College of Chemistry, Sichuan University, Chengdu, China
Institutions: Sichuan University (China)
Journal: Frontiers in oncology, volume 16, article 1750334
Dates: received 20 November 2025; accepted 9 April 2026; published online 22 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fonc.2026.1750334 · PMID 42100389 · PMCID PMC13143586 · OpenAlex W7155201746
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), other condition (population)
Methods: Machine learning, Statistics
Keywords: DNA methylation, endoplasmic reticulum stress, glioblastoma, immune microenvironment, non-negative matrix factorization, random forest
Topic: Endoplasmic Reticulum Stress and Disease (Cell Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Citations: not cited yet (Europe PMC); 62 references in the paper

Abstract

Introduction: Glioblastoma (GBM) is a highly aggressive brain tumor with significant heterogeneity, leading to poor prognosis and limited treatment options. Developing innovative molecular subtyping approaches is important for gaining deeper insights into disease pathogenesis and optimizing treatment strategies. DNA methylation has been implicated in the regulation of endoplasmic reticulum stress (ERS), which disrupts protein folding and activates the unfolded protein response (UPR), ultimately determining cellular survival or apoptotic outcomes.

Methods: ERS-related DNA methylation profiles were integrated with non-negative matrix factorization (NMF) to establish a molecular classification framework for GBM. An ERS-based signature was further developed using recursive feature elimination with cross-validation (RFECV), and a random forest (RF) model was constructed for subtype prediction. The model was then applied to an external TCGA cohort for validation and downstream characterization.

Results: The NMF-based framework stratified GBM patients into four distinct subtypes. The RF model achieved an accuracy of 92.4% in the independent test set. Application of the model to the TCGA cohort revealed distinct molecular and clinical characteristics across subtypes. In particular, Subtype 2 was associated with an immune-inflamed phenotype, lower tumor purity, and poorer prognosis. Connectivity Map (CMap) analysis further identified MEK inhibitors as preliminary candidate compounds for specific subtypes.

Discussion: These findings support an association between ERS-related epigenetic modifications and GBM heterogeneity, and provide an epigenetic framework for refined molecular stratification and further exploration of subtype-related therapeutic strategies.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 4 matches between paragraphs and lines of code.

jyz30102/ERSR-GBM-Subtypes

License: none: the authors keep all their rights
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Commit: 9e0893566929d5aa6cac48ed19d8a018c8be40bf, 19 March 2026
Languages: R (6), Python (3)
Size: 21 files, 9 scripts
Software Heritage: not archived
Found in: “Data availability statement”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: ggplot2 (2 files), pandas (2 files), tidyverse (2 files), limma (1 file), NumPy (1 file), scikit-learn (1 file), XGBoost (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers
  • 29 September 2026: the link answers
10 files

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 9 scripts, each with its path and the digest of its content;
  • 4 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability statement

The original contributions presented in the study are included in the article/Supplementary Material. The 33-CpG signature, model code, and analysis scripts used in this study are publicly available at GitHub (https://github.com/jyz30102/ERSR-GBM-Subtypes). Further inquiries can be directed to the corresponding authors.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 29 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 4 authors, 6 keywords, 62 references.

Cite

This paper

Zhao, J., Li, M., Pu, X., & Guo, Y. (2026). Machine-learning assisted subclassification of glioblastoma by developing an endoplasmic reticulum stress-related methylation signature. Frontiers in oncology, 16, 1750334. https://doi.org/10.3389/fonc.2026.1750334

BibTeX

@article{zhao2026machine,
author = {Zhao, Jinyi and Li, Menglong and Pu, Xuemei and Guo, Yanzhi},
title = {{Machine-learning assisted subclassification of glioblastoma by developing an endoplasmic reticulum stress-related methylation signature}},
journal = {Frontiers in oncology},
year = {2026},
month = apr,
volume = {16},
pages = {1750334},
publisher = {Frontiers Media SA},
issn = {2234-943X},
doi = {10.3389/fonc.2026.1750334},
url = {https://doi.org/10.3389/fonc.2026.1750334},
pmid = {42100389},
pmcid = {PMC13143586}
}

RIS

TY - JOUR
AU - Zhao, Jinyi
AU - Li, Menglong
AU - Pu, Xuemei
AU - Guo, Yanzhi
TI - Machine-learning assisted subclassification of glioblastoma by developing an endoplasmic reticulum stress-related methylation signature
T2 - Frontiers in oncology
J2 - Front Oncol
PY - 2026
DA - 2026/04/22
VL - 16
SP - 1750334
SN - 2234-943X
PB - Frontiers Media SA
DO - 10.3389/fonc.2026.1750334
UR - https://doi.org/10.3389/fonc.2026.1750334
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fonc.2026.1750334",
"type": "article-journal",
"title": "Machine-learning assisted subclassification of glioblastoma by developing an endoplasmic reticulum stress-related methylation signature",
"container-title": "Frontiers in oncology",
"author": [
{
"family": "Zhao",
"given": "Jinyi"
},
{
"family": "Li",
"given": "Menglong"
},
{
"family": "Pu",
"given": "Xuemei"
},
{
"family": "Guo",
"given": "Yanzhi"
}
],
"container-title-short": "Front Oncol",
"volume": "16",
"page": "1750334",
"DOI": "10.3389/fonc.2026.1750334",
"PMID": "42100389",
"PMCID": "PMC13143586",
"ISSN": "2234-943X",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fonc.2026.1750334",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
22
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: limma, ggplot2, tidyverse, 3 other tools, genetics / omics, other condition, 1 reference
[2] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: XGBoost, limma, ggplot2, 4 other tools
[3] doi:10.1016/j.stemcr.2026.102977 [code]
Integrative analysis of drug-gene signatures in human pluripotent stem cells reveals prazosin as a novel SQSTM1 regulator for ALS therapeutics.
Journal: Stem cell reports
In common: limma, scikit-learn, pandas, 1 other tool, genetics / omics, other condition, 2 references
[4] doi:10.1038/s41398-026-04200-5 [code]
Postmortem brain single-nucleus and bulk gene expression analyses identify shared and distinct abnormalities in bipolar disorder and major depressive disorder.
Journal: Translational psychiatry
In common: XGBoost, limma, ggplot2, 3 other tools, genetics / omics
[5] doi:10.1016/j.isci.2026.115982 [code]
Multi-omics profiling-derived signature links cellular ecosystem to glioblastoma prognosis.
Journal: iScience
In common: limma, ggplot2, tidyverse, 2 other tools, genetics / omics, other condition, 1 reference
[6] doi:10.1186/s13059-026-04125-8 [code]
MLMarker: a machine learning framework for tissue inference and biomarker discovery.
Journal: Genome biology
In common: XGBoost, limma, tidyverse, 3 other tools, genetics / omics
[7] doi:10.1038/s41746-026-02735-x [code]
Multimodal interpretable deep learning for transcriptome-informed precision oncology and drug mechanism analysis.
Journal: NPJ digital medicine
In common: scikit-learn, pandas, NumPy, genetics / omics, other condition, 3 references
[8] doi:10.3390/ijms27136068 [code]
Loss of Neuropeptide Y Signaling Accompanies the Neural-to-Mesenchymal Transcriptional Transition in Glioblastoma: A Multi-Scale Transcriptomic Analysis.
Journal: International journal of molecular sciences
In common: limma, ggplot2, tidyverse, genetics / omics, other condition, 2 references
[9] doi:10.1186/s13293-026-00927-4 [code]
Gene regulatory network analysis identifies dysregulation of hypoxia pathways as contributing to glioblastoma treatment resistance in females.
Journal: Biology of sex differences
In common: limma, ggplot2, tidyverse, 2 other tools, other condition, 1 reference
[10] doi:10.1007/s00262-026-04390-3 [code]
Identification and prioritisation of tumour antigen candidates from 79 glioblastoma transcriptomes.
Journal: Cancer immunology, immunotherapy : CII
In common: XGBoost, ggplot2, tidyverse, 3 other tools, genetics / omics, other condition

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.