Statistics of cortical representational drift can enable robust readout.
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 · 334 lines · 18 KB · no license
- # %% [markdown]
- # # Comparing sudden and gradual models of drift in a simple toy model
- #
- # This notebook steps through generating the figures from _Statistics of cortical representational drift can enable robust readout_ (Micou & O'Leary).
- # This notebook is primarily concerned with reproducibility--the paper provides a more comprehensive explanation of the model.
- #
- # The model itself is implemented within the files in this repository, which we import below to plot the key figures.
- # %%
- # Import the high-level plotting for this notebook (which internally call out to the model)
- from drift_model.model_overview import make_ratemaps, make_correlation_vs_parameter_difference, make_example_pdfs, make_correlation_vs_parameter_scatter, plot_noise_free_correlation_difference, plot_residual_distribution
- from drift_model.drift_equivalence import make_drift_equivalence, get_params_for_drift_rate, plot_drift_equivalence, plot_multiple_drift_equivalences, plot_approach_to_chance
- from drift_model.adaptive_decoding import simulate_over_time, plot_decoder_error_against_time, simulate_over_population_sizes_and_drift_rates, plot_decoder_error_vs_parameters, simulate_over_noise_levels, plot_error_against_noise_level
- from drift_model.scaled_correlation_changes import plot_drift_in_scaled_comparison, plot_gmm_fits, fit_gmms_over_drift_rates, plot_mu2_values
- # Import additional utilities for the notebook
- import numpy as np
- import os
- %matplotlib inline
- # Make a directory to save .svg versions of the figures
- OUTPUT_FOLDER = 'out'
- if not os.path.exists(OUTPUT_FOLDER):
- os.mkdir(OUTPUT_FOLDER)
- # %% [markdown]
- # ## Encoding of a stimulus in the population
- #
- # Some neuron $i$ in the population is exposed to a stimulus $s$ and produces a response $x_i$ that depends on its tuning parameter $θ_i$ and some random perturbation parameterised by the noise level $σ$. The stimulus has both a magnitude and an orientation.
- # The parameter $θ_i$ describes the orientation of maximum response for each neuron.
- # Taking $M$ samples of the stimulus, we can visualise the how each neuron responds to the stimulus by plotting a ratemap (its mean response at each combination of stimulus magnitude and orientation).
- # This plot is used in Figure 2.b in the paper.
- # %%
- # Reproduce the heatmaps for Fig. 2b
- example_neuron_tuning_parameters = np.array([0, np.pi/4, -np.pi*2/3])
- noise_sigma = 1.0
- num_samples_M = 10000
- make_ratemaps(example_neuron_tuning_parameters, noise_sigma, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_2b')
- # %% [markdown]
- # ## Pairwise correlation of neurons
- # If we take a pair of neurons and measure the correlation of their activities over the course of $M$ samples, we find that neurons with more similar values of $θ$ are more highly correlated with each other. However, due to the observation noise and the finite number of samples, the correlation between a pair of neurons at some angular separation $\Deltaθ$ between their preferred firing orientations is a probability distribution. We visualise this below.
- # This plot is used in Figure 2.c in the paper.
- # %%
- # Reproduce the pairwise correlations between neurons at some separation Δθ for Fig. 2c
- noise_sigma = 1.0
- num_samples_M = 10000
- num_points = 101
- samples_per_point = 20000
- make_correlation_vs_parameter_difference(num_points, samples_per_point, noise_sigma, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_2c')
- # %% [markdown]
- # ## Sudden and gradual drift
- #
- # We consider two models of drift. Gradual drift (parameterised by $\rho$) makes alterations to all neuron tuning parameters in the population drawn from a Gaussian distribution, while sudden drift (parameterised by $\alpha$) selects a subset of the population and retunes them drawing from a uniform distribution.
- # We show probability distributions that describe the distribution of relative change of tuning parameter from one day to the next for both of these types of drift. This plot is used in Figure 3.b in the paper.
- #
- # Note that using a big value of $\rho$ will cause the tuning parameter to 'wrap around' the unit circle. You can play with visualising that here by increasing the value of $\rho$. For the drift rate of 0.1, which is what we show in most of Figure 3, the value of $\rho$ is just below 0.75, and this wrapping around is entirely negligible.
- # The largest value of $\rho$ we use anywhere in the paper is 1.1 (for the very fast drift rate of 0.2 in Figure 3.g), and at this point the wrapping around is just about noticeable, so pushing the adaptive decoder to even faster rates of drift risks unfairly disadvantaging the gradual drift model.
- # %%
- # Reproduce the PDFs of each drift type from Fig. 3b
- alpha = 0.25
- rho = 0.75
- make_example_pdfs(alpha, rho, save_fig=f'{OUTPUT_FOLDER}/fig_3b')
- # %% [markdown]
- # ## Drift rate equivalence
- #
- # We define the drift rate of a population to be the number of days of drift it takes to scramble a population to within an $\epsilon$ of a completely randomised population. We use this to construct an equivalence between the gradual and sudden drift types. This plot is used in Figure 3.c of the paper.
- # %%
- # Reproduce the equivalence between drift types from Fig. 3c
- # Generate the equivalence
- num_equivalence_samples = 500
- num_simulations_per_sample = 1000000
- equivalence_mapping = make_drift_equivalence(num_samples=num_equivalence_samples,
- epsilon=0.05,
- num_simulations=num_simulations_per_sample)
- # Show an example of extracting a single alpha and rho for a given drift rate
- target_drift_rate = 0.1
- actual_drift_rate, alpha, rho = get_params_for_drift_rate(target_drift_rate, equivalence_mapping)
- print(f"Drift rate={actual_drift_rate}, α={alpha}, ρ={rho}")
- # Plot the entire equivalence
- plot_drift_equivalence(equivalence_mapping, save_fig=f'{OUTPUT_FOLDER}/fig_3c')
- # %% [markdown]
- # ## Adaptive decoding works best for sudden drift
- #
- # We use an adaptive decoder to attempt to track the changing tuning parameters of neurons in the population as they undergo drift.
- # We find that this adaptive decoding strategy works better with the sudden drift model than for the gradual drift model at equivalent rates of drift. This code reproduces Figure 3.f from the paper.
- #
- # Note: the adaptive decoder relies on minimising a cost function. This estimates the parameter on some day $T$ based on some prior belief of the estimate on day $T-1$. If the adaptive decoder diverges sufficiently from the ground truth, as in the case of the gradual drift simulations below, then the estimates on $T-1$ can become poor and occasionally result in the solver not neatly converging. This isn't a problem if it takes place after the estimate is already poor, but would be a methodological issue if it took place early on (after just a day or two of drift). The code below will surface any solver warnings that occur before the 5th day of drift (and silence them afterwards to keep this notebook clean, but in general this warning threshold can be increased to the whole 50 days and still generate very few warning messages over all 100 simulations).
- # %%
- # Reproduce the adaptive decoding over time in Fig. 3f
- num_simulations = 100
- days_to_simulate = 51
- num_neurons = 100
- noise_sigma = 1.0
- num_samples_M = 10000
- drift_rate = 0.1
- _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
- # Convergence warning threshold: this will report any solver convergence failures that occur before the configured day, and ignore any after
- # (see note above: as the estimates from adapting to gradual drift diverge from the truth solving eventually becomes ill-condiditioned)
- solver_warning_cutoff_day = 5
- sim_results = simulate_over_time(alpha,
- rho,
- num_neurons,
- days_to_simulate,
- num_samples_M,
- noise_sigma,
- num_simulations,
- solver_warning_cutoff_day)
- plot_decoder_error_against_time(sim_results, save_fig=f'{OUTPUT_FOLDER}/fig_3f')
- # %% [markdown]
- # ## Sudden drift retains its advantage across drift rates and population sizes
- # We can explore the parameter space of population sizes and of drift rates to confirm that sudden drift maintains an advantage over gradual drift and that our observations are not sensitive to these choices of parameter.
- # This plot is used in Figure 3.g of the paper.
- # %%
- # Reproduce the adaptive decoding over a range of drift rates and population sizes from Fig. 3g
- simulations_per_datapoint = 100
- target_drift_rates = np.array([0.05, 0.1, 0.2])
- population_sizes = np.array([25, 50, 75, 100, 125, 150, 175, 200])
- noise_sigma = 1.0
- time_window_M = 10000
- days_to_simulate = 26 # drift is applied between days (i.e. day 0 has no drift), so this is 25 days of drift
- drift_rates, alphas, rhos = get_params_for_drift_rate(target_drift_rates, equivalence_mapping)
- results = simulate_over_population_sizes_and_drift_rates(alphas,
- rhos,
- population_sizes,
- days_to_simulate,
- time_window_M,
- noise_sigma,
- simulations_per_datapoint)
- plot_decoder_error_vs_parameters(results, drift_rates, population_sizes, save_fig=f'{OUTPUT_FOLDER}/fig_3g')
- # %% [markdown]
- # ## Adaptive decoding works best for sudden drift over a range of noise levels
- #
- # The adaptive decoder is more susceptible to confusing daily random variations in activity due to noise with an underlying change in tuning.
- # We consider the accuracy of the parameter estimates after the very first day of drift to demonstrate the relative sensitivity of the gradual drift scenario to the amount of observational noise.
- # This plot is used in Figure 3.e of the paper.
- # %%
- # Reproduce the decoder error after the initial day of drift as a function of noise level sigma, as in Fig. 3e
- noise_levels = np.array([0.2, 0.4, 0.8, 1.6, 2.4, 4.8, 9.6, 19.2, 38.4, 76.8])
- time_window_M = 1000000
- drift_rate = 0.1
- _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
- simulations_per_datapoint = 100
- population_size_N = 100
- noise_results = simulate_over_noise_levels(alpha, rho, population_size_N, time_window_M, noise_levels, simulations_per_datapoint)
- plot_error_against_noise_level(noise_results, time_window_M, noise_levels, save_fig=f'{OUTPUT_FOLDER}/fig_3e')
- # %% [markdown]
- # ## Visualisation of changes in the pairwise correlation between neurons
- #
- # One way we can visualise the differences between sudden and gradual drift is to consider how the correlation between pairs of neurons in the populations change. We consider this for our simulated model before moving to considering it for in vivo data in the paper.
- # This plot is used in Figure 3.d of the paper.
- # %%
- # Reproduce the scaled correlation change ΔC from Fig. 3d
- days_to_plot = [1, 5, 100]
- alpha, rho = 0.0577, 0.3336 # drift rate of 0.02
- # Use a lower correlation threshold but a relatively un-noisy sim to reduce computation time
- corr_threshold = 0.05
- time_window_M = 1000
- noise_sigma = 0.5
- plot_drift_in_scaled_comparison(alpha, rho, days_to_plot, corr_threshold, time_window_M, noise_sigma, save_fig=f'{OUTPUT_FOLDER}/fig_3d')
- # %% [markdown]
- # ## Mixture of Gaussian fits to distributions of correlation change
- # During the early stages of drift, the distributions of scaled correlation changes can be well-approximated by a mixture of Gaussians.
- # The Gaussian with the larger mean in the mixture, $\mu_2$, has different behaviour with respect to time for each type of drift.
- # This plot is used in Figures 4.a and 4.b in the paper.
- # %%
- # Reproduce the example 2-component GMM fits from Fig. 4a and 4b
- drift_rate = 0.025
- _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
- num_days_to_plot = 6
- corr_threshold = 0.05
- plot_gmm_fits(alpha, rho, num_days_to_plot, corr_threshold, save_fig=f'{OUTPUT_FOLDER}/fig_4ab')
- # %% [markdown]
- # ## Approximate behaviour of $\mu_2$ as a function of drift
- #
- # We can approximate the behaviour of $\mu_2$ as an exponential approach to a final value for gradual drift, and as an entirely flat line independent of elapsed days for sudden drift. This holds across a variety of drift rates.
- #
- # This plot is used in Figures 4.e and 4.f in the paper.
- # %%
- # Reproduce the approximations of mu2's location as a function of time and drift rate from Fig. 4e and 4f
- Tcs = np.array([5, 10, 20, 40, 50, 60, 80])
- drift_rates = 1 / Tcs
- corr_threshold = 0.05
- days_to_simulate = 8
- noise_sigma = 0.5
- time_window_M = 1000
- drift_rates, mu2_values_sudden, mu2_values_gradual = fit_gmms_over_drift_rates(drift_rates, equivalence_mapping, noise_sigma, time_window_M, corr_threshold, days_to_simulate)
- plot_mu2_values(drift_rates, mu2_values_sudden, mu2_values_gradual, save_fig=f'{OUTPUT_FOLDER}/fig_4ef')
- # %% [markdown]
- # ## Supplementary figures
- # ### Accuracy of the approximation of the expected correlation between neurons (and choice of M and σ)
- #
- # We rely on an analytical form for the expected correlation between pairs of neurons. It allows us to compute the Jacobian quickly, and therefore makes the optimisation problems above tractable. This analytical form is very, very close to the values we get from simulation (if they were not, the solver would fail due to a disagreement between gradient and cost function), and it gets better for large $M$.
- # The plots below show the distribution of this correlation for a larger variety of $M$ and $σ$, as well as how close to normal the distribution around the expected value is.
- #
- # These plots are used in Figure S1 of the paper.
- # %%
- # Reproduce Fig. S1a: show distributions at a variety of M and σ
- num_points = 201
- samples_per_point = 100
- sigmas = [0.5, 1.0, 2.0]
- num_samples_M = [1000, 10000, 100000]
- make_correlation_vs_parameter_scatter(num_points, samples_per_point, sigmas, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_s1a')
- # %%
- # Reproduce Fig. S1b: show how the expected correlation gets more accurate as a function of M
- num_samples_M = [100, 1000, 10000, 100000]
- num_points = 201
- samples_per_point = 10000
- plot_noise_free_correlation_difference(num_points, samples_per_point, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_s2b')
- # %%
- # Reproduce Fig. S1c: a visualisation that the distribution is normally distributed about the expected value
- noise_sigma = 1.0
- num_points = 201
- samples_per_point = 10000
- time_window_M = 15 # this works even for low M (~10-100), so can reduce computation time
- plot_residual_distribution(time_window_M, noise_sigma, num_points, samples_per_point, save_fig=f'{OUTPUT_FOLDER}/fig_s2c')
- # %% [markdown]
- # ### Insensitivity of drift equivalence to choice of 𝜖
- # We use a drift rate equivalence based on setting $\epsilon=0.05$. Below, we regenerate the equivalence for $\epsilon=0.01$ and $\epsilon=0.1$ to show that this equivalence is not particularly sensitive to this choice of value.
- # We also show the approach of a population's state to chance as a function of days of drift for a variety of drift rates.
- #
- # These plots are used in Figure S2.a-b.
- # %%
- # Reproduce Fig. S2b, showing that various choices of epsilon produce comparable equivalence mappings
- num_equivalence_samples = 100
- num_simulations_per_sample = 1000000
- epsilons = [0.1, 0.05, 0.001]
- equivalences = [make_drift_equivalence(lower_rho=0.2, upper_rho=2.25, num_samples=num_equivalence_samples, epsilon=e, num_simulations=num_simulations_per_sample) for e in epsilons]
- plot_multiple_drift_equivalences(equivalences, epsilons, save_fig=f'{OUTPUT_FOLDER}/fig_s2b')
- # %%
- # Reproduce Fig. S2a, showing how a population gradually approaches a completely scrambled state
- num_days = 41
- Tcs = np.array([5, 10, 20]) # corresponding to drift rates of 0.2, 0.1, 0.05 respectively
- num_sims = 10000000
- plot_approach_to_chance(equivalence_mapping, Tcs, num_days, num_sims, save_fig=f'{OUTPUT_FOLDER}/fig_s2a')
- # %% [markdown]
- # ### Alternative definition of drift based on disruption to representation on first day of drift
- #
- # The definition of drift rate equivalence used above relies on how many days it takes to scramble a population to within an $\epsilon$ of chance. We show below that are results also hold if we used an alternative definition: a choice of parameters such that, after one day, the mean error of parameter estimate for a fixed decoder should be equal between drift types.
- #
- # These plots are used in Figure S2.c-d.
- # %%
- # Reproduce the alternative definition of drift equivalence from Fig. S2c
- alpha, rho = 0.38, 0.74242424 # Manually enforce equal drift after first day
- noise_levels = np.array([0.2, 0.4, 0.8, 1.6, 2.4, 4.8, 9.6, 19.2, 38.4, 76.8])
- time_window_M = 1000000
- simulations_per_datapoint = 100
- population_size_N = 100
- noise_results = simulate_over_noise_levels(alpha, rho, population_size_N, time_window_M, noise_levels, simulations_per_datapoint)
- plot_error_against_noise_level(noise_results, time_window_M, noise_levels, save_fig=f'{OUTPUT_FOLDER}/fig_s2c')
- # %%
- # Reproduce the adaptive decoding over time for the alternative drift equivalence in Fig. S2d
- num_simulations = 100
- days_to_simulate = 51
- num_neurons = 100
- noise_sigma = 1.0
- num_samples_M = 10000
- alpha, rho = 0.38, 0.74242424 # Manually enforce equal drift after first day
- solver_warning_cutoff_day = 5
- sim_results = simulate_over_time(alpha,
- rho,
- num_neurons,
- days_to_simulate,
- num_samples_M,
- noise_sigma,
- num_simulations,
- solver_warning_cutoff_day)
- plot_decoder_error_against_time(sim_results, save_fig=f'{OUTPUT_FOLDER}/fig_s2d')
drift_demo.ipynb at commit 92c5386, no license · at the source
Overview
Abstract
Representational drift of fixed stimuli, learned tasks and familiar environments is observed in many brain areas, leading to reconfiguration of population codes over days to weeks. This raises the question of whether downstream brain regions employ mechanisms to track changes in population activity and thus preserve the fidelity of the information they extract. We show that the statistical properties of drift have a significant impact on such mechanisms. Over an extended period, a net change in population tuning due to drift can arise from an accumulation of small changes distributed across the population, or via abrupt jumps that affect smaller subsets of cells at each time point. We demonstrate that an adaptive readout can exploit the heavy-tailed statistics of abrupt jumps to maintain a more stable readout using a simple inference mechanism. Using experimental data, we investigate the extent to which heavy-tailed drift statistics are observed during representational drift in the posterior parietal cortex and visual cortex. We find that experimentally measured drift does not conform to a Gaussian random walk. Instead, we find sudden jumps in neural tuning that would be advantageous for a downstream observer adapting to changes in representation. These observations motivate future study to determine whether adaptive decoding mechanisms exist in the brain and to determine the physiological mechanisms that shape the statistics of representational drift.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above.
CharlesMicou/heavy-tailed-drift
92c53861079cc79c148e8541bc463424b879e566, 24 September 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
11 files
- drift_demo.ipynb, Jupyter, 334 lines
- drift_model/
__init__.py , Python, 1 line - drift_model/
adaptive_decoding.py , Python, 219 lines - drift_model/
drift_equivalence.py , Python, 187 lines - drift_model/
gradual_drift.py , Python, 101 lines - drift_model/
model_overview.py , Python, 341 lines - drift_model/
plotting_utilities.py , Python, 21 lines - drift_model/
scaled_correlation_chang , Python, 218 lineses.py - drift_model/
simulation_utilities.py , Python, 60 lines - drift_model/
sudden_drift.py , Python, 97 lines - README.md, Text, 33 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;
- no match between paragraphs and code yet;
- 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
- datadryad.org/
dataset/ , at datadryad.org; found in “Data Availability”doi:10.25349/ d9m606 - doi:10.5061/
dryad.gqnk98sjq , at Dryad; found in the text, “Data inclusion.”
Data Availability
Data: 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, issue, pages, dates, 2 authors, 7 MeSH terms, 1 funder, 31 references.
Cite
This paper
Micou, C., & O’Leary, T. (2026). Statistics of cortical representational drift can enable robust readout. PLoS computational biology, 22(6), e1014297. https://
BibTeX
@article{micou2026statis
author = {Micou, Charles and O’Leary, Timothy},
title = {{Statistics of cortical representational drift can enable robust readout}},
journal = {PLoS computational biology},
year = {2026},
month = jun,
volume = {22},
number = {6},
pages = {e1014297},
publisher = {PLOS},
issn = {1553-734X},
doi = {10.1371/
url = {https://
pmid = {42258496},
pmcid = {PMC13278673}
}
RIS
TY - JOUR
AU - Micou, Charles
AU - O’Leary, Timothy
TI - Statistics of cortical representational drift can enable robust readout
T2 - PLoS computational biology
J2 - PLoS Comput Biol
PY - 2026
DA - 2026/
VL - 22
IS - 6
SP - e1014297
SN - 1553-734X
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Statistics of cortical representational drift can enable robust readout",
"container-title": "PLoS computational biology",
"author": [
{
"family": "Micou",
"given": "Charles"
},
{
"family": "O’Leary",
"given": "Timothy"
}
],
"container-title-short":
"volume": "22",
"issue": "6",
"page": "e1014297",
"DOI": "10.1371/
"PMID": "42258496",
"PMCID": "PMC13278673",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
8
]
]
}
}
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.isci.2026.115897 [code]
- Experience and behavior modulate piriform cortex odor representation in freely moving mice.Journal: iScienceIn common: NumPy, systems, 7 references
- [2] doi:10.1371/journal.pcbi.1014719 [code]
- Manifold-constrained plasticity enables stable learning in recurrent neural circuits.Journal: PLoS computational biologyIn common: 6 references
- [3] doi:10.1038/s41467-026-75792-1 [code]
- Temporal drift of sleep-wake representations in hypothalamic neuronal ensembles.Journal: Nature communicationsIn common: systems, 6 references
- [4] doi:10.1038/s41467-026-72275-1 [code]
- Distinct CA3 inputs differentially shape the learning-dependent evolution of right CA1 spatial maps.Journal: Nature communicationsIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, 3 references
- [5] doi:10.7554/elife.89629 [code]
- Active dendrites enable robust spiking computations despite timing jitter.Journal: eLifeIn common: Matplotlib, NumPy, author Timothy O'Leary
- [6] doi:10.1523/eneuro.0344-25.2026 [code]
- Long-Term Variability in Visual Processing versus Perceptual Stability.Journal: eNeuroIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, 2 references
- [7] doi:10.1016/j.patter.2026.101590 [code]
- Density-based longitudinal neuron tracking in high-density electrophysiological recordings.Journal: Patterns (New York, N.Y.)In common: scikit-learn, SciPy, Matplotlib, 1 other tool, 2 references
- [8] doi:10.1038/s41593-026-02357-2 [code]
- Experience reorganizes content-specific memory traces in macaques.Journal: Nature neuroscienceIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, 2 references
- [9] doi:10.7554/elife.107905 [code]
- Adult-neurogenesis allows for representational stability and flexibility in early olfactory system.Journal: eLifeIn common: 4 references
- [10] doi:10.1371/journal.pcbi.1013138 [code]
- Hierarchical recurrent temporal prediction as a model of the mammalian dorsal visual pathway.Journal: PLoS computational biologyIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, systems, 1 reference
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 0 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:15665c1cec6e0894…
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.
