Neural signatures of model-based and model-free reinforcement learning across prefrontal cortex and striatum.
The 7 matches
- [1] § Materials and methods › Decoding analysis ↔ Fig7. ExploreExploit.py, lines 26–171 · score 0.82 · cross validation, sklearn.svm.LinearSVC, scikit-learn, folds, stratified, selection
- [2] § Materials and methods › Population-level encoding ↔ Maths.py, lines 72–141 · score 0.72 · reduced model, full model, design matrix, SSE, variance, squared
- [3] § Materials and methods › Decoding analysis ↔ Fig6. Choice encoding.py, lines 71–141 · score 0.72 · cross validation, scikit-learn, folds, stratified, sklearn, selection
- [4] § Results › ACC and caudate encoded MB value estimates ↔ Fig4. Qvalue Coding.py, lines 101–136 · score 0.62 · PicA, PicB, peak CPD, MF, MB, Figure 4
- [5] § Results › Explore/exploit strategy modulates encoding of first-stage choice ↔ Fig7. ExploreExploit.py, lines 26–171 · score 0.58 · consecutive high rewards, medium rewards, exploit, decoder, split, permutations
- [6] § Results › ACC and caudate encoded MB value estimates ↔ Fig4. Qvalue Coding.py, lines 101–136 · score 0.58 · PicA, PicB, peak CPD, population, MF, MB
- [7] § Results › Caudate value estimates remapped following a rare transition ↔ ImportData.py, lines 240–334 · score 0.55 · unchosen option, hybrid, models, behaviour, transition, encoding
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 331 lines · 13 KB · MIT · 2 matches
- import os
- import sys
- import inspect
- import numpy as np
- import sklearn.model_selection
- import sklearn.svm
- import matplotlib.pyplot as plt
- import matplotlib
- import time
- import Details as D
- import ImportData
- import Plot
- import Maths
- # Configuration
- N_SPLITS = 5
- N_REPEATS = 1
- N_SAMPLES = 20
- RESOLUTION = 1 # Take every nth time point
- RANDOM_SEED = 0 # Seed for reproducibility
- # Set random seed for reproducibility
- np.random.seed(RANDOM_SEED)
- class NeuralDecoder:
- """Handles neural decoding analysis for explore/exploit conditions."""
- def __init__(self, n_splits=N_SPLITS, n_repeats=N_REPEATS):
- self.decoder = sklearn.svm.LinearSVC(max_iter=25000)
- self.n_splits = n_splits
- self.n_repeats = n_repeats
- def prepare_data(self, data, task_variable, resolution=RESOLUTION):
- """
- Prepare neural and behavioral data for decoding.
- Args:
- data: ImportData object containing neural recordings
- task_variable: String indicating which behavioral variable to decode ('c1dir' or 'c1chosen')
- resolution: Temporal resolution (take every nth time point)
- Returns:
- neural_data_all: List of neural responses per cell
- labels_all: List of behavioral labels per cell
- high_reward_masks: List of boolean masks for high reward trials
- low_reward_masks: List of boolean masks for low/medium reward trials
- min_trials: Minimum number of trials per condition
- """
- min_trials = 10000
- neural_data_all = []
- labels_all = []
- high_reward_masks = []
- low_reward_masks = []
- for cell_idx in range(data.n):
- trial_data = data.behavdata[cell_idx]
- # Define high reward (2 consecutive high rewards) and low reward conditions
- high_reward_mask = (trial_data.previousreward == 2) & (trial_data.previouspreviousreward == 2)
- low_reward_mask = (trial_data.previousreward != 2) & (trial_data.previouspreviousreward != 2)
- # Get neural responses and task labels
- neural_response = data.generate_epoch_norm(cell_idx, D.sc_choice1made)
- neural_response = neural_response[:, ::resolution]
- if task_variable == 'c1dir':
- labels = trial_data.c1dir
- elif task_variable == 'c1chosen':
- labels = trial_data.c1chosen
- else:
- raise ValueError(f"Unknown task variable: {task_variable}")
- # Calculate minimum trials per condition
- high_min = min([np.sum(labels[high_reward_mask] == label)
- for label in np.unique(labels)])
- low_min = min([np.sum(labels[low_reward_mask] == label)
- for label in np.unique(labels)])
- cell_min_trials = min(high_min, low_min)
- if cell_min_trials < min_trials:
- min_trials = cell_min_trials
- neural_data_all.append(neural_response)
- labels_all.append(labels)
- high_reward_masks.append(high_reward_mask)
- low_reward_masks.append(low_reward_mask)
- return neural_data_all, labels_all, high_reward_masks, low_reward_masks, min_trials
- def run_cross_validated_decoding(self, data, neural_data_all, labels_all,
- high_reward_masks, low_reward_masks,
- min_trials, n_samples=N_SAMPLES):
- """
- Run cross-validated decoding for multiple random samples.
- Args:
- data: ImportData object
- neural_data_all: List of neural responses
- labels_all: List of behavioral labels
- high_reward_masks: List of high reward trial masks
- low_reward_masks: List of low reward trial masks
- min_trials: Minimum trials to use per condition
- n_samples: Number of random samples to run
- Returns:
- high_reward_accuracy: Accuracy for high reward (exploit) trials
- low_reward_accuracy: Accuracy for low reward (explore) trials
- """
- n_timepoints = data.numTimepoints // RESOLUTION
- n_unique_labels = len(np.unique(labels_all[0]))
- high_reward_accuracy = np.empty((n_timepoints, n_samples))
- low_reward_accuracy = np.empty((n_timepoints, n_samples))
- for sample_idx in range(n_samples):
- cv_splitter = sklearn.model_selection.RepeatedStratifiedKFold(
- n_splits=self.n_splits,
- n_repeats=self.n_repeats,
- random_state=sample_idx
- )
- print(f' Sample {sample_idx + 1}/{n_samples}')
- # Prepare population data
- high_reward_pop = np.empty((data.n, n_unique_labels, min_trials, n_timepoints))
- low_reward_pop = np.empty((data.n, n_unique_labels, min_trials, n_timepoints))
- label_array = np.empty((data.n, n_unique_labels, min_trials))
- for cell_idx in range(data.n):
- high_mask = high_reward_masks[cell_idx]
- low_mask = low_reward_masks[cell_idx]
- for condition_mask, population_array in [(high_mask, high_reward_pop),
- (low_mask, low_reward_pop)]:
- neural_response = neural_data_all[cell_idx][condition_mask]
- labels = labels_all[cell_idx][condition_mask]
- for label_idx, label_value in enumerate(np.unique(labels)):
- # Randomly sample trials for this label
- matching_trials = neural_response[labels == label_value]
- # Use deterministic random seed based on sample index
- rng = np.random.RandomState(RANDOM_SEED + sample_idx)
- random_indices = rng.permutation(len(matching_trials))[:min_trials]
- population_array[cell_idx, label_idx] = matching_trials[random_indices]
- label_array[cell_idx, label_idx] = label_idx
- # Reshape for decoding
- labels_flat = label_array.reshape(data.n, -1)[0, :]
- high_reward_pop = high_reward_pop.reshape(data.n, -1, n_timepoints)
- low_reward_pop = low_reward_pop.reshape(data.n, -1, n_timepoints)
- # Decode at each timepoint
- for time_idx in range(n_timepoints):
- high_features = high_reward_pop[..., time_idx].T
- low_features = low_reward_pop[..., time_idx].T
- high_scores = sklearn.model_selection.cross_val_score(
- self.decoder, high_features, labels_flat,
- cv=cv_splitter, n_jobs=D.n_cores
- )
- low_scores = sklearn.model_selection.cross_val_score(
- self.decoder, low_features, labels_flat,
- cv=cv_splitter, n_jobs=D.n_cores
- )
- high_reward_accuracy[time_idx, sample_idx] = np.mean(high_scores)
- low_reward_accuracy[time_idx, sample_idx] = np.mean(low_scores)
- return high_reward_accuracy, low_reward_accuracy
- def plot_results(explore_accuracy, exploit_accuracy, data):
- # Plot configuration
- matplotlib.rc('xtick', labelsize=12)
- matplotlib.rc('ytick', labelsize=12)
- fig = plt.figure(figsize=(13.2, 8.8), dpi=200)
- height_ratios = [1, 0.5, 1, 0.2, 1]
- width_ratios = [1, 0.2, 1, 0.3, 1]
- gs = plt.GridSpec(len(height_ratios), len(width_ratios),
- height_ratios=height_ratios, width_ratios=width_ratios,
- hspace=0, wspace=0)
- # Create axes
- axes = [None, None, None,
- fig.add_subplot(gs[2, 0]), fig.add_subplot(gs[2, 2]), fig.add_subplot(gs[2, 4]),
- fig.add_subplot(gs[4, 0]), fig.add_subplot(gs[4, 2]), fig.add_subplot(gs[4, 4])]
- # Format axes
- for ax in axes[3:]:
- Plot.set_xlim(data, ax, -600, 600, offset=-600, res=300)
- ax.spines['right'].set_visible(False)
- ax.spines['top'].set_visible(False)
- ax.axvline(60, ls='--', c='k', lw=0.5, zorder=-1)
- for ax in axes[6:]:
- ax.set_xlabel('Time (ms) post choice 1', fontsize=13)
- # Add panel letters
- Plot.let(axes[3], 0, -0.15, 1.15, fontsize=14)
- Plot.let(axes[4], 1, -0.125, 1.15, fontsize=14)
- Plot.let(axes[5], 2, -0.15, 1.15, fontsize=14)
- Plot.let(axes[6], 3, -0.125, fontsize=14)
- Plot.let(axes[7], 4, -0.125, fontsize=14)
- Plot.let(axes[8], 5, -0.15, fontsize=14)
- # Plot data for each brain area
- for area_idx, area_name in enumerate(D.areas[1:]):
- color = f'C{area_idx}'
- # CUE IDENTITY: Explore (Panel A)
- explore_cue = explore_accuracy['cue'][area_idx].T * 100
- avg, sem = Plot.AvgSem(explore_cue, axes[4], label=area_name,
- showleg=False, c=color, lw=2.5)
- # CUE IDENTITY: Exploit (Panel B)
- exploit_cue = exploit_accuracy['cue'][area_idx].T * 100
- avg_exploit, sem_exploit = Plot.AvgSem(exploit_cue, axes[3], label=area_name,
- showleg=False, c=color, lw=2.5)
- # CUE IDENTITY: Difference (Panel C)
- difference_cue = exploit_cue - explore_cue
- avg_diff, sem_diff = Plot.AvgSem(difference_cue, axes[5], label=area_name,
- showleg=False, c=color, lw=2.5)
- # DIRECTION: Explore (Panel D)
- explore_dir = explore_accuracy['direction'][area_idx].T * 100
- avg_dir_explore, _ = Plot.AvgSem(explore_dir, axes[7], label=area_name,
- showleg=False, c=color, lw=2.5)
- # DIRECTION: Exploit (Panel E)
- exploit_dir = exploit_accuracy['direction'][area_idx].T * 100
- avg_dir_exploit, _ = Plot.AvgSem(exploit_dir, axes[6], label=area_name,
- showleg=False, c=color, lw=2.5)
- # DIRECTION: Difference (Panel F)
- difference_dir = exploit_dir - explore_dir
- avg_diff_dir, sem_diff_dir = Plot.AvgSem(difference_dir, axes[8], label=area_name,
- showleg=False, c=color, lw=2.5)
- # Format cue identity panels (top row)
- axes[3].axhline(50, color='gray', zorder=0, lw=0.5)
- axes[4].axhline(50, color='gray', zorder=0, lw=0.5)
- axes[3].set_ylabel('Accuracy (%)', fontsize=13)
- axes[3].set_ylim(40, 100)
- axes[4].set_ylim(40, 100)
- axes[5].set_ylabel('Difference', fontsize=13)
- axes[5].set_ylim(-20, 40)
- axes[5].axhline(0, lw=0.5, c='gray', zorder=-1)
- axes[3].set_title("Exploit (after 2 high rewards)")
- axes[4].set_title("Explore (after 2 low/med. rewards)")
- axes[5].set_title("Explore - Exploit")
- axes[3].text(2, 85, 'Cue\nchosen', fontsize=12,
- horizontalalignment='left', verticalalignment='center')
- # Format direction panels (bottom row)
- axes[6].axhline(33, color='gray', zorder=0, lw=0.5)
- axes[7].axhline(33, color='gray', zorder=0, lw=0.5)
- axes[6].set_ylabel('Accuracy (%)', fontsize=13)
- axes[6].set_ylim(25, 90)
- axes[7].set_ylim(25, 90)
- axes[8].set_ylabel('Difference', fontsize=13)
- axes[8].set_ylim(-20, 40)
- axes[8].axhline(0, lw=0.5, c='gray', zorder=-1)
- axes[6].text(2, 70, 'Direction\nchosen', fontsize=12,
- horizontalalignment='left', verticalalignment='center')
- axes[6].legend(loc='lower left', bbox_to_anchor=[0, 1.15], ncol=4)
- plt.show()
- def main():
- decoder = NeuralDecoder()
- # Storage for results
- explore_accuracy = {'direction': [], 'cue': []}
- exploit_accuracy = {'direction': [], 'cue': []}
- # Analyze each brain area
- for area_idx, area_name in enumerate(D.areas[1:]):
- print(f"Processing area: {area_name}")
- data = ImportData.EntireArea(area_name, 600, 600)
- # DIRECTION DECODING
- print("\nDirection decoding:")
- start_time = time.time()
- neural_data, labels, high_masks, low_masks, min_trials = decoder.prepare_data(
- data, 'c1dir', RESOLUTION
- )
- exploit_dir, explore_dir = decoder.run_cross_validated_decoding(
- data, neural_data, labels, high_masks, low_masks, min_trials, N_SAMPLES
- )
- print(f"Completed in {time.time() - start_time:.1f} seconds")
- # CUE IDENTITY DECODING
- print("\nCue identity decoding:")
- start_time = time.time()
- neural_data, labels, high_masks, low_masks, min_trials = decoder.prepare_data(
- data, 'c1chosen', RESOLUTION
- )
- exploit_cue, explore_cue = decoder.run_cross_validated_decoding(
- data, neural_data, labels, high_masks, low_masks, min_trials, N_SAMPLES
- )
- print(f"Completed in {time.time() - start_time:.1f} seconds")
- # Store results
- explore_accuracy['direction'].append(explore_dir)
- exploit_accuracy['direction'].append(exploit_dir)
- explore_accuracy['cue'].append(explore_cue)
- exploit_accuracy['cue'].append(exploit_cue)
- # Convert to arrays
- for key in explore_accuracy:
- explore_accuracy[key] = np.array(explore_accuracy[key])
- exploit_accuracy[key] = np.array(exploit_accuracy[key])
- data = ImportData.EntireArea('ACC', 600, 600)
- plot_results(explore_accuracy, exploit_accuracy, data)
- if __name__ == '__main__':
- main()
Fig7. ExploreExploit.py at commit ef32a40, under MIT · at the source
Overview
- Institute of Neurology, Department of Clinical and Movement Neurosciences, University College London London United Kingdom
- Instituto de Fisiologia, Faculdade de Medicina, Universidade de Lisboa Lisbon Portugal
- Department of Experimental Psychology, University of Oxford Oxford United Kingdom
- Wellcome Centre for Integrative Neuroimaging, University of Oxford, FMRIB, John Radcliffe Hospital Oxford United Kingdom
- Sainsbury Wellcome Centre for Neural Circuits and Behaviour College, University College London London United Kingdom
- Max Planck Institute for Biological Cybernetics Tübingen Germany
- University of Tübingen Tübingen Germany
Abstract
Animals integrate knowledge about how the state of the environment evolves to choose actions that maximise reward. Such goal-directed behaviour – or model-based (MB) reinforcement learning (RL) – can flexibly adapt choice to changes, being thus distinct from simpler habitual – or model-free (MF) RL – strategies. Previous inactivation and neuroimaging work implicates prefrontal cortex (PFC) and the caudate striatal region in MB-RL; however, details are scarce about its implementation at the single-neuron level. Here, we recorded from two PFC regions – the dorsal anterior cingulate cortex (ACC) and dorsolateral PFC (DLPFC), and two striatal regions, caudate and putamen – while two rhesus macaques performed a sequential decision-making (two-step) task in which MB-RL involves knowledge about the statistics of reward and state transitions. All four regions, but particularly the ACC, encoded the rewards received and tracked the probabilistic state transitions that occurred. However, ACC (and to a lesser extent caudate) encoded the key variables of the task – namely the interaction between reward, transition, and choice – which underlies MB decision-making. ACC and caudate neurons also encoded MB-derived estimates of choice values. Moreover, caudate value estimates of the choice options flipped when a rare transition occurred, demonstrating value update based on structural knowledge of the task. The striatal regions were unique (relative to PFC) in encoding the current and previous rewards with opposing polarities, reminiscent of dopaminergic neurons, and indicative of an MF prediction error. Our findings provide a deeper understanding of selective and temporally dissociable neural mechanisms underlying goal-directed behaviour.
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 7 matches between paragraphs and lines of code.
jamesbutler01/TwoStepExperiment
ef32a40742af500dd55584218007d8f515d6c107, 13 June 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
12 files
- Details.py, Python, 69 lines
- Fig2. Reward Coding.py, Python, 285 lines
- Fig3. Transition Coding.py, Python, 216 lines
- Fig4. Qvalue Coding.py, Python, 183 lines, 2 matches
- Fig5. Rare vs Common.py, Python, 141 lines
- Fig6. Choice encoding.py, Python, 288 lines, 1 match
- Fig7. ExploreExploit.py, Python, 331 lines, 2 matches
- ImportData.py, Python, 404 lines, 1 match
- Maths.py, Python, 141 lines, 1 match
- Plot.py, Python, 164 lines
- LICENSE, License, 21 lines
- README.md, Text, 22 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:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 10 scripts, each with its path and the digest of its content;
- 7 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.
Data availability
All data and code to reproduce figures are available at https://
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, 27 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 6 authors, 6 keywords, 10 MeSH terms, 10 funders, 70 references.
Cite
This paper
Miranda, B., Butler, J. L., Malalasekera, W. N., Behrens, T. E., Dayan, P., & Kennerley, S. W. (2026). Neural signatures of model-based and model-free reinforcement learning across prefrontal cortex and striatum. eLife, 14, RP106032. https://
BibTeX
@article{miranda2026neur
author = {Miranda, Bruno and Butler, James L and Malalasekera, WM Nishantha and Behrens, Timothy EJ and Dayan, Peter and Kennerley, Steven W},
title = {{Neural signatures of model-based and model-free reinforcement learning across prefrontal cortex and striatum}},
journal = {eLife},
year = {2026},
month = jun,
volume = {14},
pages = {RP106032},
publisher = {eLife Sciences Publications, Ltd},
issn = {2050-084X},
doi = {10.7554/
url = {https://
pmid = {42329682},
pmcid = {PMC13286570}
}
RIS
TY - JOUR
AU - Miranda, Bruno
AU - Butler, James L
AU - Malalasekera, WM Nishantha
AU - Behrens, Timothy EJ
AU - Dayan, Peter
AU - Kennerley, Steven W
TI - Neural signatures of model-based and model-free reinforcement learning across prefrontal cortex and striatum
T2 - eLife
J2 - eLife
PY - 2026
DA - 2026/
VL - 14
SP - RP106032
SN - 2050-084X
PB - eLife Sciences Publications, Ltd
DO - 10.7554/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.7554/
"type": "article-journal",
"title": "Neural signatures of model-based and model-free reinforcement learning across prefrontal cortex and striatum",
"container-title": "eLife",
"author": [
{
"family": "Miranda",
"given": "Bruno"
},
{
"family": "Butler",
"given": "James L"
},
{
"family": "Malalasekera",
"given": "WM Nishantha"
},
{
"family": "Behrens",
"given": "Timothy EJ"
},
{
"family": "Dayan",
"given": "Peter"
},
{
"family": "Kennerley",
"given": "Steven W"
}
],
"container-title-short":
"volume": "14",
"page": "RP106032",
"DOI": "10.7554/
"PMID": "42329682",
"PMCID": "PMC13286570",
"ISSN": "2050-084X",
"publisher": "eLife Sciences Publications, Ltd",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
22
]
]
}
}
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.1016/j.celrep.2026.117454 [code]
- Model-based and model-free valuation signals in the human brain vary markedly in relation to individual differences in behavioral control.Journal: Cell reportsIn common: pandas, Matplotlib, NumPy, cognitive, 11 references
- [2] doi:10.1111/ejn.70641
- Distinct High-Gamma Signals in Primate Prefrontal Cortex Differentiate Cue Information, Preference Revision, and Expected Reward During Value-Based Decisions.Journal: The European journal of neuroscienceIn common: non-human primate, cognitive, 6 references, author Steven W Kennerley
- [3] doi:10.1038/s41467-026-75706-1 [code]
- Dissociable roles of prefrontal plasticity in decision-making strategy and execution of habitual behavior.Journal: Nature communicationsIn common: scikit-learn, pandas, SciPy, 2 other tools, cognitive, 6 references
- [4] doi:10.1038/s41467-026-74783-6 [code]
- Neural and computational correlates of strategic aborting and long-run policy optimization in the dorsolateral prefrontal cortex.Journal: Nature communicationsIn common: scikit-learn, pandas, SciPy, 2 other tools, non-human primate, 5 references
- [5] doi:10.7554/elife.105774 [code]
- Anterior cingulate cortex monitors action state and action content in complex associative learning.Journal: eLifeIn common: cognitive, 6 references
- [6] doi:10.1371/journal.pbio.3003829 [code]
- Identity-specific reward expectations in orbitofrontal cortex guide goal-directed choices.Journal: PLoS biologyIn common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 3 references
- [7] doi:10.1126/sciadv.aeb3005 [code]
- Neural competition between prefrontal and auditory cortex constrains novel sound strategy learning.Journal: Science advancesIn common: 6 references
- [8] doi:10.7554/elife.108023 [code]
- Challenges in replay detection by TDLM in post-encoding resting state.Journal: eLifeIn common: statsmodels, scikit-learn, pandas, 3 other tools, 2 references
- [9] doi:10.1093/nc/niag029 [code]
- A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.Journal: Neuroscience of consciousnessIn common: scikit-image, statsmodels, scikit-learn, 4 other tools, cognitive, 1 reference
- [10] doi:10.1162/netn.a.544 [code]
- Brain network reconfiguration during reward prediction error processing.Journal: Network neuroscience (Cambridge, Mass.)In common: statsmodels, scikit-learn, pandas, 3 other tools, cognitive, 2 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, 10 scripts, and 7 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:487cebb333926266…
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.
