OSCR

Discovery-Driven Plasma Proteomics Identifies a Multi-Protein Signature for Amyloid PET Positivity: A Machine Learning Analysis of the Bio-Hermes Cohort.

Code ↔ Paper

1 match 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 1 match
  1. [1] § 4. Materials and Methods › 4.5. Machine-Learning Pipeline ↔ Workflow-RScript/SMLPipelineR.R, lines 21–35 · score 0.58 · Confusion matrices, balanced accuracy, sensitivity, metrics

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

R · 316 lines · 12 KB · MIT · 1 match

  1. #!/usr/bin/env Rscript
  2. # =====================================================================
  3. # Omics ML Pipeline (General, Tabular Data)
  4. # Author: Your Name
  5. # Version: 0.1.0
  6. # Dependencies: caret, randomForest, xgboost, nnet, tidyverse, pROC, VennDiagram
  7. # =====================================================================
  8. suppressPackageStartupMessages({
  9. library(tidyverse)
  10. library(caret)
  11. library(randomForest)
  12. library(xgboost)
  13. library(nnet)
  14. library(pROC)
  15. library(VennDiagram)
  16. })
  17. # ----------- Utility --------------------------------------------------
  18. metric_from_cm <- function(cm) {
  19. # caret::confusionMatrix stores metrics in $byClass and $overall
  20. byc <- as.list(cm$byClass)
  21. ov <- as.list(cm$overall)
  22. tibble::tibble(
  23. Accuracy = as.numeric(ov[["Accuracy"]]),
  24. Kappa = as.numeric(ov[["Kappa"]]),
  25. Sensitivity = as.numeric(byc[["Sensitivity"]]),
  26. Specificity = as.numeric(byc[["Specificity"]]),
  27. `Balanced Accuracy` = as.numeric(byc[["Balanced Accuracy"]]),
  28. `Pos Pred Value` = as.numeric(byc[["Pos Pred Value"]]),
  29. `Neg Pred Value` = as.numeric(byc[["Neg Pred Value"]]),
  30. `Mcnemar P` = suppressWarnings(as.numeric(ov[["Mcnemar's Test P-Value"]]))
  31. )
  32. }
  33. ensure_dir <- function(path) {
  34. if (!dir.exists(path)) dir.create(path, recursive = TRUE, showWarnings = FALSE)
  35. }
  36. # ----------- Pipeline Functions --------------------------------------
  37. load_data <- function(path, label_col, id_col = NULL) {
  38. message("Loading data: ", path)
  39. ext <- tools::file_ext(path)
  40. df <- switch(tolower(ext),
  41. "csv" = readr::read_csv(path, show_col_types = FALSE),
  42. "tsv" = readr::read_tsv(path, show_col_types = FALSE),
  43. "txt" = readr::read_delim(path, delim = "\t", show_col_types = FALSE),
  44. stop("Unsupported file extension: ", ext))
  45. if (!label_col %in% names(df)) stop("label_col not found in data.")
  46. if (!is.null(id_col) && !id_col %in% names(df)) stop("id_col not found in data.")
  47. df <- df %>% mutate(!!label_col := as.factor(.data[[label_col]])) %>% droplevels()
  48. df
  49. }
  50. preprocess_data <- function(df, label_col, mode = c("complete_case", "median_impute"),
  51. log1p = FALSE, center_scale = TRUE) {
  52. mode <- match.arg(mode)
  53. y <- df[[label_col]]
  54. x <- df %>% select(-all_of(label_col))
  55. # Keep only numeric predictors for modeling
  56. numeric_mask <- purrr::map_lgl(x, is.numeric)
  57. x_num <- x[, numeric_mask, drop = FALSE]
  58. # Optional log1p
  59. if (log1p) x_num <- mutate_all(x_num, ~log1p(.x))
  60. # Missing handling
  61. if (mode == "complete_case") {
  62. keep <- stats::complete.cases(x_num) & !is.na(y)
  63. x_num <- x_num[keep, , drop = FALSE]
  64. y <- y[keep]
  65. } else {
  66. # Median impute via caret preProcess on predictors only
  67. pp <- caret::preProcess(x_num, method = "medianImpute")
  68. x_num <- predict(pp, x_num)
  69. }
  70. # Center/scale if requested
  71. if (center_scale) {
  72. pp2 <- caret::preProcess(x_num, method = c("center", "scale"))
  73. x_num <- predict(pp2, x_num)
  74. }
  75. out <- bind_cols(x_num, tibble::tibble(!!label_col := y)) %>% drop_na(all_of(label_col))
  76. list(data = out, predictors = colnames(x_num))
  77. }
  78. make_splits <- function(df, label_col, ratios = c(0.6, 0.7, 0.8, 0.9), seed = 123) {
  79. set.seed(seed)
  80. splits <- list()
  81. for (r in ratios) {
  82. idx <- caret::createDataPartition(df[[label_col]], p = r, list = FALSE)
  83. train_idx <- as.vector(idx)
  84. test_idx <- setdiff(seq_len(nrow(df)), train_idx)
  85. splits[[paste0(round(r*100), "_split")]] <- list(train = train_idx, test = test_idx)
  86. }
  87. splits
  88. }
  89. feature_screen <- function(df, label_col, alpha = 0.05, max_keep = NA) {
  90. # Two-group t-tests for numeric predictors
  91. y <- df[[label_col]]
  92. x <- df %>% select(-all_of(label_col))
  93. numeric_mask <- purrr::map_lgl(x, is.numeric)
  94. x <- x[, numeric_mask, drop = FALSE]
  95. res <- purrr::map_df(colnames(x), function(feat) {
  96. a <- x[[feat]][y == levels(y)[1]]
  97. b <- x[[feat]][y == levels(y)[2]]
  98. tt <- try(stats::t.test(a, b), silent = TRUE)
  99. if (inherits(tt, "try-error")) return(tibble::tibble(feature = feat, p = NA_real_, stat = NA_real_))
  100. tibble::tibble(feature = feat, p = tt$p.value, stat = unname(tt$statistic))
  101. }) %>% arrange(p)
  102. res$padj <- p.adjust(res$p, method = "BH")
  103. keep <- res %>% filter(padj < alpha)
  104. if (!is.na(max_keep)) keep <- keep %>% slice_head(n = max_keep)
  105. list(screen_table = res, keep_features = keep$feature)
  106. }
  107. train_one <- function(train_df, label_col, method = c("rf","xgbTree","nnet"), tuneLength = 10, seed = 123) {
  108. method <- match.arg(method)
  109. set.seed(seed)
  110. ctrl <- caret::trainControl(method = "repeatedcv", number = 5, repeats = 2,
  111. classProbs = TRUE, summaryFunction = twoClassSummary,
  112. savePredictions = "final")
  113. # Ensure positive class is the first level (caret uses first level as "event" for ROC)
  114. y <- train_df[[label_col]]
  115. if (length(levels(y)) != 2) stop("Outcome must be binary factor.")
  116. # Relevel so that the first level is the 'positive' class (customizable here)
  117. # By default, make the first level the one with lower frequency to emphasize recall;
  118. # adjust as needed for your use-case.
  119. levs <- levels(y)
  120. counts <- table(y)
  121. pos <- names(sort(counts))[1]
  122. train_df[[label_col]] <- relevel(train_df[[label_col]], ref = pos)
  123. fit <- caret::train(
  124. reformulate(termlabels = setdiff(names(train_df), label_col), response = label_col),
  125. data = train_df,
  126. method = method,
  127. metric = "ROC",
  128. trControl = ctrl,
  129. tuneLength = tuneLength
  130. )
  131. fit
  132. }
  133. evaluate_one <- function(fit, test_df, label_col) {
  134. # Predictions
  135. probs <- predict(fit, newdata = test_df, type = "prob")
  136. pred <- predict(fit, newdata = test_df, type = "raw")
  137. # Ensure same positive level as training
  138. positive_class <- fit$levels[1]
  139. cm <- caret::confusionMatrix(pred, test_df[[label_col]], positive = positive_class)
  140. metrics <- metric_from_cm(cm) %>% mutate(Model = fit$method, Positive = positive_class)
  141. list(confusion = cm, metrics = metrics, probs = probs, pred = pred)
  142. }
  143. var_importance <- function(fit, top_n = 20) {
  144. imp <- try(caret::varImp(fit, scale = TRUE), silent = TRUE)
  145. if (inherits(imp, "try-error")) return(tibble::tibble(Feature = character(), Importance = numeric()))
  146. vi <- imp$importance %>% tibble::rownames_to_column("Feature") %>% arrange(desc(Overall))
  147. if (!is.null(top_n)) vi <- vi %>% slice_head(n = top_n)
  148. vi
  149. }
  150. consensus_signature <- function(imp_list, top_n = 10) {
  151. top_sets <- lapply(imp_list, function(df) head(df$Feature, top_n))
  152. names(top_sets) <- names(imp_list)
  153. inter_all <- Reduce(intersect, top_sets)
  154. # Also return pairwise intersections
  155. list(top_sets = top_sets, intersect_all = inter_all)
  156. }
  157. # ----------- Orchestrator --------------------------------------------
  158. run_pipeline <- function(data_path,
  159. label_col,
  160. id_col = NULL,
  161. out_dir = "outputs",
  162. screen_alpha = 0.05,
  163. screen_top = NA,
  164. preprocess_mode = c("complete_case", "median_impute"),
  165. log1p = FALSE,
  166. center_scale = TRUE,
  167. split_ratios = c(0.6, 0.7, 0.8, 0.9),
  168. models = c("rf","xgbTree","nnet"),
  169. tuneLength = 10,
  170. seed = 123) {
  171. ensure_dir(out_dir)
  172. df0 <- load_data(data_path, label_col = label_col, id_col = id_col)
  173. # Preprocess
  174. pp <- preprocess_data(df0, label_col = label_col, mode = preprocess_mode,
  175. log1p = log1p, center_scale = center_scale)
  176. df <- pp$data
  177. predictors <- pp$predictors
  178. # Feature screening
  179. fs <- feature_screen(df, label_col = label_col, alpha = screen_alpha, max_keep = screen_top)
  180. keep_feats <- if (length(fs$keep_features) > 0) fs$keep_features else predictors
  181. readr::write_csv(fs$screen_table, file.path(out_dir, "feature_screening.csv"))
  182. # Use screened features
  183. df_use <- df %>% select(all_of(c(keep_feats, label_col)))
  184. # Splits
  185. splits <- make_splits(df_use, label_col = label_col, ratios = split_ratios, seed = seed)
  186. # Storage
  187. all_metrics <- list()
  188. all_importance <- list()
  189. # Loop over splits and models
  190. for (sp in names(splits)) {
  191. tr_idx <- splits[[sp]]$train
  192. te_idx <- splits[[sp]]$test
  193. train_df <- df_use[tr_idx, , drop = FALSE]
  194. test_df <- df_use[te_idx, , drop = FALSE]
  195. for (m in models) {
  196. fit <- train_one(train_df, label_col = label_col, method = m, tuneLength = tuneLength, seed = seed)
  197. ev <- evaluate_one(fit, test_df, label_col = label_col)
  198. vi <- var_importance(fit, top_n = 50)
  199. # Save artifacts
  200. model_tag <- paste(sp, m, sep = "_")
  201. saveRDS(fit, file = file.path(out_dir, paste0("model_", model_tag, ".rds")))
  202. readr::write_csv(ev$metrics %>% mutate(Split = sp), file.path(out_dir, paste0("metrics_", model_tag, ".csv")))
  203. readr::write_csv(vi, file.path(out_dir, paste0("varimp_", model_tag, ".csv")))
  204. all_metrics[[model_tag]] <- ev$metrics %>% mutate(Split = sp, Model = m)
  205. all_importance[[model_tag]] <- vi
  206. }
  207. }
  208. # Aggregate metrics
  209. metrics_df <- dplyr::bind_rows(all_metrics)
  210. readr::write_csv(metrics_df, file.path(out_dir, "metrics_all_models.csv"))
  211. # Consensus signature (per model family across best split or all splits)
  212. # Here we compute per family using all splits:
  213. families <- unique(metrics_df$Model)
  214. consensus <- list()
  215. for (fam in families) {
  216. fam_ims <- all_importance[grepl(paste0("_", fam, "$"), names(all_importance))]
  217. consensus[[fam]] <- consensus_signature(fam_ims, top_n = 10)
  218. # Save simple text summary
  219. sink(file.path(out_dir, paste0("consensus_", fam, ".txt")))
  220. cat("Model family:", fam, "\n")
  221. cat("Top-10 sets per split:\n")
  222. print(consensus[[fam]]$top_sets)
  223. cat("\nIntersection across splits:\n")
  224. print(consensus[[fam]]$intersect_all)
  225. sink()
  226. }
  227. # Optional: simple Venn diagram for first three sets of a family (if available)
  228. for (fam in names(consensus)) {
  229. ts <- consensus[[fam]]$top_sets
  230. if (length(ts) >= 3) {
  231. first_three <- ts[1:3]
  232. venn.plot <- VennDiagram::venn.diagram(
  233. x = first_three,
  234. filename = NULL,
  235. fill = c("#FEE08B", "#D53E4F", "#3288BD"),
  236. alpha = 0.5,
  237. cat.cex = 0.8,
  238. cex = 0.8,
  239. main = paste("Top-10 Feature Overlap -", fam)
  240. )
  241. grDevices::png(filename = file.path(out_dir, paste0("venn_", fam, ".png")), width = 1400, height = 1000, res = 150)
  242. grid::grid.draw(venn.plot)
  243. grDevices::dev.off()
  244. }
  245. }
  246. message("Pipeline complete. Outputs written to: ", out_dir)
  247. invisible(list(metrics = metrics_df, consensus = consensus))
  248. }
  249. # ----------- CLI Entry Point -----------------------------------------
  250. if (sys.nframe() == 0) {
  251. # Example CLI usage:
  252. # Rscript pipeline.R --data data/omics.csv --label outcome --out outputs
  253. args <- commandArgs(trailingOnly = TRUE)
  254. arg_list <- list()
  255. if (length(args) > 0) {
  256. for (i in seq(1, length(args), by = 2)) {
  257. key <- gsub("^--", "", args[i])
  258. val <- args[i + 1]
  259. arg_list[[key]] <- val
  260. }
  261. }
  262. data_path <- arg_list[["data"]]
  263. label_col <- arg_list[["label"]]
  264. out_dir <- arg_list[["out"]]
  265. if (is.null(data_path) || is.null(label_col)) {
  266. stop("Usage: Rscript pipeline.R --data <path.csv> --label <label_col> [--out outputs]")
  267. }
  268. if (is.null(out_dir)) out_dir <- "outputs"
  269. # Run with defaults
  270. run_pipeline(
  271. data_path = data_path,
  272. label_col = label_col,
  273. out_dir = out_dir,
  274. screen_alpha = 0.05,
  275. preprocess_mode = "complete_case",
  276. log1p = FALSE,
  277. center_scale = TRUE,
  278. split_ratios = c(0.6, 0.7, 0.8, 0.9),
  279. models = c("rf","xgbTree","nnet"),
  280. tuneLength = 10,
  281. seed = 123
  282. )
  283. }

SMLPipelineR.R at commit 0f5b910, under MIT · at the source

Overview

Authors: Stelios Lamprou1, Kalliopi Mavromati1, Frank J. Gunn-Moore2, Terry J. Quinn1
  1. School of Cardiovascular and Metabolic Health, University of Glasgow, Glasgow G12 8TA, UK; (S.L.)
  2. School of Biology, University of St. Andrews, St. Andrews KY16 9AJ, UK
Institutions: University of Glasgow (United Kingdom); University of St Andrews (United Kingdom)
Journal: International journal of molecular sciences, volume 27, issue 12, article 5533
Dates: received 6 May 2026; accepted 17 June 2026; published online 18 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3390/ijms27125533 · PMID 42353247 · PMCID PMC13299064 · OpenAlex W7165377568
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), PET / SPECT (modality), human (organism), Alzheimer's / dementia (population), cellular / molecular (subfield)
Methods: Connectivity, Statistics, Machine learning
Keywords: Alzheimer’s disease, amyloid PET, plasma proteomics, machine learning, bioinformatics, disease biomarkers
MeSH: Alzheimer Disease*, Amyloid*, Blood Proteins*, Machine Learning*, Positron-Emission Tomography*, Proteomics*, Biomarkers, Boosting Machine Learning Algorithms, Cohort Studies, Female, Humans, Random Forest (* major topic)
Topic: Advanced Proteomics Techniques and Applications (Spectroscopy, Chemistry), according to OpenAlex
Funding: Race Against Dementia (324008-01); Scottish Funding Council
Citations: cited by 1 paper (Europe PMC); 61 references in the paper

Abstract

Alzheimer’s disease is a progressive neurodegenerative disorder in which early detection remains limited by the cost and invasiveness of positron emission tomography and cerebrospinal fluid testing. We evaluated whether plasma proteomic profiles could distinguish amyloid PET-positive from amyloid PET-negative individuals using the Bio-Hermes cohort. After quality control and missing-data filtering, 988 participants and 295 proteins were analysed; 31 proteins showing group differences were used for supervised classification. Random Forest, Gradient Boosting, and Neural Network models were trained across four train/test splits with repeated cross-validation and class downsampling. Amyloid-positive and amyloid-negative groups differed across a subset of proteins, with five remaining significant after false discovery rate correction. Tree-based models performed most consistently, with Random Forest and Gradient Boosting achieving AUC values of 0.79–0.81 and balanced accuracy of 0.68–0.73. Eight proteins (SERPINA1, C3, CRP, APOE4, CFH, VTN, C1QTNF5, and PON1) emerged as recurring high-importance features. These findings indicate that discovery-driven plasma proteomics can identify multi-protein signatures associated with amyloid status and can complement established single-analyte blood biomarkers by adding pathway-level information.

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 1 match between paragraphs and lines of code.

stelioslamprou37/SML_PipelineR

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 0f5b9109fb54d17fc2e932361dd9ba1d788863cd, 2 September 2025
Languages: R (1)
Size: 5 files, 1 script
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README, license file, environment (DESCRIPTION, requirements.txt)
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: caret (1 file), pROC (1 file), randomForest (1 file), tidyverse (1 file), XGBoost (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
3 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;
  • 1 script, each with its path and the digest of its content;
  • 1 match 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

No dataset and no data link were found in the paper.

Data Availability Statement

The Bio-Hermes plasma proteomic dataset and associated phenotypic data are available through the AD Workbench platform of the Alzheimer’s Disease Data Initiative (https://www.alzheimersdata.org/) under a controlled-access Data Use Agreement. Participant-level proteomic data are not provided as Supplementary Material because access is governed by the original data-use terms. The R analysis code supporting the findings of this study is openly available on GitHub at https://github.com/stelioslamprou37/SML_PipelineR (accessed on 16 June 2026).

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, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 6 keywords, 12 MeSH terms, 2 funders, 60 references.

Cite

This paper

Lamprou, S., Mavromati, K., Gunn-Moore, F. J., & Quinn, T. J. (2026). Discovery-Driven Plasma Proteomics Identifies a Multi-Protein Signature for Amyloid PET Positivity: A Machine Learning Analysis of the Bio-Hermes Cohort. International journal of molecular sciences, 27(12), 5533. https://doi.org/10.3390/ijms27125533

BibTeX

@article{lamprou2026discovery,
author = {Lamprou, Stelios and Mavromati, Kalliopi and Gunn-Moore, Frank J. and Quinn, Terry J.},
title = {{Discovery-Driven Plasma Proteomics Identifies a Multi-Protein Signature for Amyloid PET Positivity: A Machine Learning Analysis of the Bio-Hermes Cohort}},
journal = {International journal of molecular sciences},
year = {2026},
month = jun,
volume = {27},
number = {12},
pages = {5533},
publisher = {Multidisciplinary Digital Publishing Institute (MDPI)},
issn = {1422-0067},
doi = {10.3390/ijms27125533},
url = {https://doi.org/10.3390/ijms27125533},
pmid = {42353247},
pmcid = {PMC13299064}
}

RIS

TY - JOUR
AU - Lamprou, Stelios
AU - Mavromati, Kalliopi
AU - Gunn-Moore, Frank J.
AU - Quinn, Terry J.
TI - Discovery-Driven Plasma Proteomics Identifies a Multi-Protein Signature for Amyloid PET Positivity: A Machine Learning Analysis of the Bio-Hermes Cohort
T2 - International journal of molecular sciences
J2 - Int J Mol Sci
PY - 2026
DA - 2026/06/18
VL - 27
IS - 12
SP - 5533
SN - 1422-0067
PB - Multidisciplinary Digital Publishing Institute (MDPI)
DO - 10.3390/ijms27125533
UR - https://doi.org/10.3390/ijms27125533
LA - en
ER -

CSL-JSON

{
"id": "10.3390/ijms27125533",
"type": "article-journal",
"title": "Discovery-Driven Plasma Proteomics Identifies a Multi-Protein Signature for Amyloid PET Positivity: A Machine Learning Analysis of the Bio-Hermes Cohort",
"container-title": "International journal of molecular sciences",
"author": [
{
"family": "Lamprou",
"given": "Stelios"
},
{
"family": "Mavromati",
"given": "Kalliopi"
},
{
"family": "Gunn-Moore",
"given": "Frank J."
},
{
"family": "Quinn",
"given": "Terry J."
}
],
"container-title-short": "Int J Mol Sci",
"volume": "27",
"issue": "12",
"page": "5533",
"DOI": "10.3390/ijms27125533",
"PMID": "42353247",
"PMCID": "PMC13299064",
"ISSN": "1422-0067",
"publisher": "Multidisciplinary Digital Publishing Institute (MDPI)",
"URL": "https://doi.org/10.3390/ijms27125533",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
18
]
]
}
}

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.3390/ijms27156925 [code]
XGBoost-SHAP Interpretable Modeling Identifies and Validates an Eight-Gene Biomarker for Hepatic Encephalopathy Risk Prediction in Cirrhosis.
Journal: International journal of molecular sciences
In common: randomForest, pROC, caret, 2 other tools, genetics / omics
[2] doi:10.21037/jtd-2026-0997 [code]
Machine learning models based on XGBoost algorithm to predict prognosis of lung cancer brain metastases.
Journal: Journal of thoracic disease
In common: randomForest, pROC, caret, 2 other tools
[3] doi:10.1038/s41467-026-77170-3 [code]
DNA methylation profiling identifies long-range epigenetic silencing of clustered protocadherins as a key determinant of meningioma progression.
Journal: Nature communications
In common: randomForest, pROC, caret, 1 other tool, genetics / omics, cellular / molecular
[4] doi:10.7717/peerj.21426 [code]
Integrated transcriptomic identification and validation reveal key autophagy-associated biomarkers in sleep deprivation.
Journal: PeerJ
In common: randomForest, pROC, caret, 1 other tool, genetics / omics, cellular / molecular
[5] doi:10.1177/13872877261471049 [code]
Predicting future brain atrophy based on longitudinal MRI.
Journal: Journal of Alzheimer's disease : JAD
In common: randomForest, pROC, caret, 1 other tool, Alzheimer's / dementia
[6] doi:10.1093/braincomms/fcag236 [code]
Dynamic, state-dependent characteristics of cognitive fluctuations in Lewy body dementia: a magnetoencephalography study.
Journal: Brain communications
In common: randomForest, pROC, caret, 1 other tool, Alzheimer's / dementia
[7] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: randomForest, caret, XGBoost, 1 other tool, cellular / molecular
[8] doi:10.1016/j.celrep.2026.117852 [code]
Graph theory identifies altered prefrontal microcircuit organization in Shank3 mice, a mouse Model of autism.
Journal: Cell reports
In common: randomForest, pROC, caret, 1 other tool
[9] doi:10.1002/alz.71711 [code]
Exploring longitudinal relationships among Alzheimer's disease biomarkers.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: tidyverse, PET / SPECT, Alzheimer's / dementia, 3 references
[10] doi:10.1002/alz.71567 [code]
Associations of dementia polyexposure scores to Alzheimer's disease endophenotypes in a diverse population.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: randomForest, pROC, tidyverse, PET / SPECT, Alzheimer's / dementia

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.