OSCR

Statistics of cortical representational drift can enable robust readout.

Code ↔ Paper

The paper beside its authors' code: matches between them have not been computed for this paper yet.

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

  1. # %% [markdown]
  2. # # Comparing sudden and gradual models of drift in a simple toy model
  3. #
  4. # This notebook steps through generating the figures from _Statistics of cortical representational drift can enable robust readout_ (Micou & O'Leary).
  5. # This notebook is primarily concerned with reproducibility--the paper provides a more comprehensive explanation of the model.
  6. #
  7. # The model itself is implemented within the files in this repository, which we import below to plot the key figures.
  8. # %%
  9. # Import the high-level plotting for this notebook (which internally call out to the model)
  10. 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
  11. 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
  12. 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
  13. from drift_model.scaled_correlation_changes import plot_drift_in_scaled_comparison, plot_gmm_fits, fit_gmms_over_drift_rates, plot_mu2_values
  14. # Import additional utilities for the notebook
  15. import numpy as np
  16. import os
  17. %matplotlib inline
  18. # Make a directory to save .svg versions of the figures
  19. OUTPUT_FOLDER = 'out'
  20. if not os.path.exists(OUTPUT_FOLDER):
  21. os.mkdir(OUTPUT_FOLDER)
  22. # %% [markdown]
  23. # ## Encoding of a stimulus in the population
  24. #
  25. # 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.
  26. # The parameter $θ_i$ describes the orientation of maximum response for each neuron.
  27. # 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).
  28. # This plot is used in Figure 2.b in the paper.
  29. # %%
  30. # Reproduce the heatmaps for Fig. 2b
  31. example_neuron_tuning_parameters = np.array([0, np.pi/4, -np.pi*2/3])
  32. noise_sigma = 1.0
  33. num_samples_M = 10000
  34. make_ratemaps(example_neuron_tuning_parameters, noise_sigma, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_2b')
  35. # %% [markdown]
  36. # ## Pairwise correlation of neurons
  37. # 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.
  38. # This plot is used in Figure 2.c in the paper.
  39. # %%
  40. # Reproduce the pairwise correlations between neurons at some separation Δθ for Fig. 2c
  41. noise_sigma = 1.0
  42. num_samples_M = 10000
  43. num_points = 101
  44. samples_per_point = 20000
  45. make_correlation_vs_parameter_difference(num_points, samples_per_point, noise_sigma, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_2c')
  46. # %% [markdown]
  47. # ## Sudden and gradual drift
  48. #
  49. # 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.
  50. # 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.
  51. #
  52. # 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.
  53. # 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.
  54. # %%
  55. # Reproduce the PDFs of each drift type from Fig. 3b
  56. alpha = 0.25
  57. rho = 0.75
  58. make_example_pdfs(alpha, rho, save_fig=f'{OUTPUT_FOLDER}/fig_3b')
  59. # %% [markdown]
  60. # ## Drift rate equivalence
  61. #
  62. # 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.
  63. # %%
  64. # Reproduce the equivalence between drift types from Fig. 3c
  65. # Generate the equivalence
  66. num_equivalence_samples = 500
  67. num_simulations_per_sample = 1000000
  68. equivalence_mapping = make_drift_equivalence(num_samples=num_equivalence_samples,
  69. epsilon=0.05,
  70. num_simulations=num_simulations_per_sample)
  71. # Show an example of extracting a single alpha and rho for a given drift rate
  72. target_drift_rate = 0.1
  73. actual_drift_rate, alpha, rho = get_params_for_drift_rate(target_drift_rate, equivalence_mapping)
  74. print(f"Drift rate={actual_drift_rate}, α={alpha}, ρ={rho}")
  75. # Plot the entire equivalence
  76. plot_drift_equivalence(equivalence_mapping, save_fig=f'{OUTPUT_FOLDER}/fig_3c')
  77. # %% [markdown]
  78. # ## Adaptive decoding works best for sudden drift
  79. #
  80. # We use an adaptive decoder to attempt to track the changing tuning parameters of neurons in the population as they undergo drift.
  81. # 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.
  82. #
  83. # 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).
  84. # %%
  85. # Reproduce the adaptive decoding over time in Fig. 3f
  86. num_simulations = 100
  87. days_to_simulate = 51
  88. num_neurons = 100
  89. noise_sigma = 1.0
  90. num_samples_M = 10000
  91. drift_rate = 0.1
  92. _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
  93. # Convergence warning threshold: this will report any solver convergence failures that occur before the configured day, and ignore any after
  94. # (see note above: as the estimates from adapting to gradual drift diverge from the truth solving eventually becomes ill-condiditioned)
  95. solver_warning_cutoff_day = 5
  96. sim_results = simulate_over_time(alpha,
  97. rho,
  98. num_neurons,
  99. days_to_simulate,
  100. num_samples_M,
  101. noise_sigma,
  102. num_simulations,
  103. solver_warning_cutoff_day)
  104. plot_decoder_error_against_time(sim_results, save_fig=f'{OUTPUT_FOLDER}/fig_3f')
  105. # %% [markdown]
  106. # ## Sudden drift retains its advantage across drift rates and population sizes
  107. # 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.
  108. # This plot is used in Figure 3.g of the paper.
  109. # %%
  110. # Reproduce the adaptive decoding over a range of drift rates and population sizes from Fig. 3g
  111. simulations_per_datapoint = 100
  112. target_drift_rates = np.array([0.05, 0.1, 0.2])
  113. population_sizes = np.array([25, 50, 75, 100, 125, 150, 175, 200])
  114. noise_sigma = 1.0
  115. time_window_M = 10000
  116. days_to_simulate = 26 # drift is applied between days (i.e. day 0 has no drift), so this is 25 days of drift
  117. drift_rates, alphas, rhos = get_params_for_drift_rate(target_drift_rates, equivalence_mapping)
  118. results = simulate_over_population_sizes_and_drift_rates(alphas,
  119. rhos,
  120. population_sizes,
  121. days_to_simulate,
  122. time_window_M,
  123. noise_sigma,
  124. simulations_per_datapoint)
  125. plot_decoder_error_vs_parameters(results, drift_rates, population_sizes, save_fig=f'{OUTPUT_FOLDER}/fig_3g')
  126. # %% [markdown]
  127. # ## Adaptive decoding works best for sudden drift over a range of noise levels
  128. #
  129. # The adaptive decoder is more susceptible to confusing daily random variations in activity due to noise with an underlying change in tuning.
  130. # 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.
  131. # This plot is used in Figure 3.e of the paper.
  132. # %%
  133. # Reproduce the decoder error after the initial day of drift as a function of noise level sigma, as in Fig. 3e
  134. noise_levels = np.array([0.2, 0.4, 0.8, 1.6, 2.4, 4.8, 9.6, 19.2, 38.4, 76.8])
  135. time_window_M = 1000000
  136. drift_rate = 0.1
  137. _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
  138. simulations_per_datapoint = 100
  139. population_size_N = 100
  140. noise_results = simulate_over_noise_levels(alpha, rho, population_size_N, time_window_M, noise_levels, simulations_per_datapoint)
  141. plot_error_against_noise_level(noise_results, time_window_M, noise_levels, save_fig=f'{OUTPUT_FOLDER}/fig_3e')
  142. # %% [markdown]
  143. # ## Visualisation of changes in the pairwise correlation between neurons
  144. #
  145. # 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.
  146. # This plot is used in Figure 3.d of the paper.
  147. # %%
  148. # Reproduce the scaled correlation change ΔC from Fig. 3d
  149. days_to_plot = [1, 5, 100]
  150. alpha, rho = 0.0577, 0.3336 # drift rate of 0.02
  151. # Use a lower correlation threshold but a relatively un-noisy sim to reduce computation time
  152. corr_threshold = 0.05
  153. time_window_M = 1000
  154. noise_sigma = 0.5
  155. plot_drift_in_scaled_comparison(alpha, rho, days_to_plot, corr_threshold, time_window_M, noise_sigma, save_fig=f'{OUTPUT_FOLDER}/fig_3d')
  156. # %% [markdown]
  157. # ## Mixture of Gaussian fits to distributions of correlation change
  158. # During the early stages of drift, the distributions of scaled correlation changes can be well-approximated by a mixture of Gaussians.
  159. # The Gaussian with the larger mean in the mixture, $\mu_2$, has different behaviour with respect to time for each type of drift.
  160. # This plot is used in Figures 4.a and 4.b in the paper.
  161. # %%
  162. # Reproduce the example 2-component GMM fits from Fig. 4a and 4b
  163. drift_rate = 0.025
  164. _, alpha, rho = get_params_for_drift_rate(drift_rate, equivalence_mapping)
  165. num_days_to_plot = 6
  166. corr_threshold = 0.05
  167. plot_gmm_fits(alpha, rho, num_days_to_plot, corr_threshold, save_fig=f'{OUTPUT_FOLDER}/fig_4ab')
  168. # %% [markdown]
  169. # ## Approximate behaviour of $\mu_2$ as a function of drift
  170. #
  171. # 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.
  172. #
  173. # This plot is used in Figures 4.e and 4.f in the paper.
  174. # %%
  175. # Reproduce the approximations of mu2's location as a function of time and drift rate from Fig. 4e and 4f
  176. Tcs = np.array([5, 10, 20, 40, 50, 60, 80])
  177. drift_rates = 1 / Tcs
  178. corr_threshold = 0.05
  179. days_to_simulate = 8
  180. noise_sigma = 0.5
  181. time_window_M = 1000
  182. 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)
  183. plot_mu2_values(drift_rates, mu2_values_sudden, mu2_values_gradual, save_fig=f'{OUTPUT_FOLDER}/fig_4ef')
  184. # %% [markdown]
  185. # ## Supplementary figures
  186. # ### Accuracy of the approximation of the expected correlation between neurons (and choice of M and σ)
  187. #
  188. # 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$.
  189. # 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.
  190. #
  191. # These plots are used in Figure S1 of the paper.
  192. # %%
  193. # Reproduce Fig. S1a: show distributions at a variety of M and σ
  194. num_points = 201
  195. samples_per_point = 100
  196. sigmas = [0.5, 1.0, 2.0]
  197. num_samples_M = [1000, 10000, 100000]
  198. make_correlation_vs_parameter_scatter(num_points, samples_per_point, sigmas, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_s1a')
  199. # %%
  200. # Reproduce Fig. S1b: show how the expected correlation gets more accurate as a function of M
  201. num_samples_M = [100, 1000, 10000, 100000]
  202. num_points = 201
  203. samples_per_point = 10000
  204. plot_noise_free_correlation_difference(num_points, samples_per_point, num_samples_M, save_fig=f'{OUTPUT_FOLDER}/fig_s2b')
  205. # %%
  206. # Reproduce Fig. S1c: a visualisation that the distribution is normally distributed about the expected value
  207. noise_sigma = 1.0
  208. num_points = 201
  209. samples_per_point = 10000
  210. time_window_M = 15 # this works even for low M (~10-100), so can reduce computation time
  211. plot_residual_distribution(time_window_M, noise_sigma, num_points, samples_per_point, save_fig=f'{OUTPUT_FOLDER}/fig_s2c')
  212. # %% [markdown]
  213. # ### Insensitivity of drift equivalence to choice of 𝜖
  214. # 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.
  215. # 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.
  216. #
  217. # These plots are used in Figure S2.a-b.
  218. # %%
  219. # Reproduce Fig. S2b, showing that various choices of epsilon produce comparable equivalence mappings
  220. num_equivalence_samples = 100
  221. num_simulations_per_sample = 1000000
  222. epsilons = [0.1, 0.05, 0.001]
  223. 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]
  224. plot_multiple_drift_equivalences(equivalences, epsilons, save_fig=f'{OUTPUT_FOLDER}/fig_s2b')
  225. # %%
  226. # Reproduce Fig. S2a, showing how a population gradually approaches a completely scrambled state
  227. num_days = 41
  228. Tcs = np.array([5, 10, 20]) # corresponding to drift rates of 0.2, 0.1, 0.05 respectively
  229. num_sims = 10000000
  230. plot_approach_to_chance(equivalence_mapping, Tcs, num_days, num_sims, save_fig=f'{OUTPUT_FOLDER}/fig_s2a')
  231. # %% [markdown]
  232. # ### Alternative definition of drift based on disruption to representation on first day of drift
  233. #
  234. # 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.
  235. #
  236. # These plots are used in Figure S2.c-d.
  237. # %%
  238. # Reproduce the alternative definition of drift equivalence from Fig. S2c
  239. alpha, rho = 0.38, 0.74242424 # Manually enforce equal drift after first day
  240. noise_levels = np.array([0.2, 0.4, 0.8, 1.6, 2.4, 4.8, 9.6, 19.2, 38.4, 76.8])
  241. time_window_M = 1000000
  242. simulations_per_datapoint = 100
  243. population_size_N = 100
  244. noise_results = simulate_over_noise_levels(alpha, rho, population_size_N, time_window_M, noise_levels, simulations_per_datapoint)
  245. plot_error_against_noise_level(noise_results, time_window_M, noise_levels, save_fig=f'{OUTPUT_FOLDER}/fig_s2c')
  246. # %%
  247. # Reproduce the adaptive decoding over time for the alternative drift equivalence in Fig. S2d
  248. num_simulations = 100
  249. days_to_simulate = 51
  250. num_neurons = 100
  251. noise_sigma = 1.0
  252. num_samples_M = 10000
  253. alpha, rho = 0.38, 0.74242424 # Manually enforce equal drift after first day
  254. solver_warning_cutoff_day = 5
  255. sim_results = simulate_over_time(alpha,
  256. rho,
  257. num_neurons,
  258. days_to_simulate,
  259. num_samples_M,
  260. noise_sigma,
  261. num_simulations,
  262. solver_warning_cutoff_day)
  263. 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

  1. Department of Engineering, University of Cambridge, Cambridge, United Kingdom
Institutions: University of Cambridge (United Kingdom)
Journal: PLoS computational biology, volume 22, issue 6, article e1014297
Dates: received 25 September 2025; accepted 5 May 2026; published online 8 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pcbi.1014297 · PMID 42258496 · PMCID PMC13278673 · OpenAlex W7163866776
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), systems (subfield)
Methods: Connectivity, Statistics, fMRI & imaging, Single-unit activity, calcium imaging, Machine learning
MeSH: Models, Neurological*, Visual Cortex*, Animals, Computational Biology, Humans, Neurons, Parietal Lobe (* major topic)
Journal subjects: Biology and Life Sciences, Neuroscience, Neuronal Tuning, Cell Biology, Cellular Types, Animal Cells, Neurons, Cellular Neuroscience, Anatomy, Brain, Visual Cortex, Medicine and Health Sciences, Cognitive Science, Cognitive Psychology, Decision Making, Psychology, Social Sciences, Cognition, Nervous System, Neuroanatomy, Neural Pathways, Behavior, Engineering and Technology, Electronics Engineering, Electronics, Signal Decoders, Perception, Sensory Perception, Vision
Topic: Neural dynamics and brain function (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Citations: not cited yet (Europe PMC); 33 references in the paper

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

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 92c53861079cc79c148e8541bc463424b879e566, 24 September 2025
Languages: Python (9), Jupyter (1)
Size: 13 files, 10 scripts
Software Heritage: not archived
Found in: the text, “Implementation of solvers.”
Holds: README, environment (requirements.txt), 1 notebook
Not found: license file, CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (8 files), Matplotlib (5 files), SciPy (4 files), scikit-learn (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
11 files

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

Data Availability

Data: https://datadryad.org/dataset/doi:10.5061/dryad.gqnk98sjq https://datadryad.org/dataset/doi:10.25349/D9M606. Dataset DOI: https://doi.org/10.25349/D9M606 Simulation code github link: https://github.com/CharlesMicou/heavy-tailed-drift.

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://doi.org/10.1371/journal.pcbi.1014297

BibTeX

@article{micou2026statistics,
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/journal.pcbi.1014297},
url = {https://doi.org/10.1371/journal.pcbi.1014297},
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/06/08
VL - 22
IS - 6
SP - e1014297
SN - 1553-734X
PB - PLOS
DO - 10.1371/journal.pcbi.1014297
UR - https://doi.org/10.1371/journal.pcbi.1014297
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pcbi.1014297",
"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": "PLoS Comput Biol",
"volume": "22",
"issue": "6",
"page": "e1014297",
"DOI": "10.1371/journal.pcbi.1014297",
"PMID": "42258496",
"PMCID": "PMC13278673",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pcbi.1014297",
"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: iScience
In 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 biology
In common: 6 references
[3] doi:10.1038/s41467-026-75792-1 [code]
Temporal drift of sleep-wake representations in hypothalamic neuronal ensembles.
Journal: Nature communications
In 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 communications
In 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: eLife
In 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: eNeuro
In 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 neuroscience
In 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: eLife
In 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 biology
In 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.

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.