OSCR

Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders.

Code ↔ Paper

2 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 2 matches
  1. [1] § Results › Association between brain deviations and cognition, neurological soft signs, and psychopathology ↔ pcntoolkit/dataio/data_factory.py, lines 219 to 273 · score 0.54 · right putamen, right pallidum, rh, lh, ventricle, brain · Report a mismatch
  2. [2] § Methods › MRI-Preprocessing › Calculating normative deviations ↔ examples/10_merge.ipynb, lines 1 to 50 · score 0.51 · hierarchical Bayesian regression, separate models, population, subset, normative model, PCNToolkit · Report a mismatch

Paper

Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 479 lines · 16 KB · GPL-3.0 · 1 match

  1. from __future__ import annotations
  2. import os
  3. import urllib.request
  4. from typing import Literal
  5. import pandas as pd
  6. from pcntoolkit.dataio.norm_data import NormData
  7. def load_fcon1000(save_path: str | None = None):
  8. """Download and save fcon dataset to specified path, or load it from there
  9. if it is already downloaded
  10. Parameters
  11. ----------
  12. save_path : str | None
  13. The path to save the dataset to, or load it from if it is already
  14. downloaded
  15. Returns
  16. -------
  17. NormData
  18. The loaded dataset as a NormData object"""
  19. if not save_path:
  20. save_path = os.path.join("pcntoolkit_resources", "data")
  21. os.makedirs(save_path, exist_ok=True)
  22. data_path = os.path.join(save_path, "fcon1000.csv")
  23. # If the dataset is not already downloaded, download it and save it to
  24. # the specified path
  25. if not os.path.exists(data_path):
  26. data = pd.read_csv(
  27. "https://raw.githubusercontent.com/predictive-clinical-neuroscience/PCNtoolkit-demo/refs/heads/main/data/fcon1000.csv"
  28. )
  29. data.to_csv(data_path, index=False)
  30. else:
  31. data = pd.read_csv(data_path)
  32. # Define the variables
  33. sex_map = {0: "F", 1: "M"}
  34. data["sex"] = data["sex"].map(sex_map)
  35. subject_ids = "sub_id"
  36. covariates = ["age"]
  37. batch_effects = ["sex", "site"]
  38. response_vars = [
  39. "lh_G&S_frontomargin_thickness",
  40. "lh_G&S_occipital_inf_thickness",
  41. "lh_G&S_paracentral_thickness",
  42. "lh_G&S_subcentral_thickness",
  43. "lh_G&S_transv_frontopol_thickness",
  44. "lh_G&S_cingul-Ant_thickness",
  45. "lh_G&S_cingul-Mid-Ant_thickness",
  46. "lh_G&S_cingul-Mid-Post_thickness",
  47. "lh_G_cingul-Post-dorsal_thickness",
  48. "lh_G_cingul-Post-ventral_thickness",
  49. "lh_G_cuneus_thickness",
  50. "lh_G_front_inf-Opercular_thickness",
  51. "lh_G_front_inf-Orbital_thickness",
  52. "lh_G_front_inf-Triangul_thickness",
  53. "lh_G_front_middle_thickness",
  54. "lh_G_front_sup_thickness",
  55. "lh_G_Ins_lg&S_cent_ins_thickness",
  56. "lh_G_insular_short_thickness",
  57. "lh_G_occipital_middle_thickness",
  58. "lh_G_occipital_sup_thickness",
  59. "lh_G_oc-temp_lat-fusifor_thickness",
  60. "lh_G_oc-temp_med-Lingual_thickness",
  61. "lh_G_oc-temp_med-Parahip_thickness",
  62. "lh_G_orbital_thickness",
  63. "lh_G_pariet_inf-Angular_thickness",
  64. "lh_G_pariet_inf-Supramar_thickness",
  65. "lh_G_parietal_sup_thickness",
  66. "lh_G_postcentral_thickness",
  67. "lh_G_precentral_thickness",
  68. "lh_G_precuneus_thickness",
  69. "lh_G_rectus_thickness",
  70. "lh_G_subcallosal_thickness",
  71. "lh_G_temp_sup-G_T_transv_thickness",
  72. "lh_G_temp_sup-Lateral_thickness",
  73. "lh_G_temp_sup-Plan_polar_thickness",
  74. "lh_G_temp_sup-Plan_tempo_thickness",
  75. "lh_G_temporal_inf_thickness",
  76. "lh_G_temporal_middle_thickness",
  77. "lh_Lat_Fis-ant-Horizont_thickness",
  78. "lh_Lat_Fis-ant-Vertical_thickness",
  79. "lh_Lat_Fis-post_thickness",
  80. "lh_Pole_occipital_thickness",
  81. "lh_Pole_temporal_thickness",
  82. "lh_S_calcarine_thickness",
  83. "lh_S_central_thickness",
  84. "lh_S_cingul-Marginalis_thickness",
  85. "lh_S_circular_insula_ant_thickness",
  86. "lh_S_circular_insula_inf_thickness",
  87. "lh_S_circular_insula_sup_thickness",
  88. "lh_S_collat_transv_ant_thickness",
  89. "lh_S_collat_transv_post_thickness",
  90. "lh_S_front_inf_thickness",
  91. "lh_S_front_middle_thickness",
  92. "lh_S_front_sup_thickness",
  93. "lh_S_interm_prim-Jensen_thickness",
  94. "lh_S_intrapariet&P_trans_thickness",
  95. "lh_S_oc_middle&Lunatus_thickness",
  96. "lh_S_oc_sup&transversal_thickness",
  97. "lh_S_occipital_ant_thickness",
  98. "lh_S_oc-temp_lat_thickness",
  99. "lh_S_oc-temp_med&Lingual_thickness",
  100. "lh_S_orbital_lateral_thickness",
  101. "lh_S_orbital_med-olfact_thickness",
  102. "lh_S_orbital-H_Shaped_thickness",
  103. "lh_S_parieto_occipital_thickness",
  104. "lh_S_pericallosal_thickness",
  105. "lh_S_postcentral_thickness",
  106. "lh_S_precentral-inf-part_thickness",
  107. "lh_S_precentral-sup-part_thickness",
  108. "lh_S_suborbital_thickness",
  109. "lh_S_subparietal_thickness",
  110. "lh_S_temporal_inf_thickness",
  111. "lh_S_temporal_sup_thickness",
  112. "lh_S_temporal_transverse_thickness",
  113. "lh_MeanThickness_thickness",
  114. "BrainSegVolNotVent",
  115. "eTIV",
  116. "rh_G&S_frontomargin_thickness",
  117. "rh_G&S_occipital_inf_thickness",
  118. "rh_G&S_paracentral_thickness",
  119. "rh_G&S_subcentral_thickness",
  120. "rh_G&S_transv_frontopol_thickness",
  121. "rh_G&S_cingul-Ant_thickness",
  122. "rh_G&S_cingul-Mid-Ant_thickness",
  123. "rh_G&S_cingul-Mid-Post_thickness",
  124. "rh_G_cingul-Post-dorsal_thickness",
  125. "rh_G_cingul-Post-ventral_thickness",
  126. "rh_G_cuneus_thickness",
  127. "rh_G_front_inf-Opercular_thickness",
  128. "rh_G_front_inf-Orbital_thickness",
  129. "rh_G_front_inf-Triangul_thickness",
  130. "rh_G_front_middle_thickness",
  131. "rh_G_front_sup_thickness",
  132. "rh_G_Ins_lg&S_cent_ins_thickness",
  133. "rh_G_insular_short_thickness",
  134. "rh_G_occipital_middle_thickness",
  135. "rh_G_occipital_sup_thickness",
  136. "rh_G_oc-temp_lat-fusifor_thickness",
  137. "rh_G_oc-temp_med-Lingual_thickness",
  138. "rh_G_oc-temp_med-Parahip_thickness",
  139. "rh_G_orbital_thickness",
  140. "rh_G_pariet_inf-Angular_thickness",
  141. "rh_G_pariet_inf-Supramar_thickness",
  142. "rh_G_parietal_sup_thickness",
  143. "rh_G_postcentral_thickness",
  144. "rh_G_precentral_thickness",
  145. "rh_G_precuneus_thickness",
  146. "rh_G_rectus_thickness",
  147. "rh_G_subcallosal_thickness",
  148. "rh_G_temp_sup-G_T_transv_thickness",
  149. "rh_G_temp_sup-Lateral_thickness",
  150. "rh_G_temp_sup-Plan_polar_thickness",
  151. "rh_G_temp_sup-Plan_tempo_thickness",
  152. "rh_G_temporal_inf_thickness",
  153. "rh_G_temporal_middle_thickness",
  154. "rh_Lat_Fis-ant-Horizont_thickness",
  155. "rh_Lat_Fis-ant-Vertical_thickness",
  156. "rh_Lat_Fis-post_thickness",
  157. "rh_Pole_occipital_thickness",
  158. "rh_Pole_temporal_thickness",
  159. "rh_S_calcarine_thickness",
  160. "rh_S_central_thickness",
  161. "rh_S_cingul-Marginalis_thickness",
  162. "rh_S_circular_insula_ant_thickness",
  163. "rh_S_circular_insula_inf_thickness",
  164. "rh_S_circular_insula_sup_thickness",
  165. "rh_S_collat_transv_ant_thickness",
  166. "rh_S_collat_transv_post_thickness",
  167. "rh_S_front_inf_thickness",
  168. "rh_S_front_middle_thickness",
  169. "rh_S_front_sup_thickness",
  170. "rh_S_interm_prim-Jensen_thickness",
  171. "rh_S_intrapariet&P_trans_thickness",
  172. "rh_S_oc_middle&Lunatus_thickness",
  173. "rh_S_oc_sup&transversal_thickness",
  174. "rh_S_occipital_ant_thickness",
  175. "rh_S_oc-temp_lat_thickness",
  176. "rh_S_oc-temp_med&Lingual_thickness",
  177. "rh_S_orbital_lateral_thickness",
  178. "rh_S_orbital_med-olfact_thickness",
  179. "rh_S_orbital-H_Shaped_thickness",
  180. "rh_S_parieto_occipital_thickness",
  181. "rh_S_pericallosal_thickness",
  182. "rh_S_postcentral_thickness",
  183. "rh_S_precentral-inf-part_thickness",
  184. "rh_S_precentral-sup-part_thickness",
  185. "rh_S_suborbital_thickness",
  186. "rh_S_subparietal_thickness",
  187. "rh_S_temporal_inf_thickness",
  188. "rh_S_temporal_sup_thickness",
  189. "rh_S_temporal_transverse_thickness",
  190. "rh_MeanThickness_thickness",
  191. "Left-Lateral-Ventricle",
  192. "Left-Inf-Lat-Vent",
  193. "Left-Cerebellum-White-Matter",
  194. "Left-Cerebellum-Cortex",
  195. "Left-Thalamus-Proper",
  196. "Left-Caudate",
  197. "Left-Putamen",
  198. "Left-Pallidum",
  199. "3rd-Ventricle",
  200. "4th-Ventricle",
  201. "Brain-Stem",
  202. "Left-Hippocampus",
  203. "Left-Amygdala",
  204. "CSF",
  205. "Left-Accumbens-area",
  206. "Left-VentralDC",
  207. "Left-vessel",
  208. "Left-choroid-plexus",
  209. "Right-Lateral-Ventricle",
  210. "Right-Inf-Lat-Vent",
  211. "Right-Cerebellum-White-Matter",
  212. "Right-Cerebellum-Cortex",
  213. "Right-Thalamus-Proper",
  214. "Right-Caudate",
  215. "Right-Putamen",
  216. "Right-Pallidum",
  217. "Right-Hippocampus",
  218. "Right-Amygdala",
  219. "Right-Accumbens-area",
  220. "Right-VentralDC",
  221. "Right-vessel",
  222. "Right-choroid-plexus",
  223. "5th-Ventricle",
  224. "WM-hypointensities",
  225. "Left-WM-hypointensities",
  226. "Right-WM-hypointensities",
  227. "non-WM-hypointensities",
  228. "Left-non-WM-hypointensities",
  229. "Right-non-WM-hypointensities",
  230. "Optic-Chiasm",
  231. "CC_Posterior",
  232. "CC_Mid_Posterior",
  233. "CC_Central",
  234. "CC_Mid_Anterior",
  235. "CC_Anterior",
  236. "BrainSegVol",
  237. "BrainSegVolNotVentSurf",
  238. "lhCortexVol",
  239. "rhCortexVol",
  240. "CortexVol",
  241. "lhCerebralWhiteMatterVol",
  242. "rhCerebralWhiteMatterVol",
  243. "CerebralWhiteMatterVol",
  244. "SubCortGrayVol",
  245. "TotalGrayVol",
  246. "SupraTentorialVol",
  247. "SupraTentorialVolNotVent",
  248. "SupraTentorialVolNotVentVox",
  249. "MaskVol",
  250. "BrainSegVol-to-eTIV",
  251. "MaskVol-to-eTIV",
  252. "lhSurfaceHoles",
  253. "rhSurfaceHoles",
  254. "SurfaceHoles",
  255. "EstimatedTotalIntraCranialVol",
  256. ]
  257. norm_data = NormData.from_dataframe(
  258. name="fcon1000",
  259. dataframe=data,
  260. covariates=covariates,
  261. batch_effects=batch_effects,
  262. response_vars=response_vars,
  263. subject_ids=subject_ids,
  264. remove_Nan=True,
  265. )
  266. return norm_data
  267. _LNM_DATA_URL = "https://raw.githubusercontent.com/predictive-clinical-neuroscience/pu25_code/main/data/LNM_data.csv"
  268. _LNM_METADATA_COLUMNS = frozenset({"sub_id", "age", "sex", "site", "visit", "group"})
  269. def load_lnm(
  270. save_path: str | None = None,
  271. group: Literal["control", "patient"] | None = None,
  272. ) -> NormData:
  273. """Download and save the LNM longitudinal dataset, or load it from disk.
  274. The dataset has two visits per subject (controls and patients).
  275. Parameters
  276. ----------
  277. save_path : str | None
  278. Folder to save or load ``LNM_data.csv`` from. Defaults to
  279. ``pcntoolkit_resources/data``.
  280. group : {"control", "patient"} | None
  281. Keep only the subjects of this group. Defaults to ``None``, which
  282. keeps everyone.
  283. Returns
  284. -------
  285. NormData
  286. Longitudinal dataset with ``visits="visit"``.
  287. Raises
  288. ------
  289. ValueError
  290. If ``group`` is not ``"control"``, ``"patient"`` or ``None``.
  291. """
  292. if group not in (None, "control", "patient"):
  293. raise ValueError(f"group must be 'control', 'patient' or None, not {group!r}.")
  294. if not save_path:
  295. save_path = os.path.join("pcntoolkit_resources", "data")
  296. os.makedirs(save_path, exist_ok=True)
  297. data_path = os.path.join(save_path, "LNM_data.csv")
  298. if not os.path.exists(data_path):
  299. # Download the LNM dataset if it does not exist locally
  300. data = pd.read_csv(_LNM_DATA_URL)
  301. data.to_csv(data_path, index=False)
  302. else:
  303. data = pd.read_csv(data_path)
  304. if group is not None:
  305. data = data[data["group"] == group]
  306. subject_ids = "sub_id"
  307. covariates = ["age"]
  308. batch_effects = ["sex", "site"]
  309. # Response variables are all columns that are not metadata.
  310. response_vars = [
  311. column for column in data.columns if column not in _LNM_METADATA_COLUMNS
  312. ]
  313. norm_data = NormData.from_dataframe(
  314. name=f"lnm_{group}" if group else "lnm",
  315. dataframe=data,
  316. covariates=covariates,
  317. batch_effects=batch_effects,
  318. response_vars=response_vars,
  319. subject_ids=subject_ids,
  320. visits="visit", # specify the visit columm
  321. remove_Nan=True,
  322. )
  323. return norm_data
  324. CORRELATION_MATRIX_URL = (
  325. "https://raw.githubusercontent.com/CharFraza/CPC_ML_tutorial/"
  326. "master/data/cmat_rh_G_front_middle_thickness.csv"
  327. )
  328. CORRELATION_MATRIX_RESPONSE_VAR = "rh_G_front_middle_thickness"
  329. def fetch_example_correlation_matrix(save_path: str | None = None) -> str:
  330. """Download an example correlation matrix and return the path to its CSV.
  331. Parameters
  332. ----------
  333. save_path : str | None
  334. Folder to save the matrix to. Defaults to
  335. ``pcntoolkit_resources/data/correlation_matrix``.
  336. Returns
  337. -------
  338. str
  339. Path to the CSV, named ``<response_var>.csv`` as
  340. ``CorrelationMatrix.load`` expects.
  341. """
  342. if not save_path:
  343. save_path = os.path.join("pcntoolkit_resources", "data", "correlation_matrix")
  344. os.makedirs(save_path, exist_ok=True)
  345. # Name the file after the response variable.
  346. data_path = os.path.join(save_path, f"{CORRELATION_MATRIX_RESPONSE_VAR}.csv")
  347. # Download the CSV if it does not exist locally.
  348. if not os.path.exists(data_path):
  349. urllib.request.urlretrieve(CORRELATION_MATRIX_URL, data_path)
  350. return data_path
  351. # NOTE: This dataset is not public
  352. def load_lifespan_big(
  353. n_response_vars: int | None = None,
  354. n_largest_sites: int | None = None,
  355. n_subjects: int | None = None,
  356. ) -> NormData:
  357. """
  358. Load the lifespan_big dataset, which is a large lifespan dataset with many sites.
  359. Parameters
  360. ----------
  361. n_response_vars : int | None
  362. If specified, only use the first n_response_vars response
  363. variables.
  364. n_largest_sites : int | None
  365. If specified, only keep data from the n_largest_sites largest
  366. sites.
  367. n_subjects : int | None
  368. If specified, randomly sample n_subjects subjects.
  369. Returns
  370. -------
  371. NormData
  372. The loaded dataset as a NormData object.
  373. """
  374. # Define the variables in the dataset
  375. subject_ids = ["participant_id"]
  376. covariates = ["age"]
  377. batch_effects = ["sex", "site"]
  378. # Define the dtypes for loading the dataset, to ensure that categorical
  379. # variables are loaded as strings and numerical variables as floats
  380. dtypes = {"participant_id": str, "group": str, "group2": str}
  381. for col in batch_effects:
  382. dtypes[col] = str
  383. for col in covariates:
  384. dtypes[col] = float
  385. # Load the lifespan dataset with 57116 subjects from the Braicharts paper:
  386. # https://doi.org/10.7554/eLife.72904
  387. data = pd.read_csv(
  388. "/project_cephfs/3022017.06/projects/stijdboe/Data/sairut_data/"
  389. "lifespan_big.csv",
  390. dtype=dtypes,
  391. )
  392. # Drop rows where all values are NaN
  393. data = data.dropna(axis=0, how="all", inplace=False)
  394. # Drop columns where even if 1 value is NaN
  395. data = data.dropna(axis=1, how="any", inplace=False)
  396. data["sex"] = data["sex"].map({"0.0": "Female", "1.0": "Male", "2.0": "Female"})
  397. data["site"] = data["site_ID"]
  398. # If requested, take only the n largest sites
  399. if n_largest_sites is not None:
  400. data = data[
  401. data["site_ID"].isin(
  402. data["site_ID"].value_counts().head(n_largest_sites).index
  403. )
  404. ]
  405. # If requested, take only n subjects
  406. if n_subjects is not None:
  407. data = data.sample(n=n_subjects, replace=False)
  408. # Define response variables as all variables that
  409. # are not in subject_ids, covariates, batch_effects,
  410. # and that have variance > 0
  411. def is_response_var(col_name: str) -> bool:
  412. return (
  413. col_name not in subject_ids
  414. and col_name not in covariates
  415. and col_name not in batch_effects
  416. and not col_name.startswith("site_")
  417. and not col_name.startswith("group")
  418. and not col_name.startswith("race")
  419. and data[col_name].var() > 0
  420. )
  421. response_vars = [col for col in data.columns if is_response_var(col)]
  422. # If requested, take only n response variables
  423. if n_response_vars is not None:
  424. response_vars = response_vars[:n_response_vars]
  425. # Create NormData object
  426. norm_data = NormData.from_dataframe(
  427. name="lifespan_big",
  428. dataframe=data,
  429. covariates=covariates,
  430. batch_effects=batch_effects,
  431. response_vars=response_vars,
  432. subject_ids=subject_ids,
  433. )
  434. return norm_data

data_factory.py at commit 20a95b6, under GPL-3.0 · at the source

Overview

Authors: Sebastian Volkmer1,2,3, Katharina M Kubera4, Stefan Fritze1,3, Geva Brandt1, Dilsa Cemre Akkoc Altinok1,3, Jonas Daub1,3, Jacqueline Kukovic1,3, Kent-Tjorben Böttcher1,3, Oksana Berhe1,3, Yuchen Lin1,3, Heike Tost1,3, Andre F Marquand5,6, Andreas Meyer-Lindenberg1,3, Emanuel Schwarz1,2,3, Dusan Hirjak1,3
  1. Department of Psychiatry and Psychotherapy, Central Institute of Mental Health, Medical Faculty Mannheim, University of Heidelberg, Mannheim, Germany
  2. Hector Institute for Artificial Intelligence in Psychiatry, Central Institute of Mental Health, Medical Faculty Mannheim, Heidelberg University, Mannheim, Germany
  3. German Centre for Mental Health (DZPG), Partnersite Mannheim-Heidelberg-Ulm, Mannheim, Germany
  4. Center for Psychosocial Medicine, Department of General Psychiatry, University of Heidelberg, Heidelberg, Germany
  5. Donders Centre for Cognitive Neuroimaging, Donders Institute for Brain, Cognition and Behaviour, Radboud University, Nijmegen, the Netherlands
  6. Department of Cognitive Neuroscience, Radboud University Medical Centre, Nijmegen, the Netherlands
Journal: Translational psychiatry, volume 16, issue 1, article 197
Dates: received 19 August 2025; accepted 6 March 2026; published online 20 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41398-026-03956-0 · PMID 41862444 · PMCID PMC13039878 · OpenAlex W7139956584
Open access: gold, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: structural MRI / diffusion (modality), human (organism), schizophrenia / psychosis (population)
Methods: Statistics, Connectivity, Machine learning
Keywords: Pathogenesis, Neuroscience
MeSH: Brain*, Cognitive Dysfunction*, Schizophrenia*, Schizophrenic Psychology*, Adult, Brain Cortical Thickness, Female, Gray Matter, Humans, Magnetic Resonance Imaging, Male, Middle Aged, Young Adult (* major topic)
Topic: Schizophrenia research and treatment (Psychiatry and Mental health, Medicine), according to OpenAlex
Funding: Bundesministerium für Bildung und Forschung (Federal Ministry of Education and Research) (01GQ1102); Deutsche Forschungsgemeinschaft (SCHW 1768/8-1, HI 1928/14-1, HI 1928/5-1)
Citations: cited by 2 papers (Europe PMC); 93 references in the paper

Abstract

Schizophrenia spectrum disorders (SSD) are marked by widespread structural brain abnormalities. Neuroanatomical normative modeling (NM) can quantify person-specific deviations from healthy variability, yet it remains unknown whether pre-trained, large-scale NM features support site-held-out classification and mechanistic brain–behavior mapping in SSD. Here, we applied a publicly available PCNtoolkit model (trained on ~57,000 healthy controls from 82 sites) to six independent cohorts (N = 831) to derive individual deviations in cortical thickness (CT) and subcortical volumes from T1-weighted MRI. Employing a random forest classifier with leave-site-out cross-validation, we achieved a balanced accuracy of 65%, which underscores the inherent complexity of SSD. Feature importance analysis identified total gray matter volume, mean CT, and CT changes in limbic and sensorimotor regions as key predictive features. Relative to healthy controls, SSD participants showed a higher burden of extreme negative deviations, which related to reduced attention and processing speed and to elevated neurological soft signs (NSS). Finally, canonical correlation analysis revealed a robust multivariate relationship linking structural deviationsparticularly CT changes in limbic and sensorimotor cortices, to cognition and NSS. Together, these results demonstrate that NM features transferred from a large external reference can generalize across sites and elucidate clinically relevant brain–behavior associations in SSD, supporting the integration of multimodal, large-scale datasets to advance biomarker discovery and inform earlier, more targeted interventions.

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

Repository

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

amarquand/PCNtoolkit

License: GPL-3.0
State: the link answers, verified on 29 October 2026
Evidence: files inventoried
Commit: 20a95b639190dfb9eabc31e53bd31fdb818a7141, 28 October 2026
Languages: Python (90), Jupyter (34)
Size: 280 files, 124 scripts
Software Heritage: not archived
Found in: the text, “Introduction”
Holds: README, license file, CITATION.cff, environment (pyproject.toml, doc/requirements.txt), tests, continuous integration, documentation, 34 notebooks
Tools: NumPy (62 files), pandas (44 files), Matplotlib (31 files), seaborn (27 files), xarray (19 files), SciPy (15 files), PyMC (8 files), scikit-learn (7 files), ArviZ (3 files), NiBabel (1 file), Connectome Workbench (1 file)
Availability: 2 checks, the latest on 29 October 2026: the link answers
  • 29 October 2026: the link answers
  • 28 September 2026: the link answers
126 files

Tracing map

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

What the map holds:

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

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

Data

Datasets cited

Data availability

The data that support the findings of this study are available from the corresponding author, upon reasonable request.

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

Versions

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

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 15 authors, 2 keywords, 13 MeSH terms, 2 funders, 88 references.

Cite

This paper

Volkmer, S., Kubera, K. M., Fritze, S., Brandt, G., Akkoc Altinok, D. C., Daub, J., Kukovic, J., Böttcher, K.-T., Berhe, O., Lin, Y., Tost, H., Marquand, A. F., Meyer-Lindenberg, A., Schwarz, E., & Hirjak, D. (2026). Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders. Translational psychiatry, 16(1), 197. https://doi.org/10.1038/s41398-026-03956-0

BibTeX

@article{volkmer2026normative,
author = {Volkmer, Sebastian and Kubera, Katharina M and Fritze, Stefan and Brandt, Geva and Akkoc Altinok, Dilsa Cemre and Daub, Jonas and Kukovic, Jacqueline and Böttcher, Kent-Tjorben and Berhe, Oksana and Lin, Yuchen and Tost, Heike and Marquand, Andre F and Meyer-Lindenberg, Andreas and Schwarz, Emanuel and Hirjak, Dusan},
title = {{Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders}},
journal = {Translational psychiatry},
year = {2026},
month = mar,
volume = {16},
number = {1},
pages = {197},
publisher = {Nature Publishing Group},
issn = {2158-3188},
doi = {10.1038/s41398-026-03956-0},
url = {https://doi.org/10.1038/s41398-026-03956-0},
pmid = {41862444},
pmcid = {PMC13039878}
}

RIS

TY - JOUR
AU - Volkmer, Sebastian
AU - Kubera, Katharina M
AU - Fritze, Stefan
AU - Brandt, Geva
AU - Akkoc Altinok, Dilsa Cemre
AU - Daub, Jonas
AU - Kukovic, Jacqueline
AU - Böttcher, Kent-Tjorben
AU - Berhe, Oksana
AU - Lin, Yuchen
AU - Tost, Heike
AU - Marquand, Andre F
AU - Meyer-Lindenberg, Andreas
AU - Schwarz, Emanuel
AU - Hirjak, Dusan
TI - Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders
T2 - Translational psychiatry
J2 - Transl Psychiatry
PY - 2026
DA - 2026/03/20
VL - 16
IS - 1
SP - 197
SN - 2158-3188
PB - Nature Publishing Group
DO - 10.1038/s41398-026-03956-0
UR - https://doi.org/10.1038/s41398-026-03956-0
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41398-026-03956-0",
"type": "article-journal",
"title": "Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders",
"container-title": "Translational psychiatry",
"author": [
{
"family": "Volkmer",
"given": "Sebastian"
},
{
"family": "Kubera",
"given": "Katharina M"
},
{
"family": "Fritze",
"given": "Stefan"
},
{
"family": "Brandt",
"given": "Geva"
},
{
"family": "Akkoc Altinok",
"given": "Dilsa Cemre"
},
{
"family": "Daub",
"given": "Jonas"
},
{
"family": "Kukovic",
"given": "Jacqueline"
},
{
"family": "Böttcher",
"given": "Kent-Tjorben"
},
{
"family": "Berhe",
"given": "Oksana"
},
{
"family": "Lin",
"given": "Yuchen"
},
{
"family": "Tost",
"given": "Heike"
},
{
"family": "Marquand",
"given": "Andre F"
},
{
"family": "Meyer-Lindenberg",
"given": "Andreas"
},
{
"family": "Schwarz",
"given": "Emanuel"
},
{
"family": "Hirjak",
"given": "Dusan"
}
],
"container-title-short": "Transl Psychiatry",
"volume": "16",
"issue": "1",
"page": "197",
"DOI": "10.1038/s41398-026-03956-0",
"PMID": "41862444",
"PMCID": "PMC13039878",
"ISSN": "2158-3188",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41398-026-03956-0",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
20
]
]
}
}

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.1038/s41398-026-04426-3 [code]
Resting-state brain age is associated with cognitive and sensorimotor abnormalities in schizophrenia spectrum disorders: a validation &amp; longitudinal study.
Journal: Translational psychiatry
In common: NiBabel, pandas, NumPy, schizophrenia / psychosis, structural MRI / diffusion, 9 references, 5 authors
[2] doi:10.1016/j.bpsgos.2025.100541 [code]
Predicting Mental and Neurological Illnesses Based on Cerebellar Normative Features.
Journal: Biological psychiatry global open science
In common: PyMC, ArviZ, xarray, 8 other tools, 10 references
[3] doi:10.1038/s41593-023-01404-6 [code]
Regional, circuit and network heterogeneity of brain abnormalities in psychiatric disorders.
Journal: Nature neuroscience
In common: PyMC, ArviZ, xarray, 8 other tools, structural MRI / diffusion, 6 references, author Andre Marquand
[4] doi:10.64898/2026.02.17.706268 [code]
Protocol Update: The Normative Modelling Paradigm for Computational Psychiatry
Journal: bioRxiv (preprint)
In common: PyMC, ArviZ, xarray, 8 other tools, 7 references
[5] doi:10.1212/wnl.0000000000207298 [code]
Revealing Individual Neuroanatomical Heterogeneity in Alzheimer Disease Using Neuroanatomical Normative Modeling.
Journal: Neurology
In common: PyMC, ArviZ, xarray, 8 other tools, structural MRI / diffusion, 4 references, author Andre Marquand
[6] doi:10.1038/s42003-026-09825-2 [code]
Normative modeling of MEG brain oscillations across the human lifespan.
Journal: Communications biology
In common: PyMC, ArviZ, xarray, 7 other tools, 5 references, author Andre Marquand
[7] doi:10.1002/hbm.70281 [code]
Using Extreme Value Statistics to Reconceptualize Psychopathology as Extreme Deviations From a Normative Reference Model.
Journal: Human brain mapping
In common: PyMC, ArviZ, xarray, 8 other tools, 4 references, author Andre Marquand
[8] doi:10.12688/wellcomeopenres.19591.2 [code]
Predictive Clinical Neuroscience Portal (PCNportal): instant online access to research-grade normative models for clinical neuroscientists.
Journal: Wellcome open research
In common: PyMC, ArviZ, xarray, 8 other tools, schizophrenia / psychosis, 3 references, author Andre Marquand
[9] doi:10.1038/s41467-024-46398-2 [code]
Population-wide cerebellar growth models of children and adolescents.
Journal: Nature communications
In common: PyMC, ArviZ, xarray, 8 other tools, 3 references, author Andre Marquand
[10] doi:10.64898/2026.03.31.26349848 [code]
Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling
Journal: medRxiv (preprint)
In common: seaborn, pandas, Matplotlib, 1 other tool, schizophrenia / psychosis, structural MRI / diffusion, 13 references

Contribute

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

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

Add the badge to the code's README

OSCR: the badge of this paper

If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0.svg)](https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0.svg
   :target: https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0"><img src="https://openscicode.org/badge/doi/10.1038/s41398-026-03956-0.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".

If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge 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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.

Report a mismatch between the code and the paper · Report a code error (signed in)

Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.

Report a reproduction failure (signed in)

Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.

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