OSCR

Computational signatures of exertion and rest underlie moment-to-moment dynamics of subjective perceptions of effort and fatigue.

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

MATLAB · 534 lines · 15 KB · no license

  1. %% Function to fit different perceived effort models to the effort rating data (Experiment 1) in Müller, Milton, Husain, & Apps (2026, CABN)
  2. % Available on OSF: https://doi.org/10.17605/OSF.IO/SB9JF
  3. % The code is based on the fatigue modelling implemented in
  4. % T. Müller, M.C. Klein-Flügge, S.G. Manohar, M. Husain, & M.A.J. Apps (2021, Nature Communications)
  5. % and in J. Matthews, M. A. Pisauro, M. Jurgelis, T. Müller, E. Vassena, T. T.-J. Chong, & M.A.J. Apps (2023, Cognition)
  6. % - both manuscripts published under this license:
  7. % https://creativecommons.org/licenses/by/4.0/ -
  8. % and has been modified accordingly by T.M. for this manuscript.
  9. % Please note:
  10. % Participant data are stored in/taken from "s".
  11. % Although some variable names include the term "choice", in these tasks participants were not actually required to make any choices
  12. % (see associated manuscript text for details).
  13. % The order (numbers) of the models in this script differ(s) from the order (numbers) in the manuscript.
  14. % ST refers to recoverable fatigue, LT refers to unrecoveralbe fatigue as described in the manuscript.
  15. % The script uses a separate function "allcomb", available for example on MATLAB Central File Exchange
  16. % (https://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb-varargin), Copyright (c) 2018, Jos (10584).
  17. %%
  18. function sf_model_results = ModellingCode_Experiment1_MullerEtAl2026CABN(s)
  19. close all
  20. N = max(size(s));
  21. %% Fatigue Models
  22. test_models = [1, 2, 3, 4, 5, 6]; % which models you wish to test(e.g. 1 = fat_v1, 2 = fat_just_LT, ...)
  23. model_names = {'fat_v1', 'fat_just_LT', 'fat_one_noLT', 'fat_onepar_withLT', 'fat_noLT', 'noFat_onePara'};
  24. model_names = model_names([test_models]);
  25. fatigue_models = {
  26. @(p,E,fatigue_rating,effort) fat_v1(p,E,fatigue_rating,effort);
  27. @(p,E,fatigue_rating,effort) fat_just_LT(p,E,fatigue_rating,effort);
  28. @(p,E,fatigue_rating,effort) fat_one_noLT(p,E,fatigue_rating,effort);
  29. @(p,E,fatigue_rating,effort) fat_onepar_withLT(p,E,fatigue_rating,effort);
  30. @(p,E,fatigue_rating,effort) fat_noLT(p,E,fatigue_rating,effort);
  31. @(p,E,fatigue_rating,effort) noFat_onePara(p,E,fatigue_rating,effort);
  32. };
  33. model_params = [4, 2, 2, 3, 3, 1]; % Number of parameters in each model
  34. %% Creating empty variables
  35. parameter_estimates_best = [];
  36. Chi_best = []; % We call it Chi here
  37. total_fat_estimate_best = {};
  38. SF_estimate_best = {};
  39. LF_estimate_best = {};
  40. eff_estimate_best = {};
  41. aic = nans(N, max(test_models));
  42. corr = nans(N, max(test_models));
  43. R_sq = nans(N, max(test_models));
  44. R_sq_sig = nans(N, max(test_models));
  45. Chi_best = []; % temp
  46. %% Select Participant
  47. for i=1:N % loops through all subjects
  48. i
  49. %% Select Model
  50. for j = 1:length(test_models)
  51. z = test_models(j);
  52. %% Assign infinity to the initial lss value
  53. Chi_best(i, z) = inf;
  54. %% Load data
  55. E = s(i).choice_fat_squeeze_areaundercurve_norm.*10;
  56. fatigue_rating = s(i).choice_fat_postFatigue; % Note: This is acutally the effort rating in this task!
  57. % Load effort levels to determine rest trials
  58. effort = s(i).choice_fat_effort;
  59. %% Select Fatigue Function and Define Fit Measures Negative Likelihood
  60. fat_func = fatigue_models{z};
  61. Chi = @(p) fat_func(p, E, fatigue_rating, effort);
  62. %% Find the best parameter estimates through repeated ss function minimization
  63. clear startVals
  64. clear constrained_nll
  65. gridVals = [0:0.2:1.0];
  66. % Define constrained ss function
  67. if model_params(z) == 1
  68. startVals = gridVals;
  69. startVals = startVals';
  70. constrained_Chi = @(p) Chi(p) + (p(1)<0)*realmax;
  71. elseif model_params(z) == 2
  72. startVals = allcomb(gridVals,gridVals);
  73. constrained_Chi = @(p) Chi(p) + (p(1)<0)*realmax + (p(2)<0)*realmax;
  74. elseif model_params(z) == 3
  75. startVals = allcomb(gridVals,gridVals,gridVals);
  76. constrained_Chi = @(p) Chi(p) + (p(1)<0)*realmax + (p(2)<0)*realmax + (p(3)<0)*realmax;
  77. elseif model_params(z) == 4
  78. startVals = allcomb(gridVals,gridVals,gridVals,gridVals);
  79. constrained_Chi = @(p) Chi(p) + (p(1)<0)*realmax + (p(2)<0)*realmax + (p(3)<0)*realmax + (p(4)<0)*realmax;
  80. end
  81. % Minimize constrained Chi
  82. ChiBestIter = inf;
  83. for startPIter = 1:size(startVals,1)
  84. startp = startVals(startPIter,:);
  85. [pk, Chik] = fminsearch(constrained_Chi, startp, optimset('MaxFunEvals',10000,'MaxIter',10000));
  86. if Chik<ChiBestIter
  87. ChiBestIter = Chik;
  88. pkBestIter = pk;
  89. end
  90. end
  91. if ChiBestIter < Chi_best(i, z)
  92. parameter_estimates_best{i, z} = pkBestIter;
  93. Chi_best(i, z) = ChiBestIter;
  94. end
  95. sf_model_results.all_Chi(i,z) = ChiBestIter;
  96. sf_model_results.all_p{i,z} = pkBestIter;
  97. aic(i, z) = length(effort)*log(Chi_best(i,z)/length(effort)) + 2*(model_params(z));
  98. [Chi_best(i, z), total_fat_estimate_best{i, z}, st_fat_estimate_best{i, z}, lt_fat_estimate_best{i, z}, eff_estimate_best{i, z}] = fat_func(parameter_estimates_best{i, z}, E, fatigue_rating, effort);
  99. % Non-linear R squared (via correlation)
  100. [R , P] = corrcoef(eff_estimate_best{i, z},fatigue_rating);
  101. corr(i, z) = R(1, 2);
  102. R_sq(i, z) = R(1, 2) ^ 2;
  103. R_sq_sig(i, z) = P(1, 2);
  104. end
  105. end
  106. %% Add results to a structure
  107. sf_model_results.tot_sf_est = total_fat_estimate_best; % best SF (fatigue) estimate for each model, total fatigue
  108. sf_model_results.st_sf_est = st_fat_estimate_best; % best SF estimate for each model, recoverable (short-term) fatigue
  109. sf_model_results.lt_sf_est = lt_fat_estimate_best; % best SF estimate for each model, unrecoverable (long-term) fatigue
  110. sf_model_results.eff_est = eff_estimate_best; % best subjective effort estimate for each model
  111. sf_model_results.corr = corr;
  112. sf_model_results.R_sq = R_sq; % R squared between estimated and reported subjective effort
  113. sf_model_results.R_sq_sig = R_sq_sig; % p value of R squared between estimated and reported subjective effort
  114. sf_model_results.aic = aic;
  115. sf_model_results.Chi = Chi_best;
  116. % Model compared
  117. sf_model_results.models = fatigue_models;
  118. sf_model_results.model_names = model_names;
  119. sf_model_results.model_params = model_params;
  120. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  121. %%%%%%%%%%%%%SUBJECTIVE FATIGUE MODELS%%%%%%%%%%%%
  122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  123. %% Total fatigue estimate 1 (different coefficients for LTfat, STfat Work and Rest)
  124. function [Chi,Fat,STfat,LTfat,Eff] = fat_v1(p, E, fatigue_rating, effort)
  125. %% Regression coefficients
  126. alfa = p(1); % Rest
  127. beta = p(2); % Short-term fatigue (recoverable)
  128. gamma = p(3); % Long-term fatigue (unrecoverable)
  129. delta = p(4); % effort weight
  130. %% Empy arrays for scores
  131. STfat = nans(length(effort), 1);
  132. LTfat = nans(length(effort), 1);
  133. Fat = nans(length(effort), 1);
  134. Eff = nans(length(effort), 1);
  135. %% Starting fatigue values
  136. Fat_startp = 0.01;
  137. ST_fatigue_startp = 0;
  138. LT_fatigue_startp = 0;
  139. %%
  140. for t=1
  141. if effort(t) == 1
  142. STfat(t) = ST_fatigue_startp - (alfa*7.5);
  143. LTfat(t) = LT_fatigue_startp;
  144. else
  145. STfat(t) = ST_fatigue_startp + (beta*E(t)) - (alfa*2.5);
  146. LTfat(t) = LT_fatigue_startp + (gamma*E(t));
  147. end
  148. % Set limits to ST fatigue estimate
  149. if STfat(t) < 0
  150. STfat(t) = 0;
  151. end
  152. % Estimate total fatigue at time point t
  153. Fat(t) = Fat_startp + STfat(t) + LTfat(t);
  154. % Estimate effort at time point t
  155. if effort(t) == 1
  156. Eff(t) = 0;
  157. else
  158. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  159. end
  160. end
  161. for t=2:length(effort)
  162. if effort(t) == 1
  163. STfat(t) = STfat(t-1) - (alfa*7.5);
  164. LTfat(t) = LTfat(t-1);
  165. else
  166. STfat(t) = STfat(t-1) + (beta*E(t)) - (alfa*2.5);
  167. LTfat(t) = LTfat(t-1) + (gamma*E(t));
  168. end
  169. % Set limits to ST fatigue estimate
  170. if STfat(t) < 0
  171. STfat(t) = 0;
  172. end
  173. % Estimate total fatigue at time point t
  174. Fat(t) = Fat_startp + STfat(t) + LTfat(t);
  175. % Estimate effort at time point t
  176. if effort(t) == 1
  177. Eff(t) = 0;
  178. else
  179. Eff(t) =(E(t).*Fat(t)) + (E(t)*delta);
  180. end
  181. end
  182. %% Measures of model fit
  183. residual_squares = ((fatigue_rating - Eff).^2);
  184. Chi = sum(residual_squares); % Chi squared
  185. end
  186. %% Total fatigue estimate 2 (only LTfat)
  187. function [Chi, Fat, STfat, LTfat, Eff] = fat_just_LT(p, E, fatigue_rating, effort)
  188. %% Regression coefficients
  189. gamma = p(1);
  190. delta = p(2);
  191. %% Empy arrays for scores
  192. STfat = nans(length(effort), 1);
  193. LTfat = nans(length(effort), 1);
  194. Fat = nans(length(effort), 1);
  195. Eff = nans(length(effort), 1);
  196. %% Starting fatigue values
  197. Fat_startp = 0.01;
  198. LT_fatigue_startp = 0;
  199. %%
  200. for t=1
  201. if effort(t) == 1
  202. LTfat(t) = LT_fatigue_startp;
  203. else
  204. LTfat(t) = LT_fatigue_startp + (gamma*E(t));
  205. end
  206. % Estimate total fatigue at time point t
  207. Fat(t) = Fat_startp + LTfat(t);
  208. % Estimate effort at time point t
  209. if effort(t) == 1
  210. Eff(t) = 0;
  211. else
  212. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  213. end
  214. end
  215. for t=2:length(effort)
  216. if effort(t) == 1
  217. LTfat(t) = LTfat(t-1);
  218. else
  219. LTfat(t) = LTfat(t-1) + (gamma*E(t));
  220. end
  221. % Estimate total fatigue at time point t
  222. Fat(t) = Fat_startp + LTfat(t);
  223. % Estimate effort at time point t
  224. if effort(t) == 1
  225. Eff(t) = 0;
  226. else
  227. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  228. end
  229. end
  230. %% Fit measures
  231. residual_squares = ((fatigue_rating - Eff).^2);
  232. Chi = sum(residual_squares); % Chi squared
  233. end
  234. %% Total fatigue estimate 3 (same coefficient for STfat Work and Rest, no LTfat)
  235. function [Chi,Fat,STfat,LTfat,Eff] = fat_one_noLT(p, E, fatigue_rating, effort)
  236. %% Regression coefficients
  237. alfa = p(1);
  238. delta = p(2);
  239. %% Empy arrays for scores
  240. STfat = nans(length(effort), 1);
  241. Fat = nans(length(effort), 1);
  242. LTfat = nans(length(effort), 1);
  243. Eff = nans(length(effort), 1);
  244. %% Starting fatigue values
  245. Fat_startp = 0.01;
  246. ST_fatigue_startp = 0;
  247. %%
  248. for t=1
  249. if effort(t) == 1
  250. STfat(t) = ST_fatigue_startp - (alfa*7.5);
  251. else
  252. STfat(t) = ST_fatigue_startp + (alfa*E(t)) - (alfa*2.5);
  253. end
  254. % Set limits to ST fatigue estimate
  255. if STfat(t) < 0
  256. STfat(t) = 0;
  257. end
  258. % Estimate total fatigue at time point t
  259. Fat(t) = Fat_startp + STfat(t);
  260. % Estimate effort at time point t
  261. if effort(t) == 1
  262. Eff(t) = 0;
  263. else
  264. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  265. end
  266. end
  267. for t=2:length(effort)
  268. if effort(t) == 1
  269. STfat(t) = STfat(t-1) - (alfa*7.5);
  270. else
  271. STfat(t) = STfat(t-1) + (alfa*E(t)) - (alfa*2.5);
  272. end
  273. % Set limits to ST fatigue estimate
  274. if STfat(t) < 0
  275. STfat(t) = 0;
  276. end
  277. % Estimate total fatigue at time point t
  278. Fat(t) = Fat_startp + STfat(t);
  279. % Estimate effort at time point t
  280. if effort(t) == 1
  281. Eff(t) = 0;
  282. else
  283. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  284. end
  285. end
  286. %% Fit measures
  287. residual_squares = ((fatigue_rating - Eff).^2);
  288. Chi = sum(residual_squares); % Chi squared
  289. end
  290. %% Total fatigue estimate 4 (same coefficients for STfat Work and Rest, another for LTfat)
  291. function [Chi,Fat,STfat,LTfat,Eff] = fat_onepar_withLT(p, E, fatigue_rating, effort)
  292. %% Regression coefficients
  293. alfa = p(1);
  294. gamma = p(2);
  295. delta = p(3);
  296. %% Empy arrays for scores
  297. STfat = nans(length(effort), 1);
  298. LTfat = nans(length(effort), 1);
  299. Fat = nans(length(effort), 1);
  300. Eff = nans(length(effort), 1);
  301. %% Starting fatigue values
  302. Fat_startp = 0.01;
  303. ST_fatigue_startp = 0;
  304. LT_fatigue_startp = 0;
  305. %%
  306. for t=1
  307. if effort(t) == 1
  308. STfat(t) = ST_fatigue_startp - (alfa*7.5);
  309. LTfat(t) = LT_fatigue_startp;
  310. else
  311. STfat(t) = ST_fatigue_startp + (alfa*E(t)) - (alfa*2.5);
  312. LTfat(t) = LT_fatigue_startp + (gamma*E(t));
  313. end
  314. % Set limits to ST fatigue estimate
  315. if STfat(t) < 0
  316. STfat(t) = 0;
  317. end
  318. % Estimate total fatigue at time point t
  319. Fat(t) = Fat_startp + STfat(t) + LTfat(t);
  320. % Estimate effort at time point t
  321. if effort(t) == 1
  322. Eff(t) = 0;
  323. else
  324. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  325. end
  326. end
  327. for t=2:length(effort)
  328. if effort(t) == 1
  329. STfat(t) = STfat(t-1) - (alfa*7.5);
  330. LTfat(t) = LTfat(t-1);
  331. else
  332. STfat(t) = STfat(t-1) + (alfa*E(t)) - (alfa*2.5);
  333. LTfat(t) = LTfat(t-1) + (gamma*E(t));
  334. end
  335. % Set limits to ST fatigue estimate
  336. if STfat(t) < 0
  337. STfat(t) = 0;
  338. end
  339. % Estimate total fatigue at time point t
  340. Fat(t) = Fat_startp + STfat(t) + LTfat(t);
  341. % Estimate effort at time point t
  342. if effort(t) == 1
  343. Eff(t) = 0;
  344. else
  345. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  346. end
  347. end
  348. %% Fit measures
  349. residual_squares = ((fatigue_rating - Eff).^2);
  350. Chi = sum(residual_squares); % Chi squared
  351. end
  352. %% Total fatigue estimate 5 (different coefficients for STfat Work and Rest, no LTfat)
  353. function [Chi,Fat,STfat,LTfat,Eff] = fat_noLT(p, E, fatigue_rating, effort)
  354. %% Regression coefficients
  355. alfa = p(1);
  356. beta = p(2);
  357. delta = p(3);
  358. %% Empy arrays for scores
  359. STfat = nans(length(effort), 1);
  360. LTfat = nans(length(effort), 1);
  361. Fat = nans(length(effort), 1);
  362. Eff = nans(length(effort), 1);
  363. %% Starting fatigue values
  364. Fat_startp = 0.01;
  365. ST_fatigue_startp = 0;
  366. %%
  367. for t=1
  368. if effort(t) == 1
  369. STfat(t) = ST_fatigue_startp - (alfa*7.5);
  370. else
  371. STfat(t) = ST_fatigue_startp + (beta*E(t)) - (alfa*2.5);
  372. end
  373. % Set limits to ST fatigue estimate
  374. if STfat(t) < 0
  375. STfat(t) = 0;
  376. end
  377. % Estimate total fatigue at time point t
  378. Fat(t) = Fat_startp + STfat(t);
  379. % Estimate effort at time point t
  380. if effort(t) == 1
  381. Eff(t) = 0;
  382. else
  383. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  384. end
  385. end
  386. for t=2:length(effort)
  387. if effort(t) == 1
  388. STfat(t) = STfat(t-1) - (alfa*7.5);
  389. else
  390. STfat(t) = STfat(t-1) + (beta*E(t)) - (alfa*2.5);
  391. end
  392. % Set limits to ST fatigue estimate
  393. if STfat(t) < 0
  394. STfat(t) = 0;
  395. end
  396. % Estimate total fatigue at time point t
  397. Fat(t) = Fat_startp + STfat(t);
  398. % Estimate effort at time point t
  399. if effort(t) == 1
  400. Eff(t) = 0;
  401. else
  402. Eff(t) = (E(t).*Fat(t)) + (E(t)*delta);
  403. end
  404. end
  405. %% Fit measures
  406. residual_squares = ((fatigue_rating - Eff).^2);
  407. Chi = sum(residual_squares); % Chi squared
  408. end
  409. %% Total fatigue estimate 6 (no fatigue, one parameter)
  410. function [Chi,Fat,STfat,LTfat,Eff] = noFat_onePara(p, E, fatigue_rating, effort)
  411. %% Regression coefficients
  412. alfa = p(1);
  413. %% Empy arrays for scores
  414. STfat = nans(length(effort), 1);
  415. LTfat = nans(length(effort), 1);
  416. Fat = nans(length(effort), 1);
  417. Eff = nans(length(effort), 1);
  418. %%
  419. for t=1:length(effort)
  420. if effort(t) == 1
  421. Eff(t) = 0;
  422. else
  423. Eff(t) = E(t)*alfa;
  424. end
  425. end
  426. %% Fit measures
  427. residual_squares = ((fatigue_rating - Eff).^2);
  428. Chi = sum(residual_squares); % Chi squared
  429. end
  430. end

ModellingCode_Experiment1_MullerEtAl2026CABN.m, no license · at the source

Overview

Authors: Tanja Müller1,2,3, Joseph Milton1, Masud Husain1,2,4, Matthew A J Apps1,2,5,6
  1. Department of Experimental Psychology, University of Oxford, Oxford, UK
  2. Wellcome Centre for Integrative Neuroimaging, University of Oxford, Oxford, UK
  3. Zurich Center for Neuroeconomics, Department of Economics, University of Zurich, Zurich, Switzerland
  4. Nuffield Department of Clinical Neurosciences, University of Oxford, Oxford, UK
  5. Centre for Human Brain Health, School of Psychology, University of Birmingham, Birmingham, UK
  6. Institute for Mental Health, School of Psychology, University of Birmingham, Birmingham, UK
Institutions: University of Zurich (Switzerland); University of Oxford (United Kingdom); Wellcome Centre for Integrative Neuroimaging (United Kingdom); University of Birmingham (United Kingdom)
Journal: Cognitive, affective & behavioral neuroscience, volume 26, issue 2, pages 650-668
Dates: received 5 June 2025; accepted 21 January 2026; published online 9 March 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3758/s13415-026-01417-1 · PMID 41803422 · PMCID PMC13095941 · OpenAlex W7134838756
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: computational modeling (no new data) (modality), human (organism)
Methods: Preprocessing, Statistics
Keywords: Physical exertion, Effort, Fatigue, Motivation, Reward, Computational model
MeSH: Fatigue*, Perception*, Physical Exertion*, Rest*, Adult, Computer Simulation, Female, Hand Strength, Humans, Male, Motivation, Reward, Young Adult (* major topic)
Topic: Motor Control and Adaptation (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Wellcome Trust (098282/Z/12/Z, 206330/Z/17/Z, 226645/Z/22/Z); Biotechnology and Biological Sciences Research Council (BB/M013596/1, BB/R010668/2, BB/R010668/1); Swiss National Science Foundation (217276, TMPFP1_217276); Studienstiftung des Deutschen Volkes; British Federation of Women Graduates; Jacobs Foundation; European Research Council
Citations: not cited yet (Europe PMC); 71 references in the paper

Abstract

Everyday we perform tasks that make us feel fatigued. Theoretical accounts predict that fatigue not only develops due to exertion of effort but also increases how effortful the same action will feel subsequently. However, to date there has been no formalised computational account of subjective perceptions of fatigue and effort, with few studies measuring these sensations directly or quantifying their moment-to-moment changes. In this study, across three experiments, participants were required to exert different levels of physical effort (grip force below maximum capacity) to obtain rewards, rating on each trial how effortful they found exerting force (Experiment 1) or how fatigued they felt (Experiments 2 and 3). Across studies, ratings of fatigue and perception of effort increased over time but also fluctuated on a trial-by-trial basis as a function of both effort exerted and rest. A computational model of fatigue, comprising a recoverable component (with fatigue reducing during rest) and an unrecoverable one (in which it only increases through effort exerted) successfully accounted for subjective responses. It was best able to explain momentary changes in both fatigue and effort perception. This computational model provides insights into the brain mechanisms underpinning the close, dynamic relationship between sensations of fatigue and effort.

Supplementary Information: The online version contains supplementary material available at 10.3758/s13415-026-01417-1.

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

Repository

Its files are read in the Code ↔ Paper reader above.

OSF sb9jf

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Languages: MATLAB (2)
Size: 2 files, 2 scripts
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)
2 files
At the source: osf.io/sb9jf/

Code availability

Custom code is available on OSF (https://osf.io/sb9jf/; Digital Object Identifier: 10.17605/OSF.IO/SB9JF).

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

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;
  • 2 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 are available on the Open Science Framework (OSF; https://osf.io/v2dzq/; Digital Object Identifier: 10.17605/OSF.IO/V2DZQ). The study was not preregistered.

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

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 6 keywords, 13 MeSH terms, 7 funders, 67 references.

Cite

This paper

Müller, T., Milton, J., Husain, M., & Apps, M. A. J. (2026). Computational signatures of exertion and rest underlie moment-to-moment dynamics of subjective perceptions of effort and fatigue. Cognitive, affective & behavioral neuroscience, 26(2), 650-668. https://doi.org/10.3758/s13415-026-01417-1

BibTeX

@article{muller2026computational,
author = {Müller, Tanja and Milton, Joseph and Husain, Masud and Apps, Matthew A J},
title = {{Computational signatures of exertion and rest underlie moment-to-moment dynamics of subjective perceptions of effort and fatigue}},
journal = {Cognitive, affective \& behavioral neuroscience},
year = {2026},
month = mar,
volume = {26},
number = {2},
pages = {650--668},
publisher = {Springer Science+Business Media},
issn = {1530-7026},
doi = {10.3758/s13415-026-01417-1},
url = {https://doi.org/10.3758/s13415-026-01417-1},
pmid = {41803422},
pmcid = {PMC13095941}
}

RIS

TY - JOUR
AU - Müller, Tanja
AU - Milton, Joseph
AU - Husain, Masud
AU - Apps, Matthew A J
TI - Computational signatures of exertion and rest underlie moment-to-moment dynamics of subjective perceptions of effort and fatigue
T2 - Cognitive, affective & behavioral neuroscience
J2 - Cogn Affect Behav Neurosci
PY - 2026
DA - 2026/03/09
VL - 26
IS - 2
SP - 650
EP - 668
SN - 1530-7026
PB - Springer Science+Business Media
DO - 10.3758/s13415-026-01417-1
UR - https://doi.org/10.3758/s13415-026-01417-1
LA - en
ER -

CSL-JSON

{
"id": "10.3758/s13415-026-01417-1",
"type": "article-journal",
"title": "Computational signatures of exertion and rest underlie moment-to-moment dynamics of subjective perceptions of effort and fatigue",
"container-title": "Cognitive, affective & behavioral neuroscience",
"author": [
{
"family": "Müller",
"given": "Tanja"
},
{
"family": "Milton",
"given": "Joseph"
},
{
"family": "Husain",
"given": "Masud"
},
{
"family": "Apps",
"given": "Matthew A J"
}
],
"container-title-short": "Cogn Affect Behav Neurosci",
"volume": "26",
"issue": "2",
"page": "650-668",
"DOI": "10.3758/s13415-026-01417-1",
"PMID": "41803422",
"PMCID": "PMC13095941",
"ISSN": "1530-7026",
"publisher": "Springer Science+Business Media",
"URL": "https://doi.org/10.3758/s13415-026-01417-1",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
9
]
]
}
}

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-75987-6 [code]
Neural and computational mechanisms of effort under the pressure of a deadline.
Journal: Nature communications
In common: 4 references, author Matthew A J Apps
[2] doi:10.1016/j.isci.2026.115552 [code]
Physical and cognitive contributions to fatigue perception: The interplay between local muscle fatigue and sensory prediction error.
Journal: iScience
In common: 6 references
[3] doi:10.1002/advs.77165
Perceived Time Shapes Physical Fatigue Accumulation and Its Neural Oscillatory Correlates.
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)
In common: 5 references
[4] doi:10.1038/s41398-026-04172-6 [code]
Obesity is associated with greater variability of reward signals in the nucleus accumbens.
Journal: Translational psychiatry
In common: 4 references
[5] doi:10.1162/imag.a.1332 [code]
Decision processes underlying effort avoidance and their relationship with metacognition.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: 3 references
[6] doi:10.1016/j.neurobiolaging.2026.06.012 [code]
Brain structure in the cingulate cortex and locus coeruleus in late life is associated with engagement in complex mental activities across the life span.
Journal: Neurobiology of aging
In common: 2 references
[7] doi:10.7554/elife.103566 [code]
Effort produces after-effects costly for others but valued for self.
Journal: eLife
In common: 2 references
[8] doi:10.1111/acer.70370 [code]
Low-Level Alcohol Consumption in Children 11-12 Years Old Is Linked to Neural Substrates Involved in Reward Processing and Inhibitory Control: Results From a Brain-Wide Association Study.
Journal: Alcohol, clinical & experimental research
In common: 2 references
[9] doi:10.1111/psyp.70265 [code]
Neurocognitive Dynamics of Translating Information From a Spatial Map Into Action.
Journal: Psychophysiology
In common: 2 references
[10] doi:10.1016/j.isci.2026.116473
Belief updating in uncertain environments is differentially sensitive to reward and punishment learning: Evidence from ERP.
Journal: iScience
In common: 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.

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.