Normative age-related structural brain deviations underlying psychopathology, cognitive impairment and neurological soft signs in schizophrenia spectrum disorders.
The 2 matches
- [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] § 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
- from __future__ import annotations
- import os
- import urllib.request
- from typing import Literal
- import pandas as pd
- from pcntoolkit.dataio.norm_data import NormData
- def load_fcon1000(save_path: str | None = None):
- """Download and save fcon dataset to specified path, or load it from there
- if it is already downloaded
- Parameters
- ----------
- save_path : str | None
- The path to save the dataset to, or load it from if it is already
- downloaded
- Returns
- -------
- NormData
- The loaded dataset as a NormData object"""
- if not save_path:
- save_path = os.path.join("pcntoolkit_resources", "data")
- os.makedirs(save_path, exist_ok=True)
- data_path = os.path.join(save_path, "fcon1000.csv")
- # If the dataset is not already downloaded, download it and save it to
- # the specified path
- if not os.path.exists(data_path):
- data = pd.read_csv(
- "https://raw.githubusercontent.com/predictive-clinical-neuroscience/PCNtoolkit-demo/refs/heads/main/data/fcon1000.csv"
- )
- data.to_csv(data_path, index=False)
- else:
- data = pd.read_csv(data_path)
- # Define the variables
- sex_map = {0: "F", 1: "M"}
- data["sex"] = data["sex"].map(sex_map)
- subject_ids = "sub_id"
- covariates = ["age"]
- batch_effects = ["sex", "site"]
- response_vars = [
- "lh_G&S_frontomargin_thickness",
- "lh_G&S_occipital_inf_thickness",
- "lh_G&S_paracentral_thickness",
- "lh_G&S_subcentral_thickness",
- "lh_G&S_transv_frontopol_thickness",
- "lh_G&S_cingul-Ant_thickness",
- "lh_G&S_cingul-Mid-Ant_thickness",
- "lh_G&S_cingul-Mid-Post_thickness",
- "lh_G_cingul-Post-dorsal_thickness",
- "lh_G_cingul-Post-ventral_thickness",
- "lh_G_cuneus_thickness",
- "lh_G_front_inf-Opercular_thickness",
- "lh_G_front_inf-Orbital_thickness",
- "lh_G_front_inf-Triangul_thickness",
- "lh_G_front_middle_thickness",
- "lh_G_front_sup_thickness",
- "lh_G_Ins_lg&S_cent_ins_thickness",
- "lh_G_insular_short_thickness",
- "lh_G_occipital_middle_thickness",
- "lh_G_occipital_sup_thickness",
- "lh_G_oc-temp_lat-fusifor_thickness",
- "lh_G_oc-temp_med-Lingual_thickness",
- "lh_G_oc-temp_med-Parahip_thickness",
- "lh_G_orbital_thickness",
- "lh_G_pariet_inf-Angular_thickness",
- "lh_G_pariet_inf-Supramar_thickness",
- "lh_G_parietal_sup_thickness",
- "lh_G_postcentral_thickness",
- "lh_G_precentral_thickness",
- "lh_G_precuneus_thickness",
- "lh_G_rectus_thickness",
- "lh_G_subcallosal_thickness",
- "lh_G_temp_sup-G_T_transv_thickness",
- "lh_G_temp_sup-Lateral_thickness",
- "lh_G_temp_sup-Plan_polar_thickness",
- "lh_G_temp_sup-Plan_tempo_thickness",
- "lh_G_temporal_inf_thickness",
- "lh_G_temporal_middle_thickness",
- "lh_Lat_Fis-ant-Horizont_thickness",
- "lh_Lat_Fis-ant-Vertical_thickness",
- "lh_Lat_Fis-post_thickness",
- "lh_Pole_occipital_thickness",
- "lh_Pole_temporal_thickness",
- "lh_S_calcarine_thickness",
- "lh_S_central_thickness",
- "lh_S_cingul-Marginalis_thickness",
- "lh_S_circular_insula_ant_thickness",
- "lh_S_circular_insula_inf_thickness",
- "lh_S_circular_insula_sup_thickness",
- "lh_S_collat_transv_ant_thickness",
- "lh_S_collat_transv_post_thickness",
- "lh_S_front_inf_thickness",
- "lh_S_front_middle_thickness",
- "lh_S_front_sup_thickness",
- "lh_S_interm_prim-Jensen_thickness",
- "lh_S_intrapariet&P_trans_thickness",
- "lh_S_oc_middle&Lunatus_thickness",
- "lh_S_oc_sup&transversal_thickness",
- "lh_S_occipital_ant_thickness",
- "lh_S_oc-temp_lat_thickness",
- "lh_S_oc-temp_med&Lingual_thickness",
- "lh_S_orbital_lateral_thickness",
- "lh_S_orbital_med-olfact_thickness",
- "lh_S_orbital-H_Shaped_thickness",
- "lh_S_parieto_occipital_thickness",
- "lh_S_pericallosal_thickness",
- "lh_S_postcentral_thickness",
- "lh_S_precentral-inf-part_thickness",
- "lh_S_precentral-sup-part_thickness",
- "lh_S_suborbital_thickness",
- "lh_S_subparietal_thickness",
- "lh_S_temporal_inf_thickness",
- "lh_S_temporal_sup_thickness",
- "lh_S_temporal_transverse_thickness",
- "lh_MeanThickness_thickness",
- "BrainSegVolNotVent",
- "eTIV",
- "rh_G&S_frontomargin_thickness",
- "rh_G&S_occipital_inf_thickness",
- "rh_G&S_paracentral_thickness",
- "rh_G&S_subcentral_thickness",
- "rh_G&S_transv_frontopol_thickness",
- "rh_G&S_cingul-Ant_thickness",
- "rh_G&S_cingul-Mid-Ant_thickness",
- "rh_G&S_cingul-Mid-Post_thickness",
- "rh_G_cingul-Post-dorsal_thickness",
- "rh_G_cingul-Post-ventral_thickness",
- "rh_G_cuneus_thickness",
- "rh_G_front_inf-Opercular_thickness",
- "rh_G_front_inf-Orbital_thickness",
- "rh_G_front_inf-Triangul_thickness",
- "rh_G_front_middle_thickness",
- "rh_G_front_sup_thickness",
- "rh_G_Ins_lg&S_cent_ins_thickness",
- "rh_G_insular_short_thickness",
- "rh_G_occipital_middle_thickness",
- "rh_G_occipital_sup_thickness",
- "rh_G_oc-temp_lat-fusifor_thickness",
- "rh_G_oc-temp_med-Lingual_thickness",
- "rh_G_oc-temp_med-Parahip_thickness",
- "rh_G_orbital_thickness",
- "rh_G_pariet_inf-Angular_thickness",
- "rh_G_pariet_inf-Supramar_thickness",
- "rh_G_parietal_sup_thickness",
- "rh_G_postcentral_thickness",
- "rh_G_precentral_thickness",
- "rh_G_precuneus_thickness",
- "rh_G_rectus_thickness",
- "rh_G_subcallosal_thickness",
- "rh_G_temp_sup-G_T_transv_thickness",
- "rh_G_temp_sup-Lateral_thickness",
- "rh_G_temp_sup-Plan_polar_thickness",
- "rh_G_temp_sup-Plan_tempo_thickness",
- "rh_G_temporal_inf_thickness",
- "rh_G_temporal_middle_thickness",
- "rh_Lat_Fis-ant-Horizont_thickness",
- "rh_Lat_Fis-ant-Vertical_thickness",
- "rh_Lat_Fis-post_thickness",
- "rh_Pole_occipital_thickness",
- "rh_Pole_temporal_thickness",
- "rh_S_calcarine_thickness",
- "rh_S_central_thickness",
- "rh_S_cingul-Marginalis_thickness",
- "rh_S_circular_insula_ant_thickness",
- "rh_S_circular_insula_inf_thickness",
- "rh_S_circular_insula_sup_thickness",
- "rh_S_collat_transv_ant_thickness",
- "rh_S_collat_transv_post_thickness",
- "rh_S_front_inf_thickness",
- "rh_S_front_middle_thickness",
- "rh_S_front_sup_thickness",
- "rh_S_interm_prim-Jensen_thickness",
- "rh_S_intrapariet&P_trans_thickness",
- "rh_S_oc_middle&Lunatus_thickness",
- "rh_S_oc_sup&transversal_thickness",
- "rh_S_occipital_ant_thickness",
- "rh_S_oc-temp_lat_thickness",
- "rh_S_oc-temp_med&Lingual_thickness",
- "rh_S_orbital_lateral_thickness",
- "rh_S_orbital_med-olfact_thickness",
- "rh_S_orbital-H_Shaped_thickness",
- "rh_S_parieto_occipital_thickness",
- "rh_S_pericallosal_thickness",
- "rh_S_postcentral_thickness",
- "rh_S_precentral-inf-part_thickness",
- "rh_S_precentral-sup-part_thickness",
- "rh_S_suborbital_thickness",
- "rh_S_subparietal_thickness",
- "rh_S_temporal_inf_thickness",
- "rh_S_temporal_sup_thickness",
- "rh_S_temporal_transverse_thickness",
- "rh_MeanThickness_thickness",
- "Left-Lateral-Ventricle",
- "Left-Inf-Lat-Vent",
- "Left-Cerebellum-White-Matter",
- "Left-Cerebellum-Cortex",
- "Left-Thalamus-Proper",
- "Left-Caudate",
- "Left-Putamen",
- "Left-Pallidum",
- "3rd-Ventricle",
- "4th-Ventricle",
- "Brain-Stem",
- "Left-Hippocampus",
- "Left-Amygdala",
- "CSF",
- "Left-Accumbens-area",
- "Left-VentralDC",
- "Left-vessel",
- "Left-choroid-plexus",
- "Right-Lateral-Ventricle",
- "Right-Inf-Lat-Vent",
- "Right-Cerebellum-White-Matter",
- "Right-Cerebellum-Cortex",
- "Right-Thalamus-Proper",
- "Right-Caudate",
- "Right-Putamen",
- "Right-Pallidum",
- "Right-Hippocampus",
- "Right-Amygdala",
- "Right-Accumbens-area",
- "Right-VentralDC",
- "Right-vessel",
- "Right-choroid-plexus",
- "5th-Ventricle",
- "WM-hypointensities",
- "Left-WM-hypointensities",
- "Right-WM-hypointensities",
- "non-WM-hypointensities",
- "Left-non-WM-hypointensities",
- "Right-non-WM-hypointensities",
- "Optic-Chiasm",
- "CC_Posterior",
- "CC_Mid_Posterior",
- "CC_Central",
- "CC_Mid_Anterior",
- "CC_Anterior",
- "BrainSegVol",
- "BrainSegVolNotVentSurf",
- "lhCortexVol",
- "rhCortexVol",
- "CortexVol",
- "lhCerebralWhiteMatterVol",
- "rhCerebralWhiteMatterVol",
- "CerebralWhiteMatterVol",
- "SubCortGrayVol",
- "TotalGrayVol",
- "SupraTentorialVol",
- "SupraTentorialVolNotVent",
- "SupraTentorialVolNotVentVox",
- "MaskVol",
- "BrainSegVol-to-eTIV",
- "MaskVol-to-eTIV",
- "lhSurfaceHoles",
- "rhSurfaceHoles",
- "SurfaceHoles",
- "EstimatedTotalIntraCranialVol",
- ]
- norm_data = NormData.from_dataframe(
- name="fcon1000",
- dataframe=data,
- covariates=covariates,
- batch_effects=batch_effects,
- response_vars=response_vars,
- subject_ids=subject_ids,
- remove_Nan=True,
- )
- return norm_data
- _LNM_DATA_URL = "https://raw.githubusercontent.com/predictive-clinical-neuroscience/pu25_code/main/data/LNM_data.csv"
- _LNM_METADATA_COLUMNS = frozenset({"sub_id", "age", "sex", "site", "visit", "group"})
- def load_lnm(
- save_path: str | None = None,
- group: Literal["control", "patient"] | None = None,
- ) -> NormData:
- """Download and save the LNM longitudinal dataset, or load it from disk.
- The dataset has two visits per subject (controls and patients).
- Parameters
- ----------
- save_path : str | None
- Folder to save or load ``LNM_data.csv`` from. Defaults to
- ``pcntoolkit_resources/data``.
- group : {"control", "patient"} | None
- Keep only the subjects of this group. Defaults to ``None``, which
- keeps everyone.
- Returns
- -------
- NormData
- Longitudinal dataset with ``visits="visit"``.
- Raises
- ------
- ValueError
- If ``group`` is not ``"control"``, ``"patient"`` or ``None``.
- """
- if group not in (None, "control", "patient"):
- raise ValueError(f"group must be 'control', 'patient' or None, not {group!r}.")
- if not save_path:
- save_path = os.path.join("pcntoolkit_resources", "data")
- os.makedirs(save_path, exist_ok=True)
- data_path = os.path.join(save_path, "LNM_data.csv")
- if not os.path.exists(data_path):
- # Download the LNM dataset if it does not exist locally
- data = pd.read_csv(_LNM_DATA_URL)
- data.to_csv(data_path, index=False)
- else:
- data = pd.read_csv(data_path)
- if group is not None:
- data = data[data["group"] == group]
- subject_ids = "sub_id"
- covariates = ["age"]
- batch_effects = ["sex", "site"]
- # Response variables are all columns that are not metadata.
- response_vars = [
- column for column in data.columns if column not in _LNM_METADATA_COLUMNS
- ]
- norm_data = NormData.from_dataframe(
- name=f"lnm_{group}" if group else "lnm",
- dataframe=data,
- covariates=covariates,
- batch_effects=batch_effects,
- response_vars=response_vars,
- subject_ids=subject_ids,
- visits="visit", # specify the visit columm
- remove_Nan=True,
- )
- return norm_data
- CORRELATION_MATRIX_URL = (
- "https://raw.githubusercontent.com/CharFraza/CPC_ML_tutorial/"
- "master/data/cmat_rh_G_front_middle_thickness.csv"
- )
- CORRELATION_MATRIX_RESPONSE_VAR = "rh_G_front_middle_thickness"
- def fetch_example_correlation_matrix(save_path: str | None = None) -> str:
- """Download an example correlation matrix and return the path to its CSV.
- Parameters
- ----------
- save_path : str | None
- Folder to save the matrix to. Defaults to
- ``pcntoolkit_resources/data/correlation_matrix``.
- Returns
- -------
- str
- Path to the CSV, named ``<response_var>.csv`` as
- ``CorrelationMatrix.load`` expects.
- """
- if not save_path:
- save_path = os.path.join("pcntoolkit_resources", "data", "correlation_matrix")
- os.makedirs(save_path, exist_ok=True)
- # Name the file after the response variable.
- data_path = os.path.join(save_path, f"{CORRELATION_MATRIX_RESPONSE_VAR}.csv")
- # Download the CSV if it does not exist locally.
- if not os.path.exists(data_path):
- urllib.request.urlretrieve(CORRELATION_MATRIX_URL, data_path)
- return data_path
- # NOTE: This dataset is not public
- def load_lifespan_big(
- n_response_vars: int | None = None,
- n_largest_sites: int | None = None,
- n_subjects: int | None = None,
- ) -> NormData:
- """
- Load the lifespan_big dataset, which is a large lifespan dataset with many sites.
- Parameters
- ----------
- n_response_vars : int | None
- If specified, only use the first n_response_vars response
- variables.
- n_largest_sites : int | None
- If specified, only keep data from the n_largest_sites largest
- sites.
- n_subjects : int | None
- If specified, randomly sample n_subjects subjects.
- Returns
- -------
- NormData
- The loaded dataset as a NormData object.
- """
- # Define the variables in the dataset
- subject_ids = ["participant_id"]
- covariates = ["age"]
- batch_effects = ["sex", "site"]
- # Define the dtypes for loading the dataset, to ensure that categorical
- # variables are loaded as strings and numerical variables as floats
- dtypes = {"participant_id": str, "group": str, "group2": str}
- for col in batch_effects:
- dtypes[col] = str
- for col in covariates:
- dtypes[col] = float
- # Load the lifespan dataset with 57116 subjects from the Braicharts paper:
- # https://doi.org/10.7554/eLife.72904
- data = pd.read_csv(
- "/project_cephfs/3022017.06/projects/stijdboe/Data/sairut_data/"
- "lifespan_big.csv",
- dtype=dtypes,
- )
- # Drop rows where all values are NaN
- data = data.dropna(axis=0, how="all", inplace=False)
- # Drop columns where even if 1 value is NaN
- data = data.dropna(axis=1, how="any", inplace=False)
- data["sex"] = data["sex"].map({"0.0": "Female", "1.0": "Male", "2.0": "Female"})
- data["site"] = data["site_ID"]
- # If requested, take only the n largest sites
- if n_largest_sites is not None:
- data = data[
- data["site_ID"].isin(
- data["site_ID"].value_counts().head(n_largest_sites).index
- )
- ]
- # If requested, take only n subjects
- if n_subjects is not None:
- data = data.sample(n=n_subjects, replace=False)
- # Define response variables as all variables that
- # are not in subject_ids, covariates, batch_effects,
- # and that have variance > 0
- def is_response_var(col_name: str) -> bool:
- return (
- col_name not in subject_ids
- and col_name not in covariates
- and col_name not in batch_effects
- and not col_name.startswith("site_")
- and not col_name.startswith("group")
- and not col_name.startswith("race")
- and data[col_name].var() > 0
- )
- response_vars = [col for col in data.columns if is_response_var(col)]
- # If requested, take only n response variables
- if n_response_vars is not None:
- response_vars = response_vars[:n_response_vars]
- # Create NormData object
- norm_data = NormData.from_dataframe(
- name="lifespan_big",
- dataframe=data,
- covariates=covariates,
- batch_effects=batch_effects,
- response_vars=response_vars,
- subject_ids=subject_ids,
- )
- return norm_data
data_factory.py at commit 20a95b6, under GPL-3.0 · at the source
Overview
- Department of Psychiatry and Psychotherapy, Central Institute of Mental Health, Medical Faculty Mannheim, University of Heidelberg, Mannheim, Germany
- Hector Institute for Artificial Intelligence in Psychiatry, Central Institute of Mental Health, Medical Faculty Mannheim, Heidelberg University, Mannheim, Germany
- German Centre for Mental Health (DZPG), Partnersite Mannheim-Heidelberg-Ulm, Mannheim, Germany
- Center for Psychosocial Medicine, Department of General Psychiatry, University of Heidelberg, Heidelberg, Germany
- Donders Centre for Cognitive Neuroimaging, Donders Institute for Brain, Cognition and Behaviour, Radboud University, Nijmegen, the Netherlands
- Department of Cognitive Neuroscience, Radboud University Medical Centre, Nijmegen, the Netherlands
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
20a95b639190dfb9eabc31e53bd31fdb818a7141, 28 October 2026Availability: 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
- doc/
conf.py , Python, 144 lines - doc/
convert_notebooks.py , Python, 238 lines - doc/
tutorials/ , Jupyter, 136 linesnotebooks/ 00_getting_started.ipynb - doc/
tutorials/ , Jupyter, 261 linesnotebooks/ 01_loading_data.ipynb - doc/
tutorials/ , Jupyter, 536 linesnotebooks/ 02_BLR.ipynb - doc/
tutorials/ , Jupyter, 468 linesnotebooks/ 03_HBR_Normal.ipynb - doc/
tutorials/ , Jupyter, 539 linesnotebooks/ 04_HBR_SHASH.ipynb - doc/
tutorials/ , Jupyter, 518 linesnotebooks/ 05_HBR_Beta.ipynb - doc/
tutorials/ , Jupyter, 254 linesnotebooks/ 06_transfer_extend.ipynb - doc/
tutorials/ , Jupyter, 224 linesnotebooks/ 07_model_comparison.ipyn b - doc/
tutorials/ , Jupyter, 222 linesnotebooks/ 08_cluster.ipynb - doc/
tutorials/ , Jupyter, 225 linesnotebooks/ 09_command_line_interfac e.ipynb - doc/
tutorials/ , Jupyter, 212 linesnotebooks/ 10_merge.ipynb - doc/
tutorials/ , Jupyter, 266 linesnotebooks/ 11_composite_basis_funct ion.ipynb - doc/
tutorials/ , Jupyter, 260 linesnotebooks/ 12_transfer_pretrained.i pynb - doc/
tutorials/ , Jupyter, 288 linesnotebooks/ 13_evaluation_metrics.ip ynb - doc/
tutorials/ , Jupyter, 336 linesnotebooks/ 14_longitudinal_modellin g.ipynb - doc/
tutorials/ , Jupyter, 310 linesnotebooks/ 15_HBR_ZINB.ipynb - doc/
tutorials/ , Jupyter, 157 linesnotebooks/ 16_correlation_matrix.ip ynb - examples/
00_getting_started.ipynb , Jupyter, 136 lines - examples/
01_loading_data.ipynb , Jupyter, 261 lines - examples/
02_BLR.ipynb , Jupyter, 536 lines - examples/
03_HBR_Normal.ipynb , Jupyter, 468 lines - examples/
04_HBR_SHASH.ipynb , Jupyter, 539 lines - examples/
05_HBR_Beta.ipynb , Jupyter, 518 lines - examples/
06_transfer_extend.ipynb , Jupyter, 254 lines - examples/
07_model_comparison.ipyn , Jupyter, 224 linesb - examples/
08_cluster.ipynb , Jupyter, 222 lines - examples/
09_command_line_interfac , Jupyter, 225 linese.ipynb - examples/
10_merge.ipynb , Jupyter, 212 lines, 1 match - examples/
11_composite_basis_funct , Jupyter, 266 linesion.ipynb - examples/
12_transfer_pretrained.i , Jupyter, 260 linespynb - examples/
13_evaluation_metrics.ip , Jupyter, 288 linesynb - examples/
14_longitudinal_modellin , Jupyter, 336 linesg.ipynb - examples/
15_HBR_ZINB.ipynb , Jupyter, 310 lines - examples/
16_correlation_matrix.ip , Jupyter, 157 linesynb - pcntoolkit/
__init__.py , Python, 64 lines - pcntoolkit/
dataio/ , Python, 1 line__init__.py - pcntoolkit/
dataio/ , Python, 479 lines, 1 matchdata_factory.py - pcntoolkit/
dataio/ , Python, 694 linesfileio.py - pcntoolkit/
dataio/ , Python, 2,023 linesnorm_data.py - pcntoolkit/
longitudinal/ , Python, 11 lines__init__.py - pcntoolkit/
longitudinal/ , Python, 493 linescorrelation_matrix.py - pcntoolkit/
longitudinal/ , Python, 143 lineslongitudinal_score.py - pcntoolkit/
longitudinal/ , Python, 286 linesvelocity_model.py - pcntoolkit/
longitudinal/ , Python, 237 lineszdiff_score.py - pcntoolkit/
math_functions/ , Python, 1 line__init__.py - pcntoolkit/
math_functions/ , Python, 641 linesbasis_function.py - pcntoolkit/
math_functions/ , Python, 48 linesfactorize.py - pcntoolkit/
math_functions/ , Python, 1,094 lineslikelihood.py - pcntoolkit/
math_functions/ , Python, 714 linesprior.py - pcntoolkit/
math_functions/ , Python, 548 linesscaler.py - pcntoolkit/
math_functions/ , Python, 429 linesshash.py - pcntoolkit/
math_functions/ , Python, 933 linesvelocity.py - pcntoolkit/
math_functions/ , Python, 744 lineswarp.py - pcntoolkit/
normative.py , Python, 275 lines - pcntoolkit/
normative_model.py , Python, 1,482 lines - pcntoolkit/
regression_model/ , Python, 1 line__init__.py - pcntoolkit/
regression_model/ , Python, 1,247 linesblr.py - pcntoolkit/
regression_model/ , Python, 194 linesfactory.py - pcntoolkit/
regression_model/ , Python, 733 lineshbr.py - pcntoolkit/
regression_model/ , Python, 312 linesregression_model.py - pcntoolkit/
regression_model/ , Python, 83 linestest_model.py - pcntoolkit/
util/ , Python, 1 line__init__.py - pcntoolkit/
util/ , Python, 69 linesautoscale_plot.py - pcntoolkit/
util/ , Python, 82 linesdata_utils.py - pcntoolkit/
util/ , Python, 778 linesevaluator.py - pcntoolkit/
util/ , Python, 222 linesjob_observer.py - pcntoolkit/
util/ , Python, 397 linesmigration.py - pcntoolkit/
util/ , Python, 49 linesmodel_comparison.py - pcntoolkit/
util/ , Python, 384 linesoutput.py - pcntoolkit/
util/ , Python, 126 linespaths.py - pcntoolkit/
util/ , Python, 1,480 linesplotter.py - pcntoolkit/
util/ , Python, 1,215 linesrunner.py - render_citation.py, Python, 332 lines
- test/
__init__.py , Python, 1 line - test/
conftest.py , Python, 148 lines - test/
fixtures/ , Python, 1 line__init__.py - test/
fixtures/ , Python, 175 linesblr_model_fixtures.py - test/
fixtures/ , Python, 165 linesdata_fixtures.py - test/
fixtures/ , Python, 109 linesevaluator_fixtures.py - test/
fixtures/ , Python, 108 lineshbr_model_fixtures.py - test/
fixtures/ , Python, 58 linesnorm_data_fixtures.py - test/
fixtures/ , Python, 137 linespath_fixtures.py - test/
fixtures/ , Python, 64 linesplotter_fixtures.py - test/
fixtures/ , Python, 50 linestest_model_fixtures.py - test/
test_cli/ , Python, 1 line__init__.py - test/
test_cli/ , Python, 154 linestest_basic_commands.py - test/
test_cli/ , Python, 64 linestest_error_handling.py - test/
test_core/ , Python, 1 line__init__.py - test/
test_core/ , Python, 168 linestest_data_io.py - test/
test_core/ , Python, 63 linestest_norm_factory.py - test/
test_core/ , Python, 149 linestest_normative_model_mai n.py - test/
test_core/ , Python, 182 linestest_pretrained_model.py - test/
test_core/ , Python, 308 linestest_regression_models.p y - test/
test_core/ , Python, 216 linestest_utils.py - test/
test_dataio/ , Python, 1 line__init__.py - test/
test_dataio/ , Python, 26 linestest_fileio.py - test/
test_dataio/ , Python, 301 linestest_normdata.py - test/
test_longitudinal/ , Python, 430 linesconftest.py - test/
test_longitudinal/ , Python, 235 linestest_correlation_matrix. py - test/
test_longitudinal/ , Python, 411 linestest_scoring.py - test/
test_longitudinal/ , Python, 386 linestest_thrivelines.py - test/
test_longitudinal/ , Python, 73 linestest_validation.py - test/
test_math/ , Python, 410 linestest_basis_functions.py - test/
test_math/ , Python, 189 linestest_factorize.py - test/
test_math/ , Python, 261 linestest_likelihood.py - test/
test_math/ , Python, 95 linestest_prior.py - test/
test_math/ , Python, 201 linestest_velocity.py - test/
test_math/ , Python, 105 linestest_warp.py - test/
test_norm/ , Python, 1 line__init__.py - test/
test_norm/ , Python, 37 linestest_norm_factory.py - test/
test_norm/ , Python, 391 linestest_normative_model_hel per.py - test/
test_norm/ , Python, 195 linestest_normative_model_tra nsfer.py - test/
test_normative.py , Python, 22 lines - test/
test_regression_models/ , Python, 1 line__init__.py - test/
test_regression_models/ , Python, 245 linestest_blr.py - test/
test_regression_models/ , Python, 585 linestest_hbr.py - test/
test_util/ , Python, 111 linestest_mace.py - test/
test_util/ , Python, 215 linestest_migration.py - test/
test_util/ , Python, 60 linestest_msll.py - test/
test_util/ , Python, 86 linestest_plotter.py - test/
test_util/ , Python, 423 linestest_runner.py - test/
test_util/ , Python, 202 linestest_skewness_kurtosis.p y - LICENSE, License, 674 lines
- README.md, Text, 74 lines
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
- openfmri.org/
dataset/ , at openfmri.org; found in “Participants within the publicly available data”ds000030
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://
BibTeX
@article{volkmer2026norm
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/
url = {https://
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/
VL - 16
IS - 1
SP - 197
SN - 2158-3188
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"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":
"volume": "16",
"issue": "1",
"page": "197",
"DOI": "10.1038/
"PMID": "41862444",
"PMCID": "PMC13039878",
"ISSN": "2158-3188",
"publisher": "Nature Publishing Group",
"URL": "https://
"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 psychiatryIn 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 scienceIn 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 neuroscienceIn 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 PsychiatryJournal: 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: NeurologyIn 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 biologyIn 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 mappingIn 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 researchIn 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 communicationsIn 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 ModelingJournal: 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 124 scripts, and 2 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:cb1aae244c48c982…
Add the badge to the code's README
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 -->
[](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:endHTML
<!-- 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.
