Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling
The 6 matches
- [1] § Methods › Applying clinical datasets to the normative models ↔ scripts/apply_normative_models_ct.ipynb, lines 257–387 · score 0.69 · aleatoric uncertainty, epistemic uncertainty, variance components, predicted, normative, models
- [2] § Methods › Applying clinical datasets to the normative models ↔ scripts/apply_normative_models_ct.py, lines 300–339 · score 0.69 · aleatoric uncertainty, epistemic uncertainty, variance components, predicted, normative, models
- [3] § Methods › Establishing and evaluating normative models of GMV ↔ scripts/fit_normative_models_ct.ipynb, lines 87–109 · score 0.65 · Gaussian noise, spline basis expansion, cubic, knots, linear, age
- [4] § Methods › Establishing and evaluating normative models of GMV ↔ scripts/fit_normative_models_yeo17.ipynb, lines 77–99 · score 0.65 · Gaussian noise, spline basis expansion, cubic, knots, linear, age
- [5] § Methods › Establishing and evaluating normative models of GMV ↔ scripts/fit_normative_models_ct.ipynb, lines 180–243 · score 0.53 · standardized log loss, MSLL, kurtosis, skew, fit, variance
- [6] § Methods › Establishing and evaluating normative models of GMV ↔ scripts/fit_normative_models_yeo17.ipynb, lines 170–233 · score 0.53 · standardized log loss, MSLL, kurtosis, skew, fit, variance
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 · 249 lines · 10 KB · GPL-3.0 · 2 matches
- # %% [markdown]
- # ## Estimating lifespan normative models
- #
- # This notebook provides a complete walkthrough for an analysis of normative modelling in a large sample as described in the accompanying paper. Note that this script is provided principally for completeness (e.g. to assist in fitting normative models to new datasets). All pre-estimated normative models are already provided.
- #
- # First, if necessary, we install PCNtoolkit (note: this tutorial requires at least version 0.27)
- # %%
- ! pip install pcntoolkit==0.35
- # %% [markdown]
- # Then we import the required libraries
- # %%
- import os
- import numpy as np
- import pandas as pd
- import pickle
- from matplotlib import pyplot as plt
- import seaborn as sns
- from pcntoolkit.normative import estimate, predict, evaluate
- from pcntoolkit.util.utils import compute_MSLL, create_design_matrix
- from nm_utils import calibration_descriptives, remove_bad_subjects, load_2d
- # %% [markdown]
- # Now, we configure the locations in which the data are stored. You will need to configure this for your specific installation
- #
- # **Notes:**
- # - The data are assumed to be in CSV format and will be loaded as pandas dataframes
- # - Generally the raw data will be in a different location to the analysis
- # - The data can have arbitrary columns but some are required by the script, i.e. 'age', 'sex' and 'site', plus the phenotypes you wish to estimate (see below)
- # %%
- # where the raw data are stored
- data_dir = '<path-to-your>/data'
- # where the analysis takes place
- root_dir = '<path-to-your>/braincharts'
- out_dir = os.path.join(root_dir,'models','test')
- # create the output directory if it does not already exist
- os.makedirs(out_dir, exist_ok=True)
- # %% [markdown]
- # Now we load the data.
- #
- # We will load one pandas dataframe for the training set and one dataframe for the test set. We will also filter out low quality scans on the basis of the Freesurfer [Euler Characteristic](https://surfer.nmr.mgh.harvard.edu/fswiki/EulerNumber) (EC). This is a proxy for scan quality and is described in the publications below. Note that this requires the column 'avg_en' in the pandas dataframe, which is simply the average EC of left and right hemisphere.
- #
- # We also configrure a list of site ids
- #
- # **References**
- # - [Kia et al 2021](https://www.biorxiv.org/content/10.1101/2021.05.28.446120v1.abstract)
- # - [Rosen et al 2018](https://www.sciencedirect.com/science/article/abs/pii/S1053811917310832?via%3Dihub)
- # %%
- df_tr = pd.read_csv(os.path.join(data_dir,'lifespan_big_controls_tr_mqc.csv'), index_col=0)
- df_te = pd.read_csv(os.path.join(data_dir,'lifespan_big_controls_te_mqc.csv'), index_col=0)
- # remove some bad subjects
- df_tr, bad_sub = remove_bad_subjects(df_tr, df_tr)
- df_te, bad_sub = remove_bad_subjects(df_te, df_te)
- # extract a list of unique site ids from the training set
- site_ids = sorted(set(df_tr['site'].to_list()))
- # %% [markdown]
- # ### Configure which models to fit
- #
- # Next, we load the image derived phenotypes (IDPs) which we will process in this analysis. This is effectively just a list of columns in your dataframe. Here we estimate normative models for the left hemisphere, right hemisphere and cortical structures.
- # %%
- # load the idps to process
- with open(os.path.join(root_dir,'docs','phenotypes_ct_lh.txt')) as f:
- idp_ids_lh = f.read().splitlines()
- with open(os.path.join(root_dir,'docs','phenotypes_ct_rh.txt')) as f:
- idp_ids_rh = f.read().splitlines()
- with open(os.path.join(root_dir,'docs','phenotypes_sc.txt')) as f:
- idp_ids_sc = f.read().splitlines()
- # we choose here to process all idps
- idp_ids = idp_ids_lh + idp_ids_rh + idp_ids_sc
- # we could also just specify a list of IDPs
- #idp_ids = ['lh_MeanThickness_thickness', 'rh_MeanThickness_thickness']
- # %% [markdown]
- # ### Configure model parameters
- #
- # Now, we configure some parameters for the regression model we use to fit the normative model. Here we will use a 'warped' Bayesian linear regression model. To model non-Gaussianity, we select a sin arcsinh warp and to model non-linearity, we stick with the default value for the basis expansion (a cubic b-spline basis set with 5 knot points). Since we are sticking with the default value, we do not need to specify any parameters for this, but we do need to specify the limits. We choose to pad the input by a few years either side of the input range. We will also set a couple of options that control the estimation of the model
- #
- # For further details about the likelihood warping approach, see [Fraza et al 2021](https://www.biorxiv.org/content/10.1101/2021.04.05.438429v1).
- # %%
- # which data columns do we wish to use as covariates?
- cols_cov = ['age','sex']
- # which warping function to use? We can set this to None in order to fit a vanilla Gaussian noise model
- warp = 'WarpSinArcsinh'
- # limits for cubic B-spline basis
- xmin = -5
- xmax = 110
- # Do we want to force the model to be refit every time?
- force_refit = True
- # Absolute Z treshold above which a sample is considered to be an outlier (without fitting any model)
- outlier_thresh = 7
- # %% [markdown]
- # ### Fit the models
- #
- # Now we fit the models. This involves looping over the IDPs we have selected. We will use a module from PCNtoolkit to set up the design matrices, containing the covariates, fixed effects for site and nonlinear basis expansion.
- # %%
- for idp_num, idp in enumerate(idp_ids):
- print('Running IDP', idp_num, idp, ':')
- # set output dir
- idp_dir = os.path.join(out_dir, idp)
- os.makedirs(os.path.join(idp_dir), exist_ok=True)
- os.chdir(idp_dir)
- # extract the response variables for training and test set
- y_tr = df_tr[idp].to_numpy()
- y_te = df_te[idp].to_numpy()
- # remove gross outliers and implausible values
- yz_tr = (y_tr - np.mean(y_tr)) / np.std(y_tr)
- yz_te = (y_te - np.mean(y_te)) / np.std(y_te)
- nz_tr = np.bitwise_and(np.abs(yz_tr) < outlier_thresh, y_tr > 0)
- nz_te = np.bitwise_and(np.abs(yz_te) < outlier_thresh, y_te > 0)
- y_tr = y_tr[nz_tr]
- y_te = y_te[nz_te]
- # write out the response variables for training and test
- resp_file_tr = os.path.join(idp_dir, 'resp_tr.txt')
- resp_file_te = os.path.join(idp_dir, 'resp_te.txt')
- np.savetxt(resp_file_tr, y_tr)
- np.savetxt(resp_file_te, y_te)
- # configure the design matrix
- X_tr = create_design_matrix(df_tr[cols_cov].loc[nz_tr],
- site_ids = df_tr['site'].loc[nz_tr],
- basis = 'bspline',
- xmin = xmin,
- xmax = xmax)
- X_te = create_design_matrix(df_te[cols_cov].loc[nz_te],
- site_ids = df_te['site'].loc[nz_te],
- all_sites=site_ids,
- basis = 'bspline',
- xmin = xmin,
- xmax = xmax)
- # configure and save the covariates
- cov_file_tr = os.path.join(idp_dir, 'cov_bspline_tr.txt')
- cov_file_te = os.path.join(idp_dir, 'cov_bspline_te.txt')
- np.savetxt(cov_file_tr, X_tr)
- np.savetxt(cov_file_te, X_te)
- if not force_refit and os.path.exists(os.path.join(idp_dir, 'Models', 'NM_0_0_estimate.pkl')):
- print('Making predictions using a pre-existing model...')
- suffix = 'predict'
- # Make prdictsion with test data
- predict(cov_file_te,
- alg='blr',
- respfile=resp_file_te,
- model_path=os.path.join(idp_dir,'Models'),
- outputsuffix=suffix)
- else:
- print('Estimating the normative model...')
- estimate(cov_file_tr, resp_file_tr, testresp=resp_file_te,
- testcov=cov_file_te, alg='blr', optimizer = 'l-bfgs-b',
- savemodel=True, warp=warp, warp_reparam=True)
- suffix = 'estimate'
- # %% [markdown]
- # ### Compute error metrics
- #
- # In this section we compute the following error metrics for all IDPs (all evaluated on the test set):
- #
- # - Negative log likelihood (NLL)
- # - Explained variance (EV)
- # - Mean standardized log loss (MSLL)
- # - Bayesian information Criteria (BIC)
- # - Skew and Kurtosis of the Z-distribution
- # %%
- # initialise dataframe we will use to store quantitative metrics
- blr_metrics = pd.DataFrame(columns = ['eid', 'NLL', 'EV', 'MSLL', 'BIC','Skew','Kurtosis'])
- for idp_num, idp in enumerate(idp_ids):
- idp_dir = os.path.join(out_dir, idp)
- # load the predictions and true data. We use a custom function that ensures 2d arrays
- # equivalent to: y = np.loadtxt(filename); y = y[:, np.newaxis]
- yhat_te = load_2d(os.path.join(idp_dir, 'yhat_' + suffix + '.txt'))
- s2_te = load_2d(os.path.join(idp_dir, 'ys2_' + suffix + '.txt'))
- y_te = load_2d(os.path.join(idp_dir, 'resp_te.txt'))
- with open(os.path.join(idp_dir,'Models', 'NM_0_0_estimate.pkl'), 'rb') as handle:
- nm = pickle.load(handle)
- # compute error metrics
- if warp is None:
- metrics = evaluate(y_te, yhat_te)
- # compute MSLL manually as a sanity check
- y_tr_mean = np.array( [[np.mean(y_tr)]] )
- y_tr_var = np.array( [[np.var(y_tr)]] )
- MSLL = compute_MSLL(y_te, yhat_te, s2_te, y_tr_mean, y_tr_var)
- else:
- warp_param = nm.blr.hyp[1:nm.blr.warp.get_n_params()+1]
- W = nm.blr.warp
- # warp predictions
- med_te = W.warp_predictions(np.squeeze(yhat_te), np.squeeze(s2_te), warp_param)[0]
- med_te = med_te[:, np.newaxis]
- # evaluation metrics
- metrics = evaluate(y_te, med_te)
- # compute MSLL manually
- y_te_w = W.f(y_te, warp_param)
- y_tr_w = W.f(y_tr, warp_param)
- y_tr_mean = np.array( [[np.mean(y_tr_w)]] )
- y_tr_var = np.array( [[np.var(y_tr_w)]] )
- MSLL = compute_MSLL(y_te_w, yhat_te, s2_te, y_tr_mean, y_tr_var)
- Z = np.loadtxt(os.path.join(idp_dir, 'Z_' + suffix + '.txt'))
- [skew, sdskew, kurtosis, sdkurtosis, semean, sesd] = calibration_descriptives(Z)
- BIC = len(nm.blr.hyp) * np.log(y_tr.shape[0]) + 2 * nm.neg_log_lik
- blr_metrics.loc[len(blr_metrics)] = [idp, nm.neg_log_lik, metrics['EXPV'][0],
- MSLL[0], BIC, skew, kurtosis]
- display(blr_metrics)
- blr_metrics.to_pickle(os.path.join(out_dir,'blr_metrics.pkl'))
- # %%
- blr_metrics.to_csv(os.path.join(out_dir,'blr_metrics.csv'))
- # %%
fit_normative_models_ct.ipynb at commit 5a1a782, under GPL-3.0 · at the source
Overview
- Department of Psychiatry and Psychotherapy, LMU University Hospital, Ludwig-Maximilians-University Munich, Munich, Germany
- Donders Institute for Brain, Cognition, and Behavior, Radboud University, Nijmegen, the Netherlands
- Department of Cognitive Neuroscience, Radboud University Medical Center, Nijmegen, the Netherlands
- Max Planck School of Cognition, Leipzig, Germany
- NeuroImaging Core Unit Munich (NICUM), LMU University Hospital, Ludwig-Maximilians-University Munich, Munich, Germany
- Evidence-Based Psychiatry and Psychotherapy, Faculty of Medicine, University of Augsburg, Augsburg, Germany
- Max Planck Institute of Psychiatry, Munich, Germany
- International Max Planck Research School for Translational Psychiatry (IMPRS-TP), Munich, Germany
- Department of Psychiatry, Psychotherapy, and Psychosomatics, Medical Faculty, University of Augsburg, Bezirkskrankenhaus Augsburg, Augsburg, Germany
- Laboratory of Neuroscience (LIM27), Institute of Psychiatry, University of Sao Paulo, São Paulo, Brazil
- German Center for Mental Health (DZPG), partner site Munich-Augsburg, Munich, Germany
- Systems Lab, Department of Psychiatry, The University of Melbourne, Melbourne, VIC, Australia
Abstract
The abstract is not reproduced here: the paper's license (CC BY-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.
Repositories
Its files are read in the Code ↔ Paper reader above, with 6 matches between paragraphs and lines of code.
OSF etdvu
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
- 28 September 2026: the link answers (HTTP 200)
predictive-clinical-neuroscience/braincharts
5a1a7822e6f54405b0a826cf137d584240af307c, 30 June 2025Availability: 1 check, the latest on 28 September 2026: the link answers
- 28 September 2026: the link answers
11 files
- scripts/
apply_normative_models_c , Jupyter, 432 lines, 1 matcht.ipynb - scripts/
apply_normative_models_c , Python, 492 lines, 1 matcht.py - scripts/
apply_normative_models_s , Jupyter, 411 linesa.ipynb - scripts/
apply_normative_models_s , Jupyter, 455 linesmith10.ipynb - scripts/
apply_normative_models_y , Jupyter, 455 lineseo17.ipynb - scripts/
fit_normative_models_ct. , Jupyter, 249 lines, 2 matchesipynb - scripts/
fit_normative_models_yeo , Jupyter, 233 lines, 2 matches17.ipynb - scripts/
nm_utils.py , Python, 231 lines - scripts/
test_apply_normative_mod , Python, 5 linesels_ct.py - LICENSE, License, 674 lines
- README.md, Text, 69 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 9 scripts, each with its path and the digest of its content;
- 6 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Code and data availability statement
The paper has a code and data availability statement. Its license (CC BY-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- it points to the authors' code: predictive-clinical-neur
oscience/ , OSF etdvubraincharts - it says that the data are available on request
Read it in the paper: doi.org/10.64898/2026.03.31.26349848.
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
- Authors: added Johanna Spaeth (0009-0007-6550-0638); Vladislav Yakimov (0000-0001-9559-7492); Lukas Roell (0000-0002-0284-2290); removed Johanna Spaeth; Vladislav Yakimov; Lukas Roell
Version 1, 28 September 2026: the first record
Recorded: type, journal, dates, 20 authors, 1 funder, 88 references.
Cite
This paper
Spaeth, J., Fraza, C., Yilmaz, D., Deller, L., BrainTrain Working Group, CDP Working Group, Hasanaj, G., Kallweit, M., Korman, M., Boudriot, E., Yakimov, V., Moussiopoulou, J., Raabe, F. J., Wagner, E., Schmitt, A., Roeh, A., Falkai, P., Keeser, D., Maurus, I., & Roell, L. (2026). Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling. medRxiv (preprint). https://
BibTeX
@article{spaeth2026mappi
author = {Spaeth, Johanna and Fraza, Charlotte and Yilmaz, Deniz and Deller, Lena and {BrainTrain Working Group} and {CDP Working Group} and Hasanaj, Genc and Kallweit, Marcel and Korman, Maxim and Boudriot, Emanuel and Yakimov, Vladislav and Moussiopoulou, Joanna and Raabe, Florian J. and Wagner, Elias and Schmitt, Andrea and Roeh, Astrid and Falkai, Peter and Keeser, Daniel and Maurus, Isabel and Roell, Lukas},
title = {{Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling}},
journal = {medRxiv (preprint)},
year = {2026},
month = apr,
publisher = {medRxiv},
doi = {10.64898/
url = {https://
}
RIS
TY - JOUR
AU - Spaeth, Johanna
AU - Fraza, Charlotte
AU - Yilmaz, Deniz
AU - Deller, Lena
AU - BrainTrain Working Group
AU - CDP Working Group
AU - Hasanaj, Genc
AU - Kallweit, Marcel
AU - Korman, Maxim
AU - Boudriot, Emanuel
AU - Yakimov, Vladislav
AU - Moussiopoulou, Joanna
AU - Raabe, Florian J.
AU - Wagner, Elias
AU - Schmitt, Andrea
AU - Roeh, Astrid
AU - Falkai, Peter
AU - Keeser, Daniel
AU - Maurus, Isabel
AU - Roell, Lukas
TI - Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling
T2 - medRxiv (preprint)
J2 - medRxiv
PY - 2026
DA - 2026/
PB - medRxiv
DO - 10.64898/
UR - https://
ER -
CSL-JSON
{
"id": "10.64898/
"type": "article",
"title": "Mapping Individual Neuroanatomical Alterations to Schizophrenia Psychopathology with Normative Modeling",
"container-title": "medRxiv (preprint)",
"author": [
{
"family": "Spaeth",
"given": "Johanna"
},
{
"family": "Fraza",
"given": "Charlotte"
},
{
"family": "Yilmaz",
"given": "Deniz"
},
{
"family": "Deller",
"given": "Lena"
},
{
"literal": "BrainTrain Working Group"
},
{
"literal": "CDP Working Group"
},
{
"family": "Hasanaj",
"given": "Genc"
},
{
"family": "Kallweit",
"given": "Marcel"
},
{
"family": "Korman",
"given": "Maxim"
},
{
"family": "Boudriot",
"given": "Emanuel"
},
{
"family": "Yakimov",
"given": "Vladislav"
},
{
"family": "Moussiopoulou",
"given": "Joanna"
},
{
"family": "Raabe",
"given": "Florian J."
},
{
"family": "Wagner",
"given": "Elias"
},
{
"family": "Schmitt",
"given": "Andrea"
},
{
"family": "Roeh",
"given": "Astrid"
},
{
"family": "Falkai",
"given": "Peter"
},
{
"family": "Keeser",
"given": "Daniel"
},
{
"family": "Maurus",
"given": "Isabel"
},
{
"family": "Roell",
"given": "Lukas"
}
],
"container-title-short":
"DOI": "10.64898/
"publisher": "medRxiv",
"URL": "https://
"issued": {
"date-parts": [
[
2026,
4,
1
]
]
}
}
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.1162/imag.a.1269 [code]
- From early to contemporary normative modeling: Mapping individual differences in neurophysiological signals.Journal: Imaging neuroscience (Cambridge, Mass.)In common: FreeSurfer, seaborn, pandas, 2 other tools, computational, 15 references
- [2] doi:10.1073/pnas.2521055123 [code]
- Empirical validation of race-neutral normative brain morphometry models across ethnoracially diverse populations.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: FreeSurfer, pandas, NumPy, computational, structural MRI / diffusion, 6 references, author Daniel Keeser
- [3] doi:10.1038/s41467-026-72875-x [code]
- Lifespan normative modeling of brain microstructure.Journal: Nature communicationsIn common: seaborn, pandas, Matplotlib, 1 other tool, schizophrenia / psychosis, structural MRI / diffusion, 9 references
- [4] doi:10.1038/s41593-026-02359-0 [code]
- The cross-site reproducibility of MRI morphometric phenotypes in psychiatric disorders.Journal: Nature neuroscienceIn common: FreeSurfer, pandas, Matplotlib, 1 other tool, schizophrenia / psychosis, structural MRI / diffusion, 7 references
- [5] doi:10.64898/2026.08.13.26360304 [code]
- Lifespan brain structural variation reveals shared organization across mental health conditionsJournal: medRxiv (preprint)In common: seaborn, pandas, Matplotlib, 1 other tool, 7 references
- [6] doi:10.1371/journal.pbio.3003856 [code]
- Aging and metabolism contribute separately to brain-body health.Journal: PLoS biologyIn common: FreeSurfer, seaborn, pandas, 2 other tools, structural MRI / diffusion, 4 references
- [7] doi:10.1038/s41398-026-03902-0 [code]
- Mapping heterogeneous brain structural subtypes in alzheimer's disease and mild cognitive impairment using normative models.Journal: Translational psychiatryIn common: seaborn, pandas, Matplotlib, 1 other tool, structural MRI / diffusion, 5 references
- [8] doi:10.1371/journal.pmed.1004809 [code]
- Brain morphology in Anorexia Nervosa and its subtypes: A multi-cohort study of individual participant data.Journal: PLoS medicineIn common: seaborn, pandas, Matplotlib, 1 other tool, structural MRI / diffusion, 4 references
- [9] doi:10.1038/s41467-026-75585-6 [code]
- Brain network dynamics reflect psychiatric illness status and transdiagnostic symptom profiles across health and disease.Journal: Nature communicationsIn common: seaborn, pandas, Matplotlib, 1 other tool, schizophrenia / psychosis, 4 references
- [10] doi:10.1038/s41467-026-71555-0 [code]
- A deep representation learning model to predict response to vagus nerve stimulation.Journal: Nature communicationsIn common: FreeSurfer, seaborn, pandas, 2 other tools, structural MRI / diffusion, 4 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: 2 repositories of the authors' code, each at its verified commit and with its license, 9 scripts, and 6 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:773de5916191b689…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
