OSCR

Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause Mortality

Code ↔ Paper

19 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 19 matches
  1. [1] § Materials and Methods › Physical function ↔ 2_Cox_Mortality_Associations_of_Individual_Ageing_Biomarkers.R, lines 336–375 · score 0.95 · forced vital capacity, forced expiratory ratio, forced expiratory volume, Grip strength, Lung function, physical function
  2. [2] § Materials and Methods › Physical function ↔ 3_Cox_Mortality_Associations_of_All_Ageing_Biomarkers.R, lines 177–215 · score 0.93 · forced vital capacity, forced expiratory ratio, forced expiratory volume, Grip strength, physical function, dominant hand
  3. [3] § Materials and Methods › General cognitive function (g) ↔ 7_G_score.R, lines 90–153 · score 0.93 · empirical Bayes, fitted SEM, latent factor, shared variance, FIML, likelihood
  4. [4] § Results › Plasma proteomic signatures, biological processes, and tissues associated with all-cause mortality ↔ 6_Mortality_Elastic_Net_Cox_for_SomaScan11k_Plasma_Proteins.R, lines 1–42 · score 0.82 · fold cross validation, penalised Cox, plasma proteins, SomaScan, protein mortality, elastic
  5. [5] § Materials and Methods › Proteomic organ age gaps ↔ 8_Calculating_OrganAgeGaps_LBC1936.R, lines 42–85 · score 0.81 · log10 transformed, Organ age gaps, protein coefficients, SomaScan, predicted ages, chronological age
  6. [6] § Materials and Methods › Statistical analyses › Survival analyses ↔ 6_Mortality_Elastic_Net_Cox_for_SomaScan11k_Plasma_Proteins.R, lines 1–42 · score 0.79 · fold cross validation, penalised Cox, Plasma protein, Alive, elastic, Cox models
  7. [7] § Materials and Methods › General cognitive function (g) ↔ 7_G_score.R, lines 43–88 · score 0.79 · Digit Span Backwards, Logical Memory, Verbal Paired Associates, cognitive
  8. [8] § Results › Epigenetic, neuroimaging, and functional ageing biomarkers outperform proteomic organ ages in associations with all-cause mortality ↔ 3_Cox_Mortality_Associations_of_All_Ageing_Biomarkers.R, lines 217–302 · score 0.78 · eleven proteomic organ, brain age acceleration, proteomic brain age, telomere length, brain age gap, proteomic organ age
  9. [9] § Materials and Methods › General cognitive function (g) ↔ 7_G_score.R, lines 43–88 · score 0.76 · Digit Symbol Substitution, Symbol Search, Choice Reaction, cognitive
  10. [10] § Results › Epigenetic, neuroimaging, and functional ageing biomarkers outperform proteomic organ ages in associations with all-cause mortality ↔ 2_Cox_Mortality_Associations_of_Individual_Ageing_Biomarkers.R, lines 377–446 · score 0.72 · brain age acceleration, proteomic brain age, telomere length, brain age gap, proteomic organ age, ageing biomarkers
  11. [11] § Materials and Methods › Proteomic organ age gaps ↔ 2_Cox_Mortality_Associations_of_Individual_Ageing_Biomarkers.R, lines 377–446 · score 0.72 · Proteomic organ ages, Organ age gaps, intestine, muscle, artery, lung
  12. [12] § Results › Neuroimaging, cognitive, and physical function biomarkers of ageing independently associate with all-cause mortality ↔ 3_Cox_Mortality_Associations_of_All_Ageing_Biomarkers.R, lines 128–175 · score 0.71 · multivariable Cox, confidence intervals, PH assumption, proportional hazards, Hazard ratios, organ ageing biomarkers
  13. [13] § Materials and Methods › Statistical analyses ↔ 4_Cox_Mortality_Associations_of_SomaScan11k_Plasma_Proteins.R, lines 96–141 · score 0.68 · zero inflation, log transformed, pack years, variables
  14. [14] § Materials and Methods › Statistical analyses › Survival analyses ↔ 2_Cox_Mortality_Associations_of_Individual_Ageing_Biomarkers.R, lines 170–225 · score 0.68 · cox.zph, Proportional hazards assumptions, Cox proportional hazards, ageing biomarkers, death, HR
  15. [15] § Materials and Methods › Statistical analyses › Survival analyses ↔ 4_Cox_Mortality_Associations_of_SomaScan11k_Plasma_Proteins.R, lines 215–268 · score 0.67 · cox.zph, Proportional hazards assumptions, Cox proportional hazards, plasma protein, death, HR
  16. [16] § Results › Plasma proteomic signatures, biological processes, and tissues associated with all-cause mortality ↔ 3_Cox_Mortality_Associations_of_All_Ageing_Biomarkers.R, lines 128–175 · score 0.65 · confidence intervals, PH assumption, proportional hazards, Hazard ratios, mortality associated, Cox model
  17. [17] § Materials and Methods › Plasma proteomics ↔ 8_Calculating_OrganAgeGaps_LBC1936.R, lines 42–85 · score 0.62 · log10 transformed, Protein expression, SomaScan, coefficient, SD, proteomic
  18. [18] § Materials and Methods › Statistical analyses ↔ 1_Ageing_Biomarker_Correlations.R, lines 1–40 · score 0.57 · zero inflation, variables, log, WMH, ICV, transformed
  19. [19] § Materials and Methods › GrimAge2 acceleration ↔ 4_Cox_Mortality_Associations_of_SomaScan11k_Plasma_Proteins.R, lines 96–141 · score 0.53 · log transformed, pack years, plasma proteins, sex, Cox, mortality

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 · 931 lines · 25 KB · GPL-3.0 · 4 matches

  1. # =============================================================
  2. # ASSOCIATIONS OF INDIVIDUAL AGEING BIOMARKERS WITH ALL-CAUSE MORTALITY
  3. # =============================================================
  4. # COHORT:
  5. # Lothian Birth Cohort 1936
  6. # COX MODELS:
  7. # Models are fitted separately for each ageing biomarker.
  8. #
  9. # Model 1: Demographics
  10. # Surv(time_to_death, dead) ~ scale(biomarker_i) + scale(age) + sex
  11. #
  12. # Model 2: Demographics and lifestyle-related risk factors
  13. # Surv(time_to_death, dead) ~ scale(biomarker_i) + scale(age) + sex +
  14. # scale(Smoking_pack_years) + scale(Alcohol_units) + scale(BMI)
  15. #
  16. # Model 3: Demographics, lifestyle-related risk factors, and medical conditions
  17. # Surv(time_to_death, dead) ~ scale(biomarker_i) + scale(age) + sex +
  18. # scale(Smoking_pack_years) + scale(Alcohol_units) + scale(BMI) +
  19. # 7 medical conditions
  20. # MORTALITY OUTCOMES:
  21. # All-cause mortality over 16 years of follow-up (time-to-event).
  22. # dead (0/1) = event status, where 0 = alive/censored and 1 = deceased.
  23. # time_to_death = time (in years) from baseline (Wave 2) until death or censoring.
  24. # PREDICTORS:
  25. # 23 scaled ageing biomarkers measured at wave 2 (age ~ 73 years).
  26. # COVARIATES:
  27. # Demographics: age and sex.
  28. # Lifestyle-related risk factors: smoking pack years, alcohol units per week, and BMI.
  29. # Medical conditions: hypertension, high cholesterol, diabetes, cardiovascular disease, stroke, neoplasm, and arthritis.
  30. # =============================================================
  31. # ------------------------------------
  32. # Load required libraries
  33. # ------------------------------------
  34. library(dplyr)
  35. library(survival)
  36. library(pbapply)
  37. library(forcats)
  38. library(stringr)
  39. library(readr)
  40. library(ggplot2)
  41. library(ggtext)
  42. library(ggrepel)
  43. # ------------------------------------
  44. # Load scaled ageing biomarker dataset
  45. # ------------------------------------
  46. all_age_biomarkers_df_scaled <- read_csv("/CCACE_Shared/Maira/OrganAgeProject/Univariate_aging_biomarkers_mortality_cox/Scaled_aging_biomarkers_mortality_data_LBC1936w2.csv")
  47. # All ageing biomarkers and continuous covariates have already been scaled to a mean of 0 and standard deviation of 1.
  48. # ------------------------------------
  49. # Define output directory
  50. # ------------------------------------
  51. OUT_DIR <- "/CCACE_Shared/Maira/OrganAgeProject/Univariate_aging_biomarkers_mortality_cox"
  52. # ---------------------------
  53. # 1. Sanity checks and pre-processing
  54. # ---------------------------
  55. # Inspect the class of each variable in the dataset.
  56. data.frame(
  57. column = names(all_age_biomarkers_df_scaled),
  58. class = sapply(all_age_biomarkers_df_scaled, class)
  59. )
  60. # Exclude diseases with fewer than 50 cases.
  61. all_age_biomarkers_df_scaled <- all_age_biomarkers_df_scaled %>%
  62. select(-parkin_w2, -dement_w2)
  63. # Convert categorical variables to factors.
  64. factor_vars <- c(
  65. "sex",
  66. "hibp_w2",
  67. "hichol_w2",
  68. "diab_w2",
  69. "cvdhist_w2",
  70. "stroke_w2",
  71. "neoplas_w2",
  72. "arthrit_w2"
  73. )
  74. all_age_biomarkers_df_scaled[factor_vars] <- lapply(
  75. all_age_biomarkers_df_scaled[factor_vars],
  76. factor
  77. )
  78. # Convert the mortality outcome to an integer event indicator.
  79. all_age_biomarkers_df_scaled$dead <- as.integer(as.logical(all_age_biomarkers_df_scaled$dead))
  80. # ---------------------------
  81. # 2. Define covariate groups
  82. # ---------------------------
  83. # Demographic covariates.
  84. demographics <- c(
  85. "ageyrs_w2",
  86. "sex"
  87. )
  88. # Lifestyle-related covariates.
  89. lifestyle <- c(
  90. "Smoking_pack_years",
  91. "Alcohol_units",
  92. "BMI"
  93. )
  94. # Medical conditions.
  95. diseases <- c(
  96. "hibp_w2",
  97. "hichol_w2",
  98. "diab_w2",
  99. "cvdhist_w2",
  100. "stroke_w2",
  101. "neoplas_w2",
  102. "arthrit_w2"
  103. )
  104. # Ageing biomarkers.
  105. biomarkers <- c(
  106. "Telomere_length",
  107. "Six_meter_walk_time",
  108. "FEV",
  109. "FER",
  110. "FVC",
  111. "Grip_strength",
  112. "TBV_to_ICV_ratio",
  113. "GMV_to_ICV_ratio",
  114. "WMHV_to_ICV_ratio",
  115. "g",
  116. "GrimAge2_acceleration",
  117. "Adipose_age_gap",
  118. "Artery_age_gap",
  119. "Brain_age_gap",
  120. "Heart_age_gap",
  121. "Immune_age_gap",
  122. "Intestine_age_gap",
  123. "Kidney_age_gap",
  124. "Liver_age_gap",
  125. "Lung_age_gap",
  126. "Muscle_age_gap",
  127. "Pancreas_age_gap",
  128. "MRI_brain_age_gap"
  129. )
  130. # ---------------------------
  131. # 3. Define Cox models
  132. # ---------------------------
  133. models <- list(
  134. demographics = demographics,
  135. demographics_lifestyle = c(demographics, lifestyle),
  136. demographics_lifestyle_diseases = c(demographics, lifestyle, diseases)
  137. )
  138. # ---------------------------
  139. # 4. Function to run a Cox model
  140. # ---------------------------
  141. run_cox_model <- function(biomarker, covariates, model_name) {
  142. vars_needed <- c(
  143. "time_to_death",
  144. "dead",
  145. biomarker,
  146. covariates
  147. )
  148. # Retain complete cases for all variables included in the model.
  149. df <- all_age_biomarkers_df_scaled %>%
  150. select(all_of(vars_needed)) %>%
  151. na.omit()
  152. n_subjects <- nrow(df)
  153. # Construct the model formula.
  154. formula <- as.formula(
  155. paste(
  156. "Surv(time_to_death, dead) ~",
  157. paste(c(biomarker, covariates), collapse = " + ")
  158. )
  159. )
  160. # Fit the Cox proportional hazards model.
  161. fit <- coxph(formula, data = df)
  162. # Extract the coefficient and p-value for the ageing biomarker.
  163. s <- summary(fit)
  164. coef_tab <- s$coefficients
  165. biomarker_row <- which(rownames(coef_tab) == biomarker)
  166. coef_val <- coef_tab[biomarker_row, "coef"]
  167. p_val <- coef_tab[biomarker_row, "Pr(>|z|)"]
  168. ci <- confint(fit, parm = biomarker)
  169. # Test the proportional hazards assumption using cox.zph().
  170. ph_test <- cox.zph(fit)
  171. ph_row <- which(rownames(ph_test$table) == biomarker)
  172. data.frame(
  173. biomarker_name = biomarker,
  174. model = model_name,
  175. covariates = paste(covariates, collapse = ", "),
  176. n_subjects = n_subjects,
  177. HR = exp(coef_val),
  178. lower_95CI = exp(ci[1]),
  179. upper_95CI = exp(ci[2]),
  180. p_value = p_val,
  181. ph_violation = ph_test$table[ph_row, "p"] < 0.05,
  182. ph_chisq = ph_test$table[ph_row, "chisq"],
  183. ph_p = ph_test$table[ph_row, "p"]
  184. )
  185. }
  186. # ---------------------------
  187. # 5. Run Cox models for all ageing biomarkers
  188. # ---------------------------
  189. # The associations of each biomarker with time-to-death are evaluated using all three covariate-adjusted Cox models.
  190. results_list <- pblapply(
  191. biomarkers,
  192. function(biomarker) {
  193. do.call(
  194. rbind,
  195. lapply(
  196. names(models),
  197. function(model_name) {
  198. run_cox_model(
  199. biomarker = biomarker,
  200. covariates = models[[model_name]],
  201. model_name = model_name
  202. )
  203. }
  204. )
  205. )
  206. }
  207. )
  208. # Combine results across biomarkers and models.
  209. results_df <- bind_rows(results_list)
  210. # ---------------------------
  211. # 6. Multiple testing correction
  212. # ---------------------------
  213. # Apply Benjamini-Hochberg false discovery rate correction.
  214. results_df <- results_df %>%
  215. group_by(model) %>% # Adjust p-values within each model
  216. mutate(
  217. adj_p_benjamini = p.adjust(p_value, method = "BH")
  218. ) %>%
  219. ungroup() %>%
  220. select(
  221. biomarker_name,
  222. model,
  223. covariates,
  224. n_subjects,
  225. HR,
  226. lower_95CI,
  227. upper_95CI,
  228. p_value,
  229. adj_p_benjamini,
  230. ph_violation,
  231. ph_chisq,
  232. ph_p
  233. )
  234. write_csv(
  235. results_df,
  236. file.path(
  237. OUT_DIR,
  238. "mortality_unicox_26biomarkers_fully_adjusted_all_subjects.csv"
  239. )
  240. )
  241. # ---------------------------
  242. # 7. Invert hazard ratios below 1
  243. # ---------------------------
  244. # For biomarkers with HR < 1, invert the HR and confidence intervals (1/HR)
  245. # to facilitate comparison of effect magnitudes across positively and negatively associated biomarkers.
  246. # The biomarker name is prefixed with "-" to indicate that its direction has been inverted.
  247. inverted_univariable_aging_biomarker_results <- results_df %>%
  248. mutate(
  249. inverted_HR = ifelse(HR < 1, 1 / HR, HR),
  250. inverted_lower_95CI = ifelse(HR < 1, 1 / upper_95CI, lower_95CI),
  251. inverted_upper_95CI = ifelse(HR < 1, 1 / lower_95CI, upper_95CI),
  252. biomarker_name = ifelse(HR < 1, paste0("-", biomarker_name), biomarker_name)
  253. ) %>%
  254. arrange(desc(inverted_HR))
  255. write_csv(inverted_univariable_aging_biomarker_results, file.path(OUT_DIR, "inverted_univariable_ageing_biomarker_results_all_subjects.csv"))
  256. # ---------------------------
  257. # 8. Format results for publication
  258. # ---------------------------
  259. # Define the biomarker order based on the demographic-adjusted model.
  260. biomarker_order_fully_adjusted <- inverted_univariable_aging_biomarker_results %>%
  261. filter(model == "demographics") %>%
  262. arrange(desc(inverted_HR)) %>%
  263. pull(biomarker_name) %>%
  264. gsub("^-", "", .)
  265. biomarker_order_fully_adjusted
  266. # Format results with publication-ready biomarker descriptions, covariate descriptions, and model labels.
  267. publication_results <- results_df %>%
  268. mutate(
  269. inverted_HR = ifelse(HR < 1, 1 / HR, NA),
  270. inverted_lower_95CI = ifelse(HR < 1, 1 / upper_95CI, NA),
  271. inverted_upper_95CI = ifelse(HR < 1, 1 / lower_95CI, NA),
  272. biomarker_name = ifelse(
  273. HR < 1,
  274. paste0("-", biomarker_name),
  275. biomarker_name
  276. ),
  277. # Remove the "-" prefix before matching biomarker descriptions.
  278. biomarker_clean = gsub("^-", "", biomarker_name),
  279. # Order biomarkers according to the demographic-adjusted model.
  280. biomarker_clean = factor(
  281. biomarker_clean,
  282. levels = biomarker_order_fully_adjusted
  283. )
  284. ) %>%
  285. arrange(biomarker_clean,
  286. factor(model, levels = c(
  287. "demographics",
  288. "demographics_lifestyle",
  289. "demographics_lifestyle_diseases"
  290. ))) %>%
  291. mutate(
  292. # Assign publication-ready descriptions to each biomarker.
  293. biomarker_description = recode(
  294. as.character(biomarker_clean),
  295. # Cognition.
  296. "g" = "General cognitive factor",
  297. # MRI-derived measures of brain structure.
  298. "TBV_to_ICV_ratio" = "MRI-derived total brain volume to intracranial volume ratio",
  299. "GMV_to_ICV_ratio" = "MRI-derived grey matter volume to intracranial volume ratio",
  300. "WMHV_to_ICV_ratio" = "MRI-derived white matter hyperintensity volume to intracranial volume ratio",
  301. "MRI_brain_age_gap" = "MRI-derived brain age gap",
  302. # Physical function and lung function.
  303. "Grip_strength" = "Dominant hand grip strength (kg)",
  304. "Six_meter_walk_time" = "6-metre walk time (seconds)",
  305. "FVC" = "Forced vital capacity (L)",
  306. "FEV" = "Forced expiratory volume in 1 second (L)",
  307. "FER" = "Forced expiratory ratio (%)",
  308. # Lifestyle and anthropometric measures.
  309. "Alcohol_units" = "Alcohol consumption (units per week)",
  310. "Smoking_pack_years" = "Smoking pack years",
  311. "BMI" = "Body mass index (kg/m²)",
  312. # Molecular ageing measures.
  313. "Telomere_length" = "Leukocyte telomere length (bp)",
  314. "GrimAge2_acceleration" = "Epigenetic age acceleration",
  315. # Plasma proteomic organ age gaps.
  316. "Adipose_age_gap" = "Plasma proteomic adipose age gap",
  317. "Artery_age_gap" = "Plasma proteomic arterial age gap",
  318. "Brain_age_gap" = "Plasma proteomic brain age gap",
  319. "Heart_age_gap" = "Plasma proteomic heart age gap",
  320. "Immune_age_gap" = "Plasma proteomic immune age gap",
  321. "Intestine_age_gap" = "Plasma proteomic intestine age gap",
  322. "Kidney_age_gap" = "Plasma proteomic kidney age gap",
  323. "Liver_age_gap" = "Plasma proteomic liver age gap",
  324. "Lung_age_gap" = "Plasma proteomic lung age gap",
  325. "Muscle_age_gap" = "Plasma proteomic muscle age gap",
  326. "Pancreas_age_gap" = "Plasma proteomic pancreas age gap"
  327. ),
  328. # Provide descriptive labels for each covariate adjustment set.
  329. covariates = recode(
  330. covariates,
  331. "ageyrs_w2, sex" = "Age + sex",
  332. "ageyrs_w2, sex, Smoking_pack_years, Alcohol_units, BMI" =
  333. "Age + sex + smoking + alcohol + BMI",
  334. "ageyrs_w2, sex, Smoking_pack_years, Alcohol_units, BMI, hibp_w2, hichol_w2, diab_w2, cvdhist_w2, stroke_w2, neoplas_w2, arthrit_w2" =
  335. "Age + sex + smoking + alcohol + BMI + high blood pressure + high cholesterol + diabetes + cardiovascular disease + stroke + neoplasm + arthritis"
  336. ),
  337. # Provide descriptive labels for each Cox model.
  338. model = recode(
  339. model,
  340. "demographics" = "Cox model adjusted for demographics",
  341. "demographics_lifestyle" = "Cox model adjusted for demographics and lifestyle",
  342. "demographics_lifestyle_diseases" = "Cox model adjusted for demographics, lifestyle and diseases"
  343. )
  344. ) %>%
  345. select(
  346. biomarker_name,
  347. biomarker_description,
  348. model,
  349. covariates,
  350. n_subjects,
  351. HR,
  352. lower_95CI,
  353. upper_95CI,
  354. inverted_HR,
  355. inverted_lower_95CI,
  356. inverted_upper_95CI,
  357. p_value,
  358. adj_p_benjamini,
  359. ph_violation,
  360. ph_chisq,
  361. ph_p
  362. )
  363. write_csv(publication_results, file.path(OUT_DIR, "inverted_univariable_aging_biomarker_publication_results_all_subjects.csv"))
  364. # ---------------------------
  365. # 9. Generate forest plots for each model
  366. # ---------------------------
  367. # Biomarkers to display in bold in the forest plots.
  368. bold_labels <- c(
  369. "Liver age gap", "Immune age gap", "Heart age gap",
  370. "Pancreas age gap", "Brain age gap", "Muscle age gap",
  371. "Adipose age gap", "Kidney age gap", "Lung age gap",
  372. "Intestine age gap", "Artery age gap"
  373. )
  374. # Function to generate a forest plot for a single Cox model.
  375. create_forest_plot <- function(data, model_name) {
  376. plot_data <- data %>%
  377. filter(model == model_name) %>%
  378. filter(!is.na(inverted_HR)) %>%
  379. mutate(
  380. biomarker_name = str_replace_all(biomarker_name, "_", " "),
  381. biomarker_name = fct_reorder(
  382. biomarker_name,
  383. inverted_HR
  384. ),
  385. fill_color = ifelse(
  386. adj_p_benjamini > 0.05,
  387. "white",
  388. ifelse(
  389. str_detect(biomarker_name, "-"),
  390. "#5EC1C0",
  391. "#FFA69E"
  392. )
  393. )
  394. )
  395. # Create Markdown-formatted labels for bold organ age gaps.
  396. y_labels_md <- sapply(levels(plot_data$biomarker_name), function(x) {
  397. if (str_replace(x, "^-", "") %in% bold_labels) {
  398. paste0("**", x, "**")
  399. } else {
  400. x
  401. }
  402. })
  403. names(y_labels_md) <- levels(plot_data$biomarker_name)
  404. # Generate the forest plot.
  405. p <- ggplot(
  406. plot_data,
  407. aes(
  408. x = inverted_HR,
  409. y = biomarker_name
  410. )
  411. ) +
  412. geom_errorbarh(
  413. aes(
  414. xmin = inverted_lower_95CI,
  415. xmax = inverted_upper_95CI
  416. ),
  417. height = 0.2
  418. ) +
  419. geom_point(
  420. aes(fill = fill_color),
  421. shape = 21,
  422. size = 4,
  423. color = "black",
  424. stroke = 1
  425. ) +
  426. scale_fill_identity() +
  427. geom_vline(
  428. xintercept = 1,
  429. linetype = "dashed",
  430. size = 0.8
  431. ) +
  432. labs(
  433. x = "Hazard ratio (95% CI)",
  434. y = ""
  435. ) +
  436. scale_x_continuous(
  437. limits = c(0.6, 2.0),
  438. breaks = seq(0.6, 2.0, by = 0.2)
  439. ) +
  440. scale_y_discrete(
  441. labels = y_labels_md
  442. ) +
  443. theme_classic(base_size = 20) +
  444. theme(
  445. axis.ticks = element_line(color = "black"),
  446. panel.grid = element_blank(),
  447. panel.border = element_blank(),
  448. axis.line = element_line(color = "black"),
  449. legend.position = "none",
  450. plot.title = element_blank(),
  451. axis.text.y = element_markdown(size = 20),
  452. axis.text.x = element_text(size = 20)
  453. )
  454. return(p)
  455. }
  456. # Generate forest plots for each covariate adjustment model.
  457. p_demographics <- create_forest_plot(
  458. inverted_univariable_aging_biomarker_results,
  459. "demographics"
  460. )
  461. p_demographics_lifestyle <- create_forest_plot(
  462. inverted_univariable_aging_biomarker_results,
  463. "demographics_lifestyle"
  464. )
  465. p_demographics_lifestyle_diseases <- create_forest_plot(
  466. inverted_univariable_aging_biomarker_results,
  467. "demographics_lifestyle_diseases"
  468. )
  469. # Display the individual forest plots.
  470. p_demographics
  471. p_demographics_lifestyle
  472. p_demographics_lifestyle_diseases
  473. # Save the individual forest plots.
  474. ggsave(
  475. file.path(OUT_DIR, "forest_plot_ageing_biomarkers_demographics.png"),
  476. p_demographics,
  477. width = 10,
  478. height = 10,
  479. dpi = 600
  480. )
  481. ggsave(
  482. file.path(OUT_DIR, "forest_plot_ageing_biomarkers_demographics_lifestyle.png"),
  483. p_demographics_lifestyle,
  484. width = 10,
  485. height = 10,
  486. dpi = 600
  487. )
  488. ggsave(
  489. file.path(OUT_DIR, "forest_plot_ageing_biomarkers_demographics_lifestyle_diseases.png"),
  490. p_demographics_lifestyle_diseases,
  491. width = 10,
  492. height = 10,
  493. dpi = 600
  494. )
  495. # ---------------------------
  496. # 10. Combined forest plot: three models per biomarker
  497. # ---------------------------
  498. # Biomarkers to display in bold in the combined forest plots.
  499. bold_labels <- c(
  500. "Liver age gap", "Immune age gap", "Heart age gap",
  501. "Pancreas age gap", "Brain age gap", "Muscle age gap",
  502. "Adipose age gap", "Kidney age gap", "Lung age gap",
  503. "Intestine age gap", "Artery age gap"
  504. )
  505. # Define biomarker order based on the demographics model.
  506. biomarker_order_demographics <- inverted_univariable_aging_biomarker_results %>%
  507. filter(model == "demographics") %>%
  508. arrange(inverted_HR) %>%
  509. pull(biomarker_name)
  510. # Function to generate a combined forest plot using a specified biomarker ordering.
  511. make_forest_plot <- function(biomarker_order) {
  512. # Prepare data for plotting.
  513. plot_data <- inverted_univariable_aging_biomarker_results %>%
  514. filter(!is.na(inverted_HR)) %>%
  515. mutate(
  516. # Classify associations according to statistical significance
  517. # and direction of the original hazard ratio.
  518. effect_direction = case_when(
  519. adj_p_benjamini > 0.05 ~ "Not significant",
  520. HR < 1 ~ "Negative",
  521. HR >= 1 ~ "Positive"
  522. ),
  523. biomarker_name = str_replace_all(biomarker_name, "_", " "),
  524. biomarker_name = factor(
  525. biomarker_name,
  526. levels = str_replace_all(biomarker_order, "_", " ")
  527. ),
  528. # Define the display order for the three Cox models.
  529. model = factor(
  530. model,
  531. levels = c(
  532. "demographics",
  533. "demographics_lifestyle",
  534. "demographics_lifestyle_diseases"
  535. )
  536. ),
  537. model_for_dodge = factor(
  538. model,
  539. levels = rev(c(
  540. "demographics",
  541. "demographics_lifestyle",
  542. "demographics_lifestyle_diseases"
  543. ))
  544. )
  545. )
  546. # Create Markdown-formatted labels for bold organ age gaps.
  547. y_labels_md <- sapply(levels(plot_data$biomarker_name), function(x) {
  548. if (x %in% bold_labels) {
  549. paste0("**", x, "**")
  550. } else {
  551. x
  552. }
  553. })
  554. names(y_labels_md) <- levels(plot_data$biomarker_name)
  555. # Generate the combined forest plot.
  556. p_all_models <- ggplot(
  557. plot_data,
  558. aes(
  559. x = inverted_HR,
  560. y = biomarker_name,
  561. shape = model,
  562. group = model_for_dodge
  563. )
  564. ) +
  565. geom_errorbarh(
  566. aes(
  567. xmin = inverted_lower_95CI,
  568. xmax = inverted_upper_95CI,
  569. colour = effect_direction
  570. ),
  571. height = 0.15,
  572. linewidth = 0.8,
  573. position = position_dodge(width = 0.8)
  574. ) +
  575. geom_point(
  576. aes(
  577. fill = effect_direction
  578. ),
  579. size = 3.5,
  580. colour = "black",
  581. stroke = 1,
  582. position = position_dodge(width = 0.8)
  583. ) +
  584. scale_fill_manual(
  585. values = c(
  586. "Not significant" = "grey",
  587. "Positive" = "#FFA69E",
  588. "Negative" = "#5EC1C0"
  589. ),
  590. name = "Association"
  591. ) +
  592. scale_colour_manual(
  593. values = c(
  594. "Not significant" = "grey",
  595. "Positive" = "#FFA69E",
  596. "Negative" = "#5EC1C0"
  597. ),
  598. guide = "none"
  599. ) +
  600. scale_shape_manual(
  601. values = c(
  602. "demographics" = 16,
  603. "demographics_lifestyle" = 17,
  604. "demographics_lifestyle_diseases" = 4
  605. ),
  606. labels = c(
  607. "Age + sex",
  608. "Age + sex + lifestyle",
  609. "Age + sex + lifestyle + diseases"
  610. ),
  611. name = "Model"
  612. ) +
  613. geom_vline(
  614. xintercept = 1,
  615. linetype = "dashed",
  616. linewidth = 0.8
  617. ) +
  618. labs(
  619. x = "Hazard ratio (95% CI)",
  620. y = ""
  621. ) +
  622. scale_x_continuous(
  623. limits = c(0.8, 1.8),
  624. breaks = seq(0.8, 1.8, by = 0.2)
  625. ) +
  626. scale_y_discrete(
  627. labels = y_labels_md
  628. ) +
  629. guides(
  630. fill = guide_legend(
  631. override.aes = list(
  632. shape = 21,
  633. colour = "black",
  634. size = 4
  635. )
  636. ),
  637. shape = guide_legend(
  638. override.aes = list(
  639. fill = "white",
  640. colour = "black",
  641. size = 4
  642. )
  643. )
  644. ) +
  645. theme_classic(base_size = 20) +
  646. theme(
  647. axis.ticks = element_line(color = "black"),
  648. panel.grid = element_blank(),
  649. panel.border = element_blank(),
  650. axis.line = element_line(color = "black"),
  651. legend.position = "right",
  652. legend.box = "vertical",
  653. legend.title = element_text(size = 20),
  654. legend.text = element_text(size = 18),
  655. axis.text.y = element_markdown(size = 20),
  656. axis.text.x = element_text(size = 20)
  657. )
  658. return(p_all_models)
  659. }
  660. # Generate combined forest plot.
  661. p_demographics <- make_forest_plot(
  662. biomarker_order_demographics)
  663. # Save the combined forest plot.
  664. ggsave(
  665. file.path(
  666. OUT_DIR,
  667. "forest_plot_ageing_biomarkers_demographics_order.png"
  668. ),
  669. p_demographics,
  670. width = 14,
  671. height = 16,
  672. dpi = 600
  673. )
  674. ggsave(
  675. file.path(
  676. OUT_DIR,
  677. "forest_plot_ageing_biomarkers_demographics_order.pdf"
  678. ),
  679. p_demographics,
  680. width = 14,
  681. height = 16
  682. )
  683. # ---------------------------
  684. # 11. Compare log(HR) correlation between the full sample and the 460-subject common sample
  685. # ---------------------------
  686. # Load Cox results from full sample and 460-subject common sample.
  687. publication_results_all_subjects <- read_csv("/CCACE_Shared/Maira/OrganAgeProject/Univariate_aging_biomarkers_mortality_cox/inverted_univariable_aging_biomarker_publication_results_all_subjects.csv")
  688. publication_results_common_subjects <- read_csv("/CCACE_Shared/Maira/OrganAgeProject/Univariate_aging_biomarkers_mortality_cox/inverted_univariable_aging_biomarker_publication_results_460subjects.csv")
  689. # Restrict the full-sample results to the demographic-adjusted model.
  690. publication_results_all_subjects <- publication_results_all_subjects %>%
  691. filter(model == "demographics")
  692. # Calculate log(HR) for the full sample.
  693. publication_results_all_subjects <- publication_results_all_subjects %>%
  694. mutate(logHR = log(HR))
  695. # Calculate log(HR) for the common sample.
  696. publication_results_common_subjects <- publication_results_common_subjects %>%
  697. mutate(logHR = log(HR))
  698. # Match biomarker estimates between the two datasets.
  699. merged_df <- publication_results_all_subjects %>%
  700. select(biomarker_name, logHR_all = logHR) %>%
  701. inner_join(
  702. publication_results_common_subjects %>%
  703. select(biomarker_name, logHR_common = logHR),
  704. by = "biomarker_name"
  705. )
  706. View(merged_df)
  707. # Calculate the Pearson correlation between log(HR) estimates across the two sample definitions.
  708. cor_test <- cor.test(
  709. merged_df$logHR_all,
  710. merged_df$logHR_common,
  711. method = "pearson"
  712. )
  713. cor_test
  714. # Compute symmetric axis limits for the correlation plot.
  715. x_min <- min(merged_df$logHR_all, merged_df$logHR_common, na.rm = TRUE)
  716. x_max <- max(merged_df$logHR_all, merged_df$logHR_common, na.rm = TRUE)
  717. axis_limit <- max(abs(x_min), abs(x_max))
  718. axis_limit <- ceiling(axis_limit * 2) / 2
  719. # Generate the correlation plot.
  720. r_plot <- ggplot(merged_df, aes(x = logHR_all, y = logHR_common)) +
  721. geom_vline(xintercept = 0, color = "black", linewidth = 0.8) +
  722. geom_hline(yintercept = 0, color = "black", linewidth = 0.8) +
  723. geom_point(shape = 21,
  724. fill = "#1E7AB5",
  725. color = "black",
  726. size = 4.5,
  727. stroke = 0.8,
  728. alpha = 0.9) +
  729. # Automatically position labels for most biomarkers.
  730. geom_text_repel(
  731. data = filter(merged_df,
  732. !biomarker_name %in% c("MRI_brain_age_gap", "Six_meter_walk_time")),
  733. aes(label = gsub("_", " ", biomarker_name)),
  734. size = 4.5,
  735. max.overlaps = Inf,
  736. box.padding = 1.0,
  737. point.padding = 0.3,
  738. force = 2,
  739. force_pull = 1,
  740. min.segment.length = 0,
  741. segment.color = "grey60",
  742. segment.size = 0.4,
  743. segment.alpha = 0.9,
  744. seed = 42
  745. ) +
  746. # Manually adjust the labels for two overlapping biomarkers.
  747. geom_text_repel(
  748. data = filter(merged_df,
  749. biomarker_name %in% c("MRI_brain_age_gap", "Six_meter_walk_time")),
  750. aes(label = gsub("_", " ", biomarker_name)),
  751. size = 4.5,
  752. max.overlaps = Inf,
  753. box.padding = 1.0,
  754. point.padding = 0.3,
  755. force = 2,
  756. force_pull = 1,
  757. min.segment.length = 0,
  758. segment.color = "grey60",
  759. segment.size = 0.4,
  760. segment.alpha = 0.9,
  761. nudge_x = 0.15,
  762. nudge_y = 0.15,
  763. seed = 42
  764. ) +
  765. geom_abline(slope = 1, intercept = 0,
  766. linetype = "dashed",
  767. color = "grey50",
  768. linewidth = 0.8) +
  769. scale_x_continuous(limits = c(-axis_limit, axis_limit),
  770. expand = expansion(mult = c(0, 0.05))) +
  771. scale_y_continuous(limits = c(-axis_limit, axis_limit),
  772. expand = expansion(mult = c(0, 0.05))) +
  773. coord_equal() +
  774. theme_bw(base_size = 20) +
  775. theme(
  776. panel.grid.major = element_line(color = "grey95"),
  777. panel.grid.minor = element_line(color = "grey95"),
  778. axis.line = element_line(color = "black"),
  779. axis.ticks = element_line(color = "black"),
  780. plot.title = element_blank(),
  781. axis.text = element_text(size = 20),
  782. axis.title = element_text(size = 20)
  783. ) +
  784. labs(
  785. x = "log(HR) for maximum sample size",
  786. y = "log(HR) for common sample size"
  787. )
  788. # Save the correlation plot.
  789. ggsave(filename = file.path(OUT_DIR, "correlation_of_biomarkerlogHRs_on_all_vs_common_subjects.png"),
  790. plot = r_plot, width = 10, height = 10, dpi = 600)
  791. ggsave(filename = file.path(OUT_DIR, "correlation_of_biomarkerlogHRs_on_all_vs_common_subjects.pdf"),
  792. plot = r_plot, width = 10, height = 10, dpi = 600)

2_Cox_Mortality_Associations_of_Individual_Ageing_Biomarkers.R at commit d7bc5df, under GPL-3.0 · at the source

Overview

  1. Lothian Birth Cohorts, Edinburgh Futures Institute, The University of Edinburgh, Edinburgh, EH3 9EF, UK
  2. Lothian Birth Cohorts, Department of Psychology, The University of Edinburgh, Edinburgh, EH8 9JZ, UK
  3. Institute of Genetics and Cancer, The University of Edinburgh, Edinburgh, EH4 2XU, UK
  4. Institute for Neuroscience and Cardiovascular Research, The University of Edinburgh, Edinburgh, UK
  5. Scottish Imaging Network, A Platform for Scientific Excellence (SINAPSE) Collaboration, Edinburgh, UK
  6. Row Fogo Centre for Research into Small Vessel Diseases, Edinburgh, UK
  7. Alzheimer Scotland Dementia Research Centre, The University of Edinburgh, Edinburgh, UK
  8. Dementia Network, NHS Research Scotland, Edinburgh, UK
  9. UK Dementia Research Institute, BHF-UK DRI Centre for Vascular Dementia Research, Edinburgh, UK
  10. Department of Clinical and Biomedical Sciences, University of Exeter Medical School, University of Exeter, Barrack Road, RILD Building, Royal Devon & Exeter Hospital, Barrack Road, Exeter, Devon, EX2 5DW, UK
  11. Laboratory of Behavioral Neuroscience, National Institute on Aging, Baltimore, MD, 21224, USA
  12. Department of Psychology, The University of Texas, Austin, TX 78712, United States
Institutions: University of Edinburgh (United Kingdom); Institute of Genetics and Cancer (United Kingdom); NHS Research Scotland (United Kingdom); UK Dementia Research Institute (United Kingdom); University of Exeter (United Kingdom); National Institute on Aging (United States); The University of Texas at Austin (United States)
Dates: published online 10 March 2026
Type: Preprint · Language: English
License: CC BY
Identifiers: DOI 10.64898/2026.03.09.26347914 · OpenAlex W7134901660
Open access: green, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), structural MRI / diffusion (modality), human (organism), clinical / translational (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Machine learning, Connectivity, Physiology & signal measures
Topic: Genetics, Aging, and Longevity in Model Organisms (Aging, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: Wellcome Trust (218493/Z/19/Z, 221890/Z/20/Z); Biotechnology and Biological Sciences Research Council (BB/W008793/1)
Citations: not cited yet (Europe PMC); 138 references in the paper

Abstract

Ageing biomarkers can predict mortality risk beyond chronological age. Recently, plasma proteins were used to estimate the biological ages of eleven human organs, including the brain, heart, liver, kidneys, and pancreas. Accelerated organ ageing is linked to higher all-cause mortality; however, systematic benchmarking against established ageing biomarkers is lacking. Here, we pursued two complementary aims. First, we benchmarked proteomic organ ages against multimodal ageing biomarkers for all-cause mortality (444 deaths; ≤17-year follow-up) using Cox regression in 861 Lothian Birth Cohort 1936 (LBC1936) participants. Ageing biomarkers included epigenetic age (GrimAge2), telomere length, neuroimaging, general cognitive function (g), and physical function (grip strength, walk time, and respiratory function). Among proteomic organ ageing biomarkers, accelerated liver (HRperSD [95%CI] = 1.43 [1.30–1.58]), immune (1.42 [1.29–1.57]), and heart (1.38 [1.25–1.53]) ageing were most strongly associated with higher mortality risk. However, GrimAge2 acceleration, total brain volume (TBV), grey matter volume, respiratory function, and g exhibited higher hazard estimates (HRperSD = 1.44–1.62) than organ ageing biomarkers. In a Cox model including all biomarkers, only TBV, white matter hyperintensity volume, g, and walk time associated with mortality. Second, survival analyses of SomaScan 11K plasma proteins identified 202 proteins associated with mortality and enriched for the liver and immune-related biological processes, with the strongest effects observed for GDF15 (HRperSD [95%CI] = 1.53 [1.37–1.72]), CST3 (1.48 [1.29–1.69]), and COL18A1 (1.47 [1.30–1.68]). These findings provide a systematic, cross-modal benchmarking of proteomic organ ages against established ageing biomarkers and highlight plasma proteomic signatures of mortality.

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

Repositories

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

marioni-group/Mortality_Biomarkers_LBC1936

License: GPL-3.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: d7bc5df2cd5060660bf084e56a843740320cb4c8, 31 August 2026
Languages: R (8)
Size: 10 files, 8 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: tidyverse (8 files), ggplot2 (7 files), survival (4 files), broom (2 files), clusterProfiler (1 file), data.table (1 file), ggpubr (1 file), glmnet (1 file), lavaan (1 file), reshape2 (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
10 files

lothianbirthcohorts.github.io/longitudinal-g-models

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: the references
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 8 scripts, each with its path and the digest of its content;
  • 19 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

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

Data Availability Statement

All data produced in the present study are reported in Supplementary Tables. The code used for analyses is openly accessible at the following GitHub repository: https://github.com/marioni-group/Mortality_Biomarkers_LBC1936.git. The original data analysed in this study are not publicly available because they contain sensitive information that could compromise participant consent and confidentiality. Data access instructions for the LBC are available at: https://www.ed.ac.uk/lothian-birth-cohorts/data-access-collaboration.

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

Recorded: type, language, journal, dates, 15 authors, 2 funders, 127 references.

Cite

This paper

Pyrgioti, M., Eguiagaray, I. M., Redmond, P., Corley, J., Bastin, M. E., Hernández, M. V., Russ, T. C., Wardlaw, J. M., Hannon, E., Deary, I. J., Walker, K. A., Tucker-Drob, E. M., Cox, S. R., Marioni, R. E., & Harris, S. E. (2026). Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause Mortality. medRxiv (preprint). https://doi.org/10.64898/2026.03.09.26347914

BibTeX

@article{pyrgioti2026multimodal,
author = {Pyrgioti, Maira and Eguiagaray, Ines Mesa and Redmond, Paul and Corley, Janie and Bastin, Mark E. and Hernández, Maria Valdés and Russ, Tom C. and Wardlaw, Joanna M. and Hannon, Eilis and Deary, Ian J. and Walker, Keenan A. and Tucker-Drob, Elliot M. and Cox, Simon R. and Marioni, Riccardo E. and Harris, Sarah E.},
title = {{Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause Mortality}},
journal = {medRxiv (preprint)},
year = {2026},
month = mar,
publisher = {medRxiv},
doi = {10.64898/2026.03.09.26347914},
url = {https://doi.org/10.64898/2026.03.09.26347914}
}

RIS

TY - JOUR
AU - Pyrgioti, Maira
AU - Eguiagaray, Ines Mesa
AU - Redmond, Paul
AU - Corley, Janie
AU - Bastin, Mark E.
AU - Hernández, Maria Valdés
AU - Russ, Tom C.
AU - Wardlaw, Joanna M.
AU - Hannon, Eilis
AU - Deary, Ian J.
AU - Walker, Keenan A.
AU - Tucker-Drob, Elliot M.
AU - Cox, Simon R.
AU - Marioni, Riccardo E.
AU - Harris, Sarah E.
TI - Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause Mortality
T2 - medRxiv (preprint)
J2 - medRxiv
PY - 2026
DA - 2026/03/10
PB - medRxiv
DO - 10.64898/2026.03.09.26347914
UR - https://doi.org/10.64898/2026.03.09.26347914
LA - en
ER -

CSL-JSON

{
"id": "10.64898/2026.03.09.26347914",
"type": "article",
"title": "Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause Mortality",
"container-title": "medRxiv (preprint)",
"author": [
{
"family": "Pyrgioti",
"given": "Maira"
},
{
"family": "Eguiagaray",
"given": "Ines Mesa"
},
{
"family": "Redmond",
"given": "Paul"
},
{
"family": "Corley",
"given": "Janie"
},
{
"family": "Bastin",
"given": "Mark E."
},
{
"family": "Hernández",
"given": "Maria Valdés"
},
{
"family": "Russ",
"given": "Tom C."
},
{
"family": "Wardlaw",
"given": "Joanna M."
},
{
"family": "Hannon",
"given": "Eilis"
},
{
"family": "Deary",
"given": "Ian J."
},
{
"family": "Walker",
"given": "Keenan A."
},
{
"family": "Tucker-Drob",
"given": "Elliot M."
},
{
"family": "Cox",
"given": "Simon R."
},
{
"family": "Marioni",
"given": "Riccardo E."
},
{
"family": "Harris",
"given": "Sarah E."
}
],
"container-title-short": "medRxiv",
"DOI": "10.64898/2026.03.09.26347914",
"publisher": "medRxiv",
"URL": "https://doi.org/10.64898/2026.03.09.26347914",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
10
]
]
}
}

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: lavaan, glmnet, survival, 6 other tools, genetics / omics, 1 reference
[2] doi:10.1016/j.isci.2026.115657 [code]
Integration of machine learning to develop a disulfidptosis model for predicting glioma prognosis, immunotherapy response, and drug.
Journal: iScience
In common: glmnet, survival, broom, 6 other tools, clinical / translational
[3] doi:10.1016/j.xcrm.2026.102682 [code]
TET CpG sequence-context-specific DNA demethylation shapes progression of IDH-mutant gliomas.
Journal: Cell reports. Medicine
In common: glmnet, survival, broom, 6 other tools, genetics / omics
[4] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: glmnet, survival, broom, 6 other tools
[5] doi:10.1136/svn-2024-003690 [code]
Associations of accelerated biological ageing with incident dementia, cognitive functions and brain structure: a prospective cohort study based on UK Biobank.
Journal: Stroke and vascular neurology
In common: survival, broom, ggplot2, 1 other tool, clinical / translational, 4 references
[6] doi:10.1038/s41467-026-71682-8 [code]
GWAS meta-analysis of cerebrospinal fluid Alzheimer's biomarkers reveals loci regulating lipids, brain volume and autophagy.
Journal: Nature communications
In common: clusterProfiler, reshape2, data.table, 2 other tools, structural MRI / diffusion, genetics / omics, author Riccardo E Marioni
[7] doi:10.3390/ijms27093997 [code]
Coordinated Multicellular Immune Programs and Drug Targets Revealed by Single-Cell Analysis in Driver-Mutated NSCLC.
Journal: International journal of molecular sciences
In common: glmnet, survival, clusterProfiler, 5 other tools, genetics / omics
[8] doi:10.1038/s41514-026-00456-9 [code]
Exploring the link between body physiology and cognition: the role of the brain and aging.
Journal: npj aging
In common: lavaan, data.table, ggplot2, 1 other tool, 4 references
[9] doi:10.1038/s41514-026-00391-9 [code]
Region-specific transcriptional signatures of brain aging in the absence of neuropathology at the single-cell level.
Journal: npj aging
In common: broom, reshape2, ggpubr, 3 other tools, genetics / omics, 3 references
[10] doi:10.1016/j.isci.2026.116439 [code]
Decoding the role of transcriptomic clocks in the human prefrontal cortex.
Journal: iScience
In common: glmnet, reshape2, data.table, 2 other tools, genetics / omics, 3 references

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.