OSCR

Metric validation for detection of delayed and directed coupling.

Code ↔ Paper

7 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 7 matches · 2 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
  1. [1] § Methods › Network reconstruction metrics ↔ idtxl/__init__.py, lines 1–21 · score 0.75 · Information Dynamics Toolkit, IDTxl, multivariate transfer entropy, bivariate
  2. [2] § Methods › Network simulations ↔ gen_model.m, the whole file · a weak match · score 0.65 · coupling strength, coupling matrix, measurement noise, model, delays, connectivity
  3. [3] § Results › Measurement noise ↔ paper_figures.m, lines 553–627 · score 0.61 · Dunn Sidak, zero lag mutual, Granger causality, transfer entropy, Kruskal, mutual information
  4. [4] § Results › Network coverage ↔ paper_figures.m, lines 744–815 · score 0.55 · Dunn Sidak, Granger causality, zero lag, coverage, transfer entropy, Kruskal
  5. [5] § Methods › Network simulations ↔ paper_figures.m, lines 85–125 · score 0.53 · uncoupled nodes, amplitude, Channel, coupling
  6. [6] § Methods › Network simulations ↔ gen_model.m, the whole file · a weak match · score 0.53 · coupling strength, vector, dynamics, neural, models, delays
  7. [7] § Results › Number of nodes ↔ paper_figures.m, lines 553–627 · score 0.53 · Dunn Sidak, Granger causality, zero lag, transfer entropy, Kruskal, mutual information

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 · 815 lines · 25 KB · no license · 4 matches

  1. %% ========================================================================
  2. % Name: paper_figures.m
  3. % Author: Kate Dembny
  4. % Date: 1/20/23
  5. % Updated: 6/16/23
  6. % Syntax:
  7. % Arguments:
  8. % Description: figures for paper
  9. % Requirements: matlab
  10. % Notes:
  11. %% ========================================================================
  12. clearvars
  13. % DIRECTORIES
  14. scr_dir = pwd;
  15. pdir = fileparts(cd);
  16. data_dir = [pdir filesep() 'data'];
  17. fig_dir = [pdir filesep() 'figures'];
  18. addpath("/home/kdembny/MATLAB/toolboxes/violinplot/Violinplot-Matlab-master")
  19. addpath("/home/kdembny/MATLAB/toolboxes/sigstar")
  20. addpath('/home/kdembny/MATLAB/toolboxes/cprintf/cprintf/')
  21. %% ========================================================================
  22. % Figure 1 - appearance of data
  23. cwd = [data_dir filesep() 'nodes' filesep() '10' filesep() '004' ];
  24. load([cwd filesep() 'orig' filesep() 'orig_data.mat'])
  25. % establish figure
  26. f = figure;
  27. f.Position = [100 100 1200 700];
  28. set(gcf,'renderer','Painters')
  29. % third tile - adjacency matrix - 1/0 connection
  30. subplot(2,3,1)
  31. imagesc(tcoup)
  32. colormap(flipud(bone))
  33. xlabel("Reciever Node")
  34. ylabel("Source Node")
  35. title('True Network Connections')
  36. yticks(1:10)
  37. yticklabels(1:10)
  38. xticks(1:10)
  39. xticklabels(1:10)
  40. text(-1.2,0, ['A)'], 'FontSize', 20)
  41. % second tile - adjacency matrix - node to node
  42. subplot(2,3,4)
  43. dg = digraph(tcoup);
  44. plot(dg, 'Layout', 'force', 'EdgeColor', "k", 'NodeColor', 'k')
  45. ax = gca;
  46. ax.FontSize=16;
  47. text(-3.5,3, ['B)'], 'FontSize', 20)
  48. % first set of tiles - timeseries data
  49. subplot(2,3,[2:3, 5:6])
  50. hold on
  51. for i = 1:size(ts, 1)
  52. plot(ts(i,1:1000) - 0.25*i, 'Color', "k")
  53. end
  54. ax = gca;
  55. ax.FontSize=16;
  56. ylim([-0.25*(i+1),0])
  57. yticks(-0.25*(i):0.25:-0.25)
  58. yticklabels(size(ts,1):-1:1)
  59. ylabel('Node Number')
  60. xlabel('Time (samples)')
  61. ax = gca;
  62. ax.FontSize=16;
  63. text(-70,.07, ['C)'], 'FontSize', 20)
  64. saveas(gcf, [fig_dir filesep() '01_methods.jpg'])
  65. exportgraphics(gcf, [fig_dir filesep() '01_methods.eps'], 'ContentType', 'vector')
  66. %% ========================================================================
  67. % Figure 2 - Coupled vs uncoupled channels
  68. % assign colors
  69. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  70. % establish figure
  71. f = figure;
  72. f.Position = [100 100 1600 1000];
  73. set(gcf,'renderer','Painters')
  74. lw = 2;
  75. nd_end = 100;
  76. subplot(211)
  77. hold on
  78. plot(ts(1,1:nd_end), 'LineWidth', lw, 'Color', [colors(3,:)])
  79. plot(ts(6,1:nd_end), 'LineWidth', lw, 'Color', [colors(7,:)])
  80. legend(["Node 1", "Node 6"])
  81. xlabel('Time (samples)')
  82. ylabel('Amplitude')
  83. ylim([-0.12, 0.12])
  84. title('Coupled Nodes')
  85. ax = gca;
  86. ax.FontSize=16;
  87. subplot(212)
  88. hold on
  89. plot(ts(1,1:nd_end), 'Linewidth',lw, 'Color', [colors(3,:)])
  90. plot(ts(7,1:nd_end), 'Linewidth',lw, 'Color', [colors(5,:)])
  91. legend(["Node 1", "Node 7"])
  92. xlabel('Time (samples)')
  93. ylim([-0.12, 0.12])
  94. ylabel('Amplitude')
  95. title('Uncoupled Nodes')
  96. ax = gca;
  97. ax.FontSize=16;
  98. saveas(gcf, [fig_dir filesep() '02.coupled_noncoupled.jpg'])
  99. exportgraphics(gcf, [fig_dir filesep() '02.coupled_noncoupled.eps'], 'ContentType', 'vector')
  100. %% ========================================================================
  101. % Figure 3 - Network Reconstructions
  102. % load data
  103. pt_file = [data_dir filesep() 'nodes' filesep() '10' filesep() '004'];
  104. load([pt_file filesep() 'orig' filesep() 'orig_data.mat'])
  105. load([pt_file filesep() 'ml_fc' filesep() 'xc_biv.mat'])
  106. load([pt_file filesep() 'ml_fc' filesep() 'xc_pt.mat'])
  107. load([pt_file filesep() 'ml_fc' filesep() 'gc.mat'])
  108. load([pt_file filesep() 'bvte' filesep() 'te_bivar.mat'])
  109. load([pt_file filesep() 'mvte' filesep() 'te_multivar.mat'])
  110. load([pt_file filesep() 'mi_lagged' filesep() 'mi_lagged.mat'])
  111. load([pt_file filesep() 'mi_zerolag' filesep() 'mi_zerolag.mat'])
  112. load([pt_file filesep() 'ml_fc' filesep() 'xc_zerolag_biv.mat'])
  113. load([pt_file filesep() 'ml_fc' filesep() 'xc_zerolag_pt.mat'])
  114. calc_mi = calc_mi_lag;
  115. load([pt_file filesep() 'shuff' filesep() 'shuff.mat'])
  116. % plot
  117. labs = {{"True Network Connections"},{"Biv. Cross-Corr"}, {"Pt. Cross-Corr"}, {"Mv. Granger Causality"}, ...
  118. {"Mutual Information"}, {"Biv. Transfer Entropy"},{"Mv. Transfer Entropy"},...
  119. {"Zero-Lag Biv.","Cross-Corr"}, {"Zero-Lag Pt.","Cross-Corr"}, {"Zero-Lag Mutual","Information"}, {"Shuffled"}};
  120. arrs = zeros(size(labs,2), size(gc,1), size(gc,2));
  121. arrs(1,:,:) = tcoup;
  122. arrs(8,:,:) = xc_zerolag_biv;
  123. arrs(9,:,:) = xc_zerolag_partial;
  124. arrs(10,:,:) = calc_mi_zerolag;
  125. arrs(6,:,:) = te_bivar;
  126. arrs(2,:,:) = xc_biv(:,:,1);
  127. arrs(3,:,:) = xc_partial(:,:,1);
  128. arrs(4,:,:) = gc;
  129. arrs(5,:,:) = calc_mi;
  130. arrs(7,:,:) = te_multivar;
  131. arrs(11,:,:) = shuff;
  132. num_cols = round((size(arrs,1))/2) + 1;
  133. figLabs = 'A':'K';
  134. f = figure;
  135. clf
  136. f.Position = [100 100 2000 500];
  137. set(gcf,'renderer','Painters')
  138. subplot(2,num_cols,[1,2,num_cols + 1,num_cols + 2])
  139. imagesc(squeeze(arrs(1,:,:)))
  140. title(labs{1})
  141. axis square
  142. ylabel("Source Node")
  143. xlabel("Receiver Node")
  144. c = colorbar();
  145. c.Ticks = [0, 1];
  146. c.TickLabels = ["2%", "98%"];
  147. text(-1,.7,[figLabs(1) ')'], 'FontSize', 20)
  148. for i = 2:size(arrs,1)
  149. if i < num_cols
  150. loc = i+1;
  151. else
  152. loc = i+3;
  153. end
  154. subplot(2,num_cols,loc)
  155. imagesc(squeeze(arrs(i,:,:)))
  156. title(labs{i})
  157. axis square
  158. pct2 = prctile(arrs(i,:,:), 2, 'all');
  159. pct98 = prctile(arrs(i,:,:), 98, 'all');
  160. if i<11
  161. clim([pct2 pct98])
  162. else
  163. clim([0 1])
  164. end
  165. text(-2.2,0.7,[figLabs(i) ')'], 'FontSize', 20)
  166. end
  167. saveas(gcf, [fig_dir filesep() '03.samp_recons.jpg'])
  168. exportgraphics(gcf, [fig_dir filesep() '03.samp_recons.eps'], 'ContentType', 'vector')
  169. %% ========================================================================
  170. % Figure 4 - number of nodes by metric
  171. cwd = [data_dir filesep() 'agg'];
  172. load([cwd filesep() 'nodes_all_dist.mat'])
  173. nodes_alpha = 0.05/15;
  174. makeFig_byMetric(nodes_cos_dist, nodes_opts, nodes_alpha, 'Number of Nodes', 'Cosine Distance')
  175. saveas(gcf, [fig_dir filesep() '04.1_nodes_by_metrics.jpg'])
  176. exportgraphics(gcf, [fig_dir filesep() '04.1_nodes_by_metrics.eps'], 'ContentType', 'vector')
  177. %
  178. % Alt Figure 4 - number of nodes by bin of nodes
  179. makeFig_byParam(nodes_cos_dist, nodes_opts, nodes_alpha, 'Metrics', 'Cosine Distance', 'Nodes')
  180. saveas(gcf, [fig_dir filesep() '04.2_methods_by_nodes.jpg'])
  181. exportgraphics(gcf, [fig_dir filesep() '04.2_methods_by_nodes.eps'], 'ContentType', 'vector')
  182. %%
  183. % STATS
  184. clc
  185. cprintf('red', 'Nodes by Cosine Distance \n')
  186. doStats(nodes_cos_dist, nodes_opts, nodes_alpha, 'Nodes')
  187. %% ========================================================================
  188. % Figure 5 - number of time points by metric
  189. cwd = [data_dir filesep() 'agg'];
  190. load([cwd filesep() 'tps_all_dist.mat'])
  191. tps_alpha = 0.05/14;
  192. makeFig_byMetric(tps_cos_dist,tps_opts, tps_alpha, 'Number of Time Points', 'Cosine Distance')
  193. saveas(gcf, [fig_dir filesep() '05.1_tps_by_methods.jpg'])
  194. exportgraphics(gcf, [fig_dir filesep() '05.1_tps_by_methods.eps'], 'ContentType', 'vector')
  195. % Alt Figure 5 - number of time points by time points bin
  196. makeFig_byParam(tps_cos_dist, tps_opts, tps_alpha, 'Metrics', 'Cosine Distance', 'Time Points')
  197. saveas(gcf, [fig_dir filesep() '05.2_methods_by_tps.jpg'])
  198. exportgraphics(gcf, [fig_dir filesep() '05.2_methods_by_tps.eps'], 'ContentType', 'vector')
  199. %% STATS
  200. clc
  201. cprintf('red', 'Time Points by Cosine Distance \n')
  202. doStats(tps_cos_dist, tps_opts, tps_alpha, 'Time Points')
  203. %% ========================================================================
  204. % Figure 6 - noise by metric
  205. cwd = [data_dir filesep() 'agg'];
  206. load([cwd filesep() 'noise_all_dist.mat'])
  207. noise_alpha = 0.05/18;
  208. makeFig_byMetric(noise_cos_dist,noise_opts, noise_alpha, 'SNR', 'Cosine Distance')
  209. saveas(gcf, [fig_dir filesep() '06.1_noise_by_methods.jpg'])
  210. exportgraphics(gcf, [fig_dir filesep() '06.1_noise_by_methods.eps'], 'ContentType', 'vector')
  211. % Alt Figure 6 - noise by SNR bin
  212. makeFig_byParam(noise_cos_dist, noise_opts, noise_alpha, 'Metrics', 'Cosine Distance', 'SNR')
  213. saveas(gcf, [fig_dir filesep() '06.2_methods_by_noise.jpg'])
  214. exportgraphics(gcf, [fig_dir filesep() '06.2_methods_by_noise.eps'], 'ContentType', 'vector')
  215. %% STATS
  216. clc
  217. cprintf('red', 'Noise by Cosine Distance \n')
  218. doStats(noise_cos_dist, noise_opts, noise_alpha, 'SNR')
  219. %% ========================================================================
  220. % Figure 7 - nodes node dropping
  221. cwd = [data_dir filesep() 'agg'];
  222. load([cwd filesep() 'nodes_all_dist.mat'])
  223. ntwkCov_alpha = 0.05/20;
  224. pcts = ["100%","90%","80%","70%","60%","50%","40%","30%","20%","10%"];
  225. makeFig_nodeDrop(nodes_cos_dist, pcts, ntwkCov_alpha, '% of Network Covered', 'Cosine Distance')
  226. saveas(gcf, [fig_dir filesep() '07.1_node_dropping.jpg'])
  227. exportgraphics(gcf, [fig_dir filesep() '07.1_node_dropping.eps'], 'ContentType', 'vector')
  228. pcts = ["100%","90%","80%","70%","60%","50%","40%","30%","20%","10%"];
  229. makeFig_nodeDrop_param(nodes_cos_dist, pcts, ntwkCov_alpha, 'Metrics', 'Cosine Distance')
  230. saveas(gcf, [fig_dir filesep() '07.2_node_dropping_params.jpg'])
  231. exportgraphics(gcf, [fig_dir filesep() '07.2_node_dropping_params.eps'], 'ContentType', 'vector')
  232. %%
  233. cwd = [data_dir filesep() 'roc'];
  234. load([cwd filesep() 'nodes_roc.mat'])
  235. makeFig_nodeDrop(nodes_roc_aucs(:,:,1:9,:), pcts(1:9), ntwkCov_alpha, '% of Network Covered', 'AUC of ROC')
  236. saveas(gcf, [fig_dir filesep() '07.2_roc_node_dropping.jpg'])
  237. exportgraphics(gcf, [fig_dir filesep() '07.2_roc_node_dropping.eps'], 'ContentType', 'vector')
  238. %% compare methods within metric
  239. for i = 1:10
  240. [p, tbl, stats] = kruskalwallis(squeeze(nodes_cos_dist(4,:,:,i))); %, pcts);
  241. disp(labels(i))
  242. if p < alpha
  243. results = multcompare(stats);
  244. tbl2 = array2table(results,"VariableNames", ...
  245. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  246. close all
  247. disp(tbl2)
  248. else
  249. disp('no significant differences')
  250. end
  251. disp(' ')
  252. end
  253. %% compare methods by percent of nodes dropped
  254. for i = 1:10
  255. [p, tbl, stats] = kruskalwallis(squeeze(nodes_cos_dist(4,:,i,:))); %, pcts);
  256. disp([num2str(100 - (i-1)*10) ' pct covered'])
  257. if p < alpha
  258. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', ntwkCov_alpha);
  259. tbl2 = array2table(results,"VariableNames", ...
  260. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  261. close all
  262. disp(tbl2)
  263. else
  264. disp('no significant differences')
  265. end
  266. disp(' ')
  267. end
  268. %% compare for roc - by metric
  269. for i = 1:10
  270. [p, tbl, stats] = kruskalwallis(squeeze(nodes_roc_aucs(4,:,:,i))); %, pcts);
  271. disp(labels(i))
  272. disp([num2str(100 - (i-1)*10) ' pct covered'])
  273. if p < alpha
  274. results = multcompare(stats);
  275. tbl2 = array2table(results,"VariableNames", ...
  276. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  277. close all
  278. disp(tbl2)
  279. else
  280. disp('no significant differences')
  281. end
  282. disp(' ')
  283. end
  284. %% compare for roc - by percent covered
  285. for i = 1:10
  286. [p, tbl, stats] = kruskalwallis(squeeze(nodes_roc_aucs(4,:,i,:))); %, pcts);
  287. disp([num2str(100 - (i-1)*10) ' pct covered'])
  288. if p < alpha
  289. results = multcompare(stats);
  290. tbl2 = array2table(results,"VariableNames", ...
  291. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  292. close all
  293. disp(tbl2)
  294. else
  295. disp('no significant differences')
  296. end
  297. disp(' ')
  298. end
  299. %% compare methods by node dropping - variance
  300. for i = 1:10
  301. [p, stats] = vartestn(squeeze(nodes_cos_dist(4,:,:,i)), 'TestType', 'LeveneQuadratic'); %, pcts);
  302. close all
  303. disp(labels(i))
  304. disp(p)
  305. disp(stats)
  306. disp(' ')
  307. end
  308. %% ========================================================================
  309. % Figure 8 - runtimes
  310. cwd = [data_dir filesep() 'agg'];
  311. load([cwd filesep() 'nodes_all_rts.mat'])
  312. labels = ["Biv. Cross-Corr", "Pt. Cross-Corr", "Mv. Granger Causality", "Mutual Information",...
  313. "Biv. Transfer Entropy", "Mv. Transfer Entropy", "Zero-Lag Biv. Cross-Corr", ...
  314. "Zero-Lag Pt. Cross-Corr", "Zero-Lag Mutual Information" ];
  315. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  316. f = figure;
  317. f.Position = [100 100 1500 400];
  318. for j = 1:size(nodes_opts,2)
  319. subplot(1,5,j)
  320. for i = 1:6%size(nodes_runtimes,4)
  321. vp = Violin({squeeze(nodes_runtimes(j,:,1,i))'}, i, 'MarkerSize', 10, 'ViolinColor', {colors(i,:)});
  322. end
  323. xticks(1:6)%size(nodes_runtimes,4))
  324. xticklabels(labels (1:6))
  325. ylabel('Runtime (s)')
  326. xlabel('Metrics')
  327. title([num2str(nodes_opts(j)) ' Nodes'])
  328. ax = gca;
  329. ax.FontSize=12;
  330. set(gca, 'Yscale', 'log')
  331. ylim([10^0, 10^6])
  332. text(-2.3,10^6.5,[figLabs(j) ')'], 'FontSize', 20)
  333. end
  334. saveas(gcf, [fig_dir filesep() '08.1_runtimes.jpg'])
  335. exportgraphics(gcf, [fig_dir filesep() '08.1_runtimes.eps'], 'ContentType', 'vector')
  336. %% ========================================================================
  337. % Figure 8 - runtimes - no TE
  338. cwd = [data_dir filesep() 'agg'];
  339. load([cwd filesep() 'nodes_all_rts.mat'])
  340. f = figure;
  341. f.Position = [100 100 2000 400];
  342. for j = 2:size(nodes_opts,2)
  343. subplot(1,5,j)
  344. for i = 1:4
  345. vp = Violin({squeeze(nodes_runtimes(j,:,2,i))'}, i, 'MarkerSize', 10, 'ViolinColor', {colors(i,:)});
  346. end
  347. xlabel('Method')
  348. xticks(1:6)
  349. xticklabels(labels)
  350. ylabel('Runtime (s)')
  351. title([num2str(nodes_opts(j)) ' Nodes'])
  352. ax = gca;
  353. ax.FontSize=20;
  354. end
  355. sgtitle('Reconstruction Time by Method')
  356. saveas(gcf, [fig_dir filesep() '08.2_runtimes_noTE.jpg'])
  357. %% ========================================================================
  358. % Figure 6 - runtimes
  359. cwd = [data_dir filesep() 'agg'];
  360. load([cwd filesep() 'tps_all_rts.mat'])
  361. f = figure;
  362. f.Position = [100 100 2000 400];
  363. for j = 1:size(tps_opts,2)
  364. subplot(1,5,j)
  365. for i = 1:6
  366. vp = Violin({squeeze(tps_runtimes(j,:,1,i))'}, i, 'MarkerSize', 10);
  367. end
  368. xlabel('Method')
  369. xticks(1:6)
  370. xticklabels(labels)
  371. ylabel('Runtime (s)')
  372. title([num2str(tps_opts(j)) ' Time Points'])
  373. ax = gca;
  374. ax.FontSize=14;
  375. end
  376. %sgtitle('Reconstruction Time by Method')
  377. saveas(gcf, [fig_dir filesep() '08.1_runtimes.jpg'])
  378. %% ========================================================================
  379. % FUNCTIONS
  380. function makeFig_byMetric(data,opts, alpha, xAxLabel, yAxLabel)
  381. labels = {{"Biv. Cross-Corr"}, {"Pt. Cross-Corr"}, {"Mv. Granger","Causality"}, {"Mutual","Information"},...
  382. {"Biv. Transfer","Entropy"}, {"Mv. Transfer","Entropy"}, {"Zero-Lag Biv.","Cross-Corr"}, ...
  383. {"Zero-Lag Pt.","Cross-Corr"}, {"Zero-Lag Mutual","Information"}, {"Shuffled"}};
  384. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  385. set(gcf,'renderer','Painters')
  386. f = figure(1);
  387. clf
  388. f.Position = [10 10 1800 650];
  389. figLabs = 'A':'J';
  390. for i = 1:size(data,4)
  391. [~, ~, stats] = kruskalwallis(squeeze(data(:,:,1,i))', opts);
  392. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  393. tbl2 = array2table(results,"VariableNames", ...
  394. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  395. disp(tbl2)
  396. figure(1)
  397. for j = 1:size(opts,2)
  398. subplot(2,5,i)
  399. vp = Violin({round(squeeze(data(j,:,1,i)),4)'}, j, 'MarkerSize', 10, 'ViolinColor', {colors(i,:)});
  400. end
  401. grps = [];
  402. ps = [];
  403. for ct_p = 1:size(tbl2,1)
  404. if tbl2.("P-value")(ct_p) < alpha
  405. grps = [grps; {[tbl2.("Group A")(ct_p), tbl2.("Group B")(ct_p)]}];
  406. ps = [ps; tbl2.("P-value")(ct_p)];
  407. end
  408. end
  409. mxCompars = size(data,1) * (size(data,1)-1)/2;
  410. if size(grps,1) == mxCompars
  411. %text(0.2, 1.15, '*all comparisons significant')
  412. elseif size(grps,1) == 0
  413. text(0.2, 0.1, '*no comparisons significant')
  414. end
  415. if i > 5
  416. xlabel(xAxLabel)
  417. end
  418. xticks(1:size(opts,2))
  419. xticklabels(opts)
  420. if mod(i-1,5) == 0
  421. ylabel(yAxLabel)
  422. end
  423. title(labels{i})
  424. ylim([0, 1.2])
  425. text(-1,1.3,[figLabs(i) ')'], 'FontSize', 20)
  426. ax = gca;
  427. ax.FontSize=14;
  428. end
  429. end
  430. function makeFig_byParam(data, opts, alpha, xAxLabel, yAxLabel, paramName)
  431. labels = ["Biv. Cross-Corr", "Pt. Cross-Corr", "Mv. Granger Causality", "Mutual Information", ...
  432. "Biv. Transfer Entropy", "Mv. Transfer Entropy", "Zero-Lag Biv. Cross-Corr", ...
  433. "Zero-Lag Pt. Cross-Corr", "Zero-Lag Mutual Information", "Shuffled"];
  434. figLabs = 'A':'J';
  435. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  436. set(gcf,'renderer','Painters')
  437. f = figure(2);
  438. clf
  439. if size(opts,2) < 8
  440. f.Position = [100 100 500*size(opts,2) 500];
  441. else
  442. f.Position = [100 100 500*size(opts,2)/2 2*500];
  443. end
  444. for j = 1:size(opts,2)
  445. [p, tbl, stats] = kruskalwallis(squeeze(data(j,:,1,:)), labels);
  446. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  447. tbl2 = array2table(results,"VariableNames", ...
  448. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  449. figure(2)
  450. if size(opts,2) < 8
  451. subplot(1,size(opts,2),j)
  452. else
  453. subplot(2,size(opts,2)/2,j)
  454. end
  455. for i = 1:6 %size(nodes_cos_dist,4)
  456. vp = Violin({round(squeeze(data(j,:,1,i)),4)'}, i, 'MarkerSize', 10, 'ViolinColor', {colors(i,:)});
  457. end
  458. grps = [];
  459. ps = [];
  460. for ct_p = 1:size(tbl2,1)
  461. if tbl2.("P-value")(ct_p) < alpha && tbl2.("Group A")(ct_p) < 7 && tbl2.("Group B")(ct_p) < 7
  462. grps = [grps; {[tbl2.("Group A")(ct_p), tbl2.("Group B")(ct_p)]}];
  463. ps = [ps; tbl2.("P-value")(ct_p)];
  464. end
  465. end
  466. mxCompars = (6*5)/2;%size(data,4) * (size(data,4)-1)/2;
  467. if size(grps,1) == mxCompars
  468. %text(0.2, 1.15, '*all comparisons significant')
  469. elseif size(grps,1) == 0
  470. text(0.2, 0.1, '*no comparisons significant')
  471. end
  472. % if size(grps,1) > 0
  473. % sigstar(grps, ps)
  474. % end
  475. xticks(1:size(data,4))
  476. xticklabels(labels)
  477. if j == 1
  478. ylabel(yAxLabel)
  479. end
  480. yticks([0, 0.5, 1])
  481. if size(opts,2) < 8 || j > size(opts,2)/2
  482. xlabel(xAxLabel)
  483. end
  484. title([num2str(opts(j)) ' ' paramName])
  485. ylim([0, 1.2])
  486. ax = gca;
  487. ax.FontSize=14;
  488. axis square
  489. text(-1.2,1.2,[figLabs(j) ')'], 'FontSize', 20)
  490. end
  491. end
  492. function doStats(data, opts, alpha, paramName)
  493. labels = ["Biv. Cross-Corr", "Pt. Cross-Corr", "Mv. Granger Causality", "Mutual Information",...
  494. "Biv. Transfer Entropy", "Mv. Transfer Entropy", "Zero-Lag Biv. Cross-Corr", ...
  495. "Zero-Lag Pt. Cross-Corr", "Zero-Lag Mutual Info.", "Shuffled" ];
  496. % compare metric by parameter
  497. for i = 1:size(data,1)
  498. [p, tbl, stats] = kruskalwallis(squeeze(data(i,:,1,:)), labels);
  499. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  500. disp([num2str(opts(i)) ' ' paramName])
  501. if p < alpha
  502. tbl2 = array2table(results,"VariableNames", ...
  503. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  504. close all
  505. disp(tbl2)
  506. else
  507. disp('no significant differences')
  508. end
  509. disp(' ')
  510. end
  511. %% compare parameter by metric
  512. for i = 1:size(data,4)
  513. [p, tbl, stats] = kruskalwallis(squeeze(data(:,:,1,i))', opts);
  514. disp(labels(i))
  515. if p < alpha
  516. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  517. tbl2 = array2table(results,"VariableNames", ...
  518. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  519. close all
  520. disp(tbl2)
  521. else
  522. disp('no significant differences')
  523. end
  524. disp(' ')
  525. end
  526. end
  527. function makeFig_nodeDrop(data, opts, alpha, xAxLabel, yAxLabel)
  528. labels = {{"Biv. Cross-Corr"}, {"Pt. Cross-Corr"}, {"Mv. Granger","Causality"}, {"Mutual","Information"},...
  529. {"Biv. Transfer","Entropy"}, {"Mv. Transfer","Entropy"}, {"Zero-Lag Biv.","Cross-Corr"}, ...
  530. {"Zero-Lag Pt.","Cross-Corr"}, {"Zero-Lag Mutual","Information"}, {"Shuffled"}};
  531. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  532. figLabs = 'A':'J';
  533. f = figure(3);
  534. clf
  535. f.Position = [10 10 1800 650];
  536. set(gcf,'renderer','Painters')
  537. for i = 1:size(data,4)
  538. [p, tbl, stats] = kruskalwallis(squeeze(data(4,:,:,i)), opts);
  539. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  540. tbl2 = array2table(results,"VariableNames", ...
  541. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  542. figure(3)
  543. subplot(2,5,i)
  544. for j = 1:size(data,3)
  545. vp = Violin({round(squeeze(data(4,:,j,i)),4)'}, j, 'MarkerSize', 10, 'ViolinColor', {colors(i,:)});
  546. end
  547. grps = [];
  548. ps = [];
  549. for ct_p = 1:size(tbl2,1)
  550. if tbl2.("P-value")(ct_p) < alpha
  551. grps = [grps; {[tbl2.("Group A")(ct_p), tbl2.("Group B")(ct_p)]}];
  552. ps = [ps; tbl2.("P-value")(ct_p)];
  553. end
  554. end
  555. mxCompars = size(data,3) * (size(data,1)-3)/2;
  556. if size(grps,1) == mxCompars
  557. if mean(data(4,:,j,i), 'omitnan') < 0.6
  558. %text(0.2, 1.15, '*all comparisons significant')
  559. else
  560. %text(0.2, 0.1, '*all comparisons significant')
  561. end
  562. elseif size(grps,1) == 0
  563. if mean(data(4,:,j,i), 'omitnan') < 0.6
  564. text(0.2, 1.15, '*no comparisons significant')
  565. % if i < 7
  566. % text(0.2, 1.15, '*no comparisons significant')
  567. % else
  568. else
  569. text(0.2, 0.1, '*no comparisons significant')
  570. end
  571. end
  572. if i > 5
  573. xlabel(xAxLabel)
  574. end
  575. xticks(1:10)
  576. xticklabels(opts)
  577. xtickangle(45)
  578. if mod(i,5) == 1
  579. ylabel(yAxLabel)
  580. end
  581. title(labels{i})
  582. ylim([0, 1.2])
  583. yticks([0 0.5 1])
  584. ax = gca;
  585. ax.FontSize=13;
  586. xlim([0 size(data,3)+1])
  587. text(-1,1.3,[figLabs(i) ')'], 'FontSize', 18)
  588. end
  589. end
  590. function makeFig_nodeDrop_param(data, opts, alpha, xAxLabel, yAxLabel)
  591. labels = ["Biv. Cross-Corr", "Pt. Cross-Corr", "Mv. Granger Causality", "Mutual Information",...
  592. "Biv. Transfer Entropy", "Mv. Transfer Entropy", "Zero-Lag Biv. Cross-Corr", ...
  593. "Zero-Lag Pt. Cross-Corr", "Zero-Lag Mutual Information", "Shuffled"];
  594. colors = [136 34 85; 102 17 0; 17 119 51; 68 170 153; 102 153 204; 51 34 136; 204 102 119; 170 68 153; 153 153 51; 148 148 148]/255;
  595. figLabs = 'A':'J';
  596. f = figure(3);
  597. clf
  598. f.Position = [100 100 1800 900];
  599. set(gcf,'renderer','Painters')
  600. for i = 1:size(data,3)
  601. [p, tbl, stats] = kruskalwallis(squeeze(data(4,:,i,:)), labels);
  602. results = multcompare(stats, 'CriticalValueType', 'dunn-sidak', 'Alpha', alpha);
  603. tbl2 = array2table(results,"VariableNames", ...
  604. ["Group A","Group B","Lower Limit","A-B","Upper Limit","P-value"]);
  605. figure(3)
  606. subplot(2,5,i)
  607. for j = 1:6%size(data,3)
  608. vp = Violin({round(squeeze(data(4,:,i,j)),4)'}, j, 'MarkerSize', 10, 'ViolinColor', {colors(j,:)});
  609. end
  610. grps = [];
  611. ps = [];
  612. for ct_p = 1:size(tbl2,1)
  613. if tbl2.("P-value")(ct_p) < alpha
  614. grps = [grps; {[tbl2.("Group A")(ct_p), tbl2.("Group B")(ct_p)]}];
  615. ps = [ps; tbl2.("P-value")(ct_p)];
  616. end
  617. end
  618. mxCompars = size(data,3) * (size(data,1)-3)/2;
  619. if size(grps,1) == mxCompars
  620. if mean(data(4,:,j,i), 'omitnan') < 0.6
  621. %text(0.2, 1.15, '*all comparisons significant')
  622. else
  623. %text(0.2, 0.1, '*all comparisons significant')
  624. end
  625. elseif size(grps,1) == 0
  626. if mean(data(4,:,j,i), 'omitnan') < 0.6
  627. text(0.2, 1.15, '*no comparisons significant')
  628. % if i < 7
  629. % text(0.2, 1.15, '*no comparisons significant')
  630. % else
  631. else
  632. text(0.2, 0.1, '*no comparisons significant')
  633. end
  634. end
  635. if i > 5
  636. xlabel(xAxLabel)
  637. end
  638. xticks(1:6)
  639. xticklabels(labels(1:6))
  640. xtickangle(45)
  641. if mod(i,5) == 1
  642. ylabel(yAxLabel)
  643. end
  644. title([convertStringsToChars(opts(i)), ' Coverage'])
  645. ylim([0, 1.2])
  646. yticks([0 0.5 1])
  647. ax = gca;
  648. ax.FontSize=13;
  649. xlim([0 7])
  650. text(-1,1.3,[figLabs(i) ')'], 'FontSize', 18)
  651. end
  652. end

paper_figures.m at commit f2d6020, no license · at the source

Overview

  1. Department of Biomedical Engineering, University of Minnesota, Minneapolis, MN, United States of America
  2. University of Minnesota, Medical Scientist Training Program, Minneapolis, MN, United States of America
  3. Department of Psychiatry, University of Minnesota, Minneapolis, MN, United States of America
  4. University of Minnesota, Medical Discovery Team on Addiction, Minneapolis, MN, United States of America
  5. Department of Neurosurgery, University of Minnesota, Minneapolis, MN, United States of America
Institutions: University of Minnesota (United States)
Journal: Journal of neural engineering, volume 23, issue 3, article 036012
Dates: received 3 July 2025; accepted 15 April 2026; published online 14 May 2026; in print 1 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1088/1741-2552/ae5fd7 · PMID 41985540 · PMCID PMC13172737 · OpenAlex W4409260304
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: computational modeling (no new data) (modality), human (organism)
Methods: Statistics, Machine learning, Connectivity, Graphs, Spectral & time-frequency
Keywords: network neuroscience, effective connectivity, transfer entropy, delayed coupling, Granger causality, mutual information, cross-correlation
MeSH: Brain*, Models, Neurological*, Nerve Net*, Algorithms, Computer Simulation, Humans, Reproducibility of Results, Time Factors (* major topic)
Topic: Advanced Chemical Sensor Technologies (Biomedical Engineering, Engineering), according to OpenAlex
Funding: Brain and Behavior Research Foundation (Young Investigator Award #28426); National Institute on Drug Abuse (K23 DA050909); University of Minnesota Medical Discovery Team on Addiction; MnDrive Data Science Initiative (Graduate Assistantship Program); National Institute of Neurological Disorders and Stroke (P50 NS123109 and R01 NS094206)
Citations: not cited yet (Europe PMC); 64 references in the paper

Abstract

Objective. The brain functions as a complex network of billions of interconnected neurons, coordinating processes from basic reflexes to high-level cognition. Dysfunction in these networks contribute to neurological and psychiatric disorders, including epilepsy, depression, and Parkinson’s disease. Understanding these network alterations is essential for developing effective therapies. However, reconstructing network topology from human electrophysiology data is challenging due to sparse spatial sampling, measurement noise, and variable time delays in interregional communication. Effective connectivity (EC) metrics have been developed to infer directed neural interactions, but their accuracy under real-world data constraints remain unclear. This study empirically compares the ability of common EC metrics to reconstruct relationships between simulated time series with known temporal relationships and network topologies in the presence of data limitations common to human electrophysiology data. By utilizing networks and temporal relationships that are mathematically simple, this framework provides broad conceptual backing to understand the reliability of EC metrics and establishes groundwork upon which more complex spatial and temporal relationships between time series can be evaluated. Approach. We generated Erdős–Rényi networks and simulated time series using a time-delayed vector autoregressive model. We systematically varied network size, data length, measurement noise, and network coverage. Variations of four commonly used EC metrics, cross-correlation, Granger causality (GC), mutual information (MI), and transfer entropy, were evaluated for reconstruction accuracy using cosine distance, as well as receiver operating characteristic (ROC) curves, to compare estimated and true coupling matrices. Main Results. Multivariate transfer entropy demonstrated the highest accuracy across various conditions but required significantly longer computation times. For small networks (<30 nodes), MI and GC rapidly and accurately reconstructed networks. For larger networks, partial cross-correlation performed well with good computational efficiency. Notably, zero-lag metrics perform no better than chance for time-lagged time series relationships in nearly all conditions. Significance. The choice of an EC metric should consider specific data constraints. While multivariate transfer entropy is the most reliable across conditions, its long runtime limits its practical application. For large networks, partial cross-correlation offers a faster and reasonably accurate alternative. GC and MI are effective for small networks. Critically, time-lagged metrics are essential for accurate network reconstructions, as failing to account for time delays leads to reconstructions no more accurate than random network models.

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

Repositories

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

hermandarrowlab

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: the text, “Network simulations”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
  • 28 September 2026: the link answers (HTTP 200)

pwollstadt/IDTxl

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: c7eacfd9ce5ca6cdb371e19a52ea286db0d33f3c, 23 April 2026
Languages: Python (139), JavaScript (13), CUDA (7), Shell (2), C (1), MATLAB (1)
Size: 403 files, 163 scripts
Software Heritage: not archived
Found in: the text, “Network reconstruction metrics”
Holds: README, license file, environment (setup.py), tests, documentation
Not found: CITATION.cff, continuous integration
Tools: NumPy (114 files), SciPy (15 files), Matplotlib (9 files), h5py (2 files), NetworkX (2 files), scikit-learn (1 file), statsmodels (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
165 files

hermandarrowlab/ec-metrics-validation

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: f2d6020d991f4a40cdb3810d17c7828fb1575a61, 3 April 2025
Languages: MATLAB (13), Shell (10), Python (2)
Size: 25 files, 25 scripts
Software Heritage: not archived
Found in: the references
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: FieldTrip (3 files), Statistics and Machine Learning Toolbox (2 files), NetworkX (2 files), NumPy (2 files), SciPy (2 files)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
25 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:

  • 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 188 scripts, each with its path and the digest of its content;
  • 7 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

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

Data availability statement

External Software:

Functional Connectivity Toolbox: https://sites.google.com/site/functionalconnectivitytoolbox/.

Multivariate Granger Causality Toolbox: www.mathworks.com/matlabcentral/fileexchange/78727-the-multivariate-granger-causality-mvgc-toolbox.

Fieldtrip Mutual Information: https://github.com/fieldtrip/fieldtrip/blob/master/connectivity/ft_connectivity_mutualinformation.m.

Information Dynamics Toolbox XL (IDTxl): https://github.com/pwollstadt/IDTxl.

The data that support the findings of this study are openly available at the following URL/DOI: https://github.com/hermandarrowlab/ec-metrics-validation (Dembny et al 2026).

Supplementary Data 1 available at https://doi.org/10.1088/1741-2552/ae5fd7/data1.

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 → IOP Publishing

Version 1, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 7 keywords, 8 MeSH terms, 5 funders, 60 references.

Cite

This paper

Dembny, K., Farooqi, H., Herman, A. B., Netoff, T. I., & Darrow, D. P. (2026). Metric validation for detection of delayed and directed coupling. Journal of neural engineering, 23(3), 036012. https://doi.org/10.1088/1741-2552/ae5fd7

BibTeX

@article{dembny2026metric,
author = {Dembny, Kate and Farooqi, Hafsa and Herman, Alexander B and Netoff, Theoden I and Darrow, David P},
title = {{Metric validation for detection of delayed and directed coupling}},
journal = {Journal of neural engineering},
year = {2026},
month = may,
volume = {23},
number = {3},
pages = {036012},
publisher = {IOP Publishing},
issn = {1741-2560},
doi = {10.1088/1741-2552/ae5fd7},
url = {https://doi.org/10.1088/1741-2552/ae5fd7},
pmid = {41985540},
pmcid = {PMC13172737}
}

RIS

TY - JOUR
AU - Dembny, Kate
AU - Farooqi, Hafsa
AU - Herman, Alexander B
AU - Netoff, Theoden I
AU - Darrow, David P
TI - Metric validation for detection of delayed and directed coupling
T2 - Journal of neural engineering
J2 - J Neural Eng
PY - 2026
DA - 2026/05/14
VL - 23
IS - 3
SP - 036012
SN - 1741-2560
PB - IOP Publishing
DO - 10.1088/1741-2552/ae5fd7
UR - https://doi.org/10.1088/1741-2552/ae5fd7
LA - en
ER -

CSL-JSON

{
"id": "10.1088/1741-2552/ae5fd7",
"type": "article-journal",
"title": "Metric validation for detection of delayed and directed coupling",
"container-title": "Journal of neural engineering",
"author": [
{
"family": "Dembny",
"given": "Kate"
},
{
"family": "Farooqi",
"given": "Hafsa"
},
{
"family": "Herman",
"given": "Alexander B"
},
{
"family": "Netoff",
"given": "Theoden I"
},
{
"family": "Darrow",
"given": "David P"
}
],
"container-title-short": "J Neural Eng",
"volume": "23",
"issue": "3",
"page": "036012",
"DOI": "10.1088/1741-2552/ae5fd7",
"PMID": "41985540",
"PMCID": "PMC13172737",
"ISSN": "1741-2560",
"publisher": "IOP Publishing",
"URL": "https://doi.org/10.1088/1741-2552/ae5fd7",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
14
]
]
}
}

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-75959-w [code]
Charting higher-order models of brain function beyond pairwise interactions.
Journal: Nature communications
In common: NetworkX, h5py, statsmodels, 5 other tools, 3 references
[2] doi:10.1073/pnas.2531706123 [code]
Metabolism-weighted brain connectome reveals synaptic integration and vulnerability to neurodegeneration.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: NetworkX, statsmodels, scikit-learn, 3 other tools, 4 references
[3] doi:10.1016/j.isci.2026.115488 [code]
An integrated &lt;i&gt;i&lt;/i&gt; &lt;i&gt;n vitro&lt;/i&gt; platform and biophysical modeling approach for studying synaptic transmission in isolated neuronal pairs.
Journal: iScience
In common: NetworkX, h5py, statsmodels, 4 other tools, 2 references
[4] doi:10.1038/s41593-026-02205-3 [code]
Competitive interactions shape mammalian brain network dynamics and computation.
Journal: Nature neuroscience
In common: NetworkX, Statistics and Machine Learning Toolbox, scikit-learn, 3 other tools, computational modeling (no new data), 2 references
[5] doi:10.1002/hbm.70483 [code]
Untamed: Unconstrained Tensor Decomposition and Graph Node Embedding for Cortical Parcellation.
Journal: Human brain mapping
In common: FieldTrip, h5py, statsmodels, 5 other tools, 1 reference
[6] doi:10.1162/imag.a.1319 [code]
When the inner clock fades: Interoceptive decline and consolidation of phase resetting in cortical rhythms by cardiac events underlie healthy lifespan aging.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: FieldTrip, Statistics and Machine Learning Toolbox, SciPy, 1 other tool, 4 references
[7] doi:10.1038/s41598-026-58505-y [code]
Remoteness sensitive theta network dynamics during early autobiographical memory access.
Journal: Scientific reports
In common: FieldTrip, NetworkX, Statistics and Machine Learning Toolbox, 3 other tools, 2 references
[8] doi:10.1038/s41467-026-71918-7 [code]
Developmental disinhibition gates language lateralization in childhood.
Journal: Nature communications
In common: FieldTrip, scikit-learn, SciPy, 2 other tools, computational modeling (no new data), 3 references
[9] doi:10.1038/s41398-026-04025-2 [code]
Brain energetic landscapes shape state dysregulation in major depressive disorder: a morphological network controllability perspective.
Journal: Translational psychiatry
In common: FieldTrip, h5py, Statistics and Machine Learning Toolbox, 4 other tools, 1 reference
[10] doi:10.1038/s41467-026-76452-0 [code]
Music evokes shared neural representations of imagined narratives across sensory modalities.
Journal: Nature communications
In common: FieldTrip, h5py, statsmodels, 5 other tools

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.