OSCR

Electrophysiological Signatures of Sarcopenia: A Systematic Review of sEMG Features, Fatigue Indices and AI-Based Classifiers.

Code ↔ Paper

4 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 4 matches
  1. [1] § 2. Materials and Methods › 2.6. Clinical Reference Test Hand Grip Associated with Sensorimotor Response ↔ MetaEvaluation/MetaAnalysis_groups_final.m, lines 1–35 · score 0.74 · DerSimonian, Elderly Female, Elderly Male, Laird, subgroups, meta
  2. [2] § 3. Results › 3.3. Hand Grip-Based Clinical Reference for sEMG Assessment ↔ MetaEvaluation/validation_metafor.R, lines 194–255 · score 0.68 · prespecified independent subgroups, elderly females, elderly males, meta, REML
  3. [3] § 2. Materials and Methods › 2.6. Clinical Reference Test Hand Grip Associated with Sensorimotor Response ↔ MetaEvaluation/validation_metafor.R, lines 194–255 · score 0.62 · Elderly Female, Elderly Male, subgroups, meta, variance, Hu
  4. [4] § 2. Materials and Methods › 2.6. Clinical Reference Test Hand Grip Associated with Sensorimotor Response ↔ MetaEvaluation/MetaAnalysis_groups_final.m, lines 1–35 · score 0.58 · Elderly Female, Elderly Male, subgroup, interval, rows, DL

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 · 1,383 lines · 32 KB · no license · 2 matches

  1. %% MetaAnalysis_groups_final.m
  2. % MATLAB R2024b compatible
  3. %
  4. % Meta-analysis of Mean Differences (MD)
  5. % Random-effects models:
  6. % 1) DerSimonian-Laird (DL)
  7. % 2) REML
  8. %
  9. % Three prespecified subgroup-specific meta-analyses:
  10. % - Elderly_Female: k = 2
  11. % - Elderly_Male: k = 2
  12. % - Elderly: k = 4
  13. %
  14. % IMPORTANT:
  15. % No overall pooled estimate is calculated across the 8 rows because
  16. % some studies contribute to more than one subgroup analysis.
  17. %
  18. % Prediction intervals:
  19. % - Calculated only when k >= 3
  20. % - Not calculated for k < 3
  21. % - Results with k < 5 should be interpreted cautiously.
  22. %
  23. % Sensitivity analysis:
  24. % - Exclude Hu(2021) from Elderly group.
  25. %
  26. % Effect direction:
  27. % MD = Mean_Control - Mean_Sarcopenia
  28. % Positive MD = higher value in controls than in sarcopenia.
  29. %
  30. % MATLAB R2024b
  31. % -------------------------------------------------------------------------
  32. clear;
  33. close all;
  34. clc;
  35. %% ========================================================================
  36. % DATA
  37. % Each row:
  38. % {StudyName, GroupLabel, nControl, meanControl, sdControl,
  39. % nCase, meanCase, sdCase}
  40. % ========================================================================
  41. T = {
  42. 'He(2024)_F', 'Elderly_Female', 68, 20.4, 3.6, 36, 14.8, 2.6;
  43. 'Li(2024)_F', 'Elderly_Female', 29, 22.4, 3.0, 31, 14.4, 2.8;
  44. 'He(2024)_M', 'Elderly_Male', 30, 32.1, 5.3, 19, 24.1, 2.9;
  45. 'Li(2024)_M', 'Elderly_Male', 16, 34.1, 5.4, 17, 23.8, 2.2;
  46. 'Sepulveda(2025)','Elderly', 22, 24.5, 7.4, 13, 19.8, 5.9;
  47. 'He(2024)', 'Elderly', 98, 23.9, 7.0, 55, 18.0, 5.2;
  48. 'Li(2024)', 'Elderly', 45, 26.6, 6.9, 48, 17.7, 5.2;
  49. 'Hu(2021)', 'Elderly', 5, 29.6, 8.88, 5, 20.0, 3.74;
  50. };
  51. %% ========================================================================
  52. % CONVERT DATA
  53. % ========================================================================
  54. studies = T(:,1);
  55. groups = T(:,2);
  56. nC = cell2mat(T(:,3));
  57. mC = cell2mat(T(:,4));
  58. sdC = cell2mat(T(:,5));
  59. nT = cell2mat(T(:,6));
  60. mT = cell2mat(T(:,7));
  61. sdT = cell2mat(T(:,8));
  62. %% ========================================================================
  63. % STUDY-LEVEL EFFECT SIZES
  64. % ========================================================================
  65. % Mean Difference:
  66. % Control - Sarcopenia
  67. MD = mC - mT;
  68. % Within-study variance of the MD
  69. var_within = (sdC.^2)./nC + (sdT.^2)./nT;
  70. % Standard error
  71. se_within = sqrt(var_within);
  72. %% ========================================================================
  73. % OUTPUT DIRECTORY
  74. % ========================================================================
  75. outdir = fullfile(pwd,'outputs');
  76. if ~exist(outdir,'dir')
  77. mkdir(outdir);
  78. end
  79. %% ========================================================================
  80. % STUDY-LEVEL TABLE
  81. % ========================================================================
  82. T_out = table( ...
  83. studies(:), ...
  84. groups(:), ...
  85. nC(:), ...
  86. nT(:), ...
  87. MD(:), ...
  88. se_within(:), ...
  89. var_within(:), ...
  90. 'VariableNames', ...
  91. {'Study','Subgroup','nControl','nCase','MD','SE','Var'});
  92. writetable( ...
  93. T_out, ...
  94. fullfile(outdir,'per_study_table_allrows.xlsx'));
  95. %% ========================================================================
  96. % PROCESS EACH PREDEFINED GROUP
  97. % ========================================================================
  98. uniqueGroups = unique(groups,'stable');
  99. OutGroups = struct();
  100. summary_rows = {};
  101. for ig = 1:numel(uniqueGroups)
  102. grp = uniqueGroups{ig};
  103. fprintf('\n============================================================\n');
  104. fprintf('Processing group: %s\n',grp);
  105. fprintf('============================================================\n');
  106. %% ---------------------------------------------------------------
  107. % Select studies belonging to this subgroup
  108. % ---------------------------------------------------------------
  109. idx = find(strcmp(groups,grp));
  110. y = MD(idx)';
  111. v = var_within(idx)';
  112. k = numel(y);
  113. fprintf('Number of studies: k = %d\n',k);
  114. if k == 0
  115. warning('No studies found for group %s. Skipping.',grp);
  116. continue;
  117. end
  118. %% ---------------------------------------------------------------
  119. % FIXED-EFFECT WEIGHTS
  120. % ---------------------------------------------------------------
  121. w_fixed = 1 ./ v;
  122. theta_fixed = ...
  123. sum(w_fixed .* y) / sum(w_fixed);
  124. %% ---------------------------------------------------------------
  125. % COCHRAN Q
  126. % ---------------------------------------------------------------
  127. Q = sum( ...
  128. w_fixed .* ...
  129. (y - theta_fixed).^2);
  130. df_Q = k - 1;
  131. %% ---------------------------------------------------------------
  132. % DL CONSTANT C
  133. % ---------------------------------------------------------------
  134. C = ...
  135. sum(w_fixed) - ...
  136. (sum(w_fixed.^2) / sum(w_fixed));
  137. %% ---------------------------------------------------------------
  138. % DER SIMONIAN-LAIRD TAU^2
  139. % ---------------------------------------------------------------
  140. if k > 1 && C > 0
  141. tau2_DL = max( ...
  142. 0, ...
  143. (Q - df_Q) / C);
  144. else
  145. tau2_DL = 0;
  146. end
  147. %% ---------------------------------------------------------------
  148. % DL POOLED EFFECT
  149. % ---------------------------------------------------------------
  150. [theta_DL,var_theta_DL] = ...
  151. pooled_given_tau(y,v,tau2_DL);
  152. se_theta_DL = sqrt(var_theta_DL);
  153. ci_DL = ...
  154. theta_DL + ...
  155. norminv([0.025 0.975]) .* se_theta_DL;
  156. %% ---------------------------------------------------------------
  157. % DL WEIGHTS
  158. % ---------------------------------------------------------------
  159. wi_DL = 1 ./ (v + tau2_DL);
  160. weights_pct_DL = ...
  161. 100 .* wi_DL ./ sum(wi_DL);
  162. %% ---------------------------------------------------------------
  163. % I2
  164. % ---------------------------------------------------------------
  165. if Q > 0 && k > 1
  166. I2 = max( ...
  167. 0, ...
  168. ((Q - df_Q) / Q) * 100);
  169. else
  170. I2 = 0;
  171. end
  172. %% =================================================================
  173. % REML ESTIMATION
  174. % =================================================================
  175. % ============================================================
  176. % REML estimation of tau^2
  177. % ============================================================
  178. opt = optimset( ...
  179. 'TolX', 1e-10, ...
  180. 'MaxIter', 1000, ...
  181. 'Display', 'off');
  182. % Conservative upper bound for tau^2
  183. upper = max([ ...
  184. 100 * max(v), ...
  185. 100 * var(y), ...
  186. 1]);
  187. fun = @(t) restrictedLogLik(t, y, v);
  188. try
  189. tau2_REML = fminbnd(fun, 0, upper, opt);
  190. % Numerical protection
  191. tau2_REML = max(0, tau2_REML);
  192. catch ME
  193. warning( ...
  194. 'REML optimization failed for group %s: %s. tau2_REML set to 0.', ...
  195. grp, ME.message);
  196. tau2_REML = 0;
  197. end
  198. %% ---------------------------------------------------------------
  199. % REML POOLED EFFECT
  200. % ---------------------------------------------------------------
  201. [theta_REML,var_theta_REML] = ...
  202. pooled_given_tau( ...
  203. y,v,tau2_REML);
  204. se_theta_REML = sqrt(var_theta_REML);
  205. ci_REML = ...
  206. theta_REML + ...
  207. norminv([0.025 0.975]) .* se_theta_REML;
  208. %% ---------------------------------------------------------------
  209. % REML WEIGHTS
  210. % ---------------------------------------------------------------
  211. wi_REML = ...
  212. 1 ./ (v + tau2_REML);
  213. weights_pct_REML = ...
  214. 100 .* wi_REML ./ sum(wi_REML);
  215. %% =================================================================
  216. % PREDICTION INTERVALS
  217. % =================================================================
  218. %
  219. % PI is NOT calculated for k < 3.
  220. %
  221. % For k >= 3:
  222. %
  223. % PI = theta +/- t_(k-2,0.975)
  224. % * sqrt(SE_theta^2 + tau^2)
  225. %
  226. % NOTE:
  227. % Prediction intervals with very small k remain highly uncertain.
  228. % A warning is generated when k < 5.
  229. % =================================================================
  230. PI_DL = [NaN NaN];
  231. PI_REML = [NaN NaN];
  232. PI_status = "Not calculated";
  233. if k >= 3
  234. if k < 5
  235. warning( ...
  236. ['Prediction interval for group %s is based on only ' ...
  237. 'k=%d studies and should be interpreted cautiously.'], ...
  238. grp,k);
  239. PI_status = "Calculated with k<5; interpret cautiously";
  240. else
  241. PI_status = "Calculated";
  242. end
  243. df_PI = k - 2;
  244. tcrit = tinv(0.975,df_PI);
  245. %% DL PI
  246. PI_se_DL = ...
  247. sqrt(var_theta_DL + tau2_DL);
  248. PI_DL = ...
  249. theta_DL + ...
  250. [-1 1] .* tcrit .* PI_se_DL;
  251. %% REML PI
  252. PI_se_REML = ...
  253. sqrt(var_theta_REML + tau2_REML);
  254. PI_REML = ...
  255. theta_REML + ...
  256. [-1 1] .* tcrit .* PI_se_REML;
  257. end
  258. %% =================================================================
  259. % STORE GROUP RESULTS
  260. % =================================================================
  261. G = struct();
  262. G.group = grp;
  263. G.k = k;
  264. G.idx = idx;
  265. G.studies = studies(idx);
  266. G.y = y;
  267. G.v = v;
  268. G.Q = Q;
  269. G.df_Q = df_Q;
  270. G.I2 = I2;
  271. % DL
  272. G.tau2_DL = tau2_DL;
  273. G.theta_DL = theta_DL;
  274. G.se_theta_DL = se_theta_DL;
  275. G.ci_DL = ci_DL;
  276. G.weights_pct_DL = weights_pct_DL;
  277. % REML
  278. G.tau2_REML = tau2_REML;
  279. G.theta_REML = theta_REML;
  280. G.se_theta_REML = se_theta_REML;
  281. G.ci_REML = ci_REML;
  282. G.weights_pct_REML = weights_pct_REML;
  283. % Prediction intervals
  284. G.PI_DL = PI_DL;
  285. G.PI_REML = PI_REML;
  286. G.PI_status = PI_status;
  287. %% Store structure
  288. fieldName = ...
  289. matlab.lang.makeValidName(grp);
  290. OutGroups.(fieldName) = G;
  291. %% =================================================================
  292. % SUMMARY TABLE
  293. % =================================================================
  294. summary_rows(end+1,:) = { ...
  295. grp, ...
  296. k, ...
  297. theta_DL, ...
  298. ci_DL(1), ...
  299. ci_DL(2), ...
  300. PI_DL(1), ...
  301. PI_DL(2), ...
  302. tau2_DL, ...
  303. theta_REML, ...
  304. ci_REML(1), ...
  305. ci_REML(2), ...
  306. PI_REML(1), ...
  307. PI_REML(2), ...
  308. tau2_REML, ...
  309. Q, ...
  310. df_Q, ...
  311. I2, ...
  312. PI_status};
  313. %% =================================================================
  314. % FOREST PLOTS
  315. % =================================================================
  316. makeForestGroup( ...
  317. 'DL', ...
  318. G, ...
  319. outdir);
  320. makeForestGroup( ...
  321. 'REML', ...
  322. G, ...
  323. outdir);
  324. %% =================================================================
  325. % CONSOLE OUTPUT
  326. % =================================================================
  327. fprintf('\nGroup: %s\n',grp);
  328. fprintf('k = %d\n',k);
  329. fprintf( ...
  330. 'DL : theta = %.3f [%.3f, %.3f], tau2 = %.4f\n', ...
  331. theta_DL, ...
  332. ci_DL(1), ...
  333. ci_DL(2), ...
  334. tau2_DL);
  335. fprintf( ...
  336. 'REML : theta = %.3f [%.3f, %.3f], tau2 = %.4f\n', ...
  337. theta_REML, ...
  338. ci_REML(1), ...
  339. ci_REML(2), ...
  340. tau2_REML);
  341. fprintf( ...
  342. 'Q = %.3f, df = %d, I2 = %.2f%%\n', ...
  343. Q,df_Q,I2);
  344. if k >= 3
  345. fprintf( ...
  346. 'DL PI = [%.3f, %.3f]\n', ...
  347. PI_DL(1),PI_DL(2));
  348. fprintf( ...
  349. 'REML PI = [%.3f, %.3f]\n', ...
  350. PI_REML(1),PI_REML(2));
  351. else
  352. fprintf( ...
  353. 'Prediction intervals: NOT calculated (k < 3)\n');
  354. end
  355. end
  356. %% ========================================================================
  357. % SUMMARY TABLE
  358. % ========================================================================
  359. Tsum = cell2table( ...
  360. summary_rows, ...
  361. 'VariableNames',{ ...
  362. 'Group', ...
  363. 'k', ...
  364. 'Theta_DL', ...
  365. 'CIlo_DL', ...
  366. 'CIhi_DL', ...
  367. 'PIlo_DL', ...
  368. 'PIhi_DL', ...
  369. 'tau2_DL', ...
  370. 'Theta_REML', ...
  371. 'CIlo_REML', ...
  372. 'CIhi_REML', ...
  373. 'PIlo_REML', ...
  374. 'PIhi_REML', ...
  375. 'tau2_REML', ...
  376. 'Q', ...
  377. 'df', ...
  378. 'I2', ...
  379. 'PI_status'});
  380. writetable( ...
  381. Tsum, ...
  382. fullfile(outdir,'summary_by_group.xlsx'));
  383. %% ========================================================================
  384. % SAVE MATLAB RESULTS
  385. % ========================================================================
  386. save( ...
  387. fullfile(outdir, ...
  388. 'MetaAnalysis_groups_results.mat'), ...
  389. 'OutGroups', ...
  390. 'T_out', ...
  391. 'Tsum');
  392. %% ========================================================================
  393. % SENSITIVITY ANALYSIS
  394. % EXCLUDE HU(2021) FROM ELDERLY GROUP
  395. % ========================================================================
  396. groupName = 'Elderly';
  397. fieldName = ...
  398. matlab.lang.makeValidName(groupName);
  399. if ~isfield(OutGroups,fieldName)
  400. warning( ...
  401. 'Group %s not found. Sensitivity analysis skipped.', ...
  402. groupName);
  403. else
  404. S = OutGroups.(fieldName);
  405. idx = S.idx;
  406. %% ---------------------------------------------------------------
  407. % Locate Hu(2021)
  408. % ---------------------------------------------------------------
  409. hu_label = 'Hu(2021)';
  410. hu_global_idx = ...
  411. find(strcmp(studies,hu_label),1);
  412. if isempty(hu_global_idx)
  413. warning( ...
  414. 'Hu(2021) was not found.');
  415. elseif ~ismember(hu_global_idx,idx)
  416. warning( ...
  417. 'Hu(2021) is not part of the Elderly group.');
  418. else
  419. %% -----------------------------------------------------------
  420. % Dataset without Hu
  421. % -----------------------------------------------------------
  422. idx_no_hu = ...
  423. idx(idx ~= hu_global_idx);
  424. y_s = MD(idx_no_hu)';
  425. v_s = var_within(idx_no_hu)';
  426. k_s = numel(y_s);
  427. fprintf('\n============================================================\n');
  428. fprintf('Sensitivity analysis: Excluding Hu(2021)\n');
  429. fprintf('Original k = %d\n',numel(idx));
  430. fprintf('Without Hu k = %d\n',k_s);
  431. fprintf('============================================================\n');
  432. %% -----------------------------------------------------------
  433. % DL
  434. % -----------------------------------------------------------
  435. w_fixed_s = 1 ./ v_s;
  436. theta_fixed_s = ...
  437. sum(w_fixed_s .* y_s) / ...
  438. sum(w_fixed_s);
  439. Q_s = ...
  440. sum(w_fixed_s .* ...
  441. (y_s - theta_fixed_s).^2);
  442. df_s = k_s - 1;
  443. C_s = ...
  444. sum(w_fixed_s) - ...
  445. sum(w_fixed_s.^2) / ...
  446. sum(w_fixed_s);
  447. if k_s > 1 && C_s > 0
  448. tau2_DL_s = max( ...
  449. 0, ...
  450. (Q_s - df_s) / C_s);
  451. else
  452. tau2_DL_s = 0;
  453. end
  454. [theta_DL_s,var_theta_DL_s] = ...
  455. pooled_given_tau( ...
  456. y_s,v_s,tau2_DL_s);
  457. se_DL_s = sqrt(var_theta_DL_s);
  458. ci_DL_s = ...
  459. theta_DL_s + ...
  460. norminv([0.025 0.975]) .* se_DL_s;
  461. if Q_s > 0 && k_s > 1
  462. I2_s = max( ...
  463. 0, ...
  464. ((Q_s-df_s)/Q_s)*100);
  465. else
  466. I2_s = 0;
  467. end
  468. % ============================================================
  469. % REML for sensitivity analysis
  470. % ============================================================
  471. if k_s >= 1
  472. opt = optimset( ...
  473. 'TolX', 1e-10, ...
  474. 'MaxIter', 1000, ...
  475. 'Display', 'off');
  476. upper_bound_s = max([ ...
  477. 100 * max(v_s), ...
  478. 100 * var(y_s), ...
  479. 1]);
  480. fun_s = @(t) restrictedLogLik(t, y_s, v_s);
  481. try
  482. tau2_REML_s = fminbnd( ...
  483. fun_s, ...
  484. 0, ...
  485. upper_bound_s, ...
  486. opt);
  487. tau2_REML_s = max(0, tau2_REML_s);
  488. catch ME
  489. warning( ...
  490. 'REML sensitivity optimization failed: %s. tau2_REML_s set to 0.', ...
  491. E.message);
  492. tau2_REML_s = 0;
  493. end
  494. [theta_REML_s, var_theta_REML_s] = ...
  495. pooled_given_tau(y_s, v_s, tau2_REML_s);
  496. se_theta_REML_s = sqrt(var_theta_REML_s);
  497. ci_REML_s = theta_REML_s + ...
  498. norminv([0.025 0.975]) * se_theta_REML_s;
  499. else
  500. tau2_REML_s = NaN;
  501. theta_REML_s = NaN;
  502. ci_REML_s = [NaN NaN];
  503. end
  504. [theta_REML_s,var_theta_REML_s] = ...
  505. pooled_given_tau( ...
  506. y_s,v_s,tau2_REML_s);
  507. se_REML_s = ...
  508. sqrt(var_theta_REML_s);
  509. ci_REML_s = ...
  510. theta_REML_s + ...
  511. norminv([0.025 0.975]) .* se_REML_s;
  512. %% -----------------------------------------------------------
  513. % Prediction intervals after excluding Hu
  514. % -----------------------------------------------------------
  515. PI_DL_s = [NaN NaN];
  516. PI_REML_s = [NaN NaN];
  517. if k_s >= 3
  518. if k_s < 5
  519. warning( ...
  520. ['Sensitivity PI uses only k=%d studies. ' ...
  521. 'Interpret cautiously.'],k_s);
  522. end
  523. df_PI_s = k_s - 2;
  524. tcrit_s = ...
  525. tinv(0.975,df_PI_s);
  526. PI_DL_s = ...
  527. theta_DL_s + ...
  528. [-1 1] .* ...
  529. tcrit_s .* ...
  530. sqrt(var_theta_DL_s + tau2_DL_s);
  531. PI_REML_s = ...
  532. theta_REML_s + ...
  533. [-1 1] .* ...
  534. tcrit_s .* ...
  535. sqrt(var_theta_REML_s + tau2_REML_s);
  536. end
  537. %% -----------------------------------------------------------
  538. % Sensitivity table
  539. % -----------------------------------------------------------
  540. sens_rows = { ...
  541. 'Original_with_Hu_DL', ...
  542. theta_DL, ...
  543. S.ci_DL(1), ...
  544. S.ci_DL(2), ...
  545. S.PI_DL(1), ...
  546. S.PI_DL(2), ...
  547. S.tau2_DL, ...
  548. S.Q, ...
  549. S.I2;
  550. 'Original_with_Hu_REML', ...
  551. theta_REML, ...
  552. S.ci_REML(1), ...
  553. S.ci_REML(2), ...
  554. S.PI_REML(1), ...
  555. S.PI_REML(2), ...
  556. S.tau2_REML, ...
  557. NaN, ...
  558. NaN;
  559. 'Exclude_Hu_DL', ...
  560. theta_DL_s, ...
  561. ci_DL_s(1), ...
  562. ci_DL_s(2), ...
  563. PI_DL_s(1), ...
  564. PI_DL_s(2), ...
  565. tau2_DL_s, ...
  566. Q_s, ...
  567. I2_s;
  568. 'Exclude_Hu_REML', ...
  569. theta_REML_s, ...
  570. ci_REML_s(1), ...
  571. ci_REML_s(2), ...
  572. PI_REML_s(1), ...
  573. PI_REML_s(2), ...
  574. tau2_REML_s, ...
  575. NaN, ...
  576. NaN};
  577. T_sens = cell2table( ...
  578. sens_rows, ...
  579. 'VariableNames',{ ...
  580. 'Scenario', ...
  581. 'Theta', ...
  582. 'CI_lo', ...
  583. 'CI_hi', ...
  584. 'PI_lo', ...
  585. 'PI_hi', ...
  586. 'tau2', ...
  587. 'Q', ...
  588. 'I2'});
  589. writetable( ...
  590. T_sens, ...
  591. fullfile( ...
  592. outdir, ...
  593. 'sensitivity_exclude_Hu2021.xlsx'));
  594. %% -----------------------------------------------------------
  595. % Percentage change
  596. % -----------------------------------------------------------
  597. PercentChange = table( ...
  598. {'Theta_DL'; ...
  599. 'tau2_DL'; ...
  600. 'I2_DL'; ...
  601. 'Theta_REML'; ...
  602. 'tau2_REML'}, ...
  603. [ ...
  604. 100*(theta_DL_s-S.theta_DL)/S.theta_DL; ...
  605. 100*(tau2_DL_s-S.tau2_DL)/S.tau2_DL; ...
  606. 100*(I2_s-S.I2)/S.I2; ...
  607. 100*(theta_REML_s-S.theta_REML)/S.theta_REML; ...
  608. 100*(tau2_REML_s-S.tau2_REML)/S.tau2_REML], ...
  609. 'VariableNames', ...
  610. {'Metric','PercentChange'});
  611. writetable( ...
  612. PercentChange, ...
  613. fullfile( ...
  614. outdir, ...
  615. 'sensitivity_percent_change_Hu2021.xlsx'));
  616. %% -----------------------------------------------------------
  617. % Console
  618. % -----------------------------------------------------------
  619. fprintf('\nSensitivity results:\n');
  620. fprintf( ...
  621. 'DL original : %.3f [%.3f, %.3f]\n', ...
  622. S.theta_DL,S.ci_DL(1),S.ci_DL(2));
  623. fprintf( ...
  624. 'DL no Hu : %.3f [%.3f, %.3f]\n', ...
  625. theta_DL_s,ci_DL_s(1),ci_DL_s(2));
  626. fprintf( ...
  627. 'REML original : %.3f [%.3f, %.3f]\n', ...
  628. S.theta_REML,S.ci_REML(1),S.ci_REML(2));
  629. fprintf( ...
  630. 'REML no Hu : %.3f [%.3f, %.3f]\n', ...
  631. theta_REML_s,ci_REML_s(1),ci_REML_s(2));
  632. fprintf('\n');
  633. fprintf( ...
  634. 'DL tau2: %.6f -> %.6f\n', ...
  635. S.tau2_DL,tau2_DL_s);
  636. fprintf( ...
  637. 'REML tau2: %.6f -> %.6f\n', ...
  638. S.tau2_REML,tau2_REML_s);
  639. %% -----------------------------------------------------------
  640. % Forest plots without Hu
  641. % -----------------------------------------------------------
  642. S_s = struct();
  643. S_s.group = 'Elderly_noHu';
  644. S_s.k = k_s;
  645. S_s.studies = studies(idx_no_hu);
  646. S_s.y = y_s(:);
  647. S_s.v = v_s(:);
  648. S_s.theta_DL = theta_DL_s;
  649. S_s.ci_DL = ci_DL_s;
  650. S_s.tau2_DL = tau2_DL_s;
  651. S_s.theta_REML = theta_REML_s;
  652. S_s.ci_REML = ci_REML_s;
  653. S_s.tau2_REML = tau2_REML_s;
  654. S_s.PI_DL = PI_DL_s;
  655. S_s.PI_REML = PI_REML_s;
  656. S_s.weights_pct_DL = ...
  657. 100*(1./(v_s+tau2_DL_s)) ./ ...
  658. sum(1./(v_s+tau2_DL_s));
  659. S_s.weights_pct_REML = ...
  660. 100*(1./(v_s+tau2_REML_s)) ./ ...
  661. sum(1./(v_s+tau2_REML_s));
  662. makeForestGroup( ...
  663. 'DL', ...
  664. S_s, ...
  665. outdir);
  666. makeForestGroup( ...
  667. 'REML', ...
  668. S_s, ...
  669. outdir);
  670. end
  671. end
  672. %% ========================================================================
  673. % FINISH
  674. % ========================================================================
  675. fprintf('\n============================================================\n');
  676. fprintf('META-ANALYSIS COMPLETED\n');
  677. fprintf('Results saved in:\n%s\n',outdir);
  678. fprintf('============================================================\n');
  679. %% ========================================================================
  680. % LOCAL FUNCTION 1. ajustada por el tipo de analisis
  681. % REML RESTRICTED LOG-LIKELIHOOD
  682. % ========================================================================
  683. function nll = restrictedLogLik(tau2, y, v)
  684. % ============================================================
  685. % Restricted log-likelihood for REML estimation of tau^2
  686. % Random-effects meta-analysis with a single pooled intercept
  687. %
  688. % y = study-level effect estimates
  689. % v = within-study sampling variances
  690. % tau2 = between-study variance
  691. %
  692. % The function returns the NEGATIVE restricted log-likelihood,
  693. % because fminbnd performs minimization.
  694. % ============================================================
  695. % Ensure column vectors
  696. y = y(:);
  697. v = v(:);
  698. % Invalid values
  699. if tau2 < 0 || any(v <= 0) || any(~isfinite(v)) || any(~isfinite(y))
  700. nll = Inf;
  701. return;
  702. end
  703. % Total variance for each study
  704. sigma2 = v + tau2;
  705. % Random-effects weights
  706. w = 1 ./ sigma2;
  707. % Sum of weights
  708. W = sum(w);
  709. % Estimated pooled effect for this value of tau2
  710. mu_hat = sum(w .* y) / W;
  711. % Weighted residual sum of squares
  712. residuals = y - mu_hat;
  713. Q_tau = sum(w .* residuals.^2);
  714. % Restricted negative log-likelihood
  715. %
  716. % REML for a model with one fixed effect (the pooled mean):
  717. %
  718. % -2 log L_REML =
  719. % sum(log(sigma2))
  720. % + log(W)
  721. % + Q_tau
  722. %
  723. % Constants independent of tau2 are omitted.
  724. nll = 0.5 * ( ...
  725. sum(log(sigma2)) + ...
  726. log(W) + ...
  727. Q_tau );
  728. % Numerical protection
  729. if ~isfinite(nll)
  730. nll = Inf;
  731. end
  732. end
  733. % function out = restrictedLogLik_REML(tau2,y,v)
  734. %
  735. % % Ensure non-negative tau2
  736. % tau2 = max(tau2,0);
  737. %
  738. % % Total variance
  739. % vi = v + tau2;
  740. %
  741. % if any(~isfinite(vi)) || any(vi <= 0)
  742. %
  743. % out = Inf;
  744. % return;
  745. %
  746. % end
  747. %
  748. % % Random-effects weights
  749. % w = 1 ./ vi;
  750. %
  751. % % Sum of weights
  752. % W = sum(w);
  753. %
  754. % if ~isfinite(W) || W <= 0
  755. %
  756. % out = Inf;
  757. % return;
  758. %
  759. % end
  760. %
  761. % % Weighted pooled estimate
  762. % theta = ...
  763. % sum(w .* y) / W;
  764. %
  765. % % Weighted residual heterogeneity
  766. % Q_tau = ...
  767. % sum(w .* (y-theta).^2);
  768. %
  769. % k = numel(y);
  770. %
  771. % % Need at least 2 studies
  772. % if k < 2 || Q_tau <= 0
  773. %
  774. % out = Inf;
  775. % return;
  776. %
  777. % end
  778. %
  779. % % REML objective function
  780. % %
  781. % % Constants independent of tau2 are omitted.
  782. % %
  783. % % -2 log L_REML =
  784. % % sum(log(vi))
  785. % % + log(sum(w))
  786. % % + (k-1)*log(Q_tau)
  787. %
  788. % out = 0.5 * ( ...
  789. % sum(log(vi)) + ...
  790. % log(W) + ...
  791. % (k-1)*log(Q_tau) );
  792. %
  793. % if ~isfinite(out)
  794. %
  795. % out = Inf;
  796. %
  797. % end
  798. %
  799. % end
  800. %
  801. %
  802. %% ========================================================================
  803. % LOCAL FUNCTION 2
  804. % POOLED EFFECT GIVEN TAU2
  805. % ========================================================================
  806. function [theta,var_theta] = ...
  807. pooled_given_tau(y,v,tau2)
  808. w = 1 ./ (v + tau2);
  809. theta = ...
  810. sum(w .* y) / sum(w);
  811. var_theta = ...
  812. 1 / sum(w);
  813. end
  814. %% ========================================================================
  815. % LOCAL FUNCTION 3
  816. % FOREST PLOT
  817. % ========================================================================
  818. function makeForestGroup(method,G,outdir)
  819. studies = G.studies;
  820. y = G.y(:);
  821. v = G.v(:);
  822. k = G.k;
  823. %% ---------------------------------------------------------------
  824. % Select estimator
  825. % ---------------------------------------------------------------
  826. if strcmpi(method,'DL')
  827. theta = G.theta_DL;
  828. ci = G.ci_DL;
  829. tau2 = G.tau2_DL;
  830. if isfield(G,'weights_pct_DL')
  831. weights_pct = ...
  832. G.weights_pct_DL;
  833. else
  834. weights_pct = ...
  835. 100*(1./(v+tau2)) ./ ...
  836. sum(1./(v+tau2));
  837. end
  838. else
  839. theta = G.theta_REML;
  840. ci = G.ci_REML;
  841. tau2 = G.tau2_REML;
  842. if isfield(G,'weights_pct_REML')
  843. weights_pct = ...
  844. G.weights_pct_REML;
  845. else
  846. weights_pct = ...
  847. 100*(1./(v+tau2)) ./ ...
  848. sum(1./(v+tau2));
  849. end
  850. end
  851. %% ---------------------------------------------------------------
  852. % Figure
  853. % ---------------------------------------------------------------
  854. fig = figure( ...
  855. 'Visible','off', ...
  856. 'Units','pixels', ...
  857. 'Position',[100 100 1100 650]);
  858. ax = axes('Parent',fig);
  859. hold(ax,'on');
  860. %% ---------------------------------------------------------------
  861. % Plot study effects
  862. % ---------------------------------------------------------------
  863. ypos = (1:k)';
  864. max_w = max(weights_pct);
  865. if max_w <= 0
  866. max_w = 1;
  867. end
  868. for i = 1:k
  869. xi = y(i);
  870. sei = sqrt(v(i));
  871. ci_low = ...
  872. xi - 1.96*sei;
  873. ci_high = ...
  874. xi + 1.96*sei;
  875. % Confidence interval
  876. plot( ...
  877. ax, ...
  878. [ci_low ci_high], ...
  879. [ypos(i) ypos(i)], ...
  880. 'k-', ...
  881. 'LineWidth',1.4);
  882. % Study marker
  883. sz = ...
  884. max(25, ...
  885. 150*weights_pct(i)/max_w);
  886. scatter( ...
  887. ax, ...
  888. xi, ...
  889. ypos(i), ...
  890. sz, ...
  891. 'k', ...
  892. 'filled');
  893. end
  894. %% ---------------------------------------------------------------
  895. % X limits
  896. % ---------------------------------------------------------------
  897. xleft = ...
  898. min([y - 3*sqrt(v); ci(1)]);
  899. xright = ...
  900. max([y + 3*sqrt(v); ci(2)]);
  901. if ~isfinite(xleft) || ...
  902. ~isfinite(xright) || ...
  903. xleft == xright
  904. xleft = min(y)-1;
  905. xright = max(y)+1;
  906. end
  907. xmargin = ...
  908. 0.12*(xright-xleft);
  909. if xmargin == 0
  910. xmargin = ...
  911. max(1,0.1*abs(xright));
  912. end
  913. xlim(ax, ...
  914. [xleft-xmargin xright+xmargin]);
  915. %% ---------------------------------------------------------------
  916. % Null line
  917. % ---------------------------------------------------------------
  918. yl = [0 k+1];
  919. plot( ...
  920. ax, ...
  921. [0 0], ...
  922. yl, ...
  923. '--', ...
  924. 'Color',[0.5 0.5 0.5], ...
  925. 'LineWidth',1);
  926. %% ---------------------------------------------------------------
  927. % Pooled diamond
  928. % ---------------------------------------------------------------
  929. diamond_y = 0.35;
  930. diamond_h = 0.45;
  931. patch_x = [ ...
  932. ci(1), ...
  933. theta, ...
  934. ci(2), ...
  935. theta];
  936. patch_y = ...
  937. diamond_y + ...
  938. [-diamond_h/2, ...
  939. 0, ...
  940. diamond_h/2, ...
  941. 0];
  942. patch( ...
  943. ax, ...
  944. patch_x, ...
  945. patch_y, ...
  946. 'k', ...
  947. 'FaceAlpha',0.4, ...
  948. 'EdgeColor','k');
  949. %% ---------------------------------------------------------------
  950. % Y-axis
  951. % ---------------------------------------------------------------
  952. set( ...
  953. ax, ...
  954. 'YTick',ypos, ...
  955. 'YTickLabel',studies, ...
  956. 'YDir','reverse');
  957. %% ---------------------------------------------------------------
  958. % Pooled annotation
  959. % ---------------------------------------------------------------
  960. txtPooled = sprintf( ...
  961. 'Pooled = %.2f [%.2f, %.2f]', ...
  962. theta,ci(1),ci(2));
  963. text( ...
  964. ax, ...
  965. mean(ci), ...
  966. diamond_y+0.55, ...
  967. txtPooled, ...
  968. 'HorizontalAlignment','center', ...
  969. 'FontWeight','bold');
  970. %% ---------------------------------------------------------------
  971. % Study estimates and weights
  972. % ---------------------------------------------------------------
  973. xlims = xlim(ax);
  974. xtext = ...
  975. xlims(2) - ...
  976. 0.015*range(xlims);
  977. for i = 1:k
  978. txt = sprintf( ...
  979. '%.2f [%.2f, %.2f] (%.1f%%)', ...
  980. y(i), ...
  981. y(i)-1.96*sqrt(v(i)), ...
  982. y(i)+1.96*sqrt(v(i)), ...
  983. weights_pct(i));
  984. text( ...
  985. ax, ...
  986. xtext, ...
  987. ypos(i), ...
  988. txt, ...
  989. 'HorizontalAlignment','right', ...
  990. 'FontSize',9);
  991. end
  992. %% ---------------------------------------------------------------
  993. % Labels
  994. % ---------------------------------------------------------------
  995. xlabel( ...
  996. ax, ...
  997. 'Mean Difference (Control - Sarcopenia)');
  998. if isfield(G,'group')
  999. groupTitle = G.group;
  1000. else
  1001. groupTitle = 'Meta-analysis';
  1002. end
  1003. title( ...
  1004. ax, ...
  1005. sprintf('%s - %s', ...
  1006. groupTitle,upper(method)), ...
  1007. 'Interpreter','none');
  1008. grid(ax,'on');
  1009. %% ---------------------------------------------------------------
  1010. % Save
  1011. % ---------------------------------------------------------------
  1012. safeGroup = ...
  1013. matlab.lang.makeValidName(groupTitle);
  1014. fname = fullfile( ...
  1015. outdir, ...
  1016. sprintf( ...
  1017. 'Forest_%s_%s', ...
  1018. safeGroup, ...
  1019. upper(method)));
  1020. try
  1021. exportgraphics( ...
  1022. fig, ...
  1023. [fname '.png'], ...
  1024. 'Resolution',300, ...
  1025. 'ContentType','image');
  1026. exportgraphics( ...
  1027. fig, ...
  1028. [fname '.pdf'], ...
  1029. 'ContentType','vector');
  1030. catch
  1031. saveas( ...
  1032. fig, ...
  1033. [fname '.png']);
  1034. saveas( ...
  1035. fig, ...
  1036. [fname '.pdf']);
  1037. end
  1038. close(fig);
  1039. end

MetaAnalysis_groups_final.m at commit 4825af5, no license · at the source

Overview

  1. Instituto Politécnico Nacional, Unidad Profesional Interdisciplinaria en Ingeniería y Tecnologías Avanzadas (UPIITA), Mexico City 07340, Mexico; (K.-V.V.-D.-L.); (L.-I.G.-J.); (B.-A.R.-J.)
  2. Instituto Politécnico Nacional, Escuela Superior de Medicina (ESM), Mexico City 07738, Mexico
  3. Tecnologico de Monterrey, Escuela de Ingeniería y Ciencias, Monterrey 64849, Mexico; (J.M.A.); (O.M.-M.)
Journal: Sensors (Basel, Switzerland), volume 26, issue 16, article 5121
Dates: received 11 June 2026; accepted 6 August 2026; published online 13 August 2026
Type: Review · Language: English
License: CC BY
Identifiers: DOI 10.3390/s26165121 · PMID 42655431 · PMCID PMC13517259 · OpenAlex W7202383377
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), human (organism)
Methods: Physiology & signal measures
Keywords: surface electromyography, sarcopenia, machine learning, neuromuscular function, aged, muscle strength, hand grip, meta-analysis
MeSH: Electromyography*, Sarcopenia*, Humans, Machine Learning, Muscle, Skeletal (* major topic)
Topic: Nutrition and Health in Aging (Physiology, Medicine), according to OpenAlex
Funding: Instituto Politécnico Nacional and Tecnológico de Monterrey (SIP20253731, SIP20250622, and SECTEI/082/2024)
Citations: not cited yet (Europe PMC); 46 references in the paper

Abstract

Age-related sarcopenia involves structural and functional neuromuscular changes. Electrophysiological measures from surface electromyography (sEMG) capture activation dynamics, spectral fatigue indices and motor unit properties that may constitute objective signatures of sarcopenia. The objective of this work is to systematically review sEMG features, fatigability metrics and AI-based classification/regression approaches reported for sarcopenia assessment between 2019 and 2026. PRISMA guidelines were followed, and IEEE Xplore, PubMed and Scopus were searched for open access human studies. Extracted information comprised sample characteristics, muscles and tasks, signal acquisition and preprocessing, extracted time/frequency/time–frequency and motor unit features, fatigue metrics, machine learning pipelines, validation schemes and dataset accessibility. Studies were classified into activation, fatigue, ML, and neural control groups; risk of bias was assessed. A total of 12 studies fulfilled the inclusion criteria. Recurrent electrophysiological signatures included reduced distal activation with compensatory proximal recruitment and higher antagonist co-activation; diminished MF/IMDF fatigue slopes indicative of Type II fiber loss and altered motor unit recruitment; motor unit analyses revealed decreased discharge rates and larger MUAP amplitudes. AI-based models combining multidomain features (time, spectral, CWT/EMD, and motor unit metrics) yielded reasonable screening performance (AUC/accuracy 0.73–0.89) when using robust feature selection and explainability tools. Heterogeneity in acquisition, normalization, small cohorts and sparse data sharing limited comparability and external validity. The findings indicate that sEMG-derived electrophysiological signatures are promising for sarcopenia detection and monitoring. To translate signatures into reliable clinical tools, standardized protocols, larger shared datasets, multimodal features, including motor unit metrics, and rigorous external validation of AI models are required.

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 4 matches between paragraphs and lines of code.

c4macho/LIPS_ARTICULOS

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 4825af5b7c14c232dbfb4e9eaead3cbfaa7d3cc8, 30 July 2026
Languages: MATLAB (2), R (1)
Size: 159 files, 3 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
3 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;
  • 3 scripts, each with its path and the digest of its content;
  • 4 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

The source code and Supplementary Material are available in the GitHub repository: https://github.com/c4macho/LIPS_ARTICULOS (accessed on 5 August 2026).

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

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 8 keywords, 5 MeSH terms, 1 funder, 39 references.

Cite

This paper

Villanueva-De-Luna, K.-V., Garay-Jimenez, L.-I., Lomelí-González, J., Antelis, J. M., Mendoza-Montoya, O., Rico-Jiménez, B.-A., & Tovar-Corona, B. (2026). Electrophysiological Signatures of Sarcopenia: A Systematic Review of sEMG Features, Fatigue Indices and AI-Based Classifiers. Sensors (Basel, Switzerland), 26(16), 5121. https://doi.org/10.3390/s26165121

BibTeX

@article{villanuevadeluna2026electrophysiological,
author = {Villanueva-De-Luna, Karen-Victoria and Garay-Jimenez, Laura-Ivoone and Lomelí-González, Joel and Antelis, Javier M and Mendoza-Montoya, Omar and Rico-Jiménez, Blanca-Alicia and Tovar-Corona, Blanca},
title = {{Electrophysiological Signatures of Sarcopenia: A Systematic Review of sEMG Features, Fatigue Indices and AI-Based Classifiers}},
journal = {Sensors (Basel, Switzerland)},
year = {2026},
month = aug,
volume = {26},
number = {16},
pages = {5121},
publisher = {Multidisciplinary Digital Publishing Institute (MDPI)},
issn = {1424-8220},
doi = {10.3390/s26165121},
url = {https://doi.org/10.3390/s26165121},
pmid = {42655431},
pmcid = {PMC13517259}
}

RIS

TY - JOUR
AU - Villanueva-De-Luna, Karen-Victoria
AU - Garay-Jimenez, Laura-Ivoone
AU - Lomelí-González, Joel
AU - Antelis, Javier M
AU - Mendoza-Montoya, Omar
AU - Rico-Jiménez, Blanca-Alicia
AU - Tovar-Corona, Blanca
TI - Electrophysiological Signatures of Sarcopenia: A Systematic Review of sEMG Features, Fatigue Indices and AI-Based Classifiers
T2 - Sensors (Basel, Switzerland)
J2 - Sensors (Basel)
PY - 2026
DA - 2026/08/13
VL - 26
IS - 16
SP - 5121
SN - 1424-8220
PB - Multidisciplinary Digital Publishing Institute (MDPI)
DO - 10.3390/s26165121
UR - https://doi.org/10.3390/s26165121
LA - en
ER -

CSL-JSON

{
"id": "10.3390/s26165121",
"type": "article-journal",
"title": "Electrophysiological Signatures of Sarcopenia: A Systematic Review of sEMG Features, Fatigue Indices and AI-Based Classifiers",
"container-title": "Sensors (Basel, Switzerland)",
"author": [
{
"family": "Villanueva-De-Luna",
"given": "Karen-Victoria"
},
{
"family": "Garay-Jimenez",
"given": "Laura-Ivoone"
},
{
"family": "Lomelí-González",
"given": "Joel"
},
{
"family": "Antelis",
"given": "Javier M"
},
{
"family": "Mendoza-Montoya",
"given": "Omar"
},
{
"family": "Rico-Jiménez",
"given": "Blanca-Alicia"
},
{
"family": "Tovar-Corona",
"given": "Blanca"
}
],
"container-title-short": "Sensors (Basel)",
"volume": "26",
"issue": "16",
"page": "5121",
"DOI": "10.3390/s26165121",
"PMID": "42655431",
"PMCID": "PMC13517259",
"ISSN": "1424-8220",
"publisher": "Multidisciplinary Digital Publishing Institute (MDPI)",
"URL": "https://doi.org/10.3390/s26165121",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
13
]
]
}
}

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.3390/nu18172887
Unmetabolized Folic Acid: Biology, Epidemiology, and Clinical Consequences: A Systematic Review.
Journal: Nutrients
In common: 4 references
[2] doi:10.1128/msystems.00416-26 [code]
Integrative multicohort analysis reveals consistent sex differences in gut microbiota of multiple sclerosis patients.
Journal: mSystems
In common: metafor, 2 references
[3] doi:10.1002/epi.70254
Use of artificial intelligence in magnetic resonance imaging across the epileptic patient's journey: A meta-analysis of four clinical applications.
Journal: Epilepsia
In common: 3 references
[4] doi:10.1038/s41467-026-74565-0 [code]
The functional neurobiology of dispositions towards negative emotions.
Journal: Nature communications
In common: metafor, Statistics and Machine Learning Toolbox
[5] doi:10.1159/000551193
Intracranial Arterial Calcification on Computed Tomography and Risk of Cognitive Impairment or Dementia: A Systematic Review and Meta-Analysis.
Journal: Cerebrovascular diseases (Basel, Switzerland)
In common: other, 2 references
[6] doi:10.2196/83790
Explainable and Interpretable AI for Voice and Speech Analysis in Clinical Care: Systematic Review.
Journal: Journal of medical Internet research
In common: 2 references
[7] doi:10.1007/s10072-026-09234-7
Creative thinking in Parkinson's disease: A systematic review and meta-analysis.
Journal: Neurological sciences : official journal of the Italian Neurological Society and of the Italian Society of Clinical Neurophysiology
In common: 2 references
[8] doi:10.1002/gps3.70042 [code]
Effects of single-session transcranial direct current stimulation on response inhibition in stop-signal task performance: A meta-analysis and systematic review.
Journal: General psychiatry
In common: metafor, other
[9] doi:10.3390/diseases14080268 [code]
Common Inflammatory Pathways Between Periodontal Disease and Multiple Sclerosis: A Systematic Review.
Journal: Diseases (Basel, Switzerland)
In common: 2 references
[10] doi:10.1007/s40120-026-00924-0
Artificial Intelligence and Machine Learning in Pediatric Epilepsy: A Systematic Review.
Journal: Neurology and therapy
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.