OSCR

When emotions hurt: negative interpretations of bodily signals and interoceptive difficulties in fibromyalgia.

Code ↔ Paper

1 match 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 1 match
  1. [1] § Study 1 › Data analyses › Body coverage ↔ WP1 - Behavioural project/emBODY and interoception/PAID embody analysis.m, lines 275–354 · score 0.55 · pain today, PPP, coverage, painted, body, pixels

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 · 921 lines · 28 KB · no license · 1 match

  1. % Info:
  2. % Written by Aleksnadra Herman 2025, rev 2026
  3. %
  4. % The script has been tested on Windows computer with MATLAB R2024a
  5. % Ensure data structure is correct.
  6. %
  7. % Based on functions available here: https://version.aalto.fi/gitlab/eglerean/embody Reported in:
  8. % Nummenmaa L., Glerean E., Hari R., Hietanen, J.K. (2014)
  9. % Bodily maps of emotions, Proceedings of the National Academy of Sciences of United States of America doi:10.1073/pnas.1321664111
  10. % http://www.pnas.org/content/111/2/646.abstract
  11. %%%%
  12. %% 1. Data Loading and Setup
  13. clear all
  14. close all
  15. % the diretory wich contains all necessary functions (change):
  16. GTDIR = 'C:\Users\hermana\OneDrive - University of South Australia\TASKS backup\emBody\functions-Sven\functions';
  17. % the directory with all the project data (chage):
  18. main_dir = 'C:\Users\hermana\OneDrive - University of South Australia\TASKS backup\emBody\';
  19. addpath(genpath(main_dir));
  20. cd(GTDIR)
  21. if ~exist([main_dir 'outdata'], 'dir')
  22. mkdir([main_dir 'outdata'])
  23. end
  24. cfg.outdata = [main_dir 'outdata\'];
  25. cfg.datapath = [main_dir 'subjects\'];
  26. labels={'Fear'
  27. 'Sadness'
  28. 'Happiness'
  29. 'Anger'
  30. 'Disgust'
  31. 'Surprise'
  32. 'Anxiety'
  33. 'Stomach ache'
  34. 'Headache'
  35. 'Your pain today'
  36. 'Neutral state'
  37. 'Physical fatigue'
  38. 'Mental fatigue'
  39. };
  40. cfg.Nstimuli = length(labels);
  41. cfg.Nempty = 1;
  42. cfg.phenodata = 0;
  43. bspm=bodySPM_parseSubjects(cfg);
  44. out=[];
  45. ids=find(bspm.data_filter(:,3)==1);
  46. for i = 1:length(ids)
  47. out{i,1}=bspm.subjects(ids(i)).name;
  48. end
  49. fileID=fopen([cfg.outdata '/list.txt'],'w');
  50. for i=1:length(out)
  51. if(strcmp(out{i}(1),'.'))
  52. disp([out{i} ' has invalid ID for this study']);
  53. continue;
  54. end
  55. fprintf(fileID,'%s\n',[out{i}]);
  56. end
  57. fclose(fileID)
  58. %% 2. Preprocesssing
  59. cfg.list = [cfg.outdata 'list.txt']; %txt file with the list of subjects to process
  60. cfg.hasBaseline = 1;
  61. cfg.posneg=0;
  62. cfg.overwrite=1;
  63. base=uint8(imread('bodySPM_base2.png'));
  64. mask=uint8(imread('bodySPM_base3.png'));
  65. mask=mask*.85;
  66. base2=base(10:531,33:203,:);
  67. in_mask=find(mask>128);
  68. subjects=textread(cfg.list,'%s');
  69. Nsubj=size(subjects,1);
  70. allTimes=zeros(cfg.Nstimuli,2,Nsubj);
  71. tocheck=zeros(Nsubj,1);
  72. tocheck3=[];
  73. for ns=1:Nsubj
  74. subjID=subjects{ns,:};
  75. disp(['Processing subject ' subjID ' which is number ' num2str(ns) ' out of ' num2str(Nsubj)]);
  76. if(cfg.overwrite==0)
  77. matname=[cfg.outdata '/' subjID '.mat'];
  78. if(exist(matname)==2)
  79. a=load(matname);
  80. allTimes(:,:,ns)=a.times;
  81. disp('Already preprocessed, no overwrite')
  82. continue;
  83. end
  84. end
  85. try
  86. a=bodySPM_load([cfg.datapath '/' subjID '/'],2);
  87. S=length(a);
  88. if( S ~= cfg.Nstimuli)
  89. disp('Mismatch between expected number of trials and loaded trials')
  90. end
  91. resmat=zeros(522,171,cfg.Nstimuli);
  92. times=zeros(S,2);
  93. % go through each stimulus
  94. for n=1:S
  95. T=length(a(n).paint(:,2));
  96. over=zeros(size(base,1),size(base,2));
  97. for t=1:T
  98. y=ceil(a(n).paint(t,3)+1);
  99. x=ceil(a(n).paint(t,2)+1);
  100. if(x<=0) x=1; end
  101. if(y<=0) y=1; end
  102. if(x>=900) x=900; end
  103. if(y>=600) y=600; end
  104. over(y,x)=over(y,x)+1;
  105. end
  106. %Smoothing
  107. h=fspecial('gaussian',[15 15],5);
  108. over=imfilter(over,h);
  109. M1=1;
  110. M2=1;
  111. if(cfg.posneg==1)
  112. M2=0;
  113. end
  114. if(cfg.posneg==-1)
  115. M1=0;
  116. M2=-1;
  117. end
  118. over2=M1*over(10:531,33:203,:)-M2*over(10:531,696:866,:);
  119. resmat(:,:,n)=over2;
  120. % times vector, the first one is the amount of time in milliseconds, the second one is the total number of pixels painted
  121. if(size(a(n).paint,1)>0 && size(a(n).mouse,1)>0)
  122. times(n,1)=a(n).mouse(end,1)-a(n).mouse(1,1);
  123. else
  124. tocheck(ns)=tocheck(ns)+1;
  125. times(n,1)=0;
  126. end
  127. times(n,2)=T;
  128. end
  129. matname=[cfg.outdata subjID '.mat'];
  130. save (matname, 'resmat','times');
  131. % store all times for diagnostic purposes
  132. allTimes(:,:,ns)=times;
  133. %% visualize subject's data
  134. M=max(abs(resmat(:))); % max range for colorbar
  135. NumCol=64;
  136. hotmap=hot(NumCol);
  137. coldmap=flipud([hotmap(:,3) hotmap(:,2) hotmap(:,1) ]);
  138. hotcoldmap=[
  139. coldmap
  140. hotmap
  141. ];
  142. % visualize all responses for each subject into a grid of numcolumns
  143. plotcols = 5; %set as desired
  144. plotrows = 3;%ceil((NC+1)/plotcols); % number of rows is equal to number of conditions+1 (for the colorbar)
  145. for n=1:S%NC
  146. figure(ns)
  147. set(gcf, 'Visible', 'on');
  148. subplot(plotrows,plotcols,n)
  149. imagesc(base2);
  150. axis('off');
  151. set(gcf,'Color',[1 1 1],'Position', [200, 200, 1000, 800]);
  152. hold on;
  153. over2=resmat(:,:,n);
  154. fh=imagesc(over2,[-M,M]);
  155. axis('off');
  156. axis equal
  157. colormap(hotcoldmap);
  158. set(fh,'AlphaData',mask)
  159. title(labels(n),'FontSize',12)
  160. sgtitle(subjID)
  161. if(n==S) %(n==NC)
  162. subplot(plotrows,plotcols,n+1)
  163. fh=imagesc(ones(size(base2)),[-M,M]);
  164. axis('off');
  165. colorbar;
  166. % save a screenshot, useful for quality control (commented)
  167. saveas(gcf,[cfg.outdata subjID '.png'])
  168. end
  169. end
  170. clf
  171. catch
  172. disp(['Sth is wrong with subject ' subjID ' which is number ' num2str(ns) ' out of ' num2str(Nsubj)])
  173. tocheck3=[tocheck3;ns];
  174. end
  175. end
  176. tocheck2 =[];
  177. for i=1:length(tocheck)
  178. if tocheck(i)~= 0
  179. tocheck2 =[tocheck2;i];
  180. end
  181. end
  182. bspm=cfg;
  183. bspm.allTimes=allTimes;
  184. bspm.tocheck=tocheck;
  185. bspm.tocheck2=tocheck2;
  186. bspm.tocheck3=tocheck3;
  187. save([cfg.outdata '/bspm.mat'], 'bspm')
  188. %% 3. Quality control and filtering
  189. % find the number of stimuli painted by each subjects
  190. B = squeeze(bspm.allTimes(:,2,:)); %squeezing pos and neg matrices
  191. B(B==0) = NaN; %I'm replacing all zero's with NaN --> cause zeros means that nothing has been painted
  192. npainted = sum(~isnan(B));
  193. figure
  194. subplot(2,1,1)
  195. stem(npainted);
  196. xticks(1:(length(subjects)))
  197. set(gca, 'XTickLabel', subjects','fontsize',10);
  198. xtickangle(30)
  199. title('N pained Body Maps', 'Fontsize', 20)
  200. subplot(2,1,2)
  201. [sortedB, sortedI] = sort(npainted);
  202. stem(sortedB);
  203. xticks(1:(length(subjects)))
  204. sortedL = subjects(sortedI)';
  205. set(gca, 'Xticklabel',sortedL,'fontsize',10);
  206. xtickangle(30)
  207. title('N pained Body Maps - Ascending', 'Fontsize', 20)
  208. M = mean(nonzeros(npainted));
  209. Std = std(nonzeros(npainted));
  210. thr_std = 0.5*length(labels);
  211. disp(['Mean N BSMs pained: ' num2str(M) ' +/- ' num2str(Std) '. Threshold to accept is ' num2str(thr_std)]);
  212. disp(['Min N BSMs pained is: ' num2str(min(nonzeros(npainted)))]);
  213. ids=find(npainted>=thr_std);
  214. exc=find(npainted<thr_std);
  215. out=[];
  216. for i = 1:length(ids)
  217. out{i,1}=subjects{ids(i)};
  218. end
  219. % Descriptive stats in kept subjects
  220. Descr(1,1) = mean(nonzeros(npainted(ids)));
  221. Descr(1,2) = std(nonzeros(npainted(ids)));
  222. Descr(1,3) = min(nonzeros(npainted(ids)));
  223. % saving the list of participants to inlude in the analysis
  224. fileID=fopen([cfg.outdata 'whitelist.txt'],'w');
  225. for i=1:length(out)
  226. fprintf(fileID,'%s\n',[out{i}]);
  227. end
  228. fclose(fileID);
  229. cfg.whitelist = [cfg.outdata 'whitelist.txt'];
  230. %% 4. Identyfy groups
  231. % comparing BSMs between groups
  232. numArray = str2double(out);
  233. subjects=textread(cfg.whitelist,'%s');
  234. numArray = str2double(subjects);
  235. g1 = find(numArray<200); %FM
  236. g2 = find(numArray>199); %CO
  237. cfg.g1=g1; %FM
  238. cfg.g2=g2; %Control
  239. %% 5. Total pixels painted analysis
  240. % Exploring the coverage of embodiment.
  241. TPP = bodySPM_global_rev(cfg);
  242. save([cfg.outdata '/TPP.mat'],'TPP')
  243. %excluding pain today
  244. labels2 = labels;
  245. labels2(10) = [];
  246. scr_siz = get(0,'ScreenSize') ;
  247. %bar plot
  248. figure
  249. set(gcf,'Color',[1 1 1]); %,'Position', [200, 200, 1400, 800]);
  250. data = [mean((TPP.tpp(:,g1)/50291),2), mean((TPP.tpp(:,g2)/50291),2)];
  251. data(10,:) = []; %excluding pain today from vizualization
  252. k = bar(data);
  253. k(1).FaceColor = [0.4961 0.7461 0.4805]; %green FM
  254. k(2).FaceColor = [0.6836 0.5508 0.7617]; %purple CO
  255. %ylabel(cases(c),'fontsize',14)
  256. ylabel('Proportion of body coloured','fontsize',14)
  257. ylim([0 1])
  258. % errhigh = [std(TPP.tpp(:,g1)'/50291)', std(TPP.tpp(:,g2)'/50291)']; %std
  259. errhigh = [std(TPP.tpp(:,g1)'/50291)'/sqrt(length(TPP.tpp(:,g1)')),...
  260. std(TPP.tpp(:,g2)'/50291)'/sqrt(length(TPP.tpp(:,g2)'))]; %SE
  261. errhigh(10,:) = [];
  262. hold on
  263. [ngroups,nbars] = size(data);
  264. x = nan(nbars, ngroups);
  265. for i = 1:nbars
  266. x(i,:) = k(i).XEndPoints;
  267. end
  268. hold on
  269. errorbar(x',data,errhigh,'k','linestyle','none');
  270. legend([k(1),k(2)],'FM','CO')
  271. set(gca, 'Xticklabel',labels2,'fontsize',12)
  272. xtickangle(30)
  273. title('Body image coverage','fontsize',14)
  274. hold off
  275. saveas(gcf,[cfg.outdata '/PPP_SE.png'])
  276. % 2-way Interaction Type x Group plot
  277. Act = mean(TPP.tppPOS(:,:)/50291,1)';
  278. Dea = mean(TPP.tppNEG(:,:)/50291,1)';
  279. figure
  280. set(gcf,'Color',[1 1 1]); %,'Position', [200, 200, 1400, 800]);
  281. data = [mean(Act(g1),'all','omitnan'), mean(Act(g2),'all','omitnan');...
  282. mean(Dea(g1),'all','omitnan'), mean(Dea(g2),'all','omitnan')];
  283. k = bar(data);
  284. k(1).FaceColor = [0.4961 0.7461 0.4805]; %green FM
  285. k(2).FaceColor = [0.6836 0.5508 0.7617]; %purple CO
  286. ylabel('PPP','fontsize',14)
  287. ylim([0 0.6])
  288. set(gca, 'Xticklabel',{'Activations', 'Deactivations'},'fontsize',14)
  289. errhigh = [std(Act(g1)) std(Act(g2));std(Dea(g1)) std(Dea(g2))];
  290. hold on
  291. [ngroups,nbars] = size(data);
  292. x = nan(nbars, ngroups);
  293. for i = 1:nbars
  294. x(i,:) = k(i).XEndPoints;
  295. end
  296. allData = {Act(g1),Act(g2),...
  297. Dea(g1),Dea(g2)};
  298. spread = 0.1; % 0=no spread; 0.5=random spread within box bounds (can be any value)
  299. for i = 1:numel(allData)
  300. p = plot(rand(size(allData{i}))*spread -(spread/2) + x(i), allData{i}, 'o','MarkerEdgeColor',[0.5 0.5 0.5]);
  301. end
  302. hold on
  303. e = errorbar(x',data,errhigh,'k','linestyle','none');
  304. hold off
  305. legend([k,p,e],'FM','CNT')
  306. saveas(gcf,[cfg.outdata '/PPP_2way_interaction.png'])
  307. % save coverage information
  308. grouping = [repmat(1,length(g1),1);repmat(2,length(g2),1)];
  309. Table = array2table([numArray,(TPP.tpp'),grouping],'VariableNames',['subjectNo',labels','group']);
  310. writetable(Table,[cfg.outdata 'PPP.csv'])
  311. %% 6. Load data
  312. Nsubj=size(subjects,1);
  313. for ns=1:Nsubj
  314. disp(['Processing subject ' subjects{ns} ' which is number ' num2str(ns) ' out of ' num2str(Nsubj)]);
  315. %matname=[cfg.outdata subjects{ns} '.mat'];
  316. matname = fullfile(cfg.outdata, [num2str(subjects{ns}) '.mat']);
  317. load (matname) % 'resmat','times'
  318. tempdata=reshape(resmat,[],size(resmat,3));
  319. if(ns==1)
  320. alldata=zeros(length(in_mask),Nsubj,size(tempdata,2));
  321. end
  322. alldata(:,ns,:)=tempdata(in_mask,:);
  323. end
  324. outfile = fullfile(cfg.outdata, 'alldata.mat');
  325. save(outfile, 'alldata');
  326. %% 7. Calculate mean intensity
  327. meanIntensity = zeros(size(alldata,2),size(alldata,3)); %no subjects x no emotions
  328. for ns=1:Nsubj
  329. for e = 1:cfg.Nstimuli
  330. map = abs(alldata(:,ns,e));
  331. %find non-zero pixels
  332. validPixels = map(map ~= 0);
  333. %sum of intensity
  334. meanIntensity(ns,e) = sum(validPixels)/numel(validPixels);
  335. end
  336. end
  337. Table = array2table([numArray,(meanIntensity),grouping],'VariableNames',['subjectNo',labels','group']);
  338. writetable(Table,[cfg.outdata 'Intensity.csv'])
  339. % bar plot - intensity
  340. figure
  341. set(gcf,'Color',[1 1 1]); %,'Position', [200, 200, 1400, 800]);
  342. data = [nanmean(meanIntensity(g1,:),1)', nanmean(meanIntensity(g2,:),1)'];
  343. k = bar(data);
  344. k(1).FaceColor = [0.4961 0.7461 0.4805]; %green FM
  345. k(2).FaceColor = [0.6836 0.5508 0.7617]; %purple CO
  346. %ylabel(cases(c),'fontsize',14)
  347. ylabel('Colouring intensity','fontsize',14)
  348. %ylim([0 1])
  349. errhigh = [nanstd(meanIntensity(g1,:))', nanstd(meanIntensity(g2,:))'];
  350. hold on
  351. [ngroups,nbars] = size(data);
  352. x = nan(nbars, ngroups);
  353. for i = 1:nbars
  354. x(i,:) = k(i).XEndPoints;
  355. end
  356. hold on
  357. errorbar(x',data,errhigh,'k','linestyle','none');
  358. legend([k(1),k(2)],'FM','CN','Location','northwest')
  359. set(gca, 'Xticklabel',labels,'fontsize',12)
  360. xtickangle(30)
  361. %title('Painting ','fontsize',14)
  362. hold off
  363. saveas(gcf,[cfg.outdata '/Painting_Intensity.png'])
  364. %% 8. Nonparametric body-maps analysis
  365. %Analysis for small sample sizes (N < 40 per group).
  366. %The analysis modeled after:
  367. %Torregrossa LJ, Snodgress MA, Hong SJ, Nichols HS, Glerean E, Nummenmaa L,
  368. %Park S. Anomalous Bodily Maps of Emotions in Schizophrenia. Schizophr
  369. %Bull. 2019 Sep 11;45(5):1060-1067. doi: 10.1093/schbul/sby179. PMID:
  370. %30551180; PMCID: PMC6737484.
  371. groups = {'FM', 'Control'};
  372. num_groups = length(groups);
  373. num_subjects = size(alldata, 2);
  374. num_emotions = size(alldata, 3);
  375. body_map_size = size(alldata,1);
  376. % Initialize matrices to store group maps
  377. activation_maps = zeros([body_map_size, num_emotions, num_groups]);
  378. deactivation_maps = zeros([body_map_size, num_emotions, num_groups]);
  379. for group_id = 1:num_groups
  380. if strcmp(groups{group_id}, 'FM')
  381. g = g1;
  382. else
  383. g=g2;
  384. end
  385. activation_sum = zeros(body_map_size,num_emotions);
  386. deactivation_sum = zeros(body_map_size,num_emotions);
  387. for subject_id = 1:length(g)
  388. map = alldata(:,g(subject_id),:);
  389. map = squeeze(map);
  390. % Count activation and deactivation
  391. activation_sum = activation_sum + (map > 0);
  392. deactivation_sum = deactivation_sum + (map < 0);
  393. end
  394. % Compute proportions
  395. activation_maps(:, :, group_id) = activation_sum / length(g);
  396. deactivation_maps(:, :, group_id) = deactivation_sum / length(g);
  397. end
  398. % Combine activation and deactivation maps for each group
  399. product_maps = (activation_maps - deactivation_maps) .* (activation_maps + deactivation_maps);
  400. D = zeros([body_map_size, num_emotions, num_groups]);
  401. D(:,:,1) = activation_maps(:, :, 2)- activation_maps(:, :, 1); % Activations CO - FM (FM green)
  402. D(:,:,2) = deactivation_maps(:, :, 2)- deactivation_maps(:, :, 1); % Deactivations Co - FM
  403. disp(['Max endorsement FM = ' num2str(max(abs(product_maps(:,:,1)),[],'all')) ' Max endorsement Control = ' num2str(max(abs(product_maps(:,:,2)),[],'all'))])
  404. % Visualization
  405. base=uint8(imread('bodySPM_base2.png'));
  406. mask=uint8(imread('bodySPM_base3.png'));
  407. mask=mask*.85;
  408. in_mask=find(mask>128);
  409. base2=base(10:531,33:203,:);
  410. %Product map
  411. NumCol=21;
  412. non_sig=1;
  413. hotmap=hot(NumCol-non_sig);
  414. coldmap=flipud([hotmap(:,3) hotmap(:,2) hotmap(:,1) ]);
  415. hotcoldmap=[
  416. coldmap
  417. zeros(2*non_sig,3)+0.3; %grey background
  418. hotmap
  419. ];
  420. M=max(abs(product_maps(:)));
  421. figure;
  422. set(gcf,'Color',[1 1 1],'Position', [100, 100, 1200, 380]);
  423. i=0;
  424. for group_id = 1:num_groups
  425. for emotion_id = 1:num_emotions
  426. i=i+1;
  427. temp=zeros(size(mask));
  428. temp(in_mask)=product_maps(:,emotion_id,group_id);
  429. subplot(2,num_emotions,i)
  430. %imagesc(temp);
  431. h=imagesc(temp,[-M M]);
  432. set(h,'AlphaData',mask)
  433. colormap(hotcoldmap)
  434. axis('off');
  435. axis equal
  436. if i==1
  437. text(-100, 250, 'FM', 'Fontsize', 12, 'FontWeight', 'bold', 'HorizontalAlignment','center','Rotation', 90);
  438. elseif i==num_emotions+1
  439. text(-100, 220, 'Control', 'Fontsize', 12, 'FontWeight', 'bold', 'HorizontalAlignment','center','Rotation', 90);
  440. end
  441. box off
  442. lbl = labels{emotion_id};
  443. lbl = strrep(lbl, ' ', newline);
  444. if group_id == 1
  445. title(lbl, 'FontSize', 12);
  446. end
  447. % if group_id == 1
  448. % title(labels(emotion_id),'fontsize',12);
  449. % end
  450. end
  451. end
  452. h = colorbar;
  453. h.Position = [0.93 0.1 0.02 0.8];
  454. saveas(gcf,[cfg.outdata 'Products_maps_by_group.png'])
  455. % Difference maps
  456. map=cbrewer('div','PiYG',21);
  457. map=flipud(map);
  458. map(11,:)=[.3 .3 .3];
  459. M=max(abs(D(:)));
  460. figure
  461. set(gcf,'Color',[1 1 1],'Position', [100, 100, 1200, 380]);
  462. i=0;
  463. for group_id = 1:num_groups
  464. for emotion_id = 1:num_emotions
  465. i=i+1;
  466. temp=zeros(size(mask));
  467. temp(in_mask)=D(:,emotion_id,group_id);
  468. subplot(2,num_emotions,i)
  469. h=imagesc(temp,[-M M]);
  470. set(h,'AlphaData',mask)
  471. colormap(map)
  472. axis('off');
  473. axis equal
  474. if i==1
  475. text(-100, 200, 'Activations', 'Fontsize', 12, 'FontWeight', 'bold', 'HorizontalAlignment','center','Rotation', 90);
  476. elseif i==num_emotions+1
  477. text(-100, 200, 'Deactivations', 'Fontsize', 12, 'FontWeight', 'bold', 'HorizontalAlignment','center','Rotation', 90);
  478. end
  479. box off
  480. title(labels(emotion_id),'fontsize',12);
  481. end
  482. end
  483. h = colorbar;
  484. h.Position = [0.93 0.1 0.02 0.8];
  485. saveas(gcf,[cfg.outdata 'Difference_maps.png'])
  486. %Legend: Group difference maps for bodily sensation of emotions. Magenta
  487. %represents regions where CO consistently reported more activation (top),
  488. %or deactivation (bottom) than FM. Green represents regions where FM
  489. %consistently reported more activation (top), or deactivation (bottom) than
  490. %CO. The color bar represents the difference between FM and CO in pixel
  491. %values.
  492. %% 9. Cosine simmilarity
  493. % To what extent are group-level BSMs similar to each other?
  494. % Based on Herman et al 2024: 10.1111/adb.13364
  495. CS_FM = zeros(cfg.Nstimuli-1); % cosine similarity for FM
  496. CS_CO = zeros(cfg.Nstimuli-1); % cosine similarity for CO
  497. CS = zeros(cfg.Nstimuli-1); % cosine similarity of both
  498. %taking out pain today as it is not relevant for CO
  499. product_maps2 = product_maps;
  500. product_maps2(:,10,:) = [];
  501. labels2 = labels;
  502. labels2(10) = [];
  503. for e = 1:cfg.Nstimuli-1
  504. for f = 1:cfg.Nstimuli-1
  505. CS_FM(e,f) = getCosineSimilarity(product_maps2(:,e,1),product_maps2(:,f,1));
  506. CS_CO(e,f) = getCosineSimilarity(product_maps2(:,e,2),product_maps2(:,f,2));
  507. CS(e,f) = getCosineSimilarity(product_maps2(:,e,1),product_maps2(:,f,2));
  508. end
  509. end
  510. save([cfg.outdata '/CSs.mat'],'CS_FM','CS_CO','CS');
  511. %Cosine figure
  512. figure
  513. set(gcf,'Color',[1 1 1],'Position', [200, 200, 900, 600]);
  514. subplot(2,2,1)
  515. imagesc(CS_FM); % Display correlation matrix as an image
  516. set(gca, 'XTick', 1:cfg.Nstimuli-1); % center x-axis ticks on bins
  517. set(gca, 'YTick', 1:cfg.Nstimuli-1); % center y-axis ticks on bins
  518. set(gca, 'XTickLabel', labels2, 'FontSize', 11); % set x-axis labels
  519. xtickangle(45)
  520. set(gca, 'YTickLabel', labels2, 'FontSize', 11); % set y-axis labels
  521. title('FM', 'FontSize', 14); % set title
  522. colormap('jet'); % Choose jet or any other color scheme
  523. colorbar;
  524. caxis([-1 1])
  525. subplot(2,2,2)
  526. imagesc(CS_CO); % Display correlation matrix as an image
  527. set(gca, 'XTick', 1:cfg.Nstimuli-1); % center x-axis ticks on bins
  528. set(gca, 'YTick', 1:cfg.Nstimuli-1); % center y-axis ticks on bins
  529. set(gca, 'XTickLabel', labels2, 'FontSize', 11); % set x-axis labels
  530. xtickangle(45)
  531. set(gca, 'YTickLabel', labels2, 'FontSize', 11); % set y-axis labels
  532. title('CO', 'FontSize', 14); % set title
  533. colormap('jet'); % Choose jet or any other color scheme
  534. caxis([-1 1])
  535. colorbar;
  536. subplot(2,2,3)
  537. imagesc(CS); % Display correlation matrix as an image
  538. set(gca, 'XTick', 1:cfg.Nstimuli-1); % center x-axis ticks on bins
  539. set(gca, 'YTick', 1:cfg.Nstimuli-1); % center y-axis ticks on bins
  540. set(gca, 'XTickLabel', labels2, 'FontSize', 10); % set x-axis labels
  541. xtickangle(45)
  542. set(gca, 'YTickLabel', labels2, 'FontSize', 10); % set y-axis labels
  543. xlabel('Control')
  544. ylabel('FM')
  545. title('FM:CO', 'FontSize', 14); % set title
  546. colormap('jet'); % Choose jet or any other color scheme
  547. caxis([-1 1])
  548. colorbar;
  549. subplot(2,2,4)
  550. DCS=CS_FM-CS_CO;
  551. imagesc(DCS); % Display correlation matrix as an image
  552. set(gca, 'XTick', 1:cfg.Nstimuli-1); % center x-axis ticks on bins
  553. set(gca, 'YTick', 1:cfg.Nstimuli-1); % center y-axis ticks on bins
  554. set(gca, 'XTickLabel', labels2, 'FontSize', 11); % set x-axis labels
  555. xtickangle(45)
  556. set(gca, 'YTickLabel', labels2, 'FontSize', 11); % set y-axis labels
  557. title('Difference: FM > CO', 'FontSize', 14); % set title
  558. map=cbrewer('div','PiYG',101);
  559. map=flip(map); % flip map so that green detones greater FM
  560. map=flipud(map);
  561. colormap(gca,map);
  562. m = round(max(abs(DCS),[],'all'),1);
  563. caxis([-m m]);
  564. hcb3=colorbar;
  565. saveas(gcf,[cfg.outdata '/Cosine_simmilarity.png'])
  566. pos = length(find(tril(DCS,-1)>0));
  567. total = (length(labels2)*length(labels2)-length(labels2))/2;
  568. disp(['FM had greater cosine similarity for ' num2str(pos) ' out of ' num2str(total) ' BSMs pairs than CO.']);
  569. figure
  570. set(gcf,'Color',[1 1 1]);
  571. b=diag(CS,0);
  572. [sortedB, sortedI] = sort(b,'descend');
  573. bar(sortedB,'k');
  574. sortedL = labels2(sortedI);
  575. set(gca, 'Xticklabel',sortedL,'fontsize',14);
  576. % get(gca,'OuterPosition')
  577. % set(gca,'OuterPosition',[0.3781 0.05 0.5822 1.0000])
  578. xlim([0 length(labels2)+1])
  579. set(gca,'xtick',1:length(labels2),'fontsize',12)
  580. xtickangle(30)
  581. ylabel('Cosine similarity','fontsize',14)
  582. box off
  583. saveas(gcf,[cfg.outdata '/Cosine_simmilarity_diag.png'])
  584. disp(['Average cosine simmilarity ' num2str(mean(b))]);
  585. %% 10. LDA - revised
  586. % Are BSMs of emotions unique in each group? Can the algoryth correctly
  587. % classify them?
  588. for ns=1:length(subjects)
  589. subjID=subjects{ns,:};
  590. disp(['Processing subject ' subjID ' which is number ' num2str(ns) ' out of ' num2str(length(subjects))]);
  591. matname=[cfg.outdata '/' subjID '.mat'];
  592. load (matname) % 'resmat','times'
  593. all_data(:,:,:,ns) = resmat;
  594. end
  595. all_data = all_data(:,:,(1:cfg.Nstimuli),:);
  596. all_data = all_data(:,:,[1:9,11:end],:);
  597. % for FM only
  598. [FM_confusion, FM_accuracy, FM_ids, FM_subject_acc] = calc_model_rev(all_data(:,:,:,g1), labels2);
  599. save([cfg.outdata '/LDA_FM_rev_k5.mat'],'FM_confusion', 'FM_accuracy', 'FM_ids', 'FM_subject_acc');
  600. % Control only
  601. [CO_confusion, CO_accuracy, CO_ids, CO_subject_acc] = calc_model_rev(all_data(:,:,:,g2), labels2);
  602. save([cfg.outdata '/LDA_CO_rev_k5.mat'],'CO_confusion', 'CO_accuracy', 'CO_ids', 'CO_subject_acc');
  603. Chance_Level = round(100/length(labels2));
  604. mean_acc_FM = mean(FM_accuracy)*100;
  605. disp(['For FM Chance Level = ' num2str(Chance_Level) '%. Mean classification accuracy is ' num2str(mean_acc_FM)]);
  606. % One-sample t-tests
  607. FM_subj_mean = mean(FM_subject_acc, 2);
  608. CO_subj_mean = mean(CO_subject_acc, 2);
  609. chance = round(100/length(labels2));
  610. [h_FM, p_FM, ci_FM, stats_FM] = ttest(FM_subj_mean, chance);
  611. disp(['FM t-test vs chance: p = ' num2str(p_FM)]);
  612. disp(stats_FM);
  613. [h_CO, p_CO, ci_CO, stats_CO] = ttest(CO_subj_mean, chance);
  614. disp(['CO t-test vs chance: p = ' num2str(p_CO)]);
  615. disp(stats_CO);
  616. % PERMUTATION TESTING
  617. % FM group
  618. [p_FM, null_FM, acc_FM, thr95_FM, thr99_FM] = ...
  619. permutation_test_LDA(all_data(:,:,:,g1), labels2, 1000);
  620. % CO group
  621. [p_CO, null_CO, acc_CO, thr95_CO, thr99_CO] = ...
  622. permutation_test_LDA(all_data(:,:,:,g2), labels2, 1000);
  623. % Plot it
  624. figure;
  625. tiledlayout(1,2)
  626. nexttile %FM
  627. histogram(null_FM, 30);
  628. hold on;
  629. xline(acc_FM, 'r', 'LineWidth', 2);
  630. xline(thr95_FM, '--k');
  631. title('Permutation test - FM');
  632. xlabel('Accuracy');
  633. ylabel('Frequency');
  634. nexttile % CO
  635. histogram(null_CO, 30);
  636. hold on;
  637. xline(acc_CO, 'r', 'LineWidth', 2);
  638. xline(thr95_CO, '--k');
  639. title('Permutation test - CO');
  640. xlabel('Accuracy');
  641. ylabel('Frequency');
  642. % check for differences:
  643. all_acc = [FM_subject_acc; CO_subject_acc];
  644. nFM = size(FM_subject_acc,1);
  645. labels = [ones(nFM,1); zeros(size(CO_subject_acc,1),1)];
  646. obs_diff = mean(FM_subject_acc(:)) - mean(CO_subject_acc(:));
  647. n_perm = 1000;
  648. perm_diff = zeros(n_perm,1);
  649. for i = 1:n_perm
  650. perm_labels = labels(randperm(length(labels2)));
  651. FM_perm = all_acc(perm_labels == 1,:);
  652. CO_perm = all_acc(perm_labels == 0,:);
  653. perm_diff(i) = mean(FM_perm(:)) - mean(CO_perm(:));
  654. end
  655. p_group = (sum(abs(perm_diff) >= abs(obs_diff)) + 1) / (n_perm + 1);
  656. %get the results:
  657. chance = 1 / length(labels2); % e.g., 1/12
  658. fprintf('\n--- FM ---\n');
  659. fprintf('Accuracy: %.3f (%.1f%%)\n', acc_FM, acc_FM*100);
  660. fprintf('Chance: %.3f (%.1f%%)\n', chance, chance*100);
  661. fprintf('p-value: %.4f\n', p_FM);
  662. fprintf('95%% threshold: %.3f\n', thr95_FM);
  663. fprintf('99%% threshold: %.3f\n', thr99_FM);
  664. fprintf('\n--- CO ---\n');
  665. fprintf('Accuracy: %.3f (%.1f%%)\n', acc_CO, acc_CO*100);
  666. fprintf('Chance: %.3f (%.1f%%)\n', chance, chance*100);
  667. fprintf('p-value: %.4f\n', p_CO);
  668. fprintf('95%% threshold: %.3f\n', thr95_CO);
  669. fprintf('99%% threshold: %.3f\n', thr99_CO);
  670. fprintf('group differences p-val: %.3f\n', p_group);
  671. % ANCOVA with permutations (correcting for education and socioeconomic
  672. % status)
  673. all_acc = [FM_subject_acc; CO_subject_acc];
  674. nFM = size(FM_subject_acc,1);
  675. group = [ones(nFM,1); zeros(size(CO_subject_acc,1),1)];
  676. [nSubj, nLabels] = size(all_acc);
  677. z_edu = zscore(edu);
  678. z_ses = zscore(ses);
  679. % Remove covariance effects for group effect
  680. subj_mean = mean(all_acc,2);
  681. Xcov_group = [ones(nSubj,1), z_edu, z_ses];
  682. b_group = Xcov_group \ subj_mean;
  683. % residualised subject-level accuracy
  684. subj_mean_adj = subj_mean - Xcov_group(:,2:end) * b_group(2:end);
  685. % Main effect of GROUP
  686. obs_group = mean(subj_mean_adj(group==1)) - ...
  687. mean(subj_mean_adj(group==0));
  688. % permutation test
  689. n_perm = 1000;
  690. perm_group_stat = zeros(n_perm,1);
  691. for p = 1:n_perm
  692. perm_group = group(randperm(nSubj));
  693. perm_group_stat(p) = ...
  694. mean(subj_mean_adj(perm_group==1)) - ...
  695. mean(subj_mean_adj(perm_group==0));
  696. end
  697. p_group = ...
  698. (sum(abs(perm_group_stat) >= abs(obs_group)) + 1) ...
  699. / (n_perm + 1);
  700. disp(['Main effect of GROUP p = ' num2str(p_group)]);
  701. % Main effect of BODYMAP
  702. Xcov = [ones(nSubj,1), z_edu, z_ses];
  703. Y_adj = zeros(size(all_acc));
  704. for lab = 1:nLabels
  705. y = all_acc(:,lab);
  706. b = Xcov \ y;
  707. % residualise covariates
  708. Y_adj(:,lab) = y - Xcov(:,2:end) * b(2:end);
  709. end
  710. label_means = mean(Y_adj,1);
  711. obs_label = sum((label_means - mean(label_means)).^2);
  712. perm_label_stat = zeros(n_perm,1);
  713. for p = 1:n_perm
  714. Y_perm = zeros(size(Y_adj));
  715. % permute labels WITHIN subjects
  716. for s = 1:nSubj
  717. Y_perm(s,:) = Y_adj(s, randperm(nLabels));
  718. end
  719. perm_label_means = mean(Y_perm,1);
  720. perm_label_stat(p) = ...
  721. sum((perm_label_means - mean(perm_label_means)).^2);
  722. end
  723. p_label = ...
  724. (sum(perm_label_stat >= obs_label) + 1) ...
  725. / (n_perm + 1);
  726. disp(['Main effect of BODYMAP p = ' num2str(p_label)]);
  727. % INTERACTION
  728. FM_mean = mean(Y_adj(group==1,:),1);
  729. CO_mean = mean(Y_adj(group==0,:),1);
  730. obs_interaction = FM_mean - CO_mean;
  731. obs_interaction_stat = sum(obs_interaction.^2);
  732. perm_interaction_stat = zeros(n_perm,1);
  733. for p = 1:n_perm
  734. perm_group = group(randperm(nSubj));
  735. FM_perm = mean(Y_adj(perm_group==1,:),1);
  736. CO_perm = mean(Y_adj(perm_group==0,:),1);
  737. perm_diff = FM_perm - CO_perm;
  738. perm_interaction_stat(p) = sum(perm_diff.^2);
  739. end
  740. p_interaction = ...
  741. (sum(perm_interaction_stat >= obs_interaction_stat) + 1) ...
  742. / (n_perm + 1);
  743. disp(['INTERACTION p = ' ...
  744. num2str(p_interaction)]);
  745. %Variance explainced:
  746. subj_mean = mean(all_acc,2);
  747. mdl = fitlm([edu ses], subj_mean);
  748. disp(mdl.Rsquared)
  749. % Calculate PCA variance CV
  750. [mean_explained_FM, cumvar_FM] = ...
  751. calc_pca_variance(all_data(:,:,:,g1), labels2);
  752. [mean_explained_CO, cumvar_CO] = ...
  753. calc_pca_variance(all_data(:,:,:,g2), labels2);
  754. cumvar_5FM = cumvar_FM(5);
  755. cumvar_5CO = cumvar_CO(5);
  756. fprintf('FM: Variance explained by 5 PCs = %.2f%%\n', cumvar_5FM);
  757. fprintf('CO: Variance explained by 5 PCs = %.2f%%\n', cumvar_5CO);
  758. fprintf('FM: Variance explained by 30 PCs = %.2f%%\n', cumvar_FM(30));
  759. fprintf('CO: Variance explained by 30 PCs = %.2f%%\n', cumvar_CO(30));
  760. % Plot confusion matrix
  761. cm = CO_confusion{:,:};
  762. row_sums = sum(cm, 2);
  763. rev_ct = cm .* 100 ./ row_sums;
  764. global_max = max(rev_ct(:));
  765. fprintf('CO global max is %.2f%%\n', global_max);
  766. limits2 = [0 round(global_max)];
  767. figure;
  768. fig = gcf;
  769. fig.Position = [100 100 1500 600]; % wider figure, adjust as needed
  770. tiledlayout(1,2, 'Padding', 'compact', 'TileSpacing', 'compact');
  771. ax1 = nexttile;
  772. confusion_matrix_perc_v2(FM_confusion, labels2, limits2, ax1);
  773. title(ax1, 'A. Fibromyalgia Group');
  774. ax2 = nexttile;
  775. confusion_matrix_perc_v2(CO_confusion, labels2, limits2, ax2);
  776. title(ax2, 'B. Control Group');
  777. saveas(gcf,[cfg.outdata '/Confusion_matrix_rev.png'])

PAID embody analysis.m, no license · at the source

Overview

Authors: Aleksandra M Herman1,2,3, Julia Szczawińska1, Carolyn Berryman2,4,5,6, Tasha R Stanton2,3
  1. Laboratory of Brain Imaging, Nencki Institute of Experimental Biology of the Polish Academy of Sciences, Pasteur 3 St, Warsaw, Poland
  2. IIMPACT in Health, Adelaide University, Adelaide, South Australia Australia
  3. Persistent Pain Research Group, Hopwood Centre for Neurobiology, Lifelong Health Theme, South Australian Health and Medical Research Institute (SAHMRI), Adelaide, South Australia Australia
  4. Brain Stimulation, Imaging and Cognition Research Group, College of Health, Adelaide University, Adelaide, SA Australia
  5. Hopwood Centre for Neurobiology, South Australian Health and Medical Research Institute, Adelaide, SA Australia
  6. Women’s and Children’s Hospital, Adelaide, SA Australia
Journal: Psychological research, volume 90, issue 4, article 125
Dates: received 4 February 2026; accepted 25 June 2026; published online 2 July 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1007/s00426-026-02341-2 · PMID 42390617 · PMCID PMC13328158 · OpenAlex W7167021962
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), pain (population), cognitive (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Machine learning, Preprocessing, Connectivity, Physiology & signal measures
MeSH: Affective Symptoms*, Awareness*, Emotions*, Fibromyalgia*, Interoception*, Pain*, Adult, Cross-Sectional Studies, Female, Humans, Male, Middle Aged (* major topic)
Topic: Fibromyalgia and Chronic Fatigue Syndrome Research (Psychiatry and Mental health, Medicine), according to OpenAlex
Funding: European Commission (101059716)
Citations: not cited yet (Europe PMC); 74 references in the paper

Abstract

People with fibromyalgia often demonstrate hypersensitivity to benign bodily signals and misattribute non-noxious physical signals as pain, suggesting alterations in body-brain communication and interoception. However, little is known about whether altered body-brain communication may extend to misattribution of emotion as pain. Here, using a cross-sectional design, we aimed to investigate how individuals with fibromyalgia perceive, identify, and interpret emotions and other bodily sensations, including pain, compared to healthy controls. Across two independent studies, individuals with fibromyalgia and age- and gender-matched pain-free controls completed the emBODY task, which assesses the topography of bodily sensations experienced for different states (emotional states, neutral state, pain- and physiology-related states, fatigue). Additionally, participants completed assessments of alexithymia, bodily sensation interpretation, and interoception. In both studies, linear discriminant analysis, performed to test whether different emotions and states are associated with statistically distinct bodily patterns, indicated comparable classification accuracy of body sensation maps in the fibromyalgia group and controls. However, compared with controls, the fibromyalgia group showed higher levels of alexithymia, higher awareness of bodily signals, and more negative interpretation of ambiguous bodily sensations in daily life, together with greater self-reported interoceptive difficulties. Our findings support an amplified perception of bodily signals coupled with interoceptive difficulties in people with fibromyalgia. This raises the possibility that interventions that target perceptual retraining, and re-interpretation of bodily sensations might decrease the impact of pain and promote engagement in everyday activities for people with fibromyalgia.

Supplementary Information: The online version contains supplementary material available at https://doi.org/10.1007/s00426-026-02341-2.

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 1 match between paragraphs and lines of code.

OSF 4du3f

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Languages: MATLAB (6), R (2)
Size: 28 files, 8 scripts
Software Heritage: not checked
Found in: “Data availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Psychtoolbox (4 files), emmeans (2 files), ggplot2 (2 files), ggpubr (2 files), lme4 (2 files), tidyverse (2 files), Image Processing Toolbox (1 file), Statistics and Machine Learning Toolbox (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
8 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;
  • 8 scripts, each with its path and the digest of its content;
  • 1 match between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

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

Data

No dataset and no data link were found in the paper.

Data availability

Data and analyses scripts are available via Open Science Framework (OSF): < https://osf.io/4du3f/overview?view_only=9f346447658e465f896b02275ba712f8>.

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 2, 28 September 2026

  • Publisher: n/a → Springer Science+Business Media

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 12 MeSH terms, 1 funder, 61 references.

Cite

This paper

Herman, A. M., Szczawińska, J., Berryman, C., & Stanton, T. R. (2026). When emotions hurt: negative interpretations of bodily signals and interoceptive difficulties in fibromyalgia. Psychological research, 90(4), 125. https://doi.org/10.1007/s00426-026-02341-2

BibTeX

@article{herman2026when,
author = {Herman, Aleksandra M and Szczawińska, Julia and Berryman, Carolyn and Stanton, Tasha R},
title = {{When emotions hurt: negative interpretations of bodily signals and interoceptive difficulties in fibromyalgia}},
journal = {Psychological research},
year = {2026},
month = jul,
volume = {90},
number = {4},
pages = {125},
publisher = {Springer Science+Business Media},
issn = {0340-0727},
doi = {10.1007/s00426-026-02341-2},
url = {https://doi.org/10.1007/s00426-026-02341-2},
pmid = {42390617},
pmcid = {PMC13328158}
}

RIS

TY - JOUR
AU - Herman, Aleksandra M
AU - Szczawińska, Julia
AU - Berryman, Carolyn
AU - Stanton, Tasha R
TI - When emotions hurt: negative interpretations of bodily signals and interoceptive difficulties in fibromyalgia
T2 - Psychological research
J2 - Psychol Res
PY - 2026
DA - 2026/07/02
VL - 90
IS - 4
SP - 125
SN - 0340-0727
PB - Springer Science+Business Media
DO - 10.1007/s00426-026-02341-2
UR - https://doi.org/10.1007/s00426-026-02341-2
LA - en
ER -

CSL-JSON

{
"id": "10.1007/s00426-026-02341-2",
"type": "article-journal",
"title": "When emotions hurt: negative interpretations of bodily signals and interoceptive difficulties in fibromyalgia",
"container-title": "Psychological research",
"author": [
{
"family": "Herman",
"given": "Aleksandra M"
},
{
"family": "Szczawińska",
"given": "Julia"
},
{
"family": "Berryman",
"given": "Carolyn"
},
{
"family": "Stanton",
"given": "Tasha R"
}
],
"container-title-short": "Psychol Res",
"volume": "90",
"issue": "4",
"page": "125",
"DOI": "10.1007/s00426-026-02341-2",
"PMID": "42390617",
"PMCID": "PMC13328158",
"ISSN": "0340-0727",
"publisher": "Springer Science+Business Media",
"URL": "https://doi.org/10.1007/s00426-026-02341-2",
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
2
]
]
}
}

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-74331-2 [code]
Trial-by-trial fMRI-neurofeedback dissociates fusiform and occipital contributions to face detection and recognition.
Journal: Nature communications
In common: Psychtoolbox, emmeans, lme4, 4 other tools
[2] doi:10.1093/braincomms/fcag279 [code]
Network flexibility facilitates treatment-induced recovery in post-stroke aphasia.
Journal: Brain communications
In common: emmeans, lme4, ggpubr, 4 other tools
[3] doi:10.1111/ejn.70481 [code]
Neural and Behavioral Tracking of Musical Phrases Occurs Without Temporal Regularity.
Journal: The European journal of neuroscience
In common: Psychtoolbox, lme4, ggpubr, 3 other tools, cognitive
[4] doi:10.1016/j.isci.2026.116458 [code]
Neural tracking of prosodic and statistical rhythms jointly supports artificial language learning.
Journal: iScience
In common: Psychtoolbox, emmeans, lme4, 3 other tools, cognitive
[5] doi:10.7554/elife.103846 [code]
Overt visual attention modulates decision-related signals in the frontal cortex.
Journal: eLife
In common: Psychtoolbox, lme4, ggpubr, 3 other tools, cognitive
[6] doi:10.1192/bjp.2026.10664 [code]
Early effects of a novel 5-HT&lt;sub&gt;4&lt;/sub&gt;R agonist (PF-04995274) and the SSRI citalopram on emotional cognition in unmedicated depression: RESTAND study.
Journal: The British journal of psychiatry : the journal of mental science
In common: emmeans, lme4, ggpubr, 2 other tools, cognitive, 1 reference
[7] doi:10.1038/s41593-026-02345-6 [code]
Human hippocampal ripples tune cortical responses based on predicted uncertainty.
Journal: Nature neuroscience
In common: emmeans, lme4, ggpubr, 3 other tools, cognitive
[8] doi:10.1016/j.neuroimage.2026.122115 [code]
Midfrontal theta power relates to response speeding following frustrative nonreward.
Journal: NeuroImage
In common: emmeans, lme4, ggpubr, 3 other tools, cognitive
[9] doi:10.1038/s42003-026-10040-2 [code]
Functional dissociation of language and theory of mind in the developing superior temporal lobe.
Journal: Communications biology
In common: emmeans, lme4, ggpubr, 3 other tools, cognitive
[10] doi:10.1523/eneuro.0076-26.2026 [code]
Exogenously Driven Neural Reactivation of Spatially Matching Visual Working-Memory Contents.
Journal: eNeuro
In common: emmeans, lme4, ggpubr, 3 other tools, cognitive

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.