OSCR

Endogenous precision of the number sense.

Code ↔ Paper

2 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 2 matches
  1. [1] § Results › Estimation task ↔ Data Analysis Estimation Task.ipynb, lines 163–244 · score 0.64 · Absolute error, relative error, Standard deviation, coefficients, variations, prior width
  2. [2] § Results › Estimation task ↔ Data Analysis Estimation Task.ipynb, lines 163–244 · score 0.59 · absolute error, relative error, standard deviation, prior width, square

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 · 325 lines · 12 KB · no license · 2 matches

  1. # %%
  2. # %matplotlib inline
  3. from matplotlib.pyplot import *
  4. import numpy as np
  5. import pandas as pd
  6. from scipy import stats, optimize
  7. import itertools, tabulate
  8. from datetime import datetime
  9. # %%
  10. from scipy import __version__ as scipy_version
  11. print(np.__version__)
  12. print(scipy_version)
  13. print(pd.__version__)
  14. # %%
  15. import library_estimation as le
  16. #import apc_utils as apc
  17. #import statsmodels.api as sm
  18. # %%
  19. np.set_printoptions(linewidth=160)
  20. # %%
  21. # number spaces for each width
  22. XS_DELTA = {}
  23. for delta in le.DELTAS:
  24. lo, hi = le.RANGES_DELTA[delta]
  25. xxx = np.arange( int(lo), int(hi) + 1 )
  26. XS_DELTA[delta] = xxx
  27. XS_DELTA
  28. # %%
  29. def mean_variance_from_pmf(xhats, p_xhats):
  30. m = (xhats*p_xhats).sum()
  31. v = (p_xhats*(xhats-m)**2).sum()
  32. return m,v
  33. # %% [markdown]
  34. # # Data
  35. # %%
  36. META = pd.read_csv('data_estimation/subjects_info.csv', index_col=0)
  37. META
  38. # %%
  39. DATA = pd.read_csv('data_estimation/data.csv')
  40. DATA
  41. # %%
  42. len(META), DATA.ID.unique().shape
  43. # %%
  44. META.Gender.value_counts()
  45. # %%
  46. META.Age.mean(), META.Age.std()
  47. # %%
  48. META.Laterality.value_counts()
  49. # %%
  50. META.Reward.mean(), META.Reward.std()
  51. # %%
  52. # def estimate_mean_responses_ols(data):
  53. # A = np.vstack([data.Number, np.ones(len(data.Number))]).T
  54. # m, c = np.linalg.lstsq(A, data.Response, rcond=None)[0]
  55. # xs = np.arange( data.Number.min(), data.Number.max()+1 )
  56. # return { x : m*x + c for x in xs}
  57. # def estimate_mean_responses_gaussian_kernel(data, conv_w, xs=None):
  58. # if xs is None:
  59. # xs = np.arange(int(data.Number.min()), int(data.Number.max())+1)
  60. # return dict( zip( *apc.smooth_ys(conv_w, data.Number, data.Response, xs) ) )
  61. # %% [markdown]
  62. # ## Figure 1
  63. # %%
  64. def get_mean_responses(data):
  65. xs = np.arange( data.Number.min(), data.Number.max()+1 )
  66. return {x:data.Response[data.Number==x].mean() for x in xs}
  67. # %%
  68. fig = figure(layout="constrained", figsize=(12,9))
  69. axd = fig.subplot_mosaic(
  70. """
  71. ..BCC
  72. AAACC
  73. AAADE
  74. """, height_ratios=[3,1.8,4.2], width_ratios=[.5,.4,1.3,1,1],
  75. )
  76. axPrior = axd['B']
  77. axSTD = axd['A']
  78. axLIN = axd['C']
  79. axCV = axd['D']
  80. axERR = axd['E']
  81. axERRT = axERR.twinx()
  82. all_axs = list( axd.values() )
  83. # priors
  84. for delta in le.DELTAS:
  85. data = DATA[DATA.Delta==delta]
  86. lo, hi = le.RANGES_DELTA[delta]
  87. c = le.COLORS_DELTA[delta]
  88. xxx = np.array([lo, hi])
  89. yyy = stats.uniform(loc=lo, scale=delta).pdf(xxx)
  90. lbl = le.LABELS_DELTA[delta]
  91. axPrior.plot(xxx, yyy, c=c, label=lbl)
  92. axPrior.vlines(xxx, 0, yyy, color=c, ls=':')
  93. axPrior.text(x=60, y=1/delta-0.004, s=f'$w={delta}$', ha='center', color=c)
  94. leg = axPrior.legend(loc=(0.725,.6), facecolor='white', framealpha=1, edgecolor='none')
  95. leg.set_in_layout(False)
  96. axPrior.set_ylim(0,None)
  97. axPrior.set_xticks([30,40,50,60,70,80,90])
  98. axPrior.set_yticks([])
  99. axPrior.set_xlabel('Number $x$')
  100. axPrior.set_ylabel('pdf')
  101. axPrior.set_title('Priors')
  102. cc1 = 'purple'
  103. cc2 = '#606060'
  104. for binned in [False, True]:
  105. vars_per_delta = {}
  106. excursions_per_delta = {}
  107. xs_per_delta = {}
  108. vars_per_delta = {}
  109. errors_per_delta = {}
  110. for delta in reversed(le.DELTAS):
  111. data = DATA[DATA.Delta==delta]
  112. lo, hi = le.RANGES_DELTA[delta]
  113. c = le.COLORS_DELTA[delta]
  114. bin_edges = le.BINS_EDGES_DELTA[delta] if binned else np.linspace(*le.RANGES_DELTA[delta], delta+2)
  115. binned_data = le.split_in_bins(data, bin_edges)
  116. mean_resps = get_mean_responses(data) # { x : mean_xhat }
  117. excursions = data.apply(lambda row: row.Response - mean_resps[row.Number], axis='columns') # xhat - mean_xhat
  118. excursions_per_delta[delta] = excursions
  119. binned_excursions = le.split_in_bins(excursions, bin_edges, xcol=None, xs=data.Number)
  120. mean_xhats = np.array([da.Response.mean() for da in binned_data])
  121. vars = np.array( [ (excs**2).mean() for excs in binned_excursions] ); vars_per_delta[delta] = vars
  122. stds = np.sqrt(vars)
  123. sesds = np.array( [ le.sesd(excs) for excs in binned_excursions] )
  124. sevs = np.array( [ le.sev(excs) for excs in binned_excursions] )
  125. xs = np.array([da.Number.mean() for da in binned_data])
  126. xs_per_delta[delta] = xs
  127. cvs = np.array([ stds[i]/m_xhat for i,m_xhat in enumerate(mean_xhats) ])
  128. vars_per_delta[delta] = vars
  129. errors_per_delta[delta] = data.Error
  130. if not binned:
  131. axSTD.plot(xs, stds, c=c, alpha=.2, clip_on=False)
  132. axCV.plot(xs, cvs, c=c, alpha=.2, clip_on=False)
  133. print( delta, stds[xs==60] )
  134. else:
  135. axSTD.errorbar(xs, stds, sesds, c=c, label=f'{le.LABELS_DELTA[delta]} prior $(w={delta})$')
  136. axCV.errorbar(xs, cvs, sesds/xs, c=c)
  137. ##### MODEL
  138. ν_1, σ = 1.22553588, 3.62413533
  139. β = 1/2
  140. ν = ν_1*delta**(β-1)
  141. ps = le.probs_xhats_given_x_for_all_xs_MP(lo, delta, ν=ν, σ=σ)
  142. xs = le.discrete_xs(lo, delta)
  143. xhats_means = []
  144. xhats_vars = []
  145. for x,p_xhats in zip(xs,ps):
  146. m,v = mean_variance_from_pmf(xs, p_xhats)
  147. xhats_means.append(m)
  148. xhats_vars.append(v)
  149. axSTD.plot(xs, np.sqrt(xhats_vars), c=c, ls=':', zorder=-1000)
  150. if binned:
  151. ys = np.array( [ (excursions_per_delta[delta]**2).mean() for delta in le.DELTAS ] )
  152. yerrs = np.array( [ le.sev(excursions_per_delta[delta]) for delta in le.DELTAS ] )
  153. line, caps, bars = axLIN.errorbar(le.DELTAS, ys, 2*yerrs, c=cc1, ecolor=[le.COLORS_DELTA[d] for d in le.DELTAS])
  154. for bar in bars: bar.set_zorder(2000)
  155. axT = axLIN.twiny()
  156. line, caps, bars = axT.errorbar(np.array(le.DELTAS)**2, ys, 2*yerrs, c=cc2, ecolor=[le.COLORS_DELTA[d] for d in le.DELTAS])
  157. for bar in bars: bar.set_zorder(2000)
  158. pred_vars = vars_per_delta[20] + (vars_per_delta[40]-vars_per_delta[20])*(60**2-20**2)/(40**2-20**2)
  159. axSTD.plot(xs_per_delta[60], np.sqrt(pred_vars), 'x', c=le.COLORS_DELTA[60])
  160. pred_vars = vars_per_delta[20] + (vars_per_delta[40]-vars_per_delta[20])*(60-20)/(40-20)
  161. axSTD.plot(xs_per_delta[60], np.sqrt(pred_vars), 'o', c=le.COLORS_DELTA[60], mfc='none')
  162. #
  163. ### Relative error
  164. if axERR is not None:
  165. ys = np.array( [ np.abs(errors_per_delta[delta]).mean() for delta in le.DELTAS ] )
  166. yerrs = np.array( [ stats.sem(np.abs(errors_per_delta[delta])) for delta in le.DELTAS ] )
  167. line, caps, bars = axERR.errorbar(le.DELTAS, ys, 2*yerrs, color='grey', ecolor=[le.COLORS_DELTA[d] for d in le.DELTAS])
  168. for bar in bars: bar.set_zorder(2000)
  169. ys = np.array( [ np.abs(errors_per_delta[delta]).mean()/delta for delta in le.DELTAS ] )
  170. yerrs = np.array( [ stats.sem(np.abs(errors_per_delta[delta]/delta)) for delta in le.DELTAS ] )
  171. line, caps, bars = axERRT.errorbar(le.DELTAS, ys, 2*yerrs, color='grey', ecolor=[le.COLORS_DELTA[d] for d in le.DELTAS], ls='--')
  172. for bar in bars: bar.set_zorder(2000)
  173. axSTD.set_ylim(0,10.5)
  174. axSTD.set_xlim(30,90)
  175. axCV.set_ylim(0,.18)
  176. axCV.set_xlim(30,90)
  177. axCV.set_yticks([0,.05,.1,.15])
  178. for ax in all_axs:
  179. ax.spines['top'].set_visible(False)
  180. ax.spines['right'].set_visible(False)
  181. axSTD.set_xlabel('Presented number $x$')
  182. axSTD.set_ylabel('$\\operatorname{StdDev}[\\hat x]$')
  183. axSTD.set_title('Standard deviation of responses')
  184. axCV.set_xlabel('Presented number $x$')
  185. axCV.set_ylabel('$CV = \\operatorname{StdDev}[\\hat x]/\\operatorname{Mean}[\\hat x]$')
  186. axCV.set_title('Coefficient of Variation')
  187. #
  188. leg = axSTD.legend(frameon=False)
  189. axSTD.legend([Line2D([],[],c='grey',alpha=.2), Line2D([],[],c='grey'), Line2D([],[],c='grey', ls=':'), ],
  190. ['Subjects', 'Subjects (binned $x$)', 'Model'],
  191. frameon=False, loc='lower right')
  192. axSTD.add_artist(leg)
  193. #
  194. some_ticks = np.array([4,5,6,7,8])
  195. axLIN.set_yticks( some_ticks**2, labels=[f'${x}^2$' for x in some_ticks] )
  196. axLIN.set_xticks(le.DELTAS)
  197. axT_ticks = np.array(le.DELTAS)
  198. axT.set_xticks( axT_ticks**2, labels=[f'${x}^2$' for x in axT_ticks] )
  199. xlabel_ax = axLIN.set_xlabel('Prior width $w$', color=cc1)
  200. axT.set_xlabel('Squared prior width $w^2$', color=cc2)
  201. axT.xaxis.set_label_coords(.5, .15)
  202. axT.spines['bottom'].set_position(('outward', -30))
  203. axT.xaxis.set_ticks_position('bottom')
  204. axT.xaxis.set_label_position('bottom')
  205. axLIN.tick_params(axis='x', colors=cc1)
  206. axT.tick_params(axis='x', colors=cc2)
  207. axLIN.spines['bottom'].set_color(cc1)
  208. axT.spines['bottom'].set_color(cc2)
  209. axT.spines['top'].set_visible(False)
  210. axT.spines['right'].set_visible(False)
  211. axLIN.set_ylabel('$\\operatorname{Var}[\\hat x]$')
  212. axLIN.set_ylim(0,8**2)
  213. axLIN.set_title('Variance vs. $w$ and $w^2$')
  214. ##
  215. if axERR is not None:
  216. axERRT.spines['top'].set_visible(False)
  217. axERR.spines['right'].set_ls((0,(8,5))); axERRT.spines['right'].set_ls((0,(8,5)))
  218. axERR.set_xticks(le.DELTAS)
  219. xlabel_ax = axERR.set_xlabel('Prior width $w$')
  220. axERR.set_ylabel('Absolute error $|\\hat x - x|$'); axERRT.set_ylabel('Relative error $|\\hat x - x| / w$')
  221. axERR.set_title('Absolute and relative error')
  222. axERR.set_ylim(0,None); axERRT.set_ylim(0,None)
  223. axERRT.yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1., decimals=0))
  224. axERR.legend([Line2D([],[],c='grey'),Line2D([],[],c='grey',ls='--')], ['Absolute error', 'Relative error'], frameon=False)
  225. #fig.subplots_adjust(hspace=.25)
  226. fig.savefig('figures/result_estimation_task.pdf', bbox_inches='tight')
  227. # %%
  228. # %% [markdown]
  229. # ## Tests of equality of variances
  230. # %% [markdown]
  231. # ### across bins
  232. # %%
  233. for delta in le.DELTAS:
  234. data = DATA[DATA.Delta==delta]
  235. nbbins = 5
  236. bin_edges = le.BINS_EDGES_DELTA[delta]
  237. binned_data = le.split_in_bins(data, bin_edges)
  238. mean_resps = get_mean_responses(data) # { x : mean_xhat }
  239. excursions = data.apply(lambda row: row.Response - mean_resps[row.Number], axis='columns')
  240. binned_excursions = le.split_in_bins(excursions, bin_edges, xs=data.Number, xcol=None)
  241. print(f'w={delta}')
  242. print('Bins 3,4', stats.levene(*[binned_excursions[i] for i in [2,3]]).pvalue)
  243. print( [binned_excursions[i].std() for i in [2,3]] )
  244. print('Bins 3,5', stats.levene(*[binned_excursions[i] for i in [2,4]]).pvalue)
  245. print( [binned_excursions[i].std() for i in [2,4]] )
  246. print()
  247. # %% [markdown]
  248. # ### across conditions
  249. # Narrow-Medium, Narrow-Wide, Medium-Narrow
  250. # %% [markdown]
  251. # The Levene's test of equality of variances in the three conditions rejects the null hypothesis.
  252. # %%
  253. #### With each number in the narrowest range
  254. excs_per_x_per_delta = {}
  255. xs = np.arange(50,71)
  256. pvs = []
  257. for x in xs:
  258. excs_per_x_per_delta[x] = {}
  259. for delta in reversed(le.DELTAS):
  260. data = DATA[(DATA.Delta==delta) & (DATA.Number==x)]
  261. excursions = data.Response - data.Response.mean()
  262. excs_per_x_per_delta[x][delta] = excursions
  263. pvs.append(stats.levene(*excs_per_x_per_delta[x].values()).pvalue)
  264. print(x, pvs[-1] )
  265. np.max(pvs), np.median(pvs)
  266. # %% [markdown]
  267. # # Model
  268. # %% [markdown]
  269. # $x \in [a, a+w]$, where $a = 60 - w/2$.
  270. # $p(r|x) = N(r; \frac{x-a}{w}, \nu_w^2)$, with $\nu_w = \nu_1 w^{\beta-1}$. Note that this is slightly different than in the paper (but it is equivalent).
  271. # The Fisher information is $I(x) = \left( \frac{1}{w\nu_w} \right)^2 = \left( \frac{1}{\nu_1 w^{\beta} } \right)^2 = \frac{1}{\nu_1^2 w^{2\beta} }.$
  272. # The Bayesian estimate, given $r$, is
  273. # $$x_B(r) = a + wr + w\nu\frac{\varphi(\frac{r}{\nu}) - \varphi(\frac{r-1}{\nu})}{\Phi(\frac{r}{\nu}) - \Phi(\frac{r-1}{\nu})}.$$
  274. # With truncated motor noise:
  275. # $y = [x_B(r) + \sigma \varepsilon]_{[a,a+w]}$, where $\varepsilon \sim N(0,1)$.
  276. # Responses are integers. We round:
  277. # $\hat x = round(y)$.
  278. #
  279. # This model has 2 or 3 parameters: $\nu_1$, $\sigma$, and $\beta$ which can be fixed or allowed to take any value.
  280. # %%
  281. # This function computes the log-likelihood of `data` for delta, ν_1, σ, and β defined as above.
  282. le.LL_data_w_params(data=DATA, delta=20, ν_1=.3, σ=3, β=1)
  283. # %%
  284. def make_x0s(bounds, n=2):
  285. spaces = [ [x,] if np.isscalar(x) else np.linspace(x[0],x[1],n) for x in bounds ]
  286. return list( itertools.product(*spaces) )
  287. # %%
  288. # TO BE COMPLETED
  289. # %%

Data Analysis Estimation Task.ipynb, no license · at the source

Overview

  1. Department of Economics, Columbia University, New York, United States
Institutions: Columbia University (United States)
Journal: eLife, volume 13, article RP101277
Dates: published online 15 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.7554/elife.101277 · PMID 41983455 · PMCID PMC13082791 · OpenAlex W4402685021
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), cognitive (subfield)
Methods: Statistics
Keywords: Human
MeSH: Brain*, Mathematical Concepts*, Humans (* major topic)
Topic: Cognitive and developmental aspects of mathematical skills (Statistics and Probability, Mathematics), according to OpenAlex
Funding: National Science Foundation (SES DRMS 1949418)
Citations: cited by 4 papers (Europe PMC); 62 references in the paper

Abstract

The behavioral variability in psychophysical experiments and the stochasticity of sensory neurons have revealed the inherent imprecision in the brain’s representations of environmental variables. Numerosity studies yield similar results, pointing to an imprecise ‘number sense’ in the brain. If the imprecision in representations reflects an optimal allocation of limited cognitive resources, as suggested by efficient-coding models, then it should depend on the context in which representations are elicited. Through an estimation task and a discrimination task, both involving numerosities, we show that the scale of subjects’ imprecision increases, but sublinearly, with the width of the prior distribution from which numbers are sampled. This sublinear relation is notably different in the two tasks. The double dependence of the imprecision — both on the prior and on the task — is consistent with the optimization of a tradeoff between the expected reward, different for each task, and a resource cost of the encoding neurons’ activity. Comparing the two tasks allows us to clarify the form of the resource constraint. Our results suggest that perceptual noise is endogenously determined, and that the precision of percepts varies both with the context in which they are elicited and with the observer’s objective.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.

OSF d6k3m

License: none: the authors keep all their rights
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Languages: Jupyter (2), Python (2)
Size: 13 files, 4 scripts
Software Heritage: not checked
Found in: “Data availability”
Holds: 2 notebooks
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (4 files), SciPy (4 files), Matplotlib (2 files), pandas (2 files), statsmodels (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
  • 29 September 2026: the link answers (HTTP 200)
4 files
At the source: osf.io/d6k3m

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;
  • 4 scripts, each with its path and the digest of its content;
  • 2 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability

The data and the code are available at https://osf.io/d6k3m.

The following dataset was generated:

Prat-Carrabin A, Woodford M. 2024. Endogenous Precision of the Number Sense: Data & Code. Open Science Framework. d6k3m

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, 29 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 2 authors, 1 keyword, 3 MeSH terms, 1 funder, 55 references.

Cite

This paper

Prat-Carrabin, A., & Woodford, M. (2026). Endogenous precision of the number sense. eLife, 13, RP101277. https://doi.org/10.7554/elife.101277

BibTeX

@article{pratcarrabin2026endogenous,
author = {Prat-Carrabin, Arthur and Woodford, Michael},
title = {{Endogenous precision of the number sense}},
journal = {eLife},
year = {2026},
month = apr,
volume = {13},
pages = {RP101277},
publisher = {eLife Sciences Publications, Ltd},
issn = {2050-084X},
doi = {10.7554/elife.101277},
url = {https://doi.org/10.7554/elife.101277},
pmid = {41983455},
pmcid = {PMC13082791}
}

RIS

TY - JOUR
AU - Prat-Carrabin, Arthur
AU - Woodford, Michael
TI - Endogenous precision of the number sense
T2 - eLife
J2 - Elife
PY - 2026
DA - 2026/04/15
VL - 13
SP - RP101277
SN - 2050-084X
PB - eLife Sciences Publications, Ltd
DO - 10.7554/elife.101277
UR - https://doi.org/10.7554/elife.101277
LA - en
ER -

CSL-JSON

{
"id": "10.7554/elife.101277",
"type": "article-journal",
"title": "Endogenous precision of the number sense",
"container-title": "eLife",
"author": [
{
"family": "Prat-Carrabin",
"given": "Arthur"
},
{
"family": "Woodford",
"given": "Michael"
}
],
"container-title-short": "Elife",
"volume": "13",
"page": "RP101277",
"DOI": "10.7554/elife.101277",
"PMID": "41983455",
"PMCID": "PMC13082791",
"ISSN": "2050-084X",
"publisher": "eLife Sciences Publications, Ltd",
"URL": "https://doi.org/10.7554/elife.101277",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
15
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41467-026-73032-0 [code]
Fast efficient coding and sensory adaptation in gain-adaptive recurrent networks.
Journal: Nature communications
In common: SciPy, Matplotlib, NumPy, 11 references, author Arthur Prat-Carrabin
[2] doi:10.1371/journal.pcbi.1014251 [code]
Distilling noise characteristics and prior expectations in multisensory causal inference.
Journal: PLoS computational biology
In common: cognitive, 5 references
[3] doi:10.1162/netn.a.544 [code]
Brain network reconfiguration during reward prediction error processing.
Journal: Network neuroscience (Cambridge, Mass.)
In common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 2 references
[4] doi:10.1038/s41593-026-02255-7 [code]
Neural circuits encode prior knowledge of temporal statistics.
Journal: Nature neuroscience
In common: pandas, SciPy, Matplotlib, 1 other tool, 3 references
[5] doi:10.1371/journal.pbio.3003829 [code]
Identity-specific reward expectations in orbitofrontal cortex guide goal-directed choices.
Journal: PLoS biology
In common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 1 reference
[6] doi:10.1162/imag.a.1207 [code]
Investigating the temporal dynamics and modeling of mid-level feature representations in humans.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 1 reference
[7] doi:10.1111/psyp.70397 [code]
Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping.
Journal: Psychophysiology
In common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 1 reference
[8] doi:10.1038/s41467-026-71568-9 [code]
Convergent and selective representations of pain, appetitive processes, aversive processes, and cognitive control in the insula.
Journal: Nature communications
In common: statsmodels, pandas, SciPy, 2 other tools, cognitive, 1 reference
[9] doi:10.1016/j.isci.2026.117375 [code]
Motor priming is associated with widespread recruitment into neural ensembles and more rapid ensemble transitions.
Journal: iScience
In common: statsmodels, pandas, SciPy, 2 other tools, 1 reference
[10] doi:10.7554/elife.108109 [code]
Multimodal MRI marker of cognition explains the association between cognition and mental health in the UK Biobank.
Journal: eLife
In common: pandas, SciPy, Matplotlib, 1 other tool, cognitive, 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.