OSCR

Lifespan brain structural variation reveals shared organization across mental health conditions

Code ↔ Paper

10 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 10 matches
  1. [1] § Methods › Contextualization of derived cortical axes ↔ code/main/2_Principal_axes.ipynb, lines 463–537 · score 0.92 · spatial auto correlations, variogram permutations, weighted connectome, ENIGMA Toolbox, functional connectivity, connectome hub
  2. [2] § Methods › Association of axes of deviations with symptom magnitude ↔ code/main/2_Principal_axes.ipynb, lines 1851–1892 · score 0.72 · ADOS CSS, STAI_T, HDRS, BP, symptom, MDD
  3. [3] § Methods › Main axes of deviation ↔ code/main/2_Principal_axes.ipynb, lines 1464–1512 · score 0.67 · PC1 PC2 subspace, principal angles, perturbation, norm, component, PCA
  4. [4] § Methods › Normative modeling ↔ code/hbr/PCNToolkit_transfer_cortical_thickness_example.ipynb, lines 289–382 · score 0.64 · response variable, PCNToolkit, Normative models, held, covariates, regional
  5. [5] § Methods › Normative modeling ↔ PCNToolkit_transfer_cortical_thickness_example.ipynb, lines 292–385 · score 0.64 · response variable, PCNToolkit, Normative models, held, covariates, regional
  6. [6] § Methods › Heterogeneity of extreme deviations ↔ code/main/3_Extreme_deviation_hubs.ipynb, lines 1025–1162 · score 0.62 · propensity score matching, extreme deviation, positive deviations, sex, SA, disorders
  7. [7] § Methods › Network embedding of extreme deviations ↔ code/main/2_Principal_axes.ipynb, lines 463–537 · score 0.60 · HCP YA, weighted connectome, network, hubs, normative
  8. [8] § Methods › Group differences and variability in deviation scores ↔ code/main/helpers.py, lines 51–153 · score 0.59 · logistic regression, propensity score matching
  9. [9] § Methods › Network embedding of extreme deviations ↔ code/main/3_Extreme_deviation_hubs.ipynb, lines 657–711 · score 0.56 · weighted connectome, extreme deviation, HCP, hubs, network, transdiagnostic
  10. [10] § Methods › Normative modeling ↔ code/hbr/NormModel_SHASH_parallelized.py, lines 113–164 · score 0.51 · model parameters, heteroskedastic, SHASH, HBR, sex, deviations

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

Jupyter notebook · 2,074 lines · 68 KB · no license · 4 matches

  1. # %% [markdown]
  2. # ## 2: Axes of deviations
  3. #
  4. # This script contains analyses that aim to identify dominant axes of structural deviations across diagnostic boundaries. It:
  5. #
  6. # Applies a PCA to all z-scores to extract main axes of (unsigned) deviations from the predicted norm. It also computes group differences between PAT and HC PC scores and contextualizes the axes with normative principles of cortical organization, including: a cytoarchitectonic atlas (Mesulam), the Sensorimotor-association (S-A) axis, and network organization (based on a HCP-YA subsample).
  7. #
  8. # It contains the following sections:
  9. # 1) Apply PCA to deviation scores and plot result
  10. # 2) Test and visualize case-control differences in PC scores
  11. # 3) Contextualize the axes with normative principles of cortical organization
  12. # 4) Test association with symptom severity
  13. # 5) Test association with PCs derived in the reference cohort only
  14. #
  15. # (c) Meike Hettwer, 2026
  16. # %%
  17. ## use enigma_norm environment
  18. # =============================================================================
  19. # Setup & Imports
  20. # =============================================================================
  21. import os
  22. from pathlib import Path
  23. from itertools import combinations, product
  24. import numpy as np
  25. import pandas as pd
  26. import nibabel as nib
  27. from tqdm import tqdm
  28. from scipy.stats import gaussian_kde, skewnorm, spearmanr, zscore, ttest_ind, linregress
  29. from statsmodels.stats.multitest import multipletests
  30. import statsmodels.api as sm
  31. from sklearn.decomposition import PCA
  32. from sklearn.preprocessing import StandardScaler
  33. from sklearn.model_selection import train_test_split
  34. from scipy.linalg import subspace_angles
  35. # Plotting & Surface visualizations & Conversions
  36. import matplotlib.pyplot as plt
  37. import seaborn as sns
  38. from matplotlib.colors import ListedColormap
  39. from matplotlib.cm import register_cmap
  40. import matplotlib.cm as cm
  41. import matplotlib.colors as mcolors
  42. import ptitprince as pt
  43. from enigmatoolbox.utils.parcellation import parcel_to_surface
  44. from enigmatoolbox.utils import surface_to_parcel
  45. from enigmatoolbox.plotting import plot_cortical, plot_subcortical
  46. from enigmatoolbox.datasets import load_sc, load_fc
  47. #from enigmatoolbox.permutation_testing import spin_test#, shuf_test
  48. from brainspace.plotting import plot_hemispheres
  49. from brainspace.datasets import load_conte69
  50. from brainsmash.mapgen.base import Base
  51. from brainsmash.mapgen import eval as bseval
  52. # Colormaps
  53. from cmcrameri import cm
  54. # Custom helpers
  55. import helpers
  56. # =============================================================================
  57. # Paths / config
  58. # =============================================================================
  59. # define your personal paths in this text file to run the script on your data
  60. paths = helpers.read_paths("set_paths.txt")
  61. # Access paths
  62. base_dir = paths["base_dir"]
  63. data_dir = paths["data_dir"]
  64. resource_dir = paths["resource_dir"] # the src directory
  65. raw_dir = paths["raw_dir"]
  66. wdir = os.path.join(base_dir, "ScrFun") #code
  67. out_dir = os.path.join(data_dir, "generated")
  68. z_dir = os.path.join(out_dir, "hbr_results") #centiles
  69. fig_dir = os.path.join(base_dir, "Figures", "Figure2")
  70. # loading some example enigma data to get the correct roi label order for plotting
  71. # cortical rois
  72. sum_stats = pd.read_csv(os.path.join(resource_dir, "scz_case-controls_CortThick.csv"))
  73. enigma_order = sum_stats.Structure
  74. # subcortical rois
  75. sum_stats = pd.read_csv(os.path.join(resource_dir, "scz_case-controls_SubVol.csv"))
  76. sctx_order = sum_stats.Structure.to_list()
  77. sctx_order_no_vent = sctx_order.copy()
  78. sctx_order_no_vent.remove('LLatVent')
  79. sctx_order_no_vent.remove('RLatVent')
  80. regions_by_modality = {
  81. 'CT': enigma_order,
  82. 'SA': enigma_order,
  83. 'sctx': sctx_order_no_vent
  84. }
  85. # =============================================================================
  86. # Colormaps
  87. # =============================================================================
  88. # Register Crameri maps
  89. register_cmap('Crameri Managua', cm.managua)
  90. register_cmap('Crameri Oslo', cm.oslo)
  91. register_cmap('Crameri Oslo rev', cm.oslo_r)
  92. register_cmap('Crameri Lapaz', cm.lapaz)
  93. register_cmap('Crameri Lipari', cm.lipari_r)
  94. register_cmap('Crameri Cork', cm.cork)
  95. register_cmap('Crameri Bilbao', cm.bilbao)
  96. # Seaborn colormaps
  97. mako = sns.color_palette("mako", as_cmap=True)
  98. flare = sns.color_palette("flare", as_cmap=True)
  99. # Global plotting settings
  100. sns.set_theme(style="white")
  101. plt.rcParams['pdf.fonttype'] = 42
  102. plt.rcParams['ps.fonttype'] = 42
  103. plt.rcParams['svg.fonttype'] = 'none'
  104. plt.rc('font', size=10)
  105. nan_color = (0.7, 0.7, 0.7, 1)
  106. # =============================================================================
  107. # ENIGMA Data & Structures
  108. # =============================================================================
  109. modality = ['CT', 'SA', 'sctx']
  110. # Disorder orders
  111. disorder_order_dev = ['ANX', 'ASD', 'BP', 'MDD', 'OCD', 'SCZ', 'Developmental', 'control']
  112. disorder_order = ['ANX', 'ASD', 'BP', 'MDD', 'OCD', 'SCZ', 'control']
  113. disorder_order_pat = ['ANX', 'ASD', 'BP', 'MDD', 'OCD', 'SCZ']
  114. disorder_cmap = ['#2E4757', '#438477', '#FFC487', '#E9735B', '#D3436E', '#6D2D51', '#AEAEAE']
  115. # set threshold for extreme deviations
  116. z_extreme = 1.96
  117. # -----------------------------
  118. # Reproducibility
  119. # -----------------------------
  120. SEED = 42
  121. pca_abs = True
  122. # more color action
  123. n_colors = 5
  124. # Extract 5 evenly spaced colors
  125. cmap = plt.get_cmap('Crameri Cork')
  126. colors = [cmap(i / (n_colors - 1)) for i in range(n_colors)]
  127. colors[0] = mcolors.to_hex('#B2B2B2')
  128. cork5 = mcolors.ListedColormap(colors, name='Cork5')
  129. plt.register_cmap(cmap=cork5)
  130. cork4_colors = colors[1:]
  131. # =============================================================================
  132. # Surfaces & Labels
  133. # =============================================================================
  134. surf_lh, surf_rh = load_conte69()
  135. aparc_conte = np.loadtxt(os.path.join(resource_dir, "aparc_conte69.csv"), delimiter=',')
  136. # mask the midbrain and CC if we have 71 DK values where there should be 68 (e.g. after re-sampling)
  137. midbrain_parcels = [0, 4, 39]
  138. mask = np.isin(aparc_conte, midbrain_parcels)
  139. keep_parcels = range(71)
  140. keep_parcels = np.delete(keep_parcels, midbrain_parcels)
  141. # prepare brainsmash permutations
  142. #subctx
  143. centroids_csv = os.path.join(resource_dir,"aseg_subcortex_centroids_shortnames.csv")
  144. centroids_df = pd.read_csv(centroids_csv).set_index("Structure")
  145. distmat = np.loadtxt(os.path.join(resource_dir, "aseg_euclidean_distmat.csv"), delimiter=",")
  146. # cortex
  147. cortical_centroids_csv = os.path.join(resource_dir,"dk68_cortical_centroids_enigma_order.csv")
  148. cortical_centroids_df = pd.read_csv(cortical_centroids_csv).set_index("Structure")
  149. cortical_distmat = np.loadtxt(os.path.join(resource_dir, "dk68_cortical_euclidean_distmat_enigma_order.csv"), delimiter=",")
  150. n_perm = 10000
  151. # =============================================================================
  152. ## load other useful resources
  153. # =============================================================================
  154. # get the SA axis from: https://github.com/PennLINC/S-A_ArchetypalAxis/tree/main/FSaverage5
  155. # parcelated:
  156. SA_dk = np.load(os.path.join(resource_dir, 'SA_axis_DK.npy'))
  157. # Mesulam
  158. mesulam_dk = np.load(os.path.join(resource_dir, 'Mesulam_DK.npy'))
  159. # %% [markdown]
  160. # # 1) Identifying main axes of deviations by applying PCA across participant's z scores
  161. #
  162. # In this section, we apply a pca to absolute z-scores to get a general insight into patterns of magnified deviations from the norm (no matter in which direction). We apply the PCA to the transdiagnostic sample, including HCs. Hewever, we will also compare it to results derived from applying the PCA in (50% of) HCs only - confirming that derived patterns are not driven by e.g. one disorder.
  163. # %%
  164. # Apply PCA to absolute z-scores of each modality separately to get interpretable dimensions
  165. for mod in modality:
  166. print(mod)
  167. # Load the deviation scores for the current modality
  168. df_te_Z = pd.read_csv(os.path.join(z_dir, f"{mod}_Z_enigma_test.csv"))
  169. # extract subsamples
  170. imaging_dev = df_te_Z[df_te_Z['disorder']=='Developmental']
  171. imaging_pat = df_te_Z[(df_te_Z['diagnosis'] == 1) & (df_te_Z['disorder'] != 'Developmental')] # patients that are not from the developmental cohorts
  172. imaging_hc = df_te_Z[df_te_Z['diagnosis']==-1] # healthy controls
  173. imaging_enigma = df_te_Z[df_te_Z['disorder']!='Developmental'] #exclude only patients from developmental datasets (HBN, PNC) - keep patients and controls otherwise --> this is what we use here
  174. imaging_cols = list(regions_by_modality[mod])
  175. missing_cols = sorted(set(imaging_cols) - set(imaging_enigma.columns))
  176. if missing_cols:
  177. raise KeyError(f"Missing expected columns for {mod}: {missing_cols}")
  178. scaler = StandardScaler()
  179. if pca_abs == True:
  180. X_enigma_scaled = scaler.fit_transform(imaging_enigma[imaging_cols].abs())
  181. elif pca_abs == False:
  182. X_enigma_scaled = scaler.fit_transform(imaging_enigma[imaging_cols])
  183. # Fit PCA on scaled data
  184. n_components = min(10, len(imaging_cols))
  185. pca = PCA(n_components=n_components, svd_solver="auto", random_state=0)
  186. X_enigma_pcs = pca.fit_transform(X_enigma_scaled)
  187. # Get PCA scores for each group
  188. pat_mask = imaging_enigma['diagnosis'] == 1
  189. hc_mask = imaging_enigma['diagnosis'] == -1
  190. X_pat_pcs = X_enigma_pcs[pat_mask, :]
  191. X_hc_pcs = X_enigma_pcs[hc_mask, :]
  192. # Get scores for each subject group
  193. pca_pat_scores_df = pd.DataFrame(
  194. X_pat_pcs,
  195. columns=[f'PC{i+1}' for i in range(n_components)],
  196. index=imaging_enigma.loc[pat_mask, 'participant_id']
  197. )
  198. pca_hc_scores_df = pd.DataFrame(
  199. X_hc_pcs,
  200. columns=[f'PC{i+1}' for i in range(n_components)],
  201. index=imaging_enigma.loc[hc_mask, 'participant_id']
  202. )
  203. pca_all_scores_df = pd.DataFrame(
  204. X_enigma_pcs,
  205. columns=[f'PC{i+1}' for i in range(n_components)],
  206. index=imaging_enigma['participant_id']
  207. )
  208. # Get loadings (components)
  209. # Each row is a PC, each column is a feature
  210. pca_loadings = pd.DataFrame(pca.components_.T, # transpose to get features x PCs
  211. index=imaging_cols,
  212. columns=[f'PC{i+1}' for i in range(n_components)])
  213. pca_loadings.to_csv(os.path.join(out_dir , f'z_pca_loadings_{mod}.csv'))
  214. # extract variance explained
  215. explained_var_ratio = pca.explained_variance_ratio_ #relative to other components
  216. explained_var = pca.explained_variance_
  217. print('explained variance ratio')
  218. print(mod + str(explained_var_ratio))
  219. print('explained variance')
  220. print(mod + str(explained_var))
  221. # plot Scree plot
  222. plt.figure(figsize=(4, 4))
  223. plt.plot(np.arange(1, len(explained_var_ratio*100)+1), explained_var_ratio*100 , marker='o', linestyle='-')
  224. plt.title(f'Scree Plot {mod}')
  225. plt.xlabel('Principal Component')
  226. plt.ylabel('Variance Explained (%)')
  227. plt.xticks(np.arange(1, len(explained_var)+1, step=1))
  228. plt.grid(False)
  229. plt.tight_layout()
  230. plt.savefig(os.path.join(fig_dir, f"screeplot_pca_{mod}.svg"),format="svg")
  231. plt.show()
  232. ## scatter for full sample
  233. scores_combined = imaging_enigma[['participant_id', 'disorder']].merge(
  234. pca_all_scores_df, on='participant_id'
  235. )
  236. scores_combined.head()
  237. scores_combined.to_csv(os.path.join(out_dir, f'z_PCA_scores_{mod}.csv'))
  238. # sanity checks
  239. # Check unique disorders
  240. print(scores_combined['disorder'].unique())
  241. plt.figure(figsize=(4, 4))
  242. # Ensure 'disorder' is a categorical variable in desired order for plotting
  243. scores_combined['disorder'] = pd.Categorical(
  244. scores_combined['disorder'],
  245. categories=disorder_order,
  246. ordered=True
  247. )
  248. scores_combined = scores_combined.sort_values('disorder')
  249. # Plot with specified hue order
  250. sns.scatterplot(
  251. data=scores_combined,
  252. x='PC1',
  253. y='PC2',
  254. hue='disorder',
  255. hue_order=disorder_order,
  256. palette=disorder_cmap[:len(disorder_order)],
  257. s=6,
  258. alpha=0.6,
  259. edgecolor='none',
  260. linewidth=0.3
  261. )
  262. plt.title(f'PCs {mod}')
  263. plt.xlabel('PC1')
  264. plt.ylabel('PC2')
  265. plt.grid(False)
  266. plt.tight_layout()
  267. plt.savefig(os.path.join(fig_dir, f'PCA_scatter_{mod}.svg'), format='svg')
  268. plt.show()
  269. # plot on the brain surface
  270. if mod in ['CT', 'SA']:
  271. mod_PC12 = [None]*2
  272. mod_PC1_conte = parcel_to_surface(pca_loadings.loc[enigma_order]['PC1'].values, 'aparc_conte69')
  273. mod_PC1_conte[mask] = np.nan
  274. mod_PC2_conte = parcel_to_surface(pca_loadings.loc[enigma_order]['PC2'].values, 'aparc_conte69')
  275. mod_PC2_conte[mask] = np.nan
  276. mod_PC12[0] = mod_PC1_conte
  277. mod_PC12[1] = mod_PC2_conte
  278. save_dir = os.path.join(fig_dir, f'{mod}_unimodal_pc_z_loadings_full_sample.png')
  279. if mod == 'CT':
  280. plot_hemispheres(surf_lh, surf_rh, array_name=mod_PC12, size=(1200*2,800*2), cmap=['BuPu','rocket_r'],label_text=['PC1','PC2'],
  281. color_bar=True, zoom=1.2, interactive=False, embed_nb=True, filename=save_dir,
  282. nan_color=nan_color, screenshot=True, background=(1,1,1), color_range=[(0.05,0.18), (-0.25,0.20)],
  283. transparent_bg=True)
  284. ## Statistics ##
  285. # test group differences between patients and controls
  286. results = []
  287. for pc in [f'PC{i+1}' for i in range(2)]:# only look at first 2 PCs
  288. for disorder in disorder_order_pat:
  289. extr_scores = scores_combined.copy().drop(columns={'disorder'})
  290. extr_scores = extr_scores.merge(imaging_enigma, on='participant_id')
  291. # apply propensity score matching to extract matched hc sample based on age and sex
  292. df_pat_matched, df_hc_matched = helpers.propensity_score_match(
  293. df_pat=extr_scores.loc[extr_scores['disorder'] == disorder],
  294. df_ctrl=extr_scores.loc[extr_scores['disorder'] == 'control'],
  295. covariates=['Age', 'Sex'],
  296. random_state=SEED
  297. )
  298. # compute t-test
  299. t, p = ttest_ind(df_pat_matched[pc], df_hc_matched[pc], equal_var=False)
  300. # compute Cohen's d
  301. nx = len(df_pat_matched[pc])
  302. ny = len(df_hc_matched[pc])
  303. mean_x = np.mean(df_pat_matched[pc])
  304. mean_y = np.mean(df_hc_matched[pc])
  305. var_x = np.var(df_pat_matched[pc], ddof=1)
  306. var_y = np.var(df_hc_matched[pc], ddof=1)
  307. pooled_sd = np.sqrt(((nx - 1) * var_x + (ny - 1) * var_y) / (nx + ny - 2))
  308. d = (mean_x - mean_y) / pooled_sd
  309. results.append({
  310. 'disorder': disorder,
  311. 'PC': pc,
  312. 'd': d,
  313. 'p': p
  314. })
  315. results_df = pd.DataFrame(results)
  316. results_df
  317. # FDR correction
  318. reject, pvals_corr, _, _ = multipletests(results_df['p'], method='fdr_bh')
  319. results_df['p_fdr'] = pvals_corr # FDR-corrected
  320. results_df['sig'] = reject # boolean significance flag used for thresholding
  321. print(results_df)
  322. # Pivot results to have one row per disorder with t-values for PC1 and PC2
  323. plot_df = results_df.pivot(index="disorder", columns="PC", values="d").reset_index()
  324. # Mark disorders significant if any of PC1 or PC2 is significant
  325. sig_status = results_df.loc[results_df["PC"].isin(["PC1", "PC2"])] \
  326. .groupby("disorder")["sig"].any().reset_index()
  327. plot_df = plot_df.merge(sig_status, on="disorder", how="left")
  328. # plot
  329. plt.figure(figsize=(4,4))
  330. ax = plt.gca()
  331. if mod == 'CT':
  332. ax.set_xlim(-0.55, 0.55)
  333. ax.set_ylim(-0.55, 0.55)
  334. ax.set_xticks([-0.5,0, 0.5])
  335. ax.set_yticks([-0.5,0, 0.5])
  336. else:
  337. ax.set_xlim(-0.55, 0.55)
  338. ax.set_ylim(-0.55, 0.55)
  339. ax.set_xticks([-0.5,0, 0.5])
  340. ax.set_yticks([-0.5,0, 0.5])
  341. # reference lines
  342. ax.axhline(0, color="grey", linestyle="--", linewidth=0.8)
  343. ax.axvline(0, color="grey", linestyle="--", linewidth=0.8)
  344. # scatter
  345. sns.scatterplot(
  346. data=plot_df,
  347. x="PC1",
  348. y="PC2",
  349. hue="disorder",
  350. palette=disorder_cmap[:6],
  351. s=280,
  352. edgecolor=plot_df["sig"].map(lambda x: "black" if x else "none"),
  353. linewidth=1.2,
  354. ax=ax
  355. )
  356. ax.set_title(f"group difference {mod}")
  357. ax.set_xlabel("Cohen's d (PC1)")
  358. ax.set_ylabel("Cohen's d (PC2)")
  359. plt.tight_layout()
  360. plt.savefig(os.path.join(fig_dir, f'{mod}_ttest_pca.svg'),format='svg')
  361. plt.show()
  362. # %% [markdown]
  363. # # 2) Visualize Case-control differences in PC scores
  364. # %%
  365. for mod in modality:
  366. # Load data
  367. scores_all = pd.read_csv(os.path.join(out_dir, f'z_PCA_scores_{mod}.csv'))
  368. control_label = 'control'
  369. disorders = disorder_order_pat
  370. pcs = ['PC1', 'PC2']
  371. # Setup figure
  372. sns.set(style="white", font_scale=1.2)
  373. fig, axes = plt.subplots(2, 1, figsize=(5, 6), sharex=True)
  374. # Plot both PCs
  375. demo_data = df_te_Z[df_te_Z['disorder']!= 'Developmental'] # exclude PNC adn HBN patients
  376. helpers.plot_pc(demo_data, 'PC1', axes[0],scores_all)
  377. helpers.plot_pc(demo_data, 'PC2', axes[1],scores_all)
  378. # Final figure formatting
  379. axes[1].set_xlabel('Disorder')
  380. for ax in axes:
  381. ax.tick_params(axis='x', rotation=45)
  382. plt.tight_layout()
  383. plt.savefig(os.path.join(fig_dir, f'PC_scores_boxplot_{mod}.svg'),format='svg')
  384. plt.show()
  385. # %% [markdown]
  386. # # 3) Contextualizing the axes with normative principles of cortical organization
  387. #
  388. # Including: Connectivity, S-A axis and Cytoarchitecture
  389. # %% [markdown]
  390. # 1st Contextualization: HCP connectome hubs
  391. # %%
  392. # -----------------------------------------------------
  393. # Load HCP structural and functional connectivity
  394. # -----------------------------------------------------
  395. # get normative / HCP-YA connectome from ENIGMA toolbox
  396. fc_ctx, fc_ctx_labels, _, _ = load_fc()
  397. sc_ctx, sc_ctx_labels, _, _ = load_sc()
  398. # Multiply SC and FC to get a weighted connectome,
  399. # then threshold top 20% per node, then compute degree centrality
  400. network_hcp = fc_ctx * sc_ctx
  401. network_hcp_bin = np.zeros(network_hcp.shape)
  402. for i in range(len(network_hcp)):
  403. threshold = np.percentile(network_hcp[i], 80)
  404. network_hcp_bin[i, network_hcp[i] > threshold] = 1
  405. network_hubs_hcp = network_hcp_bin.sum(axis=0)
  406. # Compute correlations and variogram test for PC1 and PC2
  407. pcs = ['PC1', 'PC2']
  408. mods = ['CT', 'SA']
  409. colors = {'PC1': '#2E4757', 'PC2': '#438477'}
  410. ylims = { #for CT only
  411. 'PC1': (0.0505, 0.185),
  412. 'PC2': (-0.255, 0.205)
  413. }
  414. for mod in mods:
  415. pc_loadings = pd.read_csv(os.path.join(out_dir, f'z_pca_loadings_{mod}.csv'))
  416. # run variogram permutation to control for spatial auto-correlation
  417. results = {}
  418. for pc in pcs:
  419. r_val = spearmanr(network_hubs_hcp, pc_loadings[pc])[0]
  420. p_spin = helpers.brainsmash_pvalue_spearman(network_hubs_hcp, pc_loadings[pc], cortical_distmat, nsurr=n_perm, seed=SEED)
  421. results[pc] = {'r': r_val, 'p_spin': p_spin}
  422. print(f"{mod} {pc}: r = {r_val:.3f}, p_spin = {p_spin:.3f}")
  423. # create 1 x 2 figure
  424. fig, axes = plt.subplots(1, 2, figsize=(10, 5), sharex=False, sharey=False)
  425. for i, pc in enumerate(pcs):
  426. ax = axes[i]
  427. sns.regplot(
  428. x=network_hubs_hcp,
  429. y=pc_loadings[pc],
  430. scatter_kws={'s': 12, 'alpha': 1, 'color': colors[pc]},
  431. line_kws={'color': colors[pc], 'lw': 1.5},
  432. ax=ax
  433. )
  434. if mod == 'CT':
  435. ax.set_ylim(ylims[pc])
  436. ax.set_title(
  437. f"{mod} {pc}\nr = {results[pc]['r']:.2f}, p_spin = {results[pc]['p_spin']:.3f}"
  438. )
  439. ax.set_xlabel("HCP Network Hub Degree (top 20%)")
  440. ax.set_ylabel("PC Loading")
  441. ax.set_box_aspect(1)
  442. plt.tight_layout()
  443. plt.savefig(os.path.join(fig_dir, f'PC_loadings_vs_HCP_hubs_{mod}_1x2.svg'), format='svg')
  444. plt.show()
  445. # %% [markdown]
  446. # B) 2nd contextualization: SA axis
  447. # %%
  448. for mod in mods:
  449. pc_loadings = pd.read_csv(os.path.join(out_dir, f'z_pca_loadings_{mod}.csv'))
  450. # run variogram permutation to control for spatial auto-correlation
  451. results = {}
  452. for pc in pcs:
  453. r_val = spearmanr(SA_dk, pc_loadings[pc])[0]
  454. p_spin = helpers.brainsmash_pvalue_spearman(SA_dk, pc_loadings[pc], cortical_distmat, nsurr=n_perm, seed=SEED)
  455. results[pc] = {'r': r_val, 'p_spin': p_spin}
  456. print(f"{mod} {pc}: r = {r_val:.3f}, p_spin = {p_spin:.3f}")
  457. fig, axes = plt.subplots(1, 2, figsize=(10, 5), sharex=False, sharey=False)
  458. for i, pc in enumerate(pcs):
  459. ax = axes[i]
  460. sns.regplot(
  461. x=SA_dk,
  462. y=pc_loadings[pc],
  463. scatter_kws={'s': 12, 'alpha': 1, 'color': colors[pc]},
  464. line_kws={'color': colors[pc], 'lw': 1.5},
  465. ax=ax
  466. )
  467. ax.set_title(
  468. f"{mod} {pc}\nr = {results[pc]['r']:.2f}, p_spin = {results[pc]['p_spin']:.3f}"
  469. )
  470. ax.set_xlabel("S-A rank")
  471. ax.set_ylabel("PC Loading")
  472. ax.set_box_aspect(1)
  473. if mod == 'CT':
  474. ax.set_ylim(ylims[pc])
  475. plt.tight_layout()
  476. plt.savefig(os.path.join(fig_dir, f'PC_loadings_vs_SA_rank_{mod}_1x2.svg'), format='svg')
  477. plt.show()
  478. # %% [markdown]
  479. # C) 3rd contextualization: Cytoarchitecture (using the Mesulam atlas)
  480. # %%
  481. xlims = { #for CT only - add a bit of space to make sure whisters are visible
  482. 'PC1': (0.051, 0.19),
  483. 'PC2': (-0.26, 0.21)
  484. }
  485. for mod in ['CT','SA']:
  486. # load data
  487. pc_loadings = pd.read_csv(os.path.join(out_dir, f'z_pca_loadings_{mod}.csv'))
  488. # prepare dataframe to stratify loadings by mesulam class
  489. pc1_mesulam = pd.DataFrame({'PC': pc_loadings['PC1'], 'Mesulam': mesulam_dk})
  490. pc2_mesulam = pd.DataFrame({'PC': pc_loadings['PC2'], 'Mesulam': mesulam_dk})
  491. # plot
  492. fig, axes = plt.subplots(1, 2, figsize=(5, 2.5), sharey=True)
  493. y_labels = ['Paralimbic', 'Heteromodal', 'Unimodal', 'Idiotypic']
  494. # PC1 RainCloud
  495. pt.RainCloud(
  496. x='Mesulam', y='PC',
  497. data=pc1_mesulam,
  498. orient='h',
  499. ax=axes[0],
  500. palette=cork4_colors,
  501. bw=0.3,
  502. width_viol=1,
  503. move=0.01,
  504. alpha=0.6,
  505. pointplot=False,
  506. dodge=False
  507. )
  508. axes[0].set_title('PC1', fontsize=16)
  509. axes[0].set_yticks(range(4))
  510. axes[0].set_yticklabels(y_labels, fontsize=12)
  511. axes[0].set_xlabel('')
  512. if mod == 'CT':
  513. axes[0].set_xlim(xlims['PC1'])
  514. # PC2 RainCloud
  515. pt.RainCloud(
  516. x='Mesulam', y='PC',
  517. data=pc2_mesulam,
  518. orient='h',
  519. ax=axes[1],
  520. palette=cork4_colors,
  521. bw=0.3,
  522. width_viol=1,
  523. move=0.01,
  524. alpha=0.6,
  525. pointplot=False,
  526. dodge=False
  527. )
  528. axes[1].set_title('PC2', fontsize=16)
  529. axes[1].set_yticks(range(4))
  530. axes[1].set_xlabel('')
  531. axes[1].set_ylabel('')
  532. if mod == 'CT':
  533. axes[1].set_xlim(xlims['PC2'])
  534. y_ticks = range(4)
  535. for ax in axes:
  536. ax.set_yticks(y_ticks)
  537. ax.set_yticklabels(y_labels, fontsize=12)
  538. plt.xticks(fontsize=12)
  539. plt.tight_layout()
  540. plt.savefig(os.path.join(fig_dir, f'{mod}_Z_pc1_pc2_Mesulam.svg'), type='svg')
  541. plt.show()
  542. # %% [markdown]
  543. # # Association of the PCs of deviation with main axes of Group shift (Cohen's d) and variability
  544. # %%
  545. # For main manuscript / CT
  546. pc = pd.read_csv(os.path.join(out_dir, 'z_pca_loadings_CT.csv'), index_col=0)
  547. cohen = pd.read_csv(os.path.join(out_dir, 'CT_Cohens_d_supplement.csv'), index_col=0)
  548. variance = pd.read_csv(os.path.join(out_dir, 'CT_Std_supplement.csv'), index_col=0)
  549. pc1 = pc["PC1"]
  550. pc2 = pc["PC2"]
  551. # use helper functions to extract data
  552. cohen_cols = helpers.get_disorder_columns(cohen, disorders=disorder_order_pat, coltype="Cohen")
  553. variance_cols = helpers.get_disorder_columns(variance, disorders=disorder_order_pat, coltype="Std")
  554. # Build Cohen's d matrix: ROIs × Disorders
  555. cohens_df = pd.DataFrame({
  556. dis: cohen[cohen_cols[dis]].values
  557. for dis in cohen_cols.keys()
  558. })
  559. # Use ROI names as index
  560. cohens_df.index = cohen['Structure'] if 'Structure' in cohen.columns else cohen.index
  561. variance_df = pd.DataFrame({
  562. dis: variance[variance_cols[dis]].values
  563. for dis in variance_cols.keys()
  564. })
  565. variance_df.index = variance['Structure'] if 'Structure' in variance.columns else variance.index
  566. ## apply PCAs
  567. # Align ROIs
  568. cohens_df = cohens_df.loc[pc1.index]
  569. variance_df = variance_df.loc[pc1.index]
  570. # Standardize across disorders (column-wise)
  571. scaler = StandardScaler()
  572. # PCA on Cohen's d
  573. cohen_scaled = scaler.fit_transform(cohens_df.values)
  574. pca_d = PCA(n_components=5)
  575. cohen_components = pca_d.fit_transform(cohen_scaled)
  576. print("Cohen PCA explained variance ratio:")
  577. print(pca_d.explained_variance_ratio_)
  578. # First component (dominant shared pattern)
  579. cohen_pc1_map = pd.Series(
  580. cohen_components[:, 0],
  581. index=cohens_df.index
  582. )
  583. # PCA on variance
  584. # Standardize across disorders (column-wise)
  585. scaler = StandardScaler()
  586. variance_scaled = scaler.fit_transform(variance_df.values)
  587. # PCA on Variability
  588. pca_var = PCA(n_components=5)
  589. variance_components = pca_var.fit_transform(variance_scaled)
  590. print("Variance PCA explained variance ratio:")
  591. print(pca_var.explained_variance_ratio_)
  592. # First component (dominant shared pattern)
  593. variance_pc1_map = pd.Series(
  594. variance_components[:, 0],
  595. index=variance_df.index
  596. )
  597. results = []
  598. # Ensure alignment
  599. pc1 = pc1.loc[cohen_pc1_map.index]
  600. pc2 = pc2.loc[cohen_pc1_map.index]
  601. # Align PCA signs, as the sign is arbitrary and may be flipped
  602. if spearmanr(cohen_pc1_map, pc1)[0] < 0:
  603. cohen_pc1_map *= -1
  604. if spearmanr(variance_pc1_map, pc1)[0] < 0:
  605. variance_pc1_map *= -1
  606. # %%
  607. # Load CT PCs
  608. pc_loadings_ct = pd.read_csv(os.path.join(out_dir, 'z_pca_loadings_CT.csv'), index_col=0)
  609. colors = {
  610. 'PC1': '#2E4757',
  611. 'PC2': '#438477'
  612. }
  613. maps = {
  614. 'Cohen': cohen_pc1_map,
  615. 'Variability': variance_pc1_map
  616. }
  617. # Compute correlations + brainsmash permutations
  618. results = {}
  619. for label, cortical_map in maps.items():
  620. results[label] = {}
  621. x = cortical_map.loc[pc_loadings_ct.index]
  622. for pc in pcs:
  623. y = pc_loadings_ct[pc]
  624. r_val, _ = spearmanr(x, y)
  625. p_spin = helpers.brainsmash_pvalue_spearman(x.values, y.values, cortical_distmat, nsurr=n_perm, seed=SEED)
  626. results[label][pc] = {
  627. 'r': r_val,
  628. 'p_spin': p_spin
  629. }
  630. print(f"{label} vs {pc}: r = {r_val:.3f}, p_spin = {p_spin:.4f}")
  631. fig, axes = plt.subplots(2, 2, figsize=(6, 6), sharey=False)
  632. for row, (label, cortical_map) in enumerate(maps.items()):
  633. x = cortical_map.loc[pc_loadings_ct.index]
  634. for col, pc in enumerate(pcs):
  635. ax = axes[row, col]
  636. y = pc_loadings_ct[pc]
  637. sns.regplot(
  638. x=x,
  639. y=y,
  640. scatter_kws={'s': 18, 'alpha': 0.8, 'color': colors[pc]},
  641. line_kws={'color': colors[pc], 'lw': 1.5},
  642. ax=ax)
  643. ax.set_title(
  644. f"{label} vs {pc}\n"
  645. f"r = {results[label][pc]['r']:.2f}, "
  646. f"p_spin = {results[label][pc]['p_spin']:.3f}",
  647. fontsize=10)
  648. ax.set_xlabel("Group PC")
  649. ax.set_ylabel("CT deviation PC loading")
  650. ax.set_box_aspect(1)
  651. if mod == 'CT':
  652. ax.set_ylim(ylims[pc])
  653. plt.tight_layout()
  654. plt.savefig(
  655. os.path.join(fig_dir, 'Cohen_vs_Variability_CT_PCs_2x2.svg'),
  656. format='svg'
  657. )
  658. plt.show()
  659. # %% [markdown]
  660. # # Visualize on the cortex
  661. # %%
  662. # Convert to surface space
  663. cohen_pc1_surface = parcel_to_surface(cohen_pc1_map.values, 'aparc_conte69')
  664. # mask midbrain
  665. cohen_pc1_surface[mask]=np.nan
  666. variance_pc1_surface = parcel_to_surface(variance_pc1_map.values, 'aparc_conte69')
  667. variance_pc1_surface[mask]=np.nan
  668. # plot group shift axis
  669. save_dir = os.path.join(fig_dir, 'Cohensd_PC1.png')
  670. plot_hemispheres(
  671. surf_lh,
  672. surf_rh,
  673. array_name=cohen_pc1_surface,
  674. size=(1200, 800),
  675. cmap='OrRd',
  676. color_bar=True,
  677. zoom=1.2,
  678. interactive=False,
  679. embed_nb=True,
  680. screenshot=True,
  681. background=(1, 1, 1),
  682. color_range=(-4.5, 3.5),
  683. transparent_bg=True,
  684. nan_color=nan_color,
  685. filename=save_dir
  686. )
  687. # plot variability
  688. save_dir = os.path.join(fig_dir, 'Variability_PC1.png')
  689. plot_hemispheres(
  690. surf_lh,
  691. surf_rh,
  692. array_name=variance_pc1_surface,
  693. size=(1200, 800),
  694. cmap='Crameri Lapaz',
  695. color_bar=True,
  696. zoom=1.2,
  697. interactive=False,
  698. embed_nb=True,
  699. screenshot=True,
  700. background=(1, 1, 1),
  701. color_range=(-3.8, 3.1),
  702. transparent_bg=True,
  703. nan_color=nan_color,
  704. filename=save_dir)
  705. # %% [markdown]
  706. # Plot the PC components for SA and SCTX
  707. # %%
  708. SA_pcs = pd.read_csv(os.path.join(out_dir, 'z_pca_loadings_SA.csv'),index_col=0)
  709. mod_PC12 = [None]*2
  710. mod_PC1_conte = parcel_to_surface(SA_pcs.loc[enigma_order]['PC1'].values, 'aparc_conte69')
  711. mod_PC1_conte[mask] = np.nan
  712. mod_PC2_conte = parcel_to_surface(SA_pcs.loc[enigma_order]['PC2'].values, 'aparc_conte69')
  713. mod_PC2_conte[mask] = np.nan
  714. mod_PC12[0] = mod_PC1_conte
  715. mod_PC12[1] = mod_PC2_conte
  716. save_dir = os.path.join(fig_dir, 'SA_unimodal_pc_z_loadings_pat.png')
  717. plot_hemispheres(surf_lh, surf_rh, array_name=mod_PC12, size=(1200*2,800*2), cmap=['BuPu','magma_r'],label_text=['PC1','PC2'],
  718. color_bar=True, zoom=1.2, interactive=False, embed_nb=True, filename=save_dir,
  719. nan_color=nan_color, screenshot=True, background=(1,1,1), color_range=[(0.06,0.18), (-0.13,0.47)],
  720. transparent_bg=True)
  721. plot_hemispheres(surf_lh, surf_rh, array_name=mod_PC12, size=(1200,500), cmap=['BuPu','magma_r'],label_text=['PC1','PC2'],
  722. color_bar=True, zoom=1.2, interactive=False, embed_nb=True, filename=save_dir,
  723. nan_color=nan_color, screenshot=False, background=(1,1,1), color_range=[(0.06,0.18), (-0.13,0.47)],
  724. transparent_bg=True)
  725. # %%
  726. # and for the subcortex
  727. sctx_pcs = pd.read_csv(os.path.join(out_dir, 'z_pca_loadings_sctx.csv'),index_col=0)
  728. sctx_pcs
  729. for pc in ['PC1','PC2']:
  730. this_pc = sctx_pcs[pc].T
  731. this_pc['LLatVent'] = np.nan
  732. this_pc['RLatVent'] = np.nan
  733. if pc == 'PC1':
  734. cmap = 'BuPu'
  735. color_range=(0.19, 0.32)
  736. if pc == 'PC2':
  737. cmap='magma_r'
  738. color_range=(-0.29, 0.43)
  739. this_pc = this_pc[sctx_order]
  740. this_pc_plot = this_pc.values.T.flatten().astype(float)
  741. # Save figure
  742. save_dir = os.path.join(fig_dir, f'Sctx_unimodal_{pc}_z_loadings.png')
  743. plot_subcortical(
  744. array_name=this_pc_plot,
  745. size=(1600, 800),
  746. cmap=cmap,
  747. screenshot=True,
  748. color_bar=True,
  749. color_range=color_range,
  750. ventricles=True,
  751. embed_nb=True,
  752. interactive=False,
  753. filename=save_dir
  754. )
  755. # %% [markdown]
  756. # Fit PCA in 50% of HCS and apply it to patients and remaining HCs
  757. #
  758. # Aim: To see if our derived axes capture normative patterns of covarying deviations that are also present in the unaffected reference cohort. We will use 50% of the HC sample to fit the PCA - sampled across 5 age bins and approx. sex + site balanced across the 2 HC splits
  759. # %%
  760. disorder_cmap = ['#2E4757', '#438477', '#FFC487', '#E9735B', '#D3436E', '#6D2D51', '#AEAEAE']
  761. fit_sample = 'hc'
  762. for mod in modality:
  763. print(mod)
  764. os.chdir(out_dir)
  765. # Load the deviation scores for the current modality
  766. df_te_Z = pd.read_csv(os.path.join(z_dir, f'{mod}_Z_enigma_test.csv'))
  767. # extract subsamples
  768. imaging_dev = df_te_Z[df_te_Z['disorder']=='Developmental']
  769. imaging_pat = df_te_Z[(df_te_Z['diagnosis'] == 1) & (df_te_Z['disorder'] != 'Developmental')]
  770. imaging_hc = df_te_Z[df_te_Z['diagnosis']==-1].copy()
  771. imaging_enigma = df_te_Z[df_te_Z['disorder']!='Developmental'] #exclude only patients from developmental datasets (HBN, PNC)
  772. if mod in ['CT', 'SA']:
  773. imaging_cols = enigma_order
  774. else:
  775. imaging_cols = sctx_order_no_vent
  776. # compute PCA in all individuals
  777. if fit_sample == 'pat':
  778. continue
  779. elif fit_sample == 'hc':
  780. # split the HC data into 2 subsample, matched by age, sex and site
  781. # Create age bins to stratify continuous age
  782. imaging_hc['Age_bin'] = pd.qcut(imaging_hc['Age'], q=5, labels=False) # 5 quantile bins
  783. # We'll stratify by Age_bin, Sex, and Site
  784. imaging_hc['strata'] = imaging_hc['Age_bin'].astype(str) + '_' + imaging_hc['Sex'].astype(str) + '_' + imaging_hc['Site']
  785. # Split, allowing small imbalances
  786. try:
  787. train_idx, test_idx = train_test_split(
  788. imaging_hc.index,
  789. test_size=0.5,
  790. stratify=imaging_hc['strata'], # stratify on age_bin + sex
  791. random_state=42
  792. )
  793. except ValueError:
  794. # fallback: stratify on Site only if some strata have only 1 subject
  795. train_idx, test_idx = train_test_split(
  796. imaging_hc.index,
  797. test_size=0.5,
  798. stratify=imaging_hc['Site'],
  799. random_state=42
  800. )
  801. group1 = imaging_hc.loc[train_idx].copy()
  802. group2 = imaging_hc.loc[test_idx].copy()
  803. # 4. Check balance
  804. print("Group1 distributions:")
  805. print(group1[['Age', 'Sex', 'Site']].describe(include='all'))
  806. print("Group2 distributions:")
  807. print(group2[['Age', 'Sex', 'Site']].describe(include='all'))
  808. # Drop helper columns
  809. group1 = group1.drop(columns=['Age_bin', 'strata'])
  810. group2 = group2.drop(columns=['Age_bin', 'strata'])
  811. # 1. Fit PCA on HC Group 1
  812. n_components = 10
  813. pca = PCA(n_components=n_components)
  814. scaler = StandardScaler()
  815. # Fit scaler on Group1 and transform
  816. #X_group1_scaled = scaler.fit_transform(group1[imaging_cols].abs())
  817. if pca_abs == True:
  818. X_group1_scaled = scaler.fit_transform(group1[imaging_cols].abs())
  819. elif pca_abs == False:
  820. X_group1_scaled = scaler.fit_transform(group1[imaging_cols])
  821. # Fit PCA in Group1 (HC)
  822. X_group1_pcs = pca.fit_transform(X_group1_scaled)
  823. if pca_abs == True:
  824. # 2. Apply same Scaler and PCA to Group2 (HC)
  825. X_group2_scaled = scaler.transform(group2[imaging_cols].abs())
  826. X_group2_pcs = pca.transform(X_group2_scaled)
  827. # 3. Apply same PCA to patient data
  828. X_pat_scaled = scaler.transform(imaging_pat[imaging_cols].abs())
  829. X_pat_pcs = pca.transform(X_pat_scaled)
  830. elif pca_abs == False:
  831. # 2. Apply same Scaler and PCA to Group2 (HC)
  832. X_group2_scaled = scaler.transform(group2[imaging_cols])
  833. X_group2_pcs = pca.transform(X_group2_scaled)
  834. # 3. Apply same PCA to patient data
  835. X_pat_scaled = scaler.transform(imaging_pat[imaging_cols])
  836. X_pat_pcs = pca.transform(X_pat_scaled)
  837. # build dfs
  838. pc_columns = [f'PC{i+1}' for i in range(n_components)]
  839. group1_pcs_df = pd.DataFrame(X_group1_pcs, columns=pc_columns, index=group1['participant_id'])
  840. group2_pcs_df = pd.DataFrame(X_group2_pcs, columns=pc_columns, index=group2['participant_id'])
  841. pat_pcs_df = pd.DataFrame(X_pat_pcs, columns=pc_columns, index=imaging_pat['participant_id'])
  842. # Get loadings (components)
  843. # Each row is a PC, each column is a feature
  844. pca_loadings = pd.DataFrame(pca.components_.T, # transpose to get features x PCs
  845. index=imaging_cols,
  846. columns=[f'PC{i+1}' for i in range(n_components)])
  847. pca_loadings.to_csv(os.path.join(out_dir, f'z_pca_loadings_{mod}_fit_in_hc.csv'))
  848. ## Scree plot
  849. explained_var = pca.explained_variance_ratio_ *100 #in % for plotting
  850. plt.figure(figsize=(4, 4))
  851. plt.plot(np.arange(1, len(explained_var)+1), explained_var , marker='o', linestyle='-')
  852. plt.title(f'Scree Plot {mod}')
  853. plt.xlabel('Principal Component')
  854. plt.ylabel('Variance Explained (%)')
  855. plt.xticks(np.arange(1, len(explained_var)+1, step=1))
  856. plt.grid(False)
  857. plt.tight_layout()
  858. plt.savefig(os.path.join(fig_dir, f"screeplot_pca_{mod}_fit_in_hc.svg"),format="svg")
  859. plt.show()
  860. # 1. Combine PCA scores for patients with demographic data
  861. scores_combined_pat = imaging_pat[['participant_id', 'disorder', 'Age', 'Sex', 'Site']].merge(
  862. pat_pcs_df.reset_index().rename(columns={'index':'participant_id'}),
  863. on='participant_id'
  864. )
  865. # 2. Or look at HCs (HC_test)
  866. hc_scores_df = group2_pcs_df
  867. hc_metadata = group2[['participant_id','disorder','Age','Sex','Site']]
  868. scores_combined_hc = hc_metadata.merge(
  869. hc_scores_df.reset_index().rename(columns={'index':'participant_id'}),
  870. on='participant_id'
  871. )
  872. # 3. Merge both
  873. all_scores = pd.concat([scores_combined_hc, scores_combined_pat], ignore_index=True)
  874. all_scores.head()
  875. # plot the first component
  876. if mod in ['CT', 'SA']:
  877. mod_PC12 = [None]*2
  878. mod_PC1_conte = parcel_to_surface(pca_loadings.loc[enigma_order]['PC1'].values, 'aparc_conte69')
  879. mod_PC1_conte[mask] = np.nan
  880. mod_PC2_conte = parcel_to_surface(pca_loadings.loc[enigma_order]['PC2'].values, 'aparc_conte69')
  881. mod_PC2_conte[mask] = np.nan
  882. mod_PC12[0] = mod_PC1_conte
  883. mod_PC12[1] = mod_PC2_conte
  884. save_dir = os.path.join(fig_dir, f'{mod}_unimodal_pc_z_scores_fit_in_hc.png')
  885. plot_hemispheres(surf_lh, surf_rh, array_name=mod_PC12, size=(1200*2,800*2), cmap='BuPu',label_text=['PC1','PC2'],
  886. color_bar=True, zoom=1.2, interactive=False, embed_nb=True, filename=save_dir,
  887. nan_color=nan_color, screenshot=True, background=(1,1,1), color_range=[(0.05,0.18), (-0.25,0.18)],
  888. transparent_bg=True)
  889. all_scores.to_csv(os.path.join(out_dir, f'z_pca_scores_{mod}_fit_in_hc.csv'))
  890. # %% [markdown]
  891. # Check if PCs fit in HCs correlate with those computed in the full sample
  892. # %%
  893. fig, axes = plt.subplots(1, 3, figsize=(9, 3), sharex=False, sharey=False)
  894. for ax, mod in zip(axes, modality):
  895. # Load data
  896. pca_hc = pd.read_csv(
  897. os.path.join(out_dir, f'z_pca_loadings_{mod}_fit_in_hc.csv'),
  898. index_col=0)
  899. pca_all = pd.read_csv(
  900. os.path.join(out_dir, f'z_pca_loadings_{mod}.csv'),
  901. index_col=0)
  902. rois = enigma_order
  903. pcs = ['PC1', 'PC2']
  904. colors = ['#2E4757', '#438477']
  905. results = {}
  906. # Compute correlations + determine flipping per PC
  907. for pc in pcs:
  908. r_val = spearmanr(pca_hc[pc], pca_all[pc])[0]
  909. flip_value = -1 if r_val < 0 else 1
  910. r_val = r_val*-1 if r_val < 0 else r_val
  911. if mod in ['CT', 'SA']:
  912. p_spin = helpers.brainsmash_pvalue_spearman(pca_hc[pc] * flip_value, pca_all[pc], cortical_distmat, nsurr=n_perm, seed=SEED)
  913. elif mod == 'sctx':
  914. p_spin = helpers.brainsmash_pvalue_spearman(pca_hc[pc] * flip_value, pca_all[pc], distmat, nsurr=n_perm, seed=SEED)
  915. else:
  916. p_spin = float('nan')
  917. results[pc] = {
  918. 'r': r_val,
  919. 'p_spin': p_spin,
  920. 'flip': flip_value
  921. }
  922. # Plot PCs
  923. for pc, color in zip(pcs, colors):
  924. flip = results[pc]['flip']
  925. sns.regplot(
  926. x=pca_hc[pc] * flip,
  927. y=pca_all[pc],
  928. scatter_kws={'s': 1, 'alpha': 1, 'color': color},
  929. line_kws={'lw': 1, 'color': color},
  930. ax=ax
  931. )
  932. # Legend handle
  933. ax.plot([], [], color=color,
  934. label=f"{pc}: r={results[pc]['r']:.2f}, "
  935. f"p={results[pc]['p_spin']:.3f}")
  936. # Axis formatting
  937. ax.set_title(mod)
  938. ax.set_box_aspect(1)
  939. ax.set_xlabel("HC only")
  940. ax.legend(frameon=False, fontsize=8)
  941. # Shared y-label
  942. axes[0].set_ylabel("Full sample")
  943. plt.tight_layout()
  944. plt.savefig(
  945. os.path.join(fig_dir, 'PC_loadings_vs_fit_in_hc_vs_fit_in_all.svg'),
  946. format='svg'
  947. )
  948. plt.show()
  949. # %% [markdown]
  950. # # Principal angle analysis:
  951. #
  952. # 1. Principal angles (compares eigenspaces): Are the dominant axes of healthy and pathological variation alignedd?
  953. # 2. Does healthy variation explain patient variation? (Projection / reconstruction error - compare manifolds)
  954. # %%
  955. # Settings
  956. K = 2
  957. n_components = 10
  958. try:
  959. pca_abs
  960. except NameError:
  961. pca_abs = False
  962. projection_rows = []
  963. angle_rows = []
  964. for mod in ["CT"]:
  965. print(f"\nProcessing {mod}")
  966. # Load Z data and extract samples
  967. df_te_Z = pd.read_csv(os.path.join(z_dir, f'{mod}_Z_enigma_test.csv'))
  968. imaging_dev = df_te_Z[df_te_Z['disorder'] == 'Developmental']
  969. imaging_pat = df_te_Z[
  970. (df_te_Z['diagnosis'] == 1) &
  971. (df_te_Z['disorder'] != 'Developmental')
  972. ].copy()
  973. imaging_hc = df_te_Z[df_te_Z['diagnosis'] == -1].copy()
  974. imaging_enigma = df_te_Z[df_te_Z['disorder'] != 'Developmental'].copy()
  975. if mod in ['CT', 'SA']:
  976. imaging_cols = enigma_order
  977. else:
  978. imaging_cols = sctx_order_no_vent
  979. # Fit HC-only PCA
  980. X_hc = imaging_hc[imaging_cols].apply(pd.to_numeric, errors='coerce').dropna()
  981. if pca_abs:
  982. X_hc = X_hc.abs()
  983. scaler = StandardScaler()
  984. X_hc_scaled = scaler.fit_transform(X_hc)
  985. pca_hc = PCA(n_components=n_components)
  986. pca_hc.fit(X_hc_scaled)
  987. # HC normative PC1-PC2 subspace
  988. U_norm = pca_hc.components_[:K].T # ROIs x 2
  989. # Save HC-only loadings
  990. hc_loadings = pd.DataFrame(
  991. pca_hc.components_.T,
  992. index=imaging_cols,
  993. columns=[f"PC{i+1}" for i in range(n_components)]
  994. )
  995. hc_loadings.to_csv(
  996. os.path.join(out_dir, f"{mod}_HC_only_PCA_loadings.csv")
  997. )
  998. # load Cohen's d maps
  999. cohen = pd.read_csv(os.path.join(out_dir, f'{mod}_Cohens_d_supplement.csv'), index_col=0)
  1000. cohen_cols = helpers.get_disorder_columns(
  1001. cohen,
  1002. disorders=disorder_order_pat,
  1003. coltype="Cohen"
  1004. )
  1005. cohens_df = pd.DataFrame({
  1006. dis: cohen[cohen_cols[dis]].values
  1007. for dis in cohen_cols.keys()
  1008. })
  1009. cohens_df.index = cohen['Structure'] if 'Structure' in cohen.columns else cohen.index
  1010. # Match ROI order to PCA feature order
  1011. common_rois = [roi for roi in imaging_cols if roi in cohens_df.index]
  1012. if len(common_rois) != len(imaging_cols):
  1013. print(f"Warning: only {len(common_rois)} / {len(imaging_cols)} ROIs matched.")
  1014. cohens_df = cohens_df.loc[common_rois]
  1015. U_norm_matched = pd.DataFrame(
  1016. U_norm,
  1017. index=imaging_cols,
  1018. columns=["PC1", "PC2"]
  1019. ).loc[common_rois].values
  1020. disorders = [
  1021. d for d in disorder_order_pat
  1022. if d in cohens_df.columns
  1023. ]
  1024. D = cohens_df[disorders].values # ROIs x disorders
  1025. # =====================================================
  1026. # 1: Projection test
  1027. # How much of each Cohen's d map is captured by HC PC1-PC2?
  1028. # =====================================================
  1029. for disorder in disorders:
  1030. d_vec = cohens_df[disorder].values
  1031. d_proj = U_norm_matched @ (U_norm_matched.T @ d_vec) # orthogonal projection, finds the best possible approximation of disease map by only using normative PCs. this computes U^T d. telling us how much of PC1 and PC2 are present in the disease map, e.g. d=1.2*PC1 - 0.4*PC2
  1032. total_energy = np.sum(d_vec ** 2) # original 'energy' (= squared norm), nonnegative and additive across orthogonal components (hence the name energy)
  1033. projected_energy = np.sum(d_proj ** 2) # amount of disease energy inside the normative subspace
  1034. residual_energy = np.sum((d_vec - d_proj) ** 2) # amount of energy not inside normative subspace / cannot be explained by it
  1035. r2_k = projected_energy / total_energy
  1036. projection_rows.append({
  1037. "modality": mod,
  1038. "disorder": disorder,
  1039. "K": K,
  1040. "R2_normative_PC1_PC2": r2_k,
  1041. "projected_energy": projected_energy,
  1042. "residual_energy": residual_energy,
  1043. "total_energy": total_energy,
  1044. "residual_fraction": residual_energy / total_energy
  1045. })
  1046. # =====================================================
  1047. # 2: Disease-effect matrix SVD + principal angles
  1048. # Compare HC PC1-PC2 subspace with disease-effect subspace
  1049. # =====================================================
  1050. U_disease, S_disease, Vt_disease = np.linalg.svd(
  1051. D,
  1052. full_matrices=False
  1053. )
  1054. U_dis = U_disease[:, :K]
  1055. angles = np.degrees(
  1056. subspace_angles(U_norm_matched, U_dis)
  1057. )
  1058. angles = np.sort(angles)
  1059. angle_rows.append({
  1060. "modality": mod,
  1061. "K": K,
  1062. "angle_1_deg": angles[0],
  1063. "angle_2_deg": angles[1],
  1064. "max_angle_deg": np.max(angles),
  1065. "mean_angle_deg": np.mean(angles),
  1066. "min_cos_angle": np.min(np.cos(np.radians(angles))),
  1067. "mean_cos_angle": np.mean(np.cos(np.radians(angles))),
  1068. "sin_max_angle": np.sin(np.radians(np.max(angles))),
  1069. "disease_singular_value_1": S_disease[0],
  1070. "disease_singular_value_2": S_disease[1],
  1071. "disease_variance_fraction_K2": np.sum(S_disease[:K] ** 2) / np.sum(S_disease ** 2)
  1072. })
  1073. # Save results
  1074. projection_df = pd.DataFrame(projection_rows)
  1075. angle_df = pd.DataFrame(angle_rows)
  1076. projection_df.to_csv(
  1077. os.path.join(out_dir, "CT_Cohens_d_projection_onto_HC_PC1_PC2.csv"),
  1078. index=False
  1079. )
  1080. angle_df.to_csv(
  1081. os.path.join(out_dir, "CT_Cohens_d_principal_angles_HC_PC1_PC2.csv"),
  1082. index=False
  1083. )
  1084. print("\nProjection test:")
  1085. print(projection_df)
  1086. print("\nPrincipal angles:")
  1087. print(angle_df)
  1088. # %% [markdown]
  1089. # # Individual level principal angle (HC vs full)
  1090. #
  1091. # HC-only PCA vs full-sample PCA using individual-level data
  1092. # Tests whether adding patients perturbs PC1/PC2
  1093. # %%
  1094. K = 2
  1095. n_components = 3 # need PC3 for lambda_2 - lambda_3 eigengap
  1096. try:
  1097. pca_abs
  1098. except NameError:
  1099. pca_abs = False
  1100. angle_rows = []
  1101. dk_rows = []
  1102. for mod in modality:
  1103. print(f"\nProcessing {mod}")
  1104. df_te_Z = pd.read_csv(os.path.join(z_dir, f'{mod}_Z_enigma_test.csv'))
  1105. # extract subsamples
  1106. imaging_dev = df_te_Z[df_te_Z['disorder'] == 'Developmental']
  1107. imaging_pat = df_te_Z[
  1108. (df_te_Z['diagnosis'] == 1) &
  1109. (df_te_Z['disorder'] != 'Developmental')].copy()
  1110. imaging_hc = df_te_Z[df_te_Z['diagnosis'] == -1].copy()
  1111. imaging_enigma = df_te_Z[
  1112. df_te_Z['disorder'] != 'Developmental'].copy()
  1113. if mod in ['CT', 'SA']:
  1114. imaging_cols = enigma_order
  1115. else:
  1116. imaging_cols = sctx_order_no_vent
  1117. # Prepare individual-level matrices
  1118. X_hc = imaging_hc[imaging_cols].apply(pd.to_numeric, errors='coerce').dropna()
  1119. X_full = imaging_enigma[imaging_cols].apply(pd.to_numeric, errors='coerce').dropna()
  1120. if pca_abs:
  1121. X_hc = X_hc.abs()
  1122. X_full = X_full.abs()
  1123. print(f"HC n = {X_hc.shape[0]}")
  1124. print(f"Full n = {X_full.shape[0]}")
  1125. # PCA in HC only
  1126. scaler_hc = StandardScaler()
  1127. X_hc_scaled = scaler_hc.fit_transform(X_hc)
  1128. pca_hc = PCA(n_components=n_components)
  1129. pca_hc.fit(X_hc_scaled)
  1130. # PCA in full sample: HC + patients
  1131. scaler_full = StandardScaler()
  1132. X_full_scaled = scaler_full.fit_transform(X_full)
  1133. pca_full = PCA(n_components=n_components)
  1134. pca_full.fit(X_full_scaled)
  1135. # Save loadings
  1136. hc_loadings = pd.DataFrame(
  1137. pca_hc.components_.T,
  1138. index=imaging_cols,
  1139. columns=[f"PC{i+1}" for i in range(n_components)])
  1140. full_loadings = pd.DataFrame(
  1141. pca_full.components_.T,
  1142. index=imaging_cols,
  1143. columns=[f"PC{i+1}" for i in range(n_components)])
  1144. hc_loadings.to_csv(os.path.join(out_dir, f"{mod}_HC_only_individual_PCA_loadings.csv"))
  1145. full_loadings.to_csv(os.path.join(out_dir, f"{mod}_full_sample_individual_PCA_loadings.csv"))
  1146. # 1. PC-wise angles: PC1 vs PC1, PC2 vs PC2 (sign-invariant because PCA sign is arbitrary)
  1147. for i in [0, 1]:
  1148. u = pca_hc.components_[i]
  1149. v = pca_full.components_[i]
  1150. u = u / np.linalg.norm(u)
  1151. v = v / np.linalg.norm(v)
  1152. cos_angle = np.abs(np.dot(u, v))
  1153. cos_angle = np.clip(cos_angle, -1, 1)
  1154. angle_deg = np.degrees(np.arccos(cos_angle))
  1155. angle_rows.append({
  1156. "modality": mod,
  1157. "comparison": "matched_PC_vector",
  1158. "PC": f"PC{i+1}",
  1159. "angle_deg": angle_deg,
  1160. "cos_angle": cos_angle,
  1161. "sin_angle": np.sin(np.radians(angle_deg)),
  1162. "hc_var_ratio": pca_hc.explained_variance_ratio_[i],
  1163. "full_var_ratio": pca_full.explained_variance_ratio_[i]
  1164. })
  1165. # 2. Principal angles between HC PC1-PC2 and full PC1-PC2
  1166. U_hc = pca_hc.components_[:K].T
  1167. U_full = pca_full.components_[:K].T
  1168. angles = np.degrees(subspace_angles(U_hc, U_full))
  1169. angles = np.sort(angles)
  1170. angle_rows.append({
  1171. "modality": mod,
  1172. "comparison": "PC1_PC2_subspace",
  1173. "PC": "PC1-PC2",
  1174. "angle_1_deg": angles[0],
  1175. "angle_2_deg": angles[1],
  1176. "max_angle_deg": np.max(angles),
  1177. "mean_angle_deg": np.mean(angles),
  1178. "min_cos_angle": np.min(np.cos(np.radians(angles))),
  1179. "mean_cos_angle": np.mean(np.cos(np.radians(angles))),
  1180. "sin_max_angle": np.sin(np.radians(np.max(angles))),
  1181. "hc_PC1_var_ratio": pca_hc.explained_variance_ratio_[0],
  1182. "hc_PC2_var_ratio": pca_hc.explained_variance_ratio_[1],
  1183. "full_PC1_var_ratio": pca_full.explained_variance_ratio_[0],
  1184. "full_PC2_var_ratio": pca_full.explained_variance_ratio_[1]
  1185. })
  1186. # 3. Davis-Kahan-style perturbation diagnostic
  1187. # For the PC1-PC2 subspace, relevant eigengap is lambda_2 - lambda_3
  1188. C_hc = np.cov(X_hc_scaled, rowvar=False)
  1189. C_full = np.cov(X_full_scaled, rowvar=False)
  1190. E = C_full - C_hc
  1191. E_norm = np.linalg.norm(E, ord=2)
  1192. lambda_2 = pca_hc.explained_variance_[1]
  1193. lambda_3 = pca_hc.explained_variance_[2]
  1194. eigengap_2_3 = lambda_2 - lambda_3
  1195. dk_ratio = E_norm / eigengap_2_3 if eigengap_2_3 > 0 else np.nan
  1196. dk_rows.append({
  1197. "modality": mod,
  1198. "subspace": "PC1-PC2",
  1199. "lambda_2": lambda_2,
  1200. "lambda_3": lambda_3,
  1201. "eigengap_lambda2_lambda3": eigengap_2_3,
  1202. "perturbation_norm": E_norm,
  1203. "sin_max_angle_observed": np.sin(np.radians(np.max(angles))),
  1204. "davis_kahan_ratio_E_over_gap": dk_ratio
  1205. })
  1206. # Save outputs
  1207. individual_angle_df = pd.DataFrame(angle_rows)
  1208. individual_dk_df = pd.DataFrame(dk_rows)
  1209. individual_angle_df.to_csv(
  1210. os.path.join(out_dir, "individual_HC_vs_full_PC1_PC2_angles.csv"),
  1211. index=False
  1212. )
  1213. individual_dk_df.to_csv(
  1214. os.path.join(out_dir, "individual_HC_vs_full_PC1_PC2_Davis_Kahan.csv"),
  1215. index=False
  1216. )
  1217. print("\nPrincipal angles:")
  1218. print(individual_angle_df)
  1219. print("\nDavis-Kahan diagnostic:")
  1220. print(individual_dk_df)
  1221. # %%
  1222. n_components = 10
  1223. try:
  1224. pca_abs
  1225. except NameError:
  1226. pca_abs = False
  1227. angle_results = []
  1228. dk_results = []
  1229. for mod in modality:
  1230. print(f"\nProcessing {mod}")
  1231. df_te_Z = pd.read_csv(os.path.join(z_dir, f'{mod}_Z_enigma_test.csv'))
  1232. # extract subsamples
  1233. imaging_dev = df_te_Z[df_te_Z['disorder'] == 'Developmental']
  1234. imaging_pat = df_te_Z[
  1235. (df_te_Z['diagnosis'] == 1) &
  1236. (df_te_Z['disorder'] != 'Developmental')
  1237. ].copy()
  1238. imaging_hc = df_te_Z[df_te_Z['diagnosis'] == -1].copy()
  1239. imaging_enigma = df_te_Z[df_te_Z['disorder'] != 'Developmental'].copy()
  1240. if mod in ['CT', 'SA']:
  1241. imaging_cols = enigma_order
  1242. else:
  1243. imaging_cols = sctx_order_no_vent
  1244. # Prepare data
  1245. X_hc = imaging_hc[imaging_cols].apply(pd.to_numeric, errors='coerce').dropna()
  1246. X_full = imaging_enigma[imaging_cols].apply(pd.to_numeric, errors='coerce').dropna()
  1247. if pca_abs:
  1248. X_hc = X_hc.abs()
  1249. X_full = X_full.abs()
  1250. print(f"HC n = {X_hc.shape[0]}")
  1251. print(f"Full n = {X_full.shape[0]}")
  1252. # Fit PCA in HC only
  1253. scaler_hc = StandardScaler()
  1254. X_hc_scaled = scaler_hc.fit_transform(X_hc)
  1255. pca_hc = PCA(n_components=n_components)
  1256. pca_hc.fit(X_hc_scaled)
  1257. # Fit PCA in full sample
  1258. scaler_full = StandardScaler()
  1259. X_full_scaled = scaler_full.fit_transform(X_full)
  1260. pca_full = PCA(n_components=n_components)
  1261. pca_full.fit(X_full_scaled)
  1262. # Save loadings
  1263. hc_loadings = pd.DataFrame(
  1264. pca_hc.components_.T,
  1265. index=imaging_cols,
  1266. columns=[f'PC{i+1}' for i in range(n_components)])
  1267. full_loadings = pd.DataFrame(
  1268. pca_full.components_.T,
  1269. index=imaging_cols,
  1270. columns=[f'PC{i+1}' for i in range(n_components)])
  1271. # =====================================================
  1272. # 1. PC-wise angles
  1273. # =====================================================
  1274. for i in range(n_components):
  1275. u = pca_hc.components_[i]
  1276. v = pca_full.components_[i]
  1277. # normalize
  1278. u = u / np.linalg.norm(u)
  1279. v = v / np.linalg.norm(v)
  1280. # sign-invariant angle
  1281. cos_angle = np.abs(np.dot(u, v))
  1282. cos_angle = np.clip(cos_angle, -1, 1)
  1283. angle_deg = np.degrees(np.arccos(cos_angle))
  1284. sin_angle = np.sin(np.radians(angle_deg))
  1285. angle_results.append({
  1286. 'modality': mod,
  1287. 'comparison': 'matched_PC_vector',
  1288. 'PC': f'PC{i+1}',
  1289. 'k': i + 1,
  1290. 'angle_deg': angle_deg,
  1291. 'cos_angle': cos_angle,
  1292. 'sin_angle': sin_angle,
  1293. 'hc_var_ratio': pca_hc.explained_variance_ratio_[i],
  1294. 'full_var_ratio': pca_full.explained_variance_ratio_[i]
  1295. })
  1296. # =====================================================
  1297. # 2. Subspace principal angles
  1298. # =====================================================
  1299. for k in range(1, n_components + 1):
  1300. U_hc = pca_hc.components_[:k].T
  1301. U_full = pca_full.components_[:k].T
  1302. angles = np.degrees(subspace_angles(U_hc, U_full))
  1303. angles = np.sort(angles)
  1304. angle_results.append({
  1305. 'modality': mod,
  1306. 'comparison': 'subspace',
  1307. 'PC': f'PC1-PC{k}',
  1308. 'k': k,
  1309. 'max_angle_deg': np.max(angles),
  1310. 'mean_angle_deg': np.mean(angles),
  1311. 'min_angle_deg': np.min(angles),
  1312. 'min_cos_angle': np.min(np.cos(np.radians(angles))),
  1313. 'mean_cos_angle': np.mean(np.cos(np.radians(angles))),
  1314. 'sin_max_angle': np.sin(np.radians(np.max(angles)))
  1315. })
  1316. # Save results
  1317. angle_df = pd.DataFrame(angle_results)
  1318. dk_df = pd.DataFrame(dk_results)
  1319. angle_df.to_csv(
  1320. os.path.join(out_dir, 'HC_vs_full_sample_principal_angles.csv'),
  1321. index=False
  1322. )
  1323. print("Saved:")
  1324. print(os.path.join(out_dir, 'HC_vs_full_sample_principal_angles.csv'))
  1325. # %% [markdown]
  1326. # # Leave one site out stability check
  1327. # %%
  1328. # parameters
  1329. site_col = "Site"
  1330. n_folds = 10
  1331. # get sites once (using CT here just for reference, could use any)
  1332. dummy_data = pd.read_csv(os.path.join(z_dir, "CT_Z_enigma_test.csv"))
  1333. sites = np.array(dummy_data[site_col].unique())
  1334. # deterministic split into 10 folds
  1335. sites_sorted = np.sort(sites)
  1336. site_folds = np.array_split(sites_sorted, n_folds)
  1337. for mod in modality:
  1338. print(f"\nRunning robustness checks for modality: {mod}")
  1339. pcs_to_check = ["PC1", "PC2"]
  1340. results = []
  1341. # reference PCA loadings (full sample)
  1342. ref_loadings = pd.read_csv(os.path.join(out_dir, f'z_pca_loadings_{mod}.csv'), index_col=0)
  1343. # Load data
  1344. df_te_Z = pd.read_csv(os.path.join(z_dir, f"{mod}_Z_enigma_test.csv"))
  1345. imaging_enigma = df_te_Z[df_te_Z['disorder'] != 'Developmental']
  1346. imaging_cols = list(regions_by_modality[mod])
  1347. missing_cols = sorted(set(imaging_cols) - set(imaging_enigma.columns))
  1348. if missing_cols:
  1349. raise KeyError(f"Missing expected columns for {mod}: {missing_cols}")
  1350. # ==========================================================
  1351. # 1. Leave-One-Site-Out (LOSO)
  1352. # ==========================================================
  1353. for site in sites:
  1354. print(f" LOSO – leaving out site: {site}")
  1355. df_sub = imaging_enigma[imaging_enigma[site_col] != site]
  1356. scaler = StandardScaler()
  1357. X_scaled = scaler.fit_transform(df_sub[imaging_cols].abs())
  1358. pca = PCA(n_components=n_components, random_state=0)
  1359. pca.fit(X_scaled)
  1360. loadings = pd.DataFrame(
  1361. pca.components_.T,
  1362. index=imaging_cols,
  1363. columns=[f'PC{i+1}' for i in range(n_components)]
  1364. )
  1365. for pc in pcs_to_check:
  1366. ref_vec = ref_loadings[pc].values
  1367. vec = loadings[pc].values
  1368. # sign alignment
  1369. if spearmanr(ref_vec, vec)[0] < 0:
  1370. vec = -vec
  1371. rho, pval = spearmanr(ref_vec, vec)
  1372. results.append({
  1373. "modality": mod,
  1374. "condition": "Leave-1-site-out",
  1375. "left_out": site,
  1376. "PC": pc,
  1377. "spearman_r": rho,
  1378. "p": pval
  1379. })
  1380. # ==========================================================
  1381. # 2. Leave-10%-of-Sites-Out (10-fold site CV)
  1382. # ==========================================================
  1383. for fold_idx, fold_sites in enumerate(site_folds, start=1):
  1384. print(f" L10SO – fold {fold_idx}, leaving out {len(fold_sites)} sites")
  1385. df_sub = imaging_enigma[~imaging_enigma[site_col].isin(fold_sites)]
  1386. scaler = StandardScaler()
  1387. if pca_abs == True:
  1388. X_scaled = scaler.fit_transform(df_sub[imaging_cols].abs())
  1389. if pca_abs == False:
  1390. X_scaled = scaler.fit_transform(df_sub[imaging_cols])
  1391. pca = PCA(n_components=n_components, random_state=0)
  1392. pca.fit(X_scaled)
  1393. loadings = pd.DataFrame(
  1394. pca.components_.T,
  1395. index=imaging_cols,
  1396. columns=[f'PC{i+1}' for i in range(n_components)]
  1397. )
  1398. for pc in pcs_to_check:
  1399. ref_vec = ref_loadings[pc].values
  1400. vec = loadings[pc].values
  1401. # sign alignment
  1402. if spearmanr(ref_vec, vec)[0] < 0:
  1403. vec = -vec
  1404. rho, pval = spearmanr(ref_vec, vec)
  1405. results.append({
  1406. "modality": mod,
  1407. "condition": "Leave-10%-sites-out",
  1408. "left_out": f"fold_{fold_idx}",
  1409. "PC": pc,
  1410. "spearman_r": rho,
  1411. "p": pval
  1412. })
  1413. # Results dataframe
  1414. results_df = pd.DataFrame(results)
  1415. results_df.to_csv(
  1416. os.path.join(out_dir, f"robustness_pca_loso_l10so_folds_{mod}.csv"),
  1417. index=False
  1418. )
  1419. # Plot
  1420. plt.figure(figsize=(4.5, 4))
  1421. sns.stripplot(
  1422. data=results_df,
  1423. x="PC",
  1424. y="spearman_r",
  1425. hue="condition",
  1426. dodge=True,
  1427. jitter=True,
  1428. size=6,
  1429. alpha=0.8,
  1430. palette='flare'
  1431. )
  1432. plt.ylim(0.7, 1.05)
  1433. plt.ylabel("Spatial Spearman r")
  1434. plt.title(f"PCA robustness ({mod})")
  1435. plt.legend(title="", frameon=False)
  1436. plt.tight_layout()
  1437. plt.savefig(
  1438. os.path.join(fig_dir, f"pca_robustness_loso_l10so_folds_{mod}.svg"),
  1439. format="svg"
  1440. )
  1441. plt.show()
  1442. summary_df = (
  1443. results_df
  1444. .groupby(["modality", "condition", "PC"])
  1445. .agg(
  1446. spearman_min=("spearman_r", "min"),
  1447. spearman_max=("spearman_r", "max"),
  1448. spearman_mean=("spearman_r", "mean"),
  1449. spearman_std=("spearman_r", "std"),
  1450. n_runs=("spearman_r", "count")
  1451. ).round(2)
  1452. .reset_index()
  1453. )
  1454. # save table
  1455. summary_df.to_csv(
  1456. os.path.join(out_dir, f"pca_robustness_summary_loso_l10so_{mod}.csv"),
  1457. index=False
  1458. )
  1459. # %% [markdown]
  1460. # # Association between PCs and Symptom scores
  1461. # %%
  1462. pc_list = ['PC1', 'PC2']
  1463. # Define disorders and symptom columns
  1464. disorders_symptoms = {
  1465. 'ANX': ['STAI_T'],
  1466. 'ASD': ['ADOS_CSS'],
  1467. 'BP': None, #has to be merged below
  1468. 'MDD': ['HDRS'],
  1469. 'OCD': ['Sev'],
  1470. 'SCZ': None #has to be merged below
  1471. }
  1472. all_results = []
  1473. # Loop over modalities
  1474. for mod in modality:
  1475. # Load PCA scores
  1476. scores_file = os.path.join(out_dir, f'z_PCA_scores_{mod}.csv')
  1477. if not os.path.exists(scores_file):
  1478. print(f" - Missing scores file: {scores_file} (skipping modality)")
  1479. continue
  1480. scores_combined = pd.read_csv(scores_file, index_col=0)
  1481. if 'participant_id' not in scores_combined.columns:
  1482. scores_combined = scores_combined.reset_index().rename(columns={'index': 'participant_id'})
  1483. # Loop over disorders
  1484. for disorder, symp_columns in disorders_symptoms.items():
  1485. print(f"\nProcessing disorder: {disorder} (modality={mod})")
  1486. # Load disorder-specific covariates/symptoms
  1487. if disorder == 'ASD':
  1488. cov_file = os.path.join(raw_dir,'ASD','standardized','symptoms.csv')
  1489. cov_df = pd.read_csv(cov_file)
  1490. cov_df['participant_id'] = (
  1491. 'ASD_' +
  1492. cov_df['Site_Scanner'].astype(str).str.lower() +
  1493. '_' +
  1494. cov_df['participant_id'].astype(str).str.lower()
  1495. )
  1496. else:
  1497. cov_file = os.path.join(raw_dir,f'{disorder}','standardized', 'Covariates.csv')
  1498. cov_df = pd.read_csv(cov_file)
  1499. cov_df['participant_id'] = f'{disorder}_' + cov_df['participant_id'].astype(str)
  1500. # SCZ/BP symptom merging - combine different variable names
  1501. if disorder in ['SCZ', 'BP']:
  1502. column_groups = {"PANSS_Total": ["PANSS_Total", "PANSS_TOTAL", "PANSSTOT"]}
  1503. for new_col, synonyms in column_groups.items():
  1504. existing_cols = [c for c in synonyms if c in cov_df.columns]
  1505. if existing_cols:
  1506. cov_df[new_col + "_combined"] = cov_df[existing_cols].bfill(axis=1).iloc[:, 0]
  1507. else:
  1508. cov_df[new_col + "_combined"] = pd.NA
  1509. symp_columns = [c for c in cov_df.columns if c.endswith("_combined")]
  1510. if not symp_columns:
  1511. print(f"No symptom columns defined for {disorder}; skipping.")
  1512. continue
  1513. # merge
  1514. merged_df = scores_combined.merge(cov_df, on='participant_id', how='inner')
  1515. # Keep only patients if diagnosis present
  1516. if 'diagnosis' in merged_df.columns:
  1517. merged_df = merged_df[merged_df['diagnosis'] == 1].copy()
  1518. else:
  1519. print("Warning: 'diagnosis' not found; proceeding without filtering on diagnosis.")
  1520. # Loop through symptoms
  1521. for col in symp_columns:
  1522. if col not in merged_df.columns:
  1523. print(f" - {col} not found for {disorder}, skipping.")
  1524. continue
  1525. print(f" - Running analysis for symptom: {col}")
  1526. # Need symptom + PCs + covariates (Age/Sex)
  1527. required_cols = [col] + pc_list + ['Age', 'Sex']
  1528. df_all_dis = merged_df.dropna(subset=required_cols).copy()
  1529. if df_all_dis.shape[0] < 10:
  1530. print(f" - Too few subjects after dropna for {disorder} {col} (n={df_all_dis.shape[0]}), skipping.")
  1531. continue
  1532. # symptom magnitude
  1533. df_all_dis[col] = pd.to_numeric(df_all_dis[col], errors='coerce')
  1534. df_all_dis = df_all_dis.dropna(subset=[col])
  1535. if df_all_dis.shape[0] < 10:
  1536. print(f" - Too few valid symptom values for {disorder} {col} (n={df_all_dis.shape[0]}), skipping.")
  1537. continue
  1538. # histogram
  1539. if mod == 'CT':
  1540. plt.figure(figsize=(3, 2))
  1541. plt.hist(df_all_dis[col].values, bins=20)
  1542. plt.title(f'{disorder} – {col} distribution (n={len(df_all_dis)}) [{mod}]')
  1543. plt.xlabel(col)
  1544. plt.ylabel('Count')
  1545. plt.tight_layout()
  1546. plt.show()
  1547. # -----------------------
  1548. # For each PC: standardized multiple regression
  1549. # symptom_z ~ PC_z + Age_z + Sex(dummies)
  1550. # and extract beta for PC_z (standardized beta)
  1551. # -----------------------
  1552. # Standardize symptom
  1553. y_raw = df_all_dis[col].astype(float)
  1554. y_mean = y_raw.mean()
  1555. y_sd = y_raw.std(ddof=0)
  1556. if y_sd == 0 or np.isnan(y_sd):
  1557. print(f" - Symptom {col} has zero variance; skipping.")
  1558. continue
  1559. df_all_dis['symptom_z'] = (y_raw - y_mean) / y_sd
  1560. # Standardize Age
  1561. age_raw = df_all_dis['Age'].astype(float)
  1562. age_sd = age_raw.std(ddof=0)
  1563. if age_sd == 0 or np.isnan(age_sd):
  1564. print(f" - Age has zero variance; skipping.")
  1565. continue
  1566. df_all_dis['Age_z'] = (age_raw - age_raw.mean()) / age_sd
  1567. # Sex dummies
  1568. sex_dummies = pd.get_dummies(df_all_dis['Sex'].astype(str), drop_first=True)
  1569. for pc in pc_list:
  1570. if pc not in df_all_dis.columns:
  1571. print(f" - {pc} missing; skipping.")
  1572. continue
  1573. pc_raw = df_all_dis[pc].astype(float)
  1574. pc_sd = pc_raw.std(ddof=0)
  1575. if pc_sd == 0 or np.isnan(pc_sd):
  1576. print(f" - {pc} has zero variance for {disorder} {col}, skipping.")
  1577. continue
  1578. df_all_dis[f'{pc}_z'] = (pc_raw - pc_raw.mean()) / pc_sd
  1579. # Design matrix: PC_z + Age_z + Sex dummies (+ intercept)
  1580. X = pd.concat(
  1581. [df_all_dis[[f'{pc}_z', 'Age_z']], sex_dummies],
  1582. axis=1
  1583. )
  1584. X = sm.add_constant(X, has_constant='add')
  1585. y = df_all_dis['symptom_z']
  1586. try:
  1587. model = sm.OLS(y, X).fit()
  1588. except Exception as e:
  1589. print(f" - Multiple regression failed for {disorder} {col} {pc}: {e}")
  1590. continue
  1591. # standardized beta for PC is just coef on PC_z
  1592. beta_pc_std = model.params.get(f'{pc}_z', np.nan)
  1593. se_pc_std = model.bse.get(f'{pc}_z', np.nan)
  1594. t_pc_std = model.tvalues.get(f'{pc}_z', np.nan)
  1595. p_pc_std = model.pvalues.get(f'{pc}_z', np.nan)
  1596. r2 = model.rsquared
  1597. n_obs = int(model.nobs)
  1598. all_results.append({
  1599. 'modality': str(mod),
  1600. 'disorder': disorder,
  1601. 'symptom': col,
  1602. 'pc': pc,
  1603. 'n': n_obs,
  1604. 'beta_pc_std': float(beta_pc_std) if np.isfinite(beta_pc_std) else np.nan,
  1605. 'se_pc_std': float(se_pc_std) if np.isfinite(se_pc_std) else np.nan,
  1606. 't_pc_std': float(t_pc_std) if np.isfinite(t_pc_std) else np.nan,
  1607. 'p_value_pc_std': float(p_pc_std) if np.isfinite(p_pc_std) else np.nan,
  1608. 'R2': float(r2) if np.isfinite(r2) else np.nan,
  1609. })
  1610. # Convert results
  1611. results_df = pd.DataFrame(all_results)
  1612. if results_df.empty:
  1613. print("No results were produced.")
  1614. else:
  1615. results_df['modality'] = results_df['modality'].astype(str)
  1616. results_df['p_fdr_pc_std'] = np.nan
  1617. results_df['sig_pc_std'] = False
  1618. # Apply BH-FDR within each modality
  1619. for mod_name in results_df['modality'].dropna().unique():
  1620. msk = results_df['modality'] == mod_name
  1621. pvals = results_df.loc[msk, 'p_value_pc_std'].fillna(1.0).to_numpy()
  1622. reject, pvals_corr, _, _ = multipletests(pvals, method='fdr_bh')
  1623. results_df.loc[msk, 'p_fdr_pc_std'] = pvals_corr
  1624. results_df.loc[msk, 'sig_pc_std'] = reject
  1625. display_cols = [
  1626. 'modality', 'disorder', 'symptom', 'pc', 'n',
  1627. 'beta_pc_std', 'se_pc_std', 't_pc_std', 'p_value_pc_std',
  1628. 'p_fdr_pc_std', 'sig_pc_std',
  1629. 'R2']
  1630. print("\nSymptom ~ PC_z + Age_z + Sex (standardized beta for PC), FDR within modality:")
  1631. print(results_df[display_cols].sort_values(['modality','disorder','symptom','pc']).reset_index(drop=True))
  1632. results_df = results_df.round(3)
  1633. results_df.to_csv(os.path.join(out_dir, 'Symptom_PC_associations.csv'))
  1634. # %%
  1635. disorder_color_map = {
  1636. 'ANX': '#2E4757',
  1637. 'ASD': '#438477',
  1638. 'BP': '#FFC487',
  1639. 'MDD': '#E9735B',
  1640. 'OCD': '#D3436E',
  1641. 'SCZ': '#6D2D51'
  1642. }
  1643. helpers.plot_symptom_forest(
  1644. results_df=results_df,
  1645. disorder_order_pat=disorder_order_pat,
  1646. disorder_cmap=disorder_color_map,
  1647. fig_dir=fig_dir,
  1648. filename="symptom_PC_forest.svg",
  1649. modalities=modality,
  1650. xlim=(-0.35, 0.35)
  1651. )

2_Principal_axes.ipynb at commit b273325, no license · at the source

Overview

Authors: Meike D. Hettwer1,2,3,4, Amin Saberi1,3,5, Golia Shafiei2,4,6, Aikaterina Manoli1,3,7, Augustijn A. De Boer8,9, Dag Alnæs10,11, Pino Alonso12,13,14,15, Celso Arango15,16,17, Michal Assaf18,19, Mihai Avram20, Srinivas Balachander21, Nerisa Banaj22, Zeynep Başgöze23,24, Marcelo C. Batistuzzo25,26, Stephanie E.E.C. Bauduin27, Francesco Benedetti28,29, Sara Bertolin13,14,30, Bianca Besteher31,32, Laura Biagi33, Robert J. Blair34,35
and 236 other authorsKarina Blair36, Sven Bölte37,38,39, Stefan Borgwardt20, Paolo Bosco33, Paolo Brambilla40,41, Beatrice Bravi42, Brian P. Brennan43, Willem B. Bruin44,45,46, Geraldo F. Busatto47, Murray J. Cairns48,49, Sara Calderoni33,50, Vince Calhoun51, Rosa Calvo52,53,54,55, Marta Cano15,56, Vaughan J. Carr57,58, Sean P. Carruthers59, Georgia F. Caruana60, Xavier Caseras61, Stanley V. Catts62, I-Jou Chi63,64, Derin Cobia65, Federica Colombo28, Maria Beatriz Couto66,67, Benedicto Crespo-Facorro15,68,69, Kathryn R. Cullen70, Udo Dannlowski32,71,72,73, Mirella Dapretto74,75,76, Adriana Di Martino77, Gretchen J. Diefenbach19,78, Annemiek Dols44,79, Fabio Duran80, Nadza Dzinalija81,82, Christine Ecker83, Stefan Ehrlich84, Goi Khia Eng85,86, Damien A. Fair24,87,88, Afonso Fernandes66, Jamie D. Feusner37,89,90, Gregory A. Fonzo91, Paola Fuentes-Claramonte30,92, Nadine Gaab93,94, Beata R. Godlewska95,96, Benjamin I. Goldstein90, Ali Saffet Gonul97, Ian H. Gotlib98, Hans J. Grabe99,100, Melissa J. Green57, Dominik Grotegerd71, Oliver Gruber101, Patricia Gruner19, Abha R. Gupta102,103,104, Ruben C. Gur4,105, Raquel E. Gur4,105, Shlomi Haar106, Jarold P. Hamilton107, Unn K. Haukvik108,109, Frans A. Henskens110,111, Asli C. Hinc97,112, Yoshiyuki Hirano113,114, Hao Hu115, Matthew E. Hughes59,116, Felice Iasevoli117, Yanghee Im118, Jonathan Ipser119, Hammza Jabbar Abdl Sattar Hamoudi120, Allison Jack121, Delfina Janiri122,123, Joost Janssen124, Fern Jaspers-Fayer125, Kyle M. Jensen126, Jingwen Jin127, Stefan Kaiser128, Toshiharu Kamishikiryo129, Melody J. Y. Kang118, Andriana Karuk30,92, Norbert Kathmann130, Kody G. Kennedy131, Minah Kim132,133,134, Joseph A. King84, Tilo Kircher135, Anna Luisa Klahn136, Daniel N. Klein137, Kathrin Koch138, Peter Kochunov139, Azadeh Kushki89,140, Jun Soo Kwon141,142, Marilyn T. Lake119,143, Mikael Landén136,144, Luisa Lazaro15,52,53,54, Irina Lebedeva145, Nabulsi Leila118, Meng Li31, Christine Lochner146, Carmel M. Loughland147, Beatriz Luna148,149, Karl Lundin Remnélius37,150, Bradley J. MacIntosh151,152, Matteo Mancini153,154,155, Gisele G. Manfro156,157, Rachel Marsh158,159, Ignacio Martinez-Zalacain12,160, David Mataix-Cols161, Colm McDonald162, Jane McGrath163, Jose M. Menchon12,14,30, Pedro Morgado66,67,164, Bryan J. Mowry165,166, Lilianne R. Mujica-Parodi167,168, Emma Muñoz169, Filippo Muratori33, Declan Murphy170,171, Benson Mwangi172, Janardhanan C. Narayanaswamy173,174,175, Jin Narumoto176, Stener Nerland177,178, Janina Neufeld37,179, Benjamin T. Newman180,181, Jared A. Nielsen65, Erika L. Nurmi182, Joseph O’Neill183,184, Kirsten M. OHearn185, Go Okada129, Bob Oranje186, Christos Pantelis60,187,188, Nadine Parker10, Kevin A. Pelphrey189, Mary L. Phillips190, John Piacentini76, Maria Picó-Pérez66,191, Rosanne Picotin101, Alessandro Pigoni192, Fabrizio Piras22, Federica Piras22, Edith Pomarol-Clotet30,92, Giuseppe Pontillo117, Daniel Porta-Casteràs56, Maria J. Portella15,56,193, Rebecca B. Price194, Yann Quidé195,196, Joaquim Radua197,198, Elysha Ringin60, Elena Rodriguez-Cano30,199, Jaroslav Rokicki200,201, Rafael Romero-Garcia202,203, Susan Rossell204,205, Hanyang Ruan138,206, Katya Rubia207, Matthew D. Sacchet208, Yuki Sakai209,210,211, Raymond Salvador30,92, Gabriele Sani122,123, Joao R. Sato212, André Schmidt213, Rodney J. Scott49,147,214, Carl M. Sellgren161,215, Lukas Sempach213,216, Eiji Shimizu113,114, Venkataram Shivakumar217, Kang Sim218,219,220, Jair C. Soares172, Noam Soreni221,222, Carles Soriano-Mas13,223,224, Nuno Sousa66,225,226,227, Frederike Stein135, Jonas L. Steinhäuser-Meerz228,229,230, Emily R. Stern85,86,231, Thomas Straube232, Jeffrey R. Strawn233, Philip J. Sumner59, Ibrahim Sungur97, Philip R. Szeszko234,235, Kristiina Tammimies37,236, Alexander S. Tomyshev145, Michela Tosetti33, Laurens A. van de Mortel44,45, John D. van Horn180,237, Helena van Nieuwenhuizen137, Tamsyn E. van Rheenen59,60, Guido van Wingen44,45, Daniela Vecchio238, Ganesan Venkatasubramanian21, Eduard Vieta197,239, Enric Vilajosana52,54,240, Yolanda Vives-Gilabert241, Henry Völzke242, Chris Vriend82,243,244, Gregory L. Wallace245, Zhen Wang115, Martin Walter31,32, Lei Wang246, Sara Jane Webb247, Lars T. Westlye10,11,248, Sarah Whittle249,250, Mark O. Wielpütz251, Katharina Wittfeld99, Will Woods252, Mon-Ju Wu172, Tony T. Yang253,254,255,256, Lakshmi N. Yatham125,257, Tokiko Yoshida114,258, Abe Yoshinari210,259, Je-Yeon Yun141,260, Qing Zhao115, Giovana B. Zunta-Soares172, ENIGMA Autism Working Group:, ENIGMA Anxiety Working Group:, ENIGMA Bipolar Disorder Working Group:, ENIGMA Major Depression Working Group:, ENIGMA OCD Working Group:, ENIGMA Schizophrenia Working Group:, Odile A. van den Heuvel81,82, Lianne Schmaal261,262, Elena Pozzi261,262, Ole A. Andreassen10,248, Christopher R. K. Ching118, Katherine E. Lawrence118, Gaon S. Kim118, Jan K. Buitelaar263, Theo G.M. van Erp264,265, Dan J. Stein266, Daniel S. Pine267, Anderson M. Winkler268, Janna Marie Bas-Hoogendam269,270,271, Andre Zugman272, Nic J.A. van der Wee270, Nynke A. Groenewold119, Andre Marquand8, Boris C. Bernhardt273, Neda Jahanshad274, Tyler M. Moore4,6, Paul M. Thompson118, Sophia I. Thomopoulos118, Simon B. Eickhoff3,5, Matthias Kirschner128,275,276, Theodore D. Satterthwaite2,4,6, Sofie L. Valk1,3,5
276 affiliations
  1. Max Planck Institute for Human Cognitive and Brain Sciences, Leipzig, Germany
  2. Penn Lifespan Informatics and Neuroimaging Center, University of Pennsylvania, Philadelphia, PA, USA
  3. Institute of Neuroscience and Medicine, Brain and Behaviour (INM-7), Research Center Jülich, Jülich, Germany
  4. Brain Behavior Laboratory, Department of Psychiatry, University of Pennsylvania Perelman School of Medicine, Philadelphia, PA, USA
  5. Institute of Systems Neuroscience, Medical Faculty and University Hospital Düsseldorf, Heinrich Heine University Düsseldorf, Düsseldorf, Germany
  6. Lifespan Brain Institute (LiBI) of Penn Medicine and CHOP, University of Pennsylvania, Philadelphia, PA, USA
  7. Faculty of Medicine, Leipzig University, Leipzig, Germany
  8. Donders Institute for Brain, Cognition and Behaviour, Radboud University Medical Centre, Nijmegen, the Netherlands
  9. Radboud University Medical Center, Nijmegen, the Netherlands
  10. Centre for Precision Psychiatry, Division of Mental Health and Addiction, Oslo University Hospital and University of Oslo, Oslo, Norway
  11. Department of Psychology, University of Oslo, Oslo, Norway
  12. Department of Psychiatry, Bellvitge Biomedical Research Institute, Bellvitge University Hospital, Barcelona, Spain
  13. Psychiatry and Mental Health Group, Institut d’Investigació Biomèrica de Bellvitge (IDIBELL), Bellvitge University Hospital, Barcelona, Spain
  14. Department of Clinical Sciences, Faculty of Medicine, University of Barcelona, Barcelona, Spain
  15. Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Instituto de Salud Carlos III, Madrid, Spain
  16. Instituto de Investigación del Hospital Universitario La Paz (IdiPAZ), Madrid, Spain
  17. School of Medicine, Universidad Autónoma de Madrid, Madrid, Spain
  18. Olin Neuropsychiatry Research Center, Institute of Living, Hartford Hospital, Hartford, CN, USA
  19. Department of Psychiatry, Yale School of Medicine, New Haven, CN, USA
  20. University of Luebeck, Department of Psychiatry and Psychotherapy, Luebeck, Germany
  21. Department of Psychiatry, National Institute of Mental Health and Neuro Sciences (NIMHANS), Bengaluru, India
  22. Laboratory of Neuropsychiatry, Department of Clinical Neuroscience and Neurorehabilitation, Santa Lucia Foundation Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS), Rome, Italy
  23. University of Minnesota Medical School, Department of Psychiatry and Behavioral Sciences, Minneapolis, MN, USA
  24. University of Minnesota, Masonic Institute for the Developing Brain (MIDB), Minneapolis, MN, USA
  25. Department of Psychiatry, Faculdade de Medicina, Universidade de São Paulo, São Paulo, Brazil
  26. Department of Methods and Techniques in Psychology, Pontifical Catholic University, São Paulo, SP, Brazil
  27. Leiden University Medical Center (LUMC), Department of Psychiatry, Leiden, the Netherlands
  28. Psychiatry and Clinical Psychobiology Unit, Division of Neuroscience, Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS), Ospedale San Raffaele, Milan, Italy
  29. University Vita-Salute San Raffaele, Milan, Italy
  30. Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Instituto de Salud Carlos III, Barcelona, Spain
  31. Department of Psychiatry and Psychotherapy, Jena University Hospital, Friedrich-Schiller-University Jena, Jena, Germany
  32. German Center for Mental Health (DZPG), partner site Halle-Jena-Magdeburg, Germany
  33. Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS), Fondazione Stella Maris, Pisa, Italy
  34. Virginia Commonwealth University, Richmond, VA, USA
  35. Department of Clinical Medicine, Child and Adolescent Psychiatry, University of Copenhagen, Copenhagen, Denmark
  36. KabScientific
  37. Center of Neurodevelopmental Disorders (KIND), Department of Women’s and Children’s Health, Centre for Psychiatry Research, Karolinska Institutet and Region Stockholm, Stockholm, Sweden
  38. Child and Adolescent Psychiatry, Stockholm Health Care Services, Stockholm, Sweden
  39. Curtin Autism Research Group, Curtin School of Allied Health, Curtin University, Perth, Australia
  40. Department of Pathophysiology and Transplantation, University of Milan, Milan, Italy
  41. Department of Neurosciences and Mental Health, Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS) Fondazione Ca’ Granda Ospedale Maggiore Policlinico, Milan, Italy
  42. Psychiatry and Clinical Psychobiology Unit, Institute of Experimental Neuroscience, Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS) San Raffaele Hospital, Milan, Italy
  43. McLean Hospital, Harvard Medical School, Belmont, MA, USA
  44. Amsterdam University Medical Center, University of Amsterdam, Department of Psychiatry, Amsterdam, The Netherlands
  45. Amsterdam Neuroscience, Amsterdam, The Netherlands
  46. Section Forensic Family and Youth Care, Institute of Education and Child Studies, Leiden University, Leiden, the Netherlands
  47. Hospital das Clinicas HCFMUSP, Faculdade de Medicina, Universidade de Sao Paulo, Sao Paulo, SP, Brazil
  48. School of Biomedical Sciences and Pharmacy, The University of Newcastle, Callaghan, Australia
  49. Hunter Medical Research Institute, New Lambton, Australia
  50. Department of Clinical and Experimental Medicine, University of Pisa, Pisa (Italy)
  51. Tri-institutional Center for Translational Research in Neuroimaging and Data Science (TReNDS), Georgia State University/Georgia Institute of Technology/Emory University, Atlanta, GA, USA
  52. Department of Medicine, Faculty of Medicine and Health Sciences, Institute of Neurosciences, University of Barcelona, Barcelona, Spain
  53. Department of Child and Adolescent Psychiatry and Psychology, Hospital Clinic of Barcelona, Barcelona, Spain
  54. Institut d’Investigacions Biomèdiques August Pi i Sunyer (IDIBAPS), Barcelona, Spain
  55. Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Madrid, Spain
  56. Sant Pau Mental Health Research Group, Institut de Recerca Sant Pau (IR SANT PAU), Barcelona, Spain
  57. School of Clinical Medicine, University of New South Wales, Sydney, Australia
  58. Monash University, Melbourne, Australia
  59. Centre for Mental Health and Brain Sciences, Swinburne University of Technology, Melbourne, Australia
  60. Department of Psychiatry, Faculty of Medicine, Dentistry, and Health Sciences, University of Melbourne, Parkville, Australia
  61. Centre for Neuropsychiatric Genetics and Genomics, Division of Psychological Medicine and Clinical Neurosciences, Cardiff University, Cardiff, UK
  62. Faculty of Health, Medicine and Behavioural Sciences, University of Queensland, Brisbane, Australia
  63. Department of Occupational Therapy, College of Health Sciences, Kaohsiung Medical University, Kaohsiung, Taiwan
  64. Biomedical Artificial Intelligence Academy, Kaohsiung Medical University, Kaohsiung, Taiwan
  65. Department of Psychology and Neuroscience, Brigham Young University, Provo, UT, USA
  66. Life and Health Sciences Research Institute (ICVS), School of Medicine, University of Minho, Braga, Portugal
  67. ICVS/3B’s, PT Government Associate Laboratory, Braga/Guimarães, Portugal
  68. University hospital virgen del Rocío, ibis / CSIC, Sevilla, Spain
  69. University of Sevilla, Sevilla, Spain
  70. University of Minnesota, Child and Adolescent Mental Health (CAMH) Division, Minneapolis, MN, USA
  71. Institute for Translational Psychiatry, University of Münster, Münster, Germany
  72. Department of Psychiatry, Medical School and University Medical Center OWL, Protestant Hospital of the Bethel Foundation, Bielefeld University, Bielefeld, Germany
  73. Center for Intervention and Research on Adaptive and Maladaptive Brain Circuits Underlying Mental Health (C-I-R-C), partner site Halle-Jena-Magdeburg, Germany
  74. The Ahmanson Lovelace Brain Mapping Center, University of California, Los Angeles, CA, USA
  75. Department of Psychiatry and Biobehavioral Sciences, University of California, Los Angeles (UCLA) School of Medicine, Los Angeles, CA, USA
  76. Semel Institute for Neuroscience and Human Behavior, University of California, Los Angeles, CA, USA
  77. Child Mind Institute, Autism Center, New York, NY, USA
  78. Anxiety Disorders Center, Institute of Living, Hartford, CN, USA
  79. Department of Psychiatry, Utrecht University Medical Center (UMC), Utrecht, the Netherlands
  80. Laboratory of Psychiatric Neuroimaging (LIM-21), Departamento e Instituto de Psiquiatria, Hospital das Clinicas, Faculdade de Medicina Universidade de São Paulo (HCFMUSP), Faculdade de Medicina Universidade de São Paulo, Brazil
  81. Amsterdam University Medical Center, Department of Psychiatry, Department of Anatomy and Neuroscience, Vrije Universiteit Amsterdam, Amsterdam, The Netherlands
  82. Amsterdam Neuroscience, Compulsivity, Impulsivity and Attention program, Amsterdam, The Netherlands
  83. Department of Child and Adolescent Psychiatry, Psychosomatic Medicine and Psychotherapy, University Hospital Frankfurt, Goethe University, Frankfurt am Main, Germany
  84. Translational Developmental Neuroscience Section, Division of Psychological and Social Medicine and Developmental Neurosciences, Faculty of Medicine, Technische Universität Dresden, Dresden, Germany
  85. Clinical Research, Nathan Kline Institute for Psychiatric Research, Orangeburg, NY, USA
  86. Department of Psychiatry, New York University Grossman School of Medicine, New York, NY, USA
  87. Institute of Child Development, University of Minnesota, Minneapolis, MN, USA
  88. Department of Pediatrics, University of Minnesota, Minneapolis, MN, USA
  89. University of Toronto, Toronto, ON, Canada
  90. The Centre for Addiction and Mental Health, Hospital for Sick Children, Toronto, ON, Canada
  91. Charmaine and Gordon McGill Center for Psychedelic Research and Therapy, Department of Psychiatry and Behavioral Sciences, The University of Texas at Austin Dell Medical School, Austin, TX, USA
  92. FIDMAG Sisters Hospitallers Research Foundation, Barcelona, Spain
  93. Harvard Graduate School of Education, Cambridge, MA, USA
  94. Harvard University, Cambridge, MA, USA
  95. Department of Psychiatry, University of Oxford, Oxford, UK
  96. Oxford Health NHS Foundation Trust, Oxford, UK
  97. Standardization of Computational Anatomy Techniques for Cognitive and Behavioral Sciences (SoCAT) Lab, Department of Psychiatry, Faculty of the Medicine, Ege University, Izmir, Türkiye
  98. Department of Psychology, Stanford University, Stanford, CA, USA
  99. Department of Psychiatry and Psychotherapy, University Medicine Greifswald, Greifswald, Germany
  100. German Center of Neurodegenerative Diseases (DZNE) Site Rostock/Greifswald, Greifswald, Germany
  101. Section for Experimental Psychopathology and Neuroimaging, Department of General Psychiatry, Heidelberg University, Heidelberg, Germany
  102. Department of Pediatrics, Yale University School of Medicine, New Haven, CT, USA
  103. Yale Child Study Center, Yale University School of Medicine, New Haven, CT, USA
  104. Department of Neuroscience, Yale University School of Medicine, New Haven, CT, USA
  105. Lifespan Brain Institute, Children’s Hospital of Philadelphia (CHOP), Philadelphia, PA, USA
  106. School of Psychology, University of Surrey, Guildford, UK
  107. Department of Clinical and Biological Psychology, University of Bergen, Bergen, Norway
  108. Centre for Research and Education in Forensic Psychiatry, Department of Mental Health and Addiction, Oslo University Hospital, Oslo, Norway
  109. Department of Adult Psychiatry, Institute of Clinical Medicine, University of Oslo, Norway
  110. ASRB University of Newcastle, NSW, Australia
  111. School of Medicine and Public Health, University of Newcastle, NSW, Australia
  112. Izmir City Hospital, Izmir, Turkey
  113. Research Center for Child Mental Development, Chiba University, Chiba, Japan
  114. United Graduate School of Child Development, The University of Osaka, Suita, Japan
  115. Shanghai Mental Health Center, Shanghai Jiao Tong University School of Medicine, Shanghai, China
  116. Australian National Imaging Facility, The University of Queensland, St Lucia, Australia
  117. School of Psychiatry, Department of Neuroscience, University of Naples “Federico II”, Naples, Italy
  118. Imaging Genetics Center, Mark and Mary Stevens Neuroimaging and Informatics Institute, Keck School of Medicine of USC, University of Southern California, Marina del Rey, CA, USA
  119. Department of Psychiatry and Mental Health, Neuroscience Institute, University of Cape Town, Cape Town, South Africa
  120. Center of Excellence on Mood Disorders, Louis A. Faillace, MD, Department of Psychiatry and Behavioral Sciences at McGovern Medical School, UTHealth, Houston, TX, USA
  121. Department of Psychology, George Mason University, Fairfax, VA, USA
  122. Department of Neuroscience, Section of Psychiatry, Università Cattolica del Sacro Cuore, Rome, Italy
  123. Department of Neuroscience, Head-Neck and Chest, Section of Psychiatry, Fondazione Policlinico Universitario Agostino Gemelli IRCCS, Rome, Italy
  124. Instituto de Investigación Sanitaria del Hospital Gregorio Marañón (IISGM), Madrid, Spain
  125. Department of Psychiatry, Faculty of Medicine, University of British Columbia, Vancouver, Canada
  126. Psychology Department, Georgia State University, Atlanta, GA, USA
  127. Department of Psychology, The University of Hong Kong, Hong Kong
  128. Division of Adult Psychiatry, Department of Psychiatry, Geneva University Hospitals, Geneva, Switzerland
  129. Department of Psychiatry and Neurosciences, Graduate School of Biomedical and Health Sciences, Hiroshima University, Hiroshima, Japan
  130. Department of Psychology, Humboldt University of Berlin, Berlin, Germany
  131. Centre for Youth Bipolar Disorder, Centre for Addiction and Mental Health, Toronto, ON, Canada
  132. Department of Psychiatry, Seoul National University College of Medicine, Seoul, South Korea
  133. Department of Neuropsychiatry, Seoul National University Hospital, Seoul, South Korea
  134. Institute of Human Behavioral Medicine, SNU-MRC, Seoul, South Korea
  135. University of Marburg, School of Medicine, Department of Psychiatry and Psychotherapy, Marburg, Germany
  136. Department of Psychiatry and Neurochemistry, Institute of Neuroscience and Physiology, University of Gothenburg, Gothenburg, Sweden
  137. Department of Psychology, Stony Brook University, Stony Brook, NY, USA
  138. Department of Neuroradiology, TUM University Hospital, School of Medicine and Health, Technical University of Munich (TUM), Munich, Germany
  139. The University of Texas Health Science Center Houston, TX, USA
  140. Holland Bloorview Kids Rehabilitation Hospital, Toronto, ON, Canada
  141. Seoul National University Hospital, Seoul, Republic of Korea
  142. Hanyang University Hospital, Seoul, South Korea
  143. Department of Paediatrics and Child Health, University of Cape Town, Cape Town, South Africa
  144. Department of Medical Epidemiology and Biostatistics, Karolinska Institutet, Stockholm, Sweden
  145. Russian Mental Health Research Center (RMHRC), Moscow, Russia
  146. SA MRC Unit on Risk and Resilience in Mental Disorders, Department of Psychiatry, Stellenbosch University, Stellenbosch, South Africa
  147. University of Newcastle, NSW, Australia
  148. Department of Psychology, University of Pittsburgh, Pittsburgh, PA, USA
  149. Department of Psychiatry, University of Pittsburgh Medical Center, University of Pittsburgh, Pittsburgh, PA, USA
  150. Child and Adolescent Psychiatry Unit, Department of Medical Sciences, Uppsala University, Uppsala, Sweden
  151. Sunnybrook Research Institute, Toronto, ON, Canada
  152. Centre for Addiction and Mental Health, Toronto, ON, Canada
  153. Enrico Fermi Research Center, Rome, Italy
  154. Neuroimaging Laboratory, Santa Lucia Foundation, Rome, Italy
  155. Cardiff University, Brain Research Imaging Centre (CUBRIC), Cardiff University, Cardiff, UK
  156. Department of Psychiatry, School of Medicine, Universidade Federal do Rio Grande do Sul, Porto Alegre, Brazil
  157. Anxiety outpatient Unit, Hospital de Clínicas de Porto Alegre, Porto Alegre, Brazil
  158. Columbia University Irving Medical Center, New York, NY, USA
  159. The New York State Psychiatric Institute, New York, NY, USA
  160. Department of Radiology, Bellvitge University Hospital, Barcelona, Spain
  161. Centre for Psychiatry Research, Department of Clinical Neuroscience, Karolinska Institutet, and Stockholm Health Care Services, Stockholm, Sweden
  162. Centre for Neuroimaging, Cognition and Genomics (NICOG), Clinical Neuroimaging Laboratory, College of Medicine Nursing and Health Sciences, University of Galway, Galway, Ireland
  163. Department of Psychiatry, Trinity College Dublin, Dublin, Ireland
  164. 2CA-Braga, Hospital de Braga, Braga, Portugal
  165. Queensland Brain Institute, The University of Queensland, Brisbane, Australia
  166. Queensland Centre for Mental Health Research, The University of Queensland, Brisbane, Australia
  167. Department of Biomedical Engineering, State University of New York at Stony Brook, Stony Brook, NY, USA
  168. Martinos Center for Biomedical Imaging, Massachusetts General Hospital, Charlestown, MA, USA
  169. MRI Core Facility, IDIBAPS, Barcelona, Spain
  170. Institute of Psychiatry Psychology and Neuroscience, King’s College London, London, UK
  171. NIHR Maudsley Biomedical Research Centre, King’s College London, London, UK
  172. Center of Excellence on Mood Disorders, Louis A. Faillace, MD, Department of Psychiatry and Behavioral Sciences at McGovern Medical School, UTHealth, Houston, Texas, USA
  173. Monash Health and Department of Psychiatry, School of Clinical Sciences, Monash University, Melbourne, VIC, Australia
  174. OCD Clinic, National Institute of Mental Health And Neurosciences (NIMHANS), India
  175. Deakin Institute for Mental and Physical Health and Clinical Translation, School of Medicine, Deakin University, Australia
  176. Kyoto Prefectural University of Medicine, Kyoto, Japan
  177. Division of Mental Health and Substance Abuse, Diakonhjemmet Hospital, Oslo, Norway
  178. Division of Mental Health and Addiction, Institute of Clinical Medicine, University of Oslo, Oslo, Norway
  179. Swedish Collegium for Advanced Study, Uppsala, Sweden
  180. Department of Psychology, University of Virginia, Charlottesville, VA, USA
  181. Department of Radiology and Medical Imaging, University of Virginia, Charlottesville, VA, USA
  182. University of California, Los Angeles, CA, USA
  183. Division of Child and Adolescent Psychiatry, UCLA Semel Institute for Neuroscience, Los Angeles, CA, USA
  184. UCLA Brain Research Institute, Los Angeles, CA, USA
  185. Department of Physiology and Pharmacology, Wake Forest University School of Medicine, Winston-Salem, NC, USA
  186. Center for Neuropsychiatric Schizophrenia Research (CNSR), Mental Health Center, Glostrup, Copenhagen University Hospital, Mental Health Services CPH, Copenhagen, Denmark
  187. Monash Institute of Pharmaceutical Sciences (MIPS), Monash University, Parkville, Australia
  188. Western Centre for Health Research and Education (WCHRE), University of Melbourne and Western Health, Sunshine Hospital, St Albans, Australia
  189. University of Virginia, Charlottesville, VA, USA
  190. University of Pittsburgh, Pittsburgh, PA, USA
  191. Department of Basic and Clinical Psychology and Psychobiology, Jaume I University, Castelló de la Plana, Spain
  192. Department of Neurosciences and Mental Health, Fondazione IRCCS Ca’ Granda, Ospedale Maggiore Policlinico, Milan, Italy
  193. Department of Psychiatry and Legal Medicine, Universitat Autonoma de Barcelona, Barcelona, Spain
  194. University of Pittsburgh, PA, USA
  195. NeuroRecovery Research Hub, School of Psychology, University of New South Wales (UNSW) Sydney, Sydney, Australia
  196. Centre for Pain IMPACT, Neuroscience Research Australia, Randwick, Australia
  197. Institut d’Investigacions Biomèdiques August Pi i Sunyer (IDIBAPS), Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Barcelona, Spain
  198. Institute of Neurosciences, University of Barcelona, Barcelona, Spain
  199. Consorci Sanitari del Maresme, Barcelona, Spain
  200. Centre of Research and Education in Forensic Psychiatry (SIFER), Oslo University Hospital, Oslo, Norway
  201. Department of Electronic Systems, Vilnius Tech, Vilnius, Lithuania
  202. Department of Medical Physiology and Biophysics, Instituto de Biomedicina de Sevilla (IBiS), HUVR/CSIC/Universidad de Sevilla/CIBERSAM, ISCIII, Sevilla, Spain
  203. Department of Psychiatry, University of Cambridge, Cambridge, UK
  204. Centre for Mental Health and Brain Sciences, Faculty of Health, Arts & Design, Swinburne University of Technology, Melbourne, Australia
  205. University of Sydney, Sydney, Australia
  206. School of Medicine and Health, TUM-NIC Neuroimaging Center, Technical University of Munich, Munich, Germany
  207. School of Academic Psychiatry, Institute of Psychiatry, Psychology and Neuroscience, Department of Child & Adolescent Psychiatry, King’s College London, London, UK
  208. Meditation Research Program, Department of Psychiatry, Massachusetts General Hospital, Harvard Medical School, Boston, MA, USA
  209. ATR Brain Information Communication Research Laboratory Group, Kyoto, Japan
  210. Department of Psychiatry, Graduate School of Medical Science, Kyoto Prefectural University of Medicine, Kyoto, Japan
  211. XNef, Inc., Kyoto, Japan
  212. Center of Mathematics, Computing and Cognition, Universidade Federal do ABC, Santo Andre, Brazil
  213. University of Basel, Department of Clinical Research (DKF), Basel, Switzerland
  214. NSW Health Pathology, NSW, Australia
  215. Department of Physiology and Pharmacology, Karolinska Institutet, Stockholm, Sweden
  216. Center for Affective, Stress and Sleep Disorders, University Psychiatric Clinics (UPK) Basel, Basel, Switzerland
  217. Department of Integrative Medicine, National Institute of Mental Health and Neurosciences (NIMHANS), Bengaluru, India
  218. West Region, Institute of Mental Health, Singapore
  219. Yong Loo Lin School of Medicine, National University of Singapore, Singapore
  220. Lee Kong Chian School of Medicine, Nanyang Technological University, Singapore
  221. Department of Psychiatry and Behavioral Neurosciences, McMaster University, Hamilton, ON, Canada
  222. Pediatric OCD Consultation Clinic, Anxiety Treatment and Research Clinic, SJH Healthcare, Hamilton, ON, Canada
  223. Department of Social Psychology and Quantitative Psychology, Institute of Neurosciences, University of Barcelona, Barcelona, Spain
  224. Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Barcelona, Spain
  225. Centro Universitário Max Planck (UniMAX), São Paulo, Brazil
  226. Centro Universitários de Jaguaríuna (UniFAJ), São Paulo, Brazil
  227. Clinical Academic Center of Braga (2CA-Braga), Braga, Portugal
  228. Department of Medicine I, Faculty of Medicine and University Hospital Carl Gustav Carus, TUD Dresden University of Technology, Dresden, Germany
  229. Else Kröner-Fresenius Center for Digital Health, TUD Dresden University of Technology, Dresden, Germany
  230. Laureate Institute for Brain Research, Tulsa, OK, USA
  231. Neuroscience Institute, New York University School of Medicine, New York, NY, USA
  232. Institute of Medical Psychology and Systems Neuroscience, University Hospital Münster, Münster, Germany
  233. Department of Psychiatry and Behavioral Neuroscience, University of Cincinnati, College of Medicine, Cincinnati, OH, USA
  234. Icahn School of Medicine at Mount Sinai, New York, NY, USA
  235. James J. Peters VA Medical Center, Bronx, NY, USA
  236. Department of Highly Specialized Pediatric Orthopedics and Medicine, Astrid Lindgren Children’s Hospital, Karolinska University Hospital, Stockholm, Sweden
  237. School of Data Science, University of Virginia, Charlottesville, VA, USA
  238. Laboratory of Neuropsychiatry, Department of Clinical and Behavioral Neurology, Santa Lucia Foundation Istituto di Ricovero e Cura a Carattere Scientifico (IRCCS), Rome, Italy
  239. Clinical Institute of Neuroscience, University of Barcelona, Hospital Clinic, Barcelona, Spain
  240. University of Vic – Central University of Catalonia, Barcelona, Spain
  241. Intelligent Data Analysis Laboratory, Department of Electronic Engineering, University of Valencia (UV), Valencia, Spain
  242. Institute for Community Medicine, University Medicine Greifswald, Greifswald, Germany
  243. Amsterdam University Medical Center, Department of Psychiatry, Vrije Universiteit Amsterdam, Amsterdam, The Netherlands
  244. Amsterdam University Medical Center, Department of Anatomy and Neurosciences, Vrije Universiteit Amsterdam, Amsterdam, The Netherlands
  245. Department of Speech, Language, and Hearing Sciences, The George Washington University, Washington, D.C., USA
  246. Rotman Research Institute, Baycrest Academy for Research and Education, Toronto, ON, Canada
  247. Center for Child Health, Behavior and Development, Seattle Children’s Research Institute, Seattle, WA, USA
  248. K.G. Jebsen Centre for Neurodevelopmental Disorders, University of Oslo, Oslo, Norway
  249. School of Psychology, Deakin University, Melbourne, Australia
  250. Melbourne School of Psychological Sciences, The University of Melbourne, Melbourne, Australia
  251. Department of Diagnostic and Interventional Radiology, University Medicine Greifswald, Greifswald, Germany
  252. Swinburne University of Technology, Melbourne, Australia
  253. UCSF Department of Psychiatry and Behavioral Sciences, San Francisco, CA, USA
  254. Division of Child and Adolescent Psychiatry, UCSF, San Francisco, CA, USA
  255. Weill Institute for Neurosciences, UCSF, San Francisco, CA, USA
  256. UCSF School of Medicine, San Francisco, CA, USA
  257. Department of Psychiatry, Institute of Mental Health, Vancouver, BC, Canada
  258. Cognitive Behavioral Therapy Center, Chiba University Hospital, Chiba, Japan
  259. Sugimoto Psychiatric Clinic, Kyoto, Japan
  260. Yeongeon Student Support Center, Seoul National University College of Medicine, Seoul, Republic of Korea
  261. Centre for Youth Mental Health, The University of Melbourne, Parkville, Australia
  262. Orygen, The National Centre of Excellence in Youth Mental Health, Parkville, Australia
  263. Department of Medical Neuroscience, Donders Institute for Brain, Cognition and Behavior, Radboud University Medical Center, Nijmegen, The Netherlands
  264. Clinical Translational Neuroscience Laboratory, Department of Psychiatry and Human Behavior, University of California Irvine, Irvine, CA, USA
  265. Center for the Neurobiology of Learning and Memory, University of California Irvine, Irvine, CA, USA
  266. SAMRC Unit on Risk & Resilience in Mental Disorders, Department of Psychiatry & Neuroscience Institute, University of Cape Town, Cape Town, South Africa
  267. National Institute of Mental Health Intramural Research Program, Bethesda, MD, USA
  268. Department of Human Genetics, University of Texas Rio Grande Valley, Brownsville, Texas, USA
  269. Leiden University, Institute of Psychology, Leiden, The Netherlands
  270. Leiden University Medical Center (LUMC), Department of Psychiatry, Leiden, The Netherlands
  271. Leiden Institute for Brain and Cognition, Leiden, the Netherlands
  272. Section on Development and Affective Neuroscience (SDAN), National Institute of Mental Health (NIMH), Bethesda, Maryland, USA
  273. Montreal Neurological Institute and Hospital, McGill University, Montreal, QC, Canada
  274. Laboratory of Brain eScience, Mark and Mary Stevens Neuroimaging and Informatics Institute, Keck School of Medicine of USC, University of Southern California, Marina del Rey, CA, USA
  275. Psychiatric University Hospital Zurich, University of Zurich, Zurich, Switzerland
  276. Synapsy Center for Neuroscience and Mental Health Research, Faculty of Medicine, University of Geneva, Switzerland
Institutions: Max Planck Institute for Human Cognitive and Brain Sciences (Germany); University of Pennsylvania (United States); Heinrich Heine University Düsseldorf (Germany); Leipzig University (Germany); Donders Institute for Brain, Cognition and Behaviour (Netherlands); Radboud University Medical Center (Netherlands); Oslo University Hospital (Norway); University of Oslo (Norway); Institut d'Investigació Biomédica de Bellvitge (Spain); Bellvitge University Hospital (Spain); Universitat de Barcelona (Spain); Centro de Investigación Biomédica en Red de Salud Mental (Spain); Instituto de Salud Carlos III (Spain); Hospital Universitario La Paz (Spain); Universidad Autónoma de Madrid (Spain); Hartford Hospital (United States); University of Lübeck (Germany); National Institute of Mental Health and Neurosciences (India); Istituti di Ricovero e Cura a Carattere Scientifico (Italy); University of Minnesota (United States); Universidade de São Paulo (Brazil); Pontifícia Universidade Católica de São Paulo (Brazil); Leiden University Medical Center (Netherlands); IRCCS Ospedale San Raffaele (Italy); Vita-Salute San Raffaele University (Italy); Jena University Hospital (Germany); Friedrich Schiller University Jena (Germany); Deutsches Zentrum für Psychische Gesundheit (Germany); Fondazione Stella Maris (Italy); Virginia Commonwealth University (United States); University of Copenhagen (Denmark); Karolinska Institutet (Sweden); Stockholm Health Care Services (Sweden); Curtin University (Australia); University of Milan (Italy); McLean Hospital (United States); Amsterdam University Medical Centers (Netherlands); University of Amsterdam (Netherlands); Leiden University (Netherlands); University of Newcastle Australia (Australia); Hunter Medical Research Institute (Australia); University of Pisa (Italy); Center for Translational Research in Neuroimaging and Data Science (United States); Georgia State University (United States); Georgia Institute of Technology (United States); Emory University (United States); Institut de Recerca Sant Pau (Spain); UNSW Sydney (Australia); Monash University (Australia); Swinburne University of Technology (Australia); The University of Melbourne (Australia); Cardiff University (United Kingdom); The University of Queensland (Australia); Kaohsiung Medical University (Taiwan); Brigham Young University (United States); University of Minho (Portugal); Hospital Universitario Virgen del Rocío (Spain); Consejo Superior de Investigaciones Científicas (Spain); Universidad de Sevilla (Spain); University of Münster (Germany); Bielefeld University (Germany); University of California, Los Angeles (United States); Child Mind Institute (United States); Yale University (United States); University Medical Center Utrecht (Netherlands); Vrije Universiteit Amsterdam (Netherlands); Amsterdam Neuroscience (Netherlands); University Hospital Frankfurt (Germany); Goethe University Frankfurt (Germany); Technische Universität Dresden (Germany); Nathan Kline Institute for Psychiatric Research (United States); New York University (United States); University of Toronto (Canada); Hospital for Sick Children (Canada); The University of Texas at Austin (United States); Fidmag Sisters Hospitallers (Spain); Harvard University (United States); University of Oxford (United Kingdom); Oxford Health NHS Foundation Trust (United Kingdom); Ege University (Türkiye); Stanford University (United States); Universitätsmedizin Greifswald (Germany); German Center for Neurodegenerative Diseases (Germany); Heidelberg University (Germany); Children's Hospital of Philadelphia (United States); University of Surrey (United Kingdom); University of Bergen (Norway); İzmir Şehir Hastanesi (Türkiye); Chiba University (Japan); The University of Osaka (Japan); Shanghai Mental Health Center (China); Shanghai Jiao Tong University (China); National Imaging Facility (Australia); University of Naples Federico II (Italy); University of Southern California (United States); University of Cape Town (South Africa); The University of Texas Health Science Center at Houston (United States); George Mason University (United States); Università Cattolica del Sacro Cuore (Italy); Agostino Gemelli University Polyclinic (Italy); Instituto de Investigación Sanitaria Gregorio Marañón (Spain); University of British Columbia (Canada); University of Hong Kong (Hong Kong SAR China); University Hospital of Geneva (Switzerland); Hiroshima University (Japan); Humboldt-Universität zu Berlin (Germany); Centre for Addiction and Mental Health (Canada); Seoul National University (South Korea); Seoul National University Hospital (South Korea); Philipps University of Marburg (Germany); University of Gothenburg (Sweden); Stony Brook University (United States); Technical University of Munich (Germany); Holland Bloorview Kids Rehabilitation Hospital (Canada); Hanyang University Seoul Hospital (South Korea); Mental Health Research Center of Russian Academy of Medical Sciences (Russia); Stellenbosch University (South Africa); University of Pittsburgh (United States); University of Pittsburgh Medical Center (United States); Uppsala University (Sweden); Sunnybrook Research Institute; Centro Ricerche Enrico Fermi (Italy); Universidade Federal do Rio Grande do Sul (Brazil); Hospital de Clínicas de Porto Alegre (Brazil); Columbia University Irving Medical Center (United States); New York State Psychiatric Institute; Ollscoil na Gaillimhe – University of Galway (Ireland); Trinity College Dublin (Ireland); Clinical Academic Center of Braga (Portugal); Hospital Braga (Portugal); Queensland Centre for Mental Health Research (Australia); State University of New York (United States); Massachusetts General Hospital (United States); Consorci Institut D'Investigacions Biomediques August Pi I Sunyer (Spain); King's College London (United Kingdom); NIHR Maudsley Biomedical Research Centre (United Kingdom); Deakin University (Australia); Kyoto Prefectural University of Medicine (Japan); Diakonhjemmet Hospital (Norway); Swedish Collegium for Advanced Study (Sweden); University of Virginia (United States); Wake Forest University (United States); Copenhagen University Hospital (Denmark); Sunshine Hospital (Australia); Universitat Jaume I (Spain); Fondazione IRCCS Ca' Granda Ospedale Maggiore Policlinico (Italy); Universitat Autònoma de Barcelona (Spain); Neuroscience Research Australia (Australia); Maresme Health Consortium (Spain); Vilnius Gediminas Technical University (Lithuania); Instituto de Biomedicina de Sevilla (Spain); University of Cambridge (United Kingdom); The University of Sydney (Australia); School of Medicine and Health, TUM-NIC Neuroimaging Center, Technical University of Munich, Munich, Germany; Universidade Federal do ABC (Brazil); University of Basel (Switzerland); NSW Health Pathology (Australia); Universitäre Psychiatrische Kliniken Basel (Switzerland); Institute of Mental Health (Singapore); National University of Singapore (Singapore); Nanyang Technological University (Singapore); McMaster University (Canada); Instituto de Neurociencias (Spain); University Hospital Carl Gustav Carus (Germany); Laureate Institute for Brain Research (United States); Institut für Medizinische Psychologie (Germany); University Hospital Münster (Germany); University of Cincinnati (United States); Icahn School of Medicine at Mount Sinai (United States); James J. Peters VA Medical Center (United States); Karolinska University Hospital (Sweden); Universitat de Vic - Universitat Central de Catalunya (Spain); Universitat de València (Spain); George Washington University (United States); Rotman Research Institute (Canada); Baycrest Academy for Research and Education (Canada); Seattle Children's Research Institute (United States); University of California, San Francisco (United States); Chiba University Hospital (Japan); Orygen (Australia); University of California, Irvine (United States); National Institute of Mental Health (United States); Department of Human Genetics, University of Texas Rio Grande Valley, Brownsville, Texas, USA; Montreal Neurological Institute and Hospital (Canada); McGill University (Canada); Psychiatrische Universitätsklinik Zürich (Switzerland); University of Zurich (Switzerland); University of Geneva (Switzerland)
Dates: published online 18 August 2026
Type: Preprint · Language: English
License: CC BY
Identifiers: DOI 10.64898/2026.08.13.26360304 · OpenAlex W7203691059
Open access: green, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), clinical / translational (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Machine learning, Preprocessing, Connectivity, Graphs, fMRI & imaging, Physiology & signal measures
Topic: Functional Brain Connectivity Studies (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Wellcome Trust (314138/Z/24/Z); Dutch Research Council (NWO) (019.201SG.022); European Research Council (101001118); Swiss National Science Foundation (219240, 140351, 169783, 178175)
Citations: not cited yet (Europe PMC); 74 references in the paper

Abstract

Elucidating the neurobiological basis of neurodevelopmental and psychiatric conditions (NDPCs) remains challenging because brain alterations vary within diagnoses and overlap across them. Whether diverse alterations follow a systematic organization that may reflect shared vulnerabilities remains unknown. Here, we assembled 10,135 individuals with schizophrenia, autism, bipolar, obsessive-compulsive, generalized anxiety, and major depressive disorders, and 11,998 reference participants across six continents through the ENIGMA consortium. Using normative modeling, we quantified individual deviations in cortical thickness, surface area, and subcortical volumes relative to lifespan reference trajectories (5 to 80 years). We show that structural deviations converged along cortical axes reflecting connectome organization, maturation, and cytoarchitectonic diversity. These axes mirrored typical population variation, but their expression differed across diagnoses and partly scaled with symptom severity. Even rare and highly individualized extreme deviations followed this organization, concentrating in densely connected regions. Finally, brain structural deviations overlapped substantially across diagnoses, while differences between them increased toward the association cortex. Together, we provide large-scale evidence that structural deviations across NDPCs are systematically constrained by the brain’s intrinsic architecture. This shared organization provides a framework for reconciling individual variability with transdiagnostic similarities and motivates an integrative, systems-level understanding of mental 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 10 matches between paragraphs and lines of code.

Zenodo 21907827

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Languages: Jupyter (1)
Size: 4 files, 1 script
Software Heritage: not checked
Found in: “Code availability”
Holds: 1 notebook
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (1 file), NumPy (1 file), pandas (1 file), scikit-learn (1 file), seaborn (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
1 file

CNG-LAB/Enigmatics

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: b273325f1c7f355b608f933054ec8239a91a9542, 17 August 2026
Languages: Jupyter (6), Python (2), Shell (2)
Size: 45 files, 10 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, environment (requirements_main.txt, code/hbr/requirements_hbr.txt), 6 notebooks
Not found: license file, CITATION.cff, tests, continuous integration, documentation
Tools: Matplotlib (8 files), NumPy (8 files), pandas (8 files), seaborn (8 files), SciPy (6 files), BrainSMASH (5 files), statsmodels (5 files), BrainSpace (4 files), scikit-learn (4 files), NiBabel (3 files), Nilearn (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
11 files

pcntoolkit.readthedocs.io

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

Code availability

Custom code generated for this project was made publicly available under https://github.com/CNG-LAB/Enigmatics/. Normative models can be accessed via https://doi.org/10.5281/zenodo.21907827. This Github repository further contains instructions to transfer and apply the trained models to independent datasets. Our analysis code makes use of open software: Normative modeling was performed using the PCNToolkit (https://pcntoolkit.readthedocs.io). Brain visualizations were carried out using the ENIGMA Toolbox (https://enigma-toolbox.readthedocs.io) and Brainspace (https://brainspace.readthedocs.io/). Spatial permutations were performed using BrainSmash (https://brainsmash.readthedocs.io/).

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:

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

Data generated for this study, as well as atlases used for contextualization, were made publicly available under Github https://github.com/CNG-LAB/Enigmatics/. Subject-level ENIGMA neuroimaging data is not publicly available but can be acquired by submitting a research proposal to the ENIGMA Working Groups (http://enigma.ini.usc.edu/). HCP group-level connectome data was accessed via the ENIGMA Toolbox (https://enigma-toolbox.readthedocs.io/en/latest/pages/05.HCP/index.html). Lausanne group-level connectome data is available at: https://zenodo.org/records/2872624#.XOJqE99fhmM. Processed developmental neuroimaging data from the Philadelphia Neurodevelopmental Cohort and the Healthy Brain Network included in this study can be accessed through the Reproducible Brain Charts initiative74.

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 2, 28 September 2026

  • Language: n/a → en
  • Authors: added Meike D. Hettwer (0000-0002-7973-6752); Dag Alnæs (0000-0001-7361-5418); Sven Bölte (0000-0002-4579-4970); Willem B. Bruin (0000-0002-0672-8903); Murray J. Cairns (0000-0003-2490-2538); Vince Calhoun (0000-0001-9058-0747); Derin Cobia (0000-0003-2339-958X); Federica Colombo (0000-0001-5853-9912); Ian H. Gotlib (0000-0002-3622-3199); Shlomi Haar (0000-0003-2213-6585); Unn K. Haukvik (0000-0002-0363-4127); Yanghee Im (0009-0005-1247-1445); Allison Jack (0000-0002-7792-6464); Kyle M. Jensen (0000-0001-7896-2232); Peter Kochunov (0000-0003-3656-4281); Bradley J. MacIntosh (0000-0001-7300-2355); Pedro Morgado (0000-0003-3880-3258); Lilianne R. Mujica-Parodi (0000-0002-3752-5519); Benson Mwangi (0000-0002-1717-4395); Stener Nerland (0000-0001-8771-8856); Benjamin T. Newman (0000-0002-0668-2853); Jared A. Nielsen (0000-0002-2717-193X); Christos Pantelis (0000-0002-9565-0238); Federica Piras (0000-0002-9546-7038); Giuseppe Pontillo (0000-0001-5425-1890); Yann Quidé (0000-0002-8569-7139); Yuki Sakai (0000-0003-2475-8548); John D. van Horn (0000-0003-1537-0816); Chris Vriend (0000-0003-3111-1304); Lars T. Westlye (0000-0001-8644-956X); and 7 others; removed Meike D. Hettwer; Dag Alnæs; Sven Bölte; Willem B. Bruin; Murray J. Cairns; Vince Calhoun; Derin Cobia; Federica Colombo; Ian H. Gotlib; Shlomi Haar; Unn K. Haukvik; Yanghee Im; Allison Jack; Kyle M. Jensen; Peter Kochunov; Bradley J. MacIntosh; Pedro Morgado; Lilianne R. Mujica-Parodi; Benson Mwangi; Stener Nerland; Benjamin T. Newman; Jared A. Nielsen; Christos Pantelis; Federica Piras; Giuseppe Pontillo; Yann Quidé; Yuki Sakai; John D. van Horn; Chris Vriend; Lars T. Westlye; and 7 others

Version 1, 27 September 2026: the first record

Recorded: type, journal, dates, 256 authors, 4 funders, 68 references.

Cite

This paper

Hettwer, M. D., Saberi, A., Shafiei, G., Manoli, A., De Boer, A. A., Alnæs, D., Alonso, P., Arango, C., Assaf, M., Avram, M., Balachander, S., Banaj, N., Başgöze, Z., Batistuzzo, M. C., Bauduin, S. E., Benedetti, F., Bertolin, S., Besteher, B., Biagi, L., . . . Valk, S. L. (2026). Lifespan brain structural variation reveals shared organization across mental health conditions. medRxiv (preprint). https://doi.org/10.64898/2026.08.13.26360304

BibTeX

@article{hettwer2026lifespan,
author = {Hettwer, Meike D. and Saberi, Amin and Shafiei, Golia and Manoli, Aikaterina and De Boer, Augustijn A. and Alnæs, Dag and Alonso, Pino and Arango, Celso and Assaf, Michal and Avram, Mihai and Balachander, Srinivas and Banaj, Nerisa and Başgöze, Zeynep and Batistuzzo, Marcelo C. and Bauduin, Stephanie E.E.C. and Benedetti, Francesco and Bertolin, Sara and Besteher, Bianca and Biagi, Laura and Blair, Robert J. and Blair, Karina and Bölte, Sven and Borgwardt, Stefan and Bosco, Paolo and Brambilla, Paolo and Bravi, Beatrice and Brennan, Brian P. and Bruin, Willem B. and Busatto, Geraldo F. and Cairns, Murray J. and Calderoni, Sara and Calhoun, Vince and Calvo, Rosa and Cano, Marta and Carr, Vaughan J. and Carruthers, Sean P. and Caruana, Georgia F. and Caseras, Xavier and Catts, Stanley V. and Chi, I-Jou and Cobia, Derin and Colombo, Federica and Couto, Maria Beatriz and Crespo-Facorro, Benedicto and Cullen, Kathryn R. and Dannlowski, Udo and Dapretto, Mirella and Di Martino, Adriana and Diefenbach, Gretchen J. and Dols, Annemiek and Duran, Fabio and Dzinalija, Nadza and Ecker, Christine and Ehrlich, Stefan and Eng, Goi Khia and Fair, Damien A. and Fernandes, Afonso and Feusner, Jamie D. and Fonzo, Gregory A. and Fuentes-Claramonte, Paola and Gaab, Nadine and Godlewska, Beata R. and Goldstein, Benjamin I. and Gonul, Ali Saffet and Gotlib, Ian H. and Grabe, Hans J. and Green, Melissa J. and Grotegerd, Dominik and Gruber, Oliver and Gruner, Patricia and Gupta, Abha R. and Gur, Ruben C. and Gur, Raquel E. and Haar, Shlomi and Hamilton, Jarold P. and Haukvik, Unn K. and Henskens, Frans A. and Hinc, Asli C. and Hirano, Yoshiyuki and Hu, Hao and Hughes, Matthew E. and Iasevoli, Felice and Im, Yanghee and Ipser, Jonathan and Hamoudi, Hammza Jabbar Abdl Sattar and Jack, Allison and Janiri, Delfina and Janssen, Joost and Jaspers-Fayer, Fern and Jensen, Kyle M. and Jin, Jingwen and Kaiser, Stefan and Kamishikiryo, Toshiharu and Kang, Melody J. Y. and Karuk, Andriana and Kathmann, Norbert and Kennedy, Kody G. and Kim, Minah and King, Joseph A. and Kircher, Tilo and Klahn, Anna Luisa and Klein, Daniel N. and Koch, Kathrin and Kochunov, Peter and Kushki, Azadeh and Kwon, Jun Soo and Lake, Marilyn T. and Landén, Mikael and Lazaro, Luisa and Lebedeva, Irina and Leila, Nabulsi and Li, Meng and Lochner, Christine and Loughland, Carmel M. and Luna, Beatriz and Remnélius, Karl Lundin and MacIntosh, Bradley J. and Mancini, Matteo and Manfro, Gisele G. and Marsh, Rachel and Martinez-Zalacain, Ignacio and Mataix-Cols, David and McDonald, Colm and McGrath, Jane and Menchon, Jose M. and Morgado, Pedro and Mowry, Bryan J. and Mujica-Parodi, Lilianne R. and Muñoz, Emma and Muratori, Filippo and Murphy, Declan and Mwangi, Benson and Narayanaswamy, Janardhanan C. and Narumoto, Jin and Nerland, Stener and Neufeld, Janina and Newman, Benjamin T. and Nielsen, Jared A. and Nurmi, Erika L. and O’Neill, Joseph and OHearn, Kirsten M. and Okada, Go and Oranje, Bob and Pantelis, Christos and Parker, Nadine and Pelphrey, Kevin A. and Phillips, Mary L. and Piacentini, John and Picó-Pérez, Maria and Picotin, Rosanne and Pigoni, Alessandro and Piras, Fabrizio and Piras, Federica and Pomarol-Clotet, Edith and Pontillo, Giuseppe and Porta-Casteràs, Daniel and Portella, Maria J. and Price, Rebecca B. and Quidé, Yann and Radua, Joaquim and Ringin, Elysha and Rodriguez-Cano, Elena and Rokicki, Jaroslav and Romero-Garcia, Rafael and Rossell, Susan and Ruan, Hanyang and Rubia, Katya and Sacchet, Matthew D. and Sakai, Yuki and Salvador, Raymond and Sani, Gabriele and Sato, Joao R. and Schmidt, André and Scott, Rodney J. and Sellgren, Carl M. and Sempach, Lukas and Shimizu, Eiji and Shivakumar, Venkataram and Sim, Kang and Soares, Jair C. and Soreni, Noam and Soriano-Mas, Carles and Sousa, Nuno and Stein, Frederike and Steinhäuser-Meerz, Jonas L. and Stern, Emily R. and Straube, Thomas and Strawn, Jeffrey R. and Sumner, Philip J. and Sungur, Ibrahim and Szeszko, Philip R. and Tammimies, Kristiina and Tomyshev, Alexander S. and Tosetti, Michela and van de Mortel, Laurens A. and van Horn, John D. and van Nieuwenhuizen, Helena and van Rheenen, Tamsyn E. and van Wingen, Guido and Vecchio, Daniela and Venkatasubramanian, Ganesan and Vieta, Eduard and Vilajosana, Enric and Vives-Gilabert, Yolanda and Völzke, Henry and Vriend, Chris and Wallace, Gregory L. and Wang, Zhen and Walter, Martin and Wang, Lei and Webb, Sara Jane and Westlye, Lars T. and Whittle, Sarah and Wielpütz, Mark O. and Wittfeld, Katharina and Woods, Will and Wu, Mon-Ju and Yang, Tony T. and Yatham, Lakshmi N. and Yoshida, Tokiko and Yoshinari, Abe and Yun, Je-Yeon and Zhao, Qing and Zunta-Soares, Giovana B. and {ENIGMA Autism Working Group:} and {ENIGMA Anxiety Working Group:} and {ENIGMA Bipolar Disorder Working Group:} and {ENIGMA Major Depression Working Group:} and {ENIGMA OCD Working Group:} and {ENIGMA Schizophrenia Working Group:} and van den Heuvel, Odile A. and Schmaal, Lianne and Pozzi, Elena and Andreassen, Ole A. and Ching, Christopher R. K. and Lawrence, Katherine E. and Kim, Gaon S. and Buitelaar, Jan K. and van Erp, Theo G.M. and Stein, Dan J. and Pine, Daniel S. and Winkler, Anderson M. and Bas-Hoogendam, Janna Marie and Zugman, Andre and van der Wee, Nic J.A. and Groenewold, Nynke A. and Marquand, Andre and Bernhardt, Boris C. and Jahanshad, Neda and Moore, Tyler M. and Thompson, Paul M. and Thomopoulos, Sophia I. and Eickhoff, Simon B. and Kirschner, Matthias and Satterthwaite, Theodore D. and Valk, Sofie L.},
title = {{Lifespan brain structural variation reveals shared organization across mental health conditions}},
journal = {medRxiv (preprint)},
year = {2026},
month = aug,
publisher = {medRxiv},
doi = {10.64898/2026.08.13.26360304},
url = {https://doi.org/10.64898/2026.08.13.26360304}
}

RIS

TY - JOUR
AU - Hettwer, Meike D.
AU - Saberi, Amin
AU - Shafiei, Golia
AU - Manoli, Aikaterina
AU - De Boer, Augustijn A.
AU - Alnæs, Dag
AU - Alonso, Pino
AU - Arango, Celso
AU - Assaf, Michal
AU - Avram, Mihai
AU - Balachander, Srinivas
AU - Banaj, Nerisa
AU - Başgöze, Zeynep
AU - Batistuzzo, Marcelo C.
AU - Bauduin, Stephanie E.E.C.
AU - Benedetti, Francesco
AU - Bertolin, Sara
AU - Besteher, Bianca
AU - Biagi, Laura
AU - Blair, Robert J.
AU - Blair, Karina
AU - Bölte, Sven
AU - Borgwardt, Stefan
AU - Bosco, Paolo
AU - Brambilla, Paolo
AU - Bravi, Beatrice
AU - Brennan, Brian P.
AU - Bruin, Willem B.
AU - Busatto, Geraldo F.
AU - Cairns, Murray J.
AU - Calderoni, Sara
AU - Calhoun, Vince
AU - Calvo, Rosa
AU - Cano, Marta
AU - Carr, Vaughan J.
AU - Carruthers, Sean P.
AU - Caruana, Georgia F.
AU - Caseras, Xavier
AU - Catts, Stanley V.
AU - Chi, I-Jou
AU - Cobia, Derin
AU - Colombo, Federica
AU - Couto, Maria Beatriz
AU - Crespo-Facorro, Benedicto
AU - Cullen, Kathryn R.
AU - Dannlowski, Udo
AU - Dapretto, Mirella
AU - Di Martino, Adriana
AU - Diefenbach, Gretchen J.
AU - Dols, Annemiek
AU - Duran, Fabio
AU - Dzinalija, Nadza
AU - Ecker, Christine
AU - Ehrlich, Stefan
AU - Eng, Goi Khia
AU - Fair, Damien A.
AU - Fernandes, Afonso
AU - Feusner, Jamie D.
AU - Fonzo, Gregory A.
AU - Fuentes-Claramonte, Paola
AU - Gaab, Nadine
AU - Godlewska, Beata R.
AU - Goldstein, Benjamin I.
AU - Gonul, Ali Saffet
AU - Gotlib, Ian H.
AU - Grabe, Hans J.
AU - Green, Melissa J.
AU - Grotegerd, Dominik
AU - Gruber, Oliver
AU - Gruner, Patricia
AU - Gupta, Abha R.
AU - Gur, Ruben C.
AU - Gur, Raquel E.
AU - Haar, Shlomi
AU - Hamilton, Jarold P.
AU - Haukvik, Unn K.
AU - Henskens, Frans A.
AU - Hinc, Asli C.
AU - Hirano, Yoshiyuki
AU - Hu, Hao
AU - Hughes, Matthew E.
AU - Iasevoli, Felice
AU - Im, Yanghee
AU - Ipser, Jonathan
AU - Hamoudi, Hammza Jabbar Abdl Sattar
AU - Jack, Allison
AU - Janiri, Delfina
AU - Janssen, Joost
AU - Jaspers-Fayer, Fern
AU - Jensen, Kyle M.
AU - Jin, Jingwen
AU - Kaiser, Stefan
AU - Kamishikiryo, Toshiharu
AU - Kang, Melody J. Y.
AU - Karuk, Andriana
AU - Kathmann, Norbert
AU - Kennedy, Kody G.
AU - Kim, Minah
AU - King, Joseph A.
AU - Kircher, Tilo
AU - Klahn, Anna Luisa
AU - Klein, Daniel N.
AU - Koch, Kathrin
AU - Kochunov, Peter
AU - Kushki, Azadeh
AU - Kwon, Jun Soo
AU - Lake, Marilyn T.
AU - Landén, Mikael
AU - Lazaro, Luisa
AU - Lebedeva, Irina
AU - Leila, Nabulsi
AU - Li, Meng
AU - Lochner, Christine
AU - Loughland, Carmel M.
AU - Luna, Beatriz
AU - Remnélius, Karl Lundin
AU - MacIntosh, Bradley J.
AU - Mancini, Matteo
AU - Manfro, Gisele G.
AU - Marsh, Rachel
AU - Martinez-Zalacain, Ignacio
AU - Mataix-Cols, David
AU - McDonald, Colm
AU - McGrath, Jane
AU - Menchon, Jose M.
AU - Morgado, Pedro
AU - Mowry, Bryan J.
AU - Mujica-Parodi, Lilianne R.
AU - Muñoz, Emma
AU - Muratori, Filippo
AU - Murphy, Declan
AU - Mwangi, Benson
AU - Narayanaswamy, Janardhanan C.
AU - Narumoto, Jin
AU - Nerland, Stener
AU - Neufeld, Janina
AU - Newman, Benjamin T.
AU - Nielsen, Jared A.
AU - Nurmi, Erika L.
AU - O’Neill, Joseph
AU - OHearn, Kirsten M.
AU - Okada, Go
AU - Oranje, Bob
AU - Pantelis, Christos
AU - Parker, Nadine
AU - Pelphrey, Kevin A.
AU - Phillips, Mary L.
AU - Piacentini, John
AU - Picó-Pérez, Maria
AU - Picotin, Rosanne
AU - Pigoni, Alessandro
AU - Piras, Fabrizio
AU - Piras, Federica
AU - Pomarol-Clotet, Edith
AU - Pontillo, Giuseppe
AU - Porta-Casteràs, Daniel
AU - Portella, Maria J.
AU - Price, Rebecca B.
AU - Quidé, Yann
AU - Radua, Joaquim
AU - Ringin, Elysha
AU - Rodriguez-Cano, Elena
AU - Rokicki, Jaroslav
AU - Romero-Garcia, Rafael
AU - Rossell, Susan
AU - Ruan, Hanyang
AU - Rubia, Katya
AU - Sacchet, Matthew D.
AU - Sakai, Yuki
AU - Salvador, Raymond
AU - Sani, Gabriele
AU - Sato, Joao R.
AU - Schmidt, André
AU - Scott, Rodney J.
AU - Sellgren, Carl M.
AU - Sempach, Lukas
AU - Shimizu, Eiji
AU - Shivakumar, Venkataram
AU - Sim, Kang
AU - Soares, Jair C.
AU - Soreni, Noam
AU - Soriano-Mas, Carles
AU - Sousa, Nuno
AU - Stein, Frederike
AU - Steinhäuser-Meerz, Jonas L.
AU - Stern, Emily R.
AU - Straube, Thomas
AU - Strawn, Jeffrey R.
AU - Sumner, Philip J.
AU - Sungur, Ibrahim
AU - Szeszko, Philip R.
AU - Tammimies, Kristiina
AU - Tomyshev, Alexander S.
AU - Tosetti, Michela
AU - van de Mortel, Laurens A.
AU - van Horn, John D.
AU - van Nieuwenhuizen, Helena
AU - van Rheenen, Tamsyn E.
AU - van Wingen, Guido
AU - Vecchio, Daniela
AU - Venkatasubramanian, Ganesan
AU - Vieta, Eduard
AU - Vilajosana, Enric
AU - Vives-Gilabert, Yolanda
AU - Völzke, Henry
AU - Vriend, Chris
AU - Wallace, Gregory L.
AU - Wang, Zhen
AU - Walter, Martin
AU - Wang, Lei
AU - Webb, Sara Jane
AU - Westlye, Lars T.
AU - Whittle, Sarah
AU - Wielpütz, Mark O.
AU - Wittfeld, Katharina
AU - Woods, Will
AU - Wu, Mon-Ju
AU - Yang, Tony T.
AU - Yatham, Lakshmi N.
AU - Yoshida, Tokiko
AU - Yoshinari, Abe
AU - Yun, Je-Yeon
AU - Zhao, Qing
AU - Zunta-Soares, Giovana B.
AU - ENIGMA Autism Working Group:
AU - ENIGMA Anxiety Working Group:
AU - ENIGMA Bipolar Disorder Working Group:
AU - ENIGMA Major Depression Working Group:
AU - ENIGMA OCD Working Group:
AU - ENIGMA Schizophrenia Working Group:
AU - van den Heuvel, Odile A.
AU - Schmaal, Lianne
AU - Pozzi, Elena
AU - Andreassen, Ole A.
AU - Ching, Christopher R. K.
AU - Lawrence, Katherine E.
AU - Kim, Gaon S.
AU - Buitelaar, Jan K.
AU - van Erp, Theo G.M.
AU - Stein, Dan J.
AU - Pine, Daniel S.
AU - Winkler, Anderson M.
AU - Bas-Hoogendam, Janna Marie
AU - Zugman, Andre
AU - van der Wee, Nic J.A.
AU - Groenewold, Nynke A.
AU - Marquand, Andre
AU - Bernhardt, Boris C.
AU - Jahanshad, Neda
AU - Moore, Tyler M.
AU - Thompson, Paul M.
AU - Thomopoulos, Sophia I.
AU - Eickhoff, Simon B.
AU - Kirschner, Matthias
AU - Satterthwaite, Theodore D.
AU - Valk, Sofie L.
TI - Lifespan brain structural variation reveals shared organization across mental health conditions
T2 - medRxiv (preprint)
J2 - medRxiv
PY - 2026
DA - 2026/08/18
PB - medRxiv
DO - 10.64898/2026.08.13.26360304
UR - https://doi.org/10.64898/2026.08.13.26360304
LA - en
ER -

CSL-JSON

{
"id": "10.64898/2026.08.13.26360304",
"type": "article",
"title": "Lifespan brain structural variation reveals shared organization across mental health conditions",
"container-title": "medRxiv (preprint)",
"author": [
{
"family": "Hettwer",
"given": "Meike D."
},
{
"family": "Saberi",
"given": "Amin"
},
{
"family": "Shafiei",
"given": "Golia"
},
{
"family": "Manoli",
"given": "Aikaterina"
},
{
"family": "De Boer",
"given": "Augustijn A."
},
{
"family": "Alnæs",
"given": "Dag"
},
{
"family": "Alonso",
"given": "Pino"
},
{
"family": "Arango",
"given": "Celso"
},
{
"family": "Assaf",
"given": "Michal"
},
{
"family": "Avram",
"given": "Mihai"
},
{
"family": "Balachander",
"given": "Srinivas"
},
{
"family": "Banaj",
"given": "Nerisa"
},
{
"family": "Başgöze",
"given": "Zeynep"
},
{
"family": "Batistuzzo",
"given": "Marcelo C."
},
{
"family": "Bauduin",
"given": "Stephanie E.E.C."
},
{
"family": "Benedetti",
"given": "Francesco"
},
{
"family": "Bertolin",
"given": "Sara"
},
{
"family": "Besteher",
"given": "Bianca"
},
{
"family": "Biagi",
"given": "Laura"
},
{
"family": "Blair",
"given": "Robert J."
},
{
"family": "Blair",
"given": "Karina"
},
{
"family": "Bölte",
"given": "Sven"
},
{
"family": "Borgwardt",
"given": "Stefan"
},
{
"family": "Bosco",
"given": "Paolo"
},
{
"family": "Brambilla",
"given": "Paolo"
},
{
"family": "Bravi",
"given": "Beatrice"
},
{
"family": "Brennan",
"given": "Brian P."
},
{
"family": "Bruin",
"given": "Willem B."
},
{
"family": "Busatto",
"given": "Geraldo F."
},
{
"family": "Cairns",
"given": "Murray J."
},
{
"family": "Calderoni",
"given": "Sara"
},
{
"family": "Calhoun",
"given": "Vince"
},
{
"family": "Calvo",
"given": "Rosa"
},
{
"family": "Cano",
"given": "Marta"
},
{
"family": "Carr",
"given": "Vaughan J."
},
{
"family": "Carruthers",
"given": "Sean P."
},
{
"family": "Caruana",
"given": "Georgia F."
},
{
"family": "Caseras",
"given": "Xavier"
},
{
"family": "Catts",
"given": "Stanley V."
},
{
"family": "Chi",
"given": "I-Jou"
},
{
"family": "Cobia",
"given": "Derin"
},
{
"family": "Colombo",
"given": "Federica"
},
{
"family": "Couto",
"given": "Maria Beatriz"
},
{
"family": "Crespo-Facorro",
"given": "Benedicto"
},
{
"family": "Cullen",
"given": "Kathryn R."
},
{
"family": "Dannlowski",
"given": "Udo"
},
{
"family": "Dapretto",
"given": "Mirella"
},
{
"family": "Di Martino",
"given": "Adriana"
},
{
"family": "Diefenbach",
"given": "Gretchen J."
},
{
"family": "Dols",
"given": "Annemiek"
},
{
"family": "Duran",
"given": "Fabio"
},
{
"family": "Dzinalija",
"given": "Nadza"
},
{
"family": "Ecker",
"given": "Christine"
},
{
"family": "Ehrlich",
"given": "Stefan"
},
{
"family": "Eng",
"given": "Goi Khia"
},
{
"family": "Fair",
"given": "Damien A."
},
{
"family": "Fernandes",
"given": "Afonso"
},
{
"family": "Feusner",
"given": "Jamie D."
},
{
"family": "Fonzo",
"given": "Gregory A."
},
{
"family": "Fuentes-Claramonte",
"given": "Paola"
},
{
"family": "Gaab",
"given": "Nadine"
},
{
"family": "Godlewska",
"given": "Beata R."
},
{
"family": "Goldstein",
"given": "Benjamin I."
},
{
"family": "Gonul",
"given": "Ali Saffet"
},
{
"family": "Gotlib",
"given": "Ian H."
},
{
"family": "Grabe",
"given": "Hans J."
},
{
"family": "Green",
"given": "Melissa J."
},
{
"family": "Grotegerd",
"given": "Dominik"
},
{
"family": "Gruber",
"given": "Oliver"
},
{
"family": "Gruner",
"given": "Patricia"
},
{
"family": "Gupta",
"given": "Abha R."
},
{
"family": "Gur",
"given": "Ruben C."
},
{
"family": "Gur",
"given": "Raquel E."
},
{
"family": "Haar",
"given": "Shlomi"
},
{
"family": "Hamilton",
"given": "Jarold P."
},
{
"family": "Haukvik",
"given": "Unn K."
},
{
"family": "Henskens",
"given": "Frans A."
},
{
"family": "Hinc",
"given": "Asli C."
},
{
"family": "Hirano",
"given": "Yoshiyuki"
},
{
"family": "Hu",
"given": "Hao"
},
{
"family": "Hughes",
"given": "Matthew E."
},
{
"family": "Iasevoli",
"given": "Felice"
},
{
"family": "Im",
"given": "Yanghee"
},
{
"family": "Ipser",
"given": "Jonathan"
},
{
"family": "Hamoudi",
"given": "Hammza Jabbar Abdl Sattar"
},
{
"family": "Jack",
"given": "Allison"
},
{
"family": "Janiri",
"given": "Delfina"
},
{
"family": "Janssen",
"given": "Joost"
},
{
"family": "Jaspers-Fayer",
"given": "Fern"
},
{
"family": "Jensen",
"given": "Kyle M."
},
{
"family": "Jin",
"given": "Jingwen"
},
{
"family": "Kaiser",
"given": "Stefan"
},
{
"family": "Kamishikiryo",
"given": "Toshiharu"
},
{
"family": "Kang",
"given": "Melody J. Y."
},
{
"family": "Karuk",
"given": "Andriana"
},
{
"family": "Kathmann",
"given": "Norbert"
},
{
"family": "Kennedy",
"given": "Kody G."
},
{
"family": "Kim",
"given": "Minah"
},
{
"family": "King",
"given": "Joseph A."
},
{
"family": "Kircher",
"given": "Tilo"
},
{
"family": "Klahn",
"given": "Anna Luisa"
},
{
"family": "Klein",
"given": "Daniel N."
},
{
"family": "Koch",
"given": "Kathrin"
},
{
"family": "Kochunov",
"given": "Peter"
},
{
"family": "Kushki",
"given": "Azadeh"
},
{
"family": "Kwon",
"given": "Jun Soo"
},
{
"family": "Lake",
"given": "Marilyn T."
},
{
"family": "Landén",
"given": "Mikael"
},
{
"family": "Lazaro",
"given": "Luisa"
},
{
"family": "Lebedeva",
"given": "Irina"
},
{
"family": "Leila",
"given": "Nabulsi"
},
{
"family": "Li",
"given": "Meng"
},
{
"family": "Lochner",
"given": "Christine"
},
{
"family": "Loughland",
"given": "Carmel M."
},
{
"family": "Luna",
"given": "Beatriz"
},
{
"family": "Remnélius",
"given": "Karl Lundin"
},
{
"family": "MacIntosh",
"given": "Bradley J."
},
{
"family": "Mancini",
"given": "Matteo"
},
{
"family": "Manfro",
"given": "Gisele G."
},
{
"family": "Marsh",
"given": "Rachel"
},
{
"family": "Martinez-Zalacain",
"given": "Ignacio"
},
{
"family": "Mataix-Cols",
"given": "David"
},
{
"family": "McDonald",
"given": "Colm"
},
{
"family": "McGrath",
"given": "Jane"
},
{
"family": "Menchon",
"given": "Jose M."
},
{
"family": "Morgado",
"given": "Pedro"
},
{
"family": "Mowry",
"given": "Bryan J."
},
{
"family": "Mujica-Parodi",
"given": "Lilianne R."
},
{
"family": "Muñoz",
"given": "Emma"
},
{
"family": "Muratori",
"given": "Filippo"
},
{
"family": "Murphy",
"given": "Declan"
},
{
"family": "Mwangi",
"given": "Benson"
},
{
"family": "Narayanaswamy",
"given": "Janardhanan C."
},
{
"family": "Narumoto",
"given": "Jin"
},
{
"family": "Nerland",
"given": "Stener"
},
{
"family": "Neufeld",
"given": "Janina"
},
{
"family": "Newman",
"given": "Benjamin T."
},
{
"family": "Nielsen",
"given": "Jared A."
},
{
"family": "Nurmi",
"given": "Erika L."
},
{
"family": "O’Neill",
"given": "Joseph"
},
{
"family": "OHearn",
"given": "Kirsten M."
},
{
"family": "Okada",
"given": "Go"
},
{
"family": "Oranje",
"given": "Bob"
},
{
"family": "Pantelis",
"given": "Christos"
},
{
"family": "Parker",
"given": "Nadine"
},
{
"family": "Pelphrey",
"given": "Kevin A."
},
{
"family": "Phillips",
"given": "Mary L."
},
{
"family": "Piacentini",
"given": "John"
},
{
"family": "Picó-Pérez",
"given": "Maria"
},
{
"family": "Picotin",
"given": "Rosanne"
},
{
"family": "Pigoni",
"given": "Alessandro"
},
{
"family": "Piras",
"given": "Fabrizio"
},
{
"family": "Piras",
"given": "Federica"
},
{
"family": "Pomarol-Clotet",
"given": "Edith"
},
{
"family": "Pontillo",
"given": "Giuseppe"
},
{
"family": "Porta-Casteràs",
"given": "Daniel"
},
{
"family": "Portella",
"given": "Maria J."
},
{
"family": "Price",
"given": "Rebecca B."
},
{
"family": "Quidé",
"given": "Yann"
},
{
"family": "Radua",
"given": "Joaquim"
},
{
"family": "Ringin",
"given": "Elysha"
},
{
"family": "Rodriguez-Cano",
"given": "Elena"
},
{
"family": "Rokicki",
"given": "Jaroslav"
},
{
"family": "Romero-Garcia",
"given": "Rafael"
},
{
"family": "Rossell",
"given": "Susan"
},
{
"family": "Ruan",
"given": "Hanyang"
},
{
"family": "Rubia",
"given": "Katya"
},
{
"family": "Sacchet",
"given": "Matthew D."
},
{
"family": "Sakai",
"given": "Yuki"
},
{
"family": "Salvador",
"given": "Raymond"
},
{
"family": "Sani",
"given": "Gabriele"
},
{
"family": "Sato",
"given": "Joao R."
},
{
"family": "Schmidt",
"given": "André"
},
{
"family": "Scott",
"given": "Rodney J."
},
{
"family": "Sellgren",
"given": "Carl M."
},
{
"family": "Sempach",
"given": "Lukas"
},
{
"family": "Shimizu",
"given": "Eiji"
},
{
"family": "Shivakumar",
"given": "Venkataram"
},
{
"family": "Sim",
"given": "Kang"
},
{
"family": "Soares",
"given": "Jair C."
},
{
"family": "Soreni",
"given": "Noam"
},
{
"family": "Soriano-Mas",
"given": "Carles"
},
{
"family": "Sousa",
"given": "Nuno"
},
{
"family": "Stein",
"given": "Frederike"
},
{
"family": "Steinhäuser-Meerz",
"given": "Jonas L."
},
{
"family": "Stern",
"given": "Emily R."
},
{
"family": "Straube",
"given": "Thomas"
},
{
"family": "Strawn",
"given": "Jeffrey R."
},
{
"family": "Sumner",
"given": "Philip J."
},
{
"family": "Sungur",
"given": "Ibrahim"
},
{
"family": "Szeszko",
"given": "Philip R."
},
{
"family": "Tammimies",
"given": "Kristiina"
},
{
"family": "Tomyshev",
"given": "Alexander S."
},
{
"family": "Tosetti",
"given": "Michela"
},
{
"family": "van de Mortel",
"given": "Laurens A."
},
{
"family": "van Horn",
"given": "John D."
},
{
"family": "van Nieuwenhuizen",
"given": "Helena"
},
{
"family": "van Rheenen",
"given": "Tamsyn E."
},
{
"family": "van Wingen",
"given": "Guido"
},
{
"family": "Vecchio",
"given": "Daniela"
},
{
"family": "Venkatasubramanian",
"given": "Ganesan"
},
{
"family": "Vieta",
"given": "Eduard"
},
{
"family": "Vilajosana",
"given": "Enric"
},
{
"family": "Vives-Gilabert",
"given": "Yolanda"
},
{
"family": "Völzke",
"given": "Henry"
},
{
"family": "Vriend",
"given": "Chris"
},
{
"family": "Wallace",
"given": "Gregory L."
},
{
"family": "Wang",
"given": "Zhen"
},
{
"family": "Walter",
"given": "Martin"
},
{
"family": "Wang",
"given": "Lei"
},
{
"family": "Webb",
"given": "Sara Jane"
},
{
"family": "Westlye",
"given": "Lars T."
},
{
"family": "Whittle",
"given": "Sarah"
},
{
"family": "Wielpütz",
"given": "Mark O."
},
{
"family": "Wittfeld",
"given": "Katharina"
},
{
"family": "Woods",
"given": "Will"
},
{
"family": "Wu",
"given": "Mon-Ju"
},
{
"family": "Yang",
"given": "Tony T."
},
{
"family": "Yatham",
"given": "Lakshmi N."
},
{
"family": "Yoshida",
"given": "Tokiko"
},
{
"family": "Yoshinari",
"given": "Abe"
},
{
"family": "Yun",
"given": "Je-Yeon"
},
{
"family": "Zhao",
"given": "Qing"
},
{
"family": "Zunta-Soares",
"given": "Giovana B."
},
{
"literal": "ENIGMA Autism Working Group:"
},
{
"literal": "ENIGMA Anxiety Working Group:"
},
{
"literal": "ENIGMA Bipolar Disorder Working Group:"
},
{
"literal": "ENIGMA Major Depression Working Group:"
},
{
"literal": "ENIGMA OCD Working Group:"
},
{
"literal": "ENIGMA Schizophrenia Working Group:"
},
{
"family": "van den Heuvel",
"given": "Odile A."
},
{
"family": "Schmaal",
"given": "Lianne"
},
{
"family": "Pozzi",
"given": "Elena"
},
{
"family": "Andreassen",
"given": "Ole A."
},
{
"family": "Ching",
"given": "Christopher R. K."
},
{
"family": "Lawrence",
"given": "Katherine E."
},
{
"family": "Kim",
"given": "Gaon S."
},
{
"family": "Buitelaar",
"given": "Jan K."
},
{
"family": "van Erp",
"given": "Theo G.M."
},
{
"family": "Stein",
"given": "Dan J."
},
{
"family": "Pine",
"given": "Daniel S."
},
{
"family": "Winkler",
"given": "Anderson M."
},
{
"family": "Bas-Hoogendam",
"given": "Janna Marie"
},
{
"family": "Zugman",
"given": "Andre"
},
{
"family": "van der Wee",
"given": "Nic J.A."
},
{
"family": "Groenewold",
"given": "Nynke A."
},
{
"family": "Marquand",
"given": "Andre"
},
{
"family": "Bernhardt",
"given": "Boris C."
},
{
"family": "Jahanshad",
"given": "Neda"
},
{
"family": "Moore",
"given": "Tyler M."
},
{
"family": "Thompson",
"given": "Paul M."
},
{
"family": "Thomopoulos",
"given": "Sophia I."
},
{
"family": "Eickhoff",
"given": "Simon B."
},
{
"family": "Kirschner",
"given": "Matthias"
},
{
"family": "Satterthwaite",
"given": "Theodore D."
},
{
"family": "Valk",
"given": "Sofie L."
}
],
"container-title-short": "medRxiv",
"DOI": "10.64898/2026.08.13.26360304",
"publisher": "medRxiv",
"URL": "https://doi.org/10.64898/2026.08.13.26360304",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
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.64898/2026.03.04.709586 [code]
Mapping Higher-Order Topology in OCD Brain Networks with Hodge Laplacian
Journal: bioRxiv (preprint)
In common: statsmodels, seaborn, scikit-learn, 4 other tools, 9 authors
[2] doi:10.1038/s41467-026-74153-2 [code]
Regional, functional and transcriptomic decoding of multidimensional brain structure alterations in obsessive-compulsive disorder.
Journal: Nature communications
In common: BrainSMASH, BrainSpace, NiBabel, 6 other tools, 4 references, 6 authors
[3] doi:10.1038/s41380-026-03641-0
Cerebral cortical alterations in adolescent early-onset psychosis: a surface-based morphometry mega-analysis.
Journal: Molecular psychiatry
In common: 5 references, 6 authors
[4] doi:10.1038/s41380-026-03547-x [code]
Multiscale characterization of cortical signatures in positive and negative schizotypy: a worldwide ENIGMA study.
Journal: Molecular psychiatry
In common: 10 references, 3 authors
[5] doi:10.1038/s41398-026-04078-3 [code]
Brain age prediction in generalized anxiety disorder using a convolutional neural network.
Journal: Translational psychiatry
In common: clinical / translational, 1 reference, 5 authors
[6] doi:10.1038/s41398-026-04189-x [code]
Decomposing neuroanatomical heterogeneity in depression: insights from an ENIGMA major depressive disorder working group study in 5146 individuals.
Journal: Translational psychiatry
In common: clinical / translational, 5 references, 4 authors
[7] doi:10.21203/rs.3.rs-9246968/v1 [code]
Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders
Journal: Research Square (preprint)
In common: pandas, NumPy, clinical / translational, 10 references, 2 authors
[8] doi:10.1162/imag.a.1269 [code]
From early to contemporary normative modeling: Mapping individual differences in neurophysiological signals.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: Nilearn, NiBabel, statsmodels, 6 other tools, 11 references
[9] doi:10.1038/s41467-026-72875-x [code]
Lifespan normative modeling of brain microstructure.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, 6 references, 2 authors
[10] doi:10.1038/s41380-026-03500-y [code]
Altered frontal and occipital cortical microstructure in obsessive-compulsive disorder - a multisite mega-analysis.
Journal: Molecular psychiatry
In common: clinical / translational, 7 references, 2 authors

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.