OSCR

Exposome-wide patterns predict brain health in aging.

Code ↔ Paper

9 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 9 matches
  1. [1] § Methods › Grey matter health prediction model ↔ 2_BAGCharacterization/2_1_BAG_Characterization.py, lines 184–209 · score 0.80 · T1 head image, volumetric scaling, standard space, height, sex, confounds
  2. [2] § Methods › Grey matter health prediction model ↔ 2_BAGCharacterization/2_2_BAG_Visualisation.py, lines 185–210 · score 0.80 · T1 head image, volumetric scaling, standard space, height, sex, confounds
  3. [3] § Methods › Grey matter health prediction model ↔ 1_BrainAgePrediction/1_1_BrainAgePrediction.py, lines 179–229 · score 0.76 · squared error, cross validation, absolute error, metrics, root, shuffling
  4. [4] § Methods › Participants ↔ 1_BrainAgePrediction/1_0_DataFiltering.py, lines 219–272 · score 0.74 · long standing illness, healthy participants, stroke, ICD, diagnosis, field
  5. [5] § Methods › Brain age prediction model ↔ 1_BrainAgePrediction/1_1_BrainAgePrediction.py, lines 141–177 · score 0.73 · Linear Regression, Random Forest, Brain Age Prediction, tuning, RF, hyperparameter
  6. [6] § Methods › Grey matter health prediction model ↔ 2_BAGCharacterization/2_1_BAG_Characterization.py, lines 243–292 · score 0.71 · squared error, cross validation, absolute error, root, shuffling, fold
  7. [7] § Methods › Brain age prediction model ↔ 1_BrainAgePrediction/1_2_visualisation.py, lines 305–339 · score 0.59 · brain age prediction, bias correction, chronological age, slope, intercept, correlation
  8. [8] § Methods › Exposome variables ↔ 2_BAGCharacterization/2_3_BAG_to_SHAP.ipynb, lines 110–139 · score 0.57 · body morphology, socio affective, mental health, bone, composition
  9. [9] § Results › Brain age gap indicator of grey matter health ↔ 1_BrainAgePrediction/1_2_visualisation.py, lines 305–339 · score 0.53 · Brain Age prediction, Absolute Error, chronological age, MAE, correlation, healthy

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 · 386 lines · 13 KB · MIT · 2 matches

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @author:
  5. Mostafa Mahdipour [email hidden]
  6. """
  7. """
  8. # Brian Age Gap (BAG) prediction
  9. In this code, we try to change the features into continuous and categorical
  10. then using uptona for hyperparameter tuning.
  11. """
  12. # %% 1 importing libraries
  13. import sys
  14. import os
  15. import ast # convert string model_params to dictionary
  16. from click import command
  17. import numpy as np
  18. # import wget
  19. import pandas as pd # to use dataframe
  20. import glob
  21. import pickle
  22. # import psutil
  23. from pprint import pprint # To print in a pretty way
  24. # import missingno as msno
  25. import nest_asyncio
  26. nest_asyncio.apply()
  27. import matplotlib.pyplot as plt # to make plots
  28. import seaborn as sns # to make plots
  29. import scipy # to calculate correlation
  30. import optuna
  31. from optuna.distributions import IntDistribution
  32. from optuna.distributions import FloatDistribution
  33. from sklearn.metrics import mean_absolute_error # to calculate MAE
  34. from sklearn.metrics import mean_squared_error # to calculate MSE
  35. from sklearn import linear_model
  36. from sklearn.model_selection import KFold
  37. # from sklearn.model_selection import train_test_split, RepeatedStratifiedKFold
  38. from julearn import run_cross_validation
  39. from julearn.utils import configure_logging
  40. from julearn.pipeline import PipelineCreator
  41. from julearn.model_selection import RepeatedContinuousStratifiedKFold
  42. # from julearn.model_selection import ContinuousStratifiedKFold
  43. import tqdm
  44. tqdm.tqdm
  45. import shap
  46. # %% 2 Color print in terminal
  47. RED = "\033[1;31m"
  48. BLUE = "\033[1;34m"
  49. CYAN = "\033[1;36m"
  50. GREEN = "\033[0;32m"
  51. RESET = "\033[0;0m"
  52. BOLD = "\033[;1m"
  53. REVERSE = "\033[;7m"
  54. UNDERLINE = '\033[4m'
  55. CBLACKBG = '\33[40m'
  56. CREDBG = '\33[41m'
  57. CGREENBG = '\33[42m'
  58. CYELLOWBG = '\33[43m'
  59. CBLUEBG = '\33[44m'
  60. CVIOLETBG = '\33[45m'
  61. CBEIGEBG = '\33[46m'
  62. CWHITEBG = '\33[47m'
  63. # %% 3 Starting statement
  64. sys.stdout.write(RED)
  65. # sys.stdout.write(BOLD)
  66. print(
  67. "\n\n================================================="
  68. "\nprogram started\n"
  69. "=================================================\n\n"
  70. )
  71. sys.stdout.write(CYAN)
  72. print('Julearn info\n')
  73. sys.stdout.write(RESET)
  74. # To log information
  75. configure_logging(level='INFO')
  76. # Checking which conda env are we using
  77. sys.stdout.write(GREEN)
  78. # sys.stdout.write(BOLD)
  79. print(
  80. "\nvirtual conda env:\n"
  81. )
  82. print(sys.executable)
  83. sys.stdout.write(RESET)
  84. #%% 4 Pathes
  85. My_current_path=os.path.abspath(os.getcwd())
  86. path_2_data_NEW = My_current_path + 'Path/to/exposome/Subgroups' # path to the exposome subgroups
  87. # for exmple:
  88. # path_2_data_NEW = My_current_path + '/../../../../' + '1_DATA/4_BAG_Prediction/9_DATA_4_BAG_GMV_SHAP'
  89. result_folder_Name= 'name of the folder' # name of the folder to save the results
  90. # for exmple:
  91. # result_folder_Name= '3_BAG_CR_RF' # 3 ==> subset # 3 or main subset, BAG ==> brain age gap, CR ==> with Confound Removal, RF ==> Random Forest
  92. Path_to_Save_Results = My_current_path + '/path/to/results/'+ result_folder_Name
  93. if not os.path.exists(Path_to_Save_Results):
  94. # If it doesn't exist, create it
  95. os.makedirs(Path_to_Save_Results)
  96. sys.stdout.write(GREEN)
  97. print(f"Directory '{Path_to_Save_Results}' created successfully.")
  98. sys.stdout.write(RESET)
  99. else:
  100. sys.stdout.write(RED)
  101. print(f"Directory '{Path_to_Save_Results}' already exists.")
  102. sys.stdout.write(RESET)
  103. #%% 5 creating optuna study
  104. '''
  105. If we run the code for the first time, we will get an error because there is no study to delete
  106. We can ignore the error and create the study with the "try & except" approach.
  107. '''
  108. study_name = result_folder_Name
  109. storage_name = "sqlite:///"+result_folder_Name+".db"
  110. try:
  111. optuna.delete_study(study_name=study_name, storage=storage_name)
  112. print(f"Study '{study_name}' deleted successfully.")
  113. except KeyError:
  114. print(f"Warning: The study '{study_name}' does not exist. Continuing with the next steps...")
  115. # optuna.delete_study(study_name="12_6_226_BAG_all_CR_RF", storage="sqlite:///rf-test.db")
  116. study = optuna.create_study(
  117. direction = "maximize",
  118. storage = storage_name,
  119. study_name = result_folder_Name,
  120. load_if_exists=True,
  121. )
  122. sys.stdout.write(CGREENBG)
  123. sys.stdout.write(UNDERLINE)
  124. sys.stdout.write(BLUE)
  125. # sys.stdout.write(BOLD)
  126. print("\n\n=================================================")
  127. print(f"The study '{result_folder_Name}' has been created successfully.")
  128. print("=================================================\n\n")
  129. sys.stdout.write(RESET)
  130. #%% 6 loading Data
  131. # ls function : This is a function that can do ls in a directory
  132. def listdir_nohidden(path):
  133. return glob.glob(os.path.join(path, '*')) # to make a list of our folders' contents
  134. list_of_input_files=listdir_nohidden(path_2_data_NEW)
  135. print(np.sort(list_of_input_files))
  136. '''
  137. As mentioned in the README file, we have 3 different subgroups of exposome data:
  138. - subgroup1.csv
  139. - subgroup2.csv
  140. - subgroup3.csv
  141. And a list of categorical features:
  142. - listofcols2Cat.npy
  143. Therefore, we have first check the files in the directory and then load the them.
  144. '''
  145. # Here we load the subgroup3 and listofcols2Cat:
  146. # (we can change the index to load other datasets)
  147. # loading the data : np.sort(list_of_input_files)[2] ==> 'subgroup3.csv'
  148. All_Data=pd.read_csv(np.sort(list_of_input_files)[2],index_col=0).reset_index(drop=True)
  149. # loading the Categorical data labels : np.sort(list_of_input_files)[-1] ==> 'listofcols2Cat.npy'
  150. loaded_list = np.load(np.sort(list_of_input_files)[-1], allow_pickle=True)
  151. #%% 7 parentheses
  152. All_Data.columns = All_Data.columns.str.replace(')', '')
  153. All_Data.columns = All_Data.columns.str.replace('(', '')
  154. All_Data.columns = All_Data.columns.str.replace(',', '')
  155. All_Data.columns = All_Data.columns.str.replace('/', '')
  156. # Perform string replacements on each element in the list
  157. listofcols2Category = [col.replace(')', '').replace('(', '').replace(',', '').replace('/', '') for col in loaded_list]
  158. #%% 8 Features and data types
  159. """
  160. defining Features and data types
  161. # X_list
  162. - confounds
  163. - features
  164. -- categorical
  165. -- continuous
  166. """
  167. Data2Model= All_Data.drop(columns=['TIV','GM',
  168. 'BAG', 'Session',
  169. 'Predicted_Age', 'Corrected_Predicted_Age'])
  170. y = 'Corrected_BAG' # target
  171. X_list = list(set(Data2Model.columns) - set(['SubjectID',
  172. 'Corrected_BAG'])) # features & confounds
  173. Our_Confounds = ['Age','Age2', 'Height-2.0', 'Sex',
  174. 'Volumetric_scaling_from_T1_head_image_to_standard_space-2.0']
  175. Our_Features = list(set(X_list) - set(Our_Confounds))
  176. common_elements = np.intersect1d(Our_Features, listofcols2Category) # the categorical features in our dataset
  177. ContinuousVars = list(set(Our_Features) - set(common_elements))
  178. # define features and confounds
  179. # {'categorical' : listofcols2Category, 'continuous' : ContinuousVars})
  180. X_types = {'continuous': list(ContinuousVars), 'categorical' : list(common_elements), 'confounds': list(Our_Confounds)}
  181. #%% 9 Pipeline
  182. rand_seed = 94
  183. creator = PipelineCreator(problem_type="regression", apply_to=["continuous","categorical"])
  184. creator.add("zscore", apply_to="continuous")
  185. creator.add("confound_removal", confounds="confounds", apply_to="continuous")
  186. # here we add the model. Models We have used:
  187. # 'linreg' ==> 'linear_regression', there is no hyperparameter for it to be tuned
  188. # 'ridge' ==> 'ridge', we have tuned alpha as a hyperparameter (see below)
  189. # 'svr' ==> 'linear_svr', we have tuned C, kernel, and gamma as a hyperparameters (see Julearn documentation)
  190. # 'rf' ==> 'random_forest', we have tuned n_estimators, min_samples_split, min_samples_leaf,and max_depth hyperparameters (see Julearn documentation)
  191. # the example of RandomForest hyperparameters:
  192. creator.add("rf",
  193. n_estimators=(200,1000,"uniform"),
  194. min_samples_split=(1,10, "uniform"),
  195. min_samples_leaf=(1,40, "uniform"),
  196. max_depth = (20,180, "uniform")
  197. )
  198. sys.stdout.write(RED)
  199. sys.stdout.write(BOLD)
  200. sys.stdout.write(CGREENBG)
  201. print(creator)
  202. sys.stdout.write(RESET)
  203. #%% 10 Nested CV and scores
  204. cv_splitter = RepeatedContinuousStratifiedKFold(3,
  205. n_splits=5, n_repeats=5,
  206. random_state=rand_seed,
  207. method='quantile')
  208. scoring = ['neg_mean_absolute_error', 'neg_mean_squared_error',
  209. 'neg_root_mean_squared_error',
  210. 'r2','r2_corr',
  211. 'r_corr']
  212. search_params = {
  213. "kind": "optuna",
  214. "n_trials": 100,
  215. "study": study,
  216. "cv": KFold(n_splits=5, shuffle = True, random_state=rand_seed),
  217. "verbose" : 1
  218. }
  219. #%% 11 run_cross_validation :
  220. scores, model, inspector = run_cross_validation(
  221. X=X_list,
  222. y=y,
  223. data=Data2Model,
  224. X_types=X_types,
  225. model=creator,
  226. return_train_score=True,
  227. return_estimator="all",
  228. return_inspector=True,
  229. seed=rand_seed,
  230. cv=cv_splitter,
  231. scoring=scoring,
  232. search_params=search_params,
  233. n_jobs=4, # as Fede sugested n_jobs should be set to 4
  234. )
  235. sys.stdout.write(BLUE)
  236. print('best para', model.best_params_)
  237. sys.stdout.write(RESET)
  238. sys.stdout.write(RED)
  239. print(
  240. "\n\n================================================="
  241. "\nModel Trained\n"
  242. "=================================================\n\n"
  243. )
  244. sys.stdout.write(RESET)
  245. # %% 12 saving
  246. # Save the model using pickle
  247. with open(Path_to_Save_Results+'/Model.pkl', 'wb') as file:
  248. pickle.dump(model, file)
  249. # Save the inspector using pickle
  250. with open(Path_to_Save_Results+'/inspector.pkl', 'wb') as file:
  251. pickle.dump(inspector, file)
  252. # Save scores using pickle
  253. with open(Path_to_Save_Results+'/scores.pkl', 'wb') as file:
  254. pickle.dump(scores, file)
  255. # %% 13 extra plots plot
  256. if not os.path.exists(Path_to_Save_Results+'/Outerfold_extra'):
  257. # If it doesn't exist, create it
  258. os.makedirs(Path_to_Save_Results+'/Outerfold_extra')
  259. sys.stdout.write(GREEN)
  260. print(f"Directory '{Path_to_Save_Results+'/Outerfold_extra'}' created successfully.")
  261. sys.stdout.write(RESET)
  262. else:
  263. sys.stdout.write(RED)
  264. print(f"Directory '{Path_to_Save_Results+'/Outerfold_extra'}' already exists.")
  265. sys.stdout.write(RESET)
  266. for i, (train_index, test_index) in enumerate(cv_splitter.split(Data2Model.loc[:,X_list], Data2Model.loc[:,y])):
  267. # sys.stdout.write(RED)
  268. # print("\n\n=================================================\n\n")
  269. # print(f"Fold {i}:")
  270. # sys.stdout.write(RESET)
  271. y_pred = scores['estimator'][i].predict(Data2Model.iloc[test_index,:].loc[:,X_list]).ravel()
  272. y_true=Data2Model.iloc[test_index,:].loc[:,y]
  273. mae=mean_absolute_error(y_true, y_pred)
  274. mse=mean_squared_error(y_true, y_pred)
  275. corr, p = scipy.stats.pearsonr(y_pred, y_true)
  276. # sys.stdout.write(CYAN)
  277. # print('Test MSE: ', mse ,'Test MAE: ', mae, 'Test Corr: ', corr)
  278. # sys.stdout.write(RESET)
  279. results_df_test = pd.DataFrame({'True BAG': y_true, 'Predicted BAG': y_pred})
  280. # Generate scatter plot
  281. fig100=plt.figure('scatter predicted BAG vs True BAG',figsize=(16,16))
  282. ax11=sns.jointplot(data=results_df_test, x="True BAG", y="Predicted BAG",
  283. kind="kde",fill=True, joint_kws={'alpha': 0.5} ,
  284. color='Darkorange') # peru
  285. ax11.ax_joint.set_xlim(-20,20)
  286. ax11.ax_joint.set_ylim(-20,20)
  287. ax11.ax_joint.plot([-20,20], [-20,20], 'r-', linewidth = 2)
  288. ax11.ax_joint.tick_params(axis='both', labelsize=20)
  289. sns.regplot(data=results_df_test, x='True BAG', y='Predicted BAG',
  290. scatter=False, color='black', line_kws={'linestyle':'--'}, ax=ax11.ax_joint)
  291. #calculate slope and intercept of regression equation
  292. slope_1, intercept_1, r_1, p_1, sterr_1 = scipy.stats.linregress( x=ax11.ax_joint.get_lines()[1].get_xdata(),
  293. y=ax11.ax_joint.get_lines()[1].get_ydata())
  294. # Add regression equation to the joint plot
  295. ax11.ax_joint.text(8, -10, 'y = ' + str(round(intercept_1, 3)) + ' + ' + str(round(slope_1, 3)) + 'x')
  296. plt.grid()
  297. # plt.show()
  298. # Save
  299. results_df_test.to_csv(Path_to_Save_Results+'/Outerfold_extra' + '/outer_CV_fold'+str(i)+'.csv')
  300. # # del results_df_test
  301. plt.savefig(Path_to_Save_Results+'/Outerfold_extra' + '/FOLD'+str(i)+'.png')
  302. plt.close(fig100)
  303. plt.close('all')
  304. del results_df_test
  305. del intercept_1
  306. del slope_1
  307. del y_pred
  308. del y_true
  309. del fig100
  310. del ax11
  311. # save scores
  312. scores.to_csv(Path_to_Save_Results+'/Outerfold_extra'+'/scores.csv')
  313. # %% 14 ending statement
  314. sys.stdout.write(RED)
  315. print(
  316. "\n\n================================================="
  317. "\nProgramm ended\n"
  318. "=================================================\n\n"
  319. )
  320. sys.stdout.write(RESET)
  321. # %%

2_1_BAG_Characterization.py at commit 0da13fa, under MIT · at the source

Overview

  1. Institute of Neuroscience and Medicine (INM-7: Brain and Behaviour), Research Centre Jülich, Jülich, Germany
  2. Institute of Systems Neuroscience, Heinrich Heine University Düsseldorf, Düsseldorf, Germany
  3. Department of Bioinformatics, Fraunhofer Institute for Algorithms and Scientific Computing (SCAI), Sankt Augustin, Germany
  4. Mathematical Institute, Heinrich Heine University Düsseldorf, Düsseldorf, Germany
  5. Department of Nuclear Medicine, Faculty of Medicine and University Hospital Cologne, University of Cologne, Cologne, Germany
  6. GIGA-CRC-Human Imaging, University of Liège, Liège, Belgium
Journal: Nature communications, volume 17, issue 1, article 3409
Dates: received 30 May 2025; accepted 16 March 2026; published online 10 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41467-026-71271-9 · PMID 41963296 · PMCID PMC13068930 · OpenAlex W7153352963
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), clinical / translational (subfield)
Methods: Statistics, Machine learning, Connectivity, Preprocessing
Keywords: Risk factors, Neuroscience
MeSH: Aging*, Brain*, Exposome*, Aged, Female, Gray Matter, Humans, Life Style, Machine Learning, Male, Middle Aged, UK Biobank (* major topic)
Topic: Health, Environment, Cognitive Aging (Health, Toxicology and Mutagenesis, Environmental Science), according to OpenAlex
Funding: Deutsche Forschungsgemeinschaft (German Research Foundation) (SFB 1451 - Project-ID 431549029, GE 2835/2-1, GE 2835/9-1)
Citations: cited by 3 papers (Europe PMC); 73 references in the paper

Abstract

Promoting brain health is vital for well-being and reducing healthcare burdens. Brain health as measured with the Brain Age Gap (BAG) - the difference between chronological and predicted brain age- relates to many factors. However, a holistic view, integrating the range of factors an individual brain is exposed to, is missing for understanding how the exposome shapes brain health. After computing BAG as an indicator of grey matter (GM) health, we predicted it using machine learning based on 261 exposome variables (spanning biomedical, environmental, lifestyle, socio-affective, and early life domains) in UK Biobank participants. Exposome data can predict GM health with factors pertaining to cardiovascular and bone health, along with alcohol and smoking, nutrition and diabetes showing greater contribution to the prediction. In such domains, life period and duration of exposure appeared crucial. These findings call for early prevention in cardiovascular and metabolic health to promote life-long brain health.

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 9 matches between paragraphs and lines of code.

MostafaMahdipour/Predicting_Brain_Age_Gap_BAG_using_UKB_exposome

License: MIT
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Commit: 0da13fa337a761161f9a78559c86c85cda4ec93f, 13 April 2026
Languages: Python (5), Jupyter (1)
Size: 27 files, 6 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, environment (assets/environment_BrainAgeGap.yml), 1 notebook
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (6 files), pandas (6 files), Matplotlib (5 files), seaborn (5 files), scikit-learn (4 files), SciPy (4 files), SHAP (3 files), DataLad (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers
  • 29 September 2026: the link answers
8 files

Zenodo 18606659

License: MIT
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (6 files), pandas (6 files), Matplotlib (5 files), seaborn (5 files), scikit-learn (4 files), SciPy (4 files), SHAP (3 files), DataLad (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
  • 29 September 2026: the link answers (HTTP 200)
8 files
At the source:

Code availability

The analysis code used in this study is publicly available on GitHub at (https://github.com/MostafaMahdipour/Predicting_Brain_Age_Gap_BAG_using_UKB_exposome) and is archived on Zenodo at (10.5281/zenodo.18606659)73. The archived version (v1.0.0) corresponds to the code used for the analyses reported in this manuscript.

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

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;
  • 12 scripts, each with its path and the digest of its content;
  • 9 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

The brain imaging and exposome data used in this study are derived from the UK Biobank resource under application number 41655 (https://biobank.ndph.ox.ac.uk/showcase/app.cgi?id=41655). These data are available under restricted access due to ethical approval requirements, participant consent, and data protection regulations. Access can be obtained by bona fide researchers through application to the UK Biobank Access Management System (https://www.ukbiobank.ac.uk/), subject to approval by UK Biobank. Raw participant-level data are protected and cannot be publicly shared due to data privacy laws. Processed data that do not contain participant-level information are provided with this paper as Source Data files where applicable. Source data supporting this study are provided with this paper. Source data are provided with this paper.

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, issue, pages, dates, 11 authors, 2 keywords, 12 MeSH terms, 1 funder, 63 references.

Cite

This paper

Mahdipour, M., Maleki Balajoo, S., Raimondo, F., Wu, J., Nicolaisen-Sobesky, E., More, S., Hoffstaedter, F., Schwender, H., Tahmasian, M., Eickhoff, S. B., & Genon, S. (2026). Exposome-wide patterns predict brain health in aging. Nature communications, 17(1), 3409. https://doi.org/10.1038/s41467-026-71271-9

BibTeX

@article{mahdipour2026exposome,
author = {Mahdipour, Mostafa and Maleki Balajoo, Somayeh and Raimondo, Federico and Wu, Jianxiao and Nicolaisen-Sobesky, Eliana and More, Shammi and Hoffstaedter, Felix and Schwender, Holger and Tahmasian, Masoud and Eickhoff, Simon B and Genon, Sarah},
title = {{Exposome-wide patterns predict brain health in aging}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {3409},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-71271-9},
url = {https://doi.org/10.1038/s41467-026-71271-9},
pmid = {41963296},
pmcid = {PMC13068930}
}

RIS

TY - JOUR
AU - Mahdipour, Mostafa
AU - Maleki Balajoo, Somayeh
AU - Raimondo, Federico
AU - Wu, Jianxiao
AU - Nicolaisen-Sobesky, Eliana
AU - More, Shammi
AU - Hoffstaedter, Felix
AU - Schwender, Holger
AU - Tahmasian, Masoud
AU - Eickhoff, Simon B
AU - Genon, Sarah
TI - Exposome-wide patterns predict brain health in aging
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/04/10
VL - 17
IS - 1
SP - 3409
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-71271-9
UR - https://doi.org/10.1038/s41467-026-71271-9
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-71271-9",
"type": "article-journal",
"title": "Exposome-wide patterns predict brain health in aging",
"container-title": "Nature communications",
"author": [
{
"family": "Mahdipour",
"given": "Mostafa"
},
{
"family": "Maleki Balajoo",
"given": "Somayeh"
},
{
"family": "Raimondo",
"given": "Federico"
},
{
"family": "Wu",
"given": "Jianxiao"
},
{
"family": "Nicolaisen-Sobesky",
"given": "Eliana"
},
{
"family": "More",
"given": "Shammi"
},
{
"family": "Hoffstaedter",
"given": "Felix"
},
{
"family": "Schwender",
"given": "Holger"
},
{
"family": "Tahmasian",
"given": "Masoud"
},
{
"family": "Eickhoff",
"given": "Simon B"
},
{
"family": "Genon",
"given": "Sarah"
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "3409",
"DOI": "10.1038/s41467-026-71271-9",
"PMID": "41963296",
"PMCID": "PMC13068930",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-71271-9",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
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.21203/rs.3.rs-9914920/v1 [code]
Prediction of cognitive performance by demographics, sleep, and brain morphometry: machine learning findings from ENIGMA-Sleep Working Group
Journal: Research Square (preprint)
In common: SHAP, seaborn, scikit-learn, 4 other tools, 2 references, 4 authors
[2] doi:10.1038/s42003-026-10205-z [code]
Source-space EEG alpha activity reveals brain age gaps due to neurodegeneration and disparity.
Journal: Communications biology
In common: SHAP, seaborn, scikit-learn, 4 other tools, 4 references
[3] doi:10.3389/fnagi.2026.1789408 [code]
Biological brain aging, cognitive-motor decline and vascular risk: a multivariate imaging analysis of 40,579 individuals.
Journal: Frontiers in aging neuroscience
In common: seaborn, scikit-learn, pandas, 2 other tools, 5 references
[4] doi:10.1073/pnas.2516601123 [code]
Unveiling the glymphatic system's role in brain aging: A comprehensive biomarker and modifiable intervention target.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: SHAP, seaborn, scikit-learn, 4 other tools, clinical / translational, 3 references
[5] doi:10.1371/journal.pbio.3003856 [code]
Aging and metabolism contribute separately to brain-body health.
Journal: PLoS biology
In common: seaborn, scikit-learn, pandas, 3 other tools, clinical / translational, 5 references
[6] doi:10.1371/journal.pmed.1004860 [code]
Brain aging patterns among nine neurological disorders: A case-control study.
Journal: PLoS medicine
In common: SHAP, scikit-learn, pandas, 2 other tools, 5 references
[7] doi:10.1162/imag.a.1242 [code]
Stable individual differences dominate adult brain volume variation until later life.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: seaborn, pandas, SciPy, 2 other tools, 5 references
[8] doi:10.1186/s40708-026-00316-y [code]
Generalizable and explainable deep learning for brain MRI: a multi-cohort evaluation of 3D architectures for age and sex prediction.
Journal: Brain informatics
In common: seaborn, scikit-learn, pandas, 3 other tools, 4 references
[9] doi:10.1038/s41467-026-72940-5 [code]
Cerebellar growth is associated with domain-specific cerebral maturation and socio-linguistic behavior.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, author Felix Hoffstaedter
[10] doi:10.1162/imag.a.1266 [code]
Multimodal subspace independent vector analysis effectively captures latent relationships between brain structure and function.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: seaborn, scikit-learn, pandas, 3 other tools, clinical / translational, 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.