From 963fd889b248a3cc04fd8e039d77682b1839097a Mon Sep 17 00:00:00 2001 From: Experiments DB Dev Date: Mon, 20 Jul 2026 17:49:09 -0400 Subject: [PATCH] feat(matlab): windowed paper-LME replication for mergeNaive (d0_10, d0_13) Make tdcs_paper_lme window-aware (windowKey 'full'|'d0_10'|'d0_13', default 'full' -> unchanged filename). Windowed runs give the two anchor arms equal day coverage, so the stim:day interaction is not confounded by the full-range coverage imbalance; the report now states whether coverage is equal and adds an INTERPRETATION block. Add switch cases paper_mergeNaive_d0_10 / _d0_13 and include them in run_all. Finding: unlike mergeA2 (fair-window interaction n.s.), the pooled-naive control keeps the interaction significant in the fair d0_13 window (F(1)=7.07, p=0.0088, +1.80 [+0.46,+3.14]; equal on Day 1 p=0.20), reproducing the paper without the coverage confound; d0_10 is borderline (p=0.051). Tests: tLme asserts equal coverage / no warning / one full summary for both windows and a significant positive d0_13 interaction; bad windowKey errors. Suite 41/41. Co-Authored-By: Claude Opus 4.8 --- analysis/matlab/derived/mergeNaive_d0_10.csv | 127 +++++++++++++++ analysis/matlab/derived/mergeNaive_d0_13.csv | 153 ++++++++++++++++++ analysis/matlab/results/paper_mergeA2.txt | 7 +- .../matlab/results/paper_mergeNaive_d0_10.txt | 71 ++++++++ .../matlab/results/paper_mergeNaive_d0_13.txt | 71 ++++++++ analysis/matlab/run_all.m | 3 +- analysis/matlab/tdcs_glm.m | 6 + analysis/matlab/tdcs_paper_lme.m | 80 +++++++-- analysis/matlab/tests/tLme.m | 30 ++++ 9 files changed, 532 insertions(+), 16 deletions(-) create mode 100644 analysis/matlab/derived/mergeNaive_d0_10.csv create mode 100644 analysis/matlab/derived/mergeNaive_d0_13.csv create mode 100644 analysis/matlab/results/paper_mergeNaive_d0_10.txt create mode 100644 analysis/matlab/results/paper_mergeNaive_d0_13.txt diff --git a/analysis/matlab/derived/mergeNaive_d0_10.csv b/analysis/matlab/derived/mergeNaive_d0_10.csv new file mode 100644 index 0000000..0ff8202 --- /dev/null +++ b/analysis/matlab/derived/mergeNaive_d0_10.csv @@ -0,0 +1,127 @@ +subject,group,day,success,total,day_c,day_c2 +Banh-mi-1,Electrode-Box-B2,0,13,84,-4.92063492063492,24.2126480221718 +Banh-mi-1,Electrode-Box-B2,1,35,86,-3.92063492063492,15.371378180902 +Banh-mi-1,Electrode-Box-B2,2,47,110,-2.92063492063492,8.53010833963215 +Banh-mi-1,Electrode-Box-B2,3,65,140,-1.92063492063492,3.68883849836231 +Banh-mi-1,Electrode-Box-B2,4,70,127,-0.920634920634921,0.847568657092467 +Banh-mi-1,Electrode-Box-B2,5,102,142,0.0793650793650791,0.0062988158226253 +Banh-mi-1,Electrode-Box-B2,6,90,131,1.07936507936508,1.16502897455278 +Banh-mi-1,Electrode-Box-B2,7,109,148,2.07936507936508,4.32375913328294 +Banh-mi-1,Electrode-Box-B2,8,104,137,3.07936507936508,9.4824892920131 +Banh-mi-1,Electrode-Box-B2,9,119,150,4.07936507936508,16.6412194507433 +Banh-mi-1,Electrode-Box-B2,10,121,158,5.07936507936508,25.7999496094734 +Banh-mi-2,Electrode-Box-A2,0,25,97,-4.92063492063492,24.2126480221718 +Banh-mi-2,Electrode-Box-A2,1,22,101,-3.92063492063492,15.371378180902 +Banh-mi-2,Electrode-Box-A2,2,22,119,-2.92063492063492,8.53010833963215 +Banh-mi-2,Electrode-Box-A2,3,29,118,-1.92063492063492,3.68883849836231 +Banh-mi-2,Electrode-Box-A2,4,27,136,-0.920634920634921,0.847568657092467 +Banh-mi-2,Electrode-Box-A2,5,43,146,0.0793650793650791,0.0062988158226253 +Banh-mi-2,Electrode-Box-A2,6,74,146,1.07936507936508,1.16502897455278 +Banh-mi-2,Electrode-Box-A2,7,70,148,2.07936507936508,4.32375913328294 +Banh-mi-2,Electrode-Box-A2,8,65,130,3.07936507936508,9.4824892920131 +Banh-mi-2,Electrode-Box-A2,9,79,151,4.07936507936508,16.6412194507433 +Banh-mi-2,Electrode-Box-A2,10,93,152,5.07936507936508,25.7999496094734 +Egg-tart-1,Electrode-Box-B2,0,7,56,-4.92063492063492,24.2126480221718 +Egg-tart-1,Electrode-Box-B2,1,16,78,-3.92063492063492,15.371378180902 +Egg-tart-1,Electrode-Box-B2,2,23,103,-2.92063492063492,8.53010833963215 +Egg-tart-1,Electrode-Box-B2,3,63,120,-1.92063492063492,3.68883849836231 +Egg-tart-1,Electrode-Box-B2,4,69,132,-0.920634920634921,0.847568657092467 +Egg-tart-1,Electrode-Box-B2,5,83,136,0.0793650793650791,0.0062988158226253 +Egg-tart-1,Electrode-Box-B2,6,71,142,1.07936507936508,1.16502897455278 +Egg-tart-1,Electrode-Box-B2,7,79,138,2.07936507936508,4.32375913328294 +Egg-tart-1,Electrode-Box-B2,8,98,142,3.07936507936508,9.4824892920131 +Egg-tart-1,Electrode-Box-B2,9,89,139,4.07936507936508,16.6412194507433 +Egg-tart-1,Electrode-Box-B2,10,96,143,5.07936507936508,25.7999496094734 +Egg-tart-2,Electrode-Box-A2,0,9,32,-4.92063492063492,24.2126480221718 +Egg-tart-2,Electrode-Box-A2,1,2,38,-3.92063492063492,15.371378180902 +Egg-tart-2,Electrode-Box-A2,2,31,93,-2.92063492063492,8.53010833963215 +Egg-tart-2,Electrode-Box-A2,3,44,101,-1.92063492063492,3.68883849836231 +Egg-tart-2,Electrode-Box-A2,4,54,131,-0.920634920634921,0.847568657092467 +Egg-tart-2,Electrode-Box-A2,5,84,139,0.0793650793650791,0.0062988158226253 +Egg-tart-2,Electrode-Box-A2,6,85,145,1.07936507936508,1.16502897455278 +Egg-tart-2,Electrode-Box-A2,7,79,143,2.07936507936508,4.32375913328294 +Egg-tart-2,Electrode-Box-A2,8,76,131,3.07936507936508,9.4824892920131 +Egg-tart-2,Electrode-Box-A2,9,88,149,4.07936507936508,16.6412194507433 +Egg-tart-2,Electrode-Box-A2,10,81,151,5.07936507936508,25.7999496094734 +Khoai-lang-1,Electrode-Box-B2,0,3,69,-4.92063492063492,24.2126480221718 +Khoai-lang-1,Electrode-Box-B2,1,18,97,-3.92063492063492,15.371378180902 +Khoai-lang-1,Electrode-Box-B2,2,27,84,-2.92063492063492,8.53010833963215 +Khoai-lang-1,Electrode-Box-B2,3,46,121,-1.92063492063492,3.68883849836231 +Khoai-lang-1,Electrode-Box-B2,4,65,143,-0.920634920634921,0.847568657092467 +Khoai-lang-1,Electrode-Box-B2,5,76,141,0.0793650793650791,0.0062988158226253 +Khoai-lang-1,Electrode-Box-B2,6,79,146,1.07936507936508,1.16502897455278 +Khoai-lang-1,Electrode-Box-B2,7,81,153,2.07936507936508,4.32375913328294 +Khoai-lang-1,Electrode-Box-B2,8,98,144,3.07936507936508,9.4824892920131 +Khoai-lang-1,Electrode-Box-B2,9,101,149,4.07936507936508,16.6412194507433 +Khoai-lang-1,Electrode-Box-B2,10,103,150,5.07936507936508,25.7999496094734 +Khoai-lang-2,Electrode-Box-A2,0,0,0,-4.92063492063492,24.2126480221718 +Khoai-lang-2,Electrode-Box-A2,1,0,0,-3.92063492063492,15.371378180902 +Khoai-lang-2,Electrode-Box-A2,2,10,47,-2.92063492063492,8.53010833963215 +Khoai-lang-2,Electrode-Box-A2,3,11,52,-1.92063492063492,3.68883849836231 +Khoai-lang-2,Electrode-Box-A2,4,9,56,-0.920634920634921,0.847568657092467 +Khoai-lang-2,Electrode-Box-A2,5,34,95,0.0793650793650791,0.0062988158226253 +Khoai-lang-2,Electrode-Box-A2,6,21,72,1.07936507936508,1.16502897455278 +Khoai-lang-2,Electrode-Box-A2,7,23,99,2.07936507936508,4.32375913328294 +Khoai-lang-2,Electrode-Box-A2,8,64,136,3.07936507936508,9.4824892920131 +Khoai-lang-2,Electrode-Box-A2,9,75,131,4.07936507936508,16.6412194507433 +Khoai-lang-2,Electrode-Box-A2,10,63,134,5.07936507936508,25.7999496094734 +Khoai-tay-1,Electrode-Box-A,0,14,62,-4.92063492063492,24.2126480221718 +Khoai-tay-1,Electrode-Box-A,1,22,83,-3.92063492063492,15.371378180902 +Khoai-tay-1,Electrode-Box-A,2,6,79,-2.92063492063492,8.53010833963215 +Khoai-tay-1,Electrode-Box-A,3,28,97,-1.92063492063492,3.68883849836231 +Khoai-tay-1,Electrode-Box-A,4,60,134,-0.920634920634921,0.847568657092467 +Khoai-tay-1,Electrode-Box-A,5,75,138,0.0793650793650791,0.0062988158226253 +Khoai-tay-1,Electrode-Box-A,6,81,137,1.07936507936508,1.16502897455278 +Khoai-tay-1,Electrode-Box-A,7,78,147,2.07936507936508,4.32375913328294 +Khoai-tay-1,Electrode-Box-A,8,91,132,3.07936507936508,9.4824892920131 +Khoai-tay-1,Electrode-Box-A,9,99,146,4.07936507936508,16.6412194507433 +Khoai-tay-1,Electrode-Box-A,10,94,143,5.07936507936508,25.7999496094734 +Khoai-tay-2,Electrode-Box-A2,1,21,68,-3.92063492063492,15.371378180902 +Khoai-tay-2,Electrode-Box-A2,2,6,79,-2.92063492063492,8.53010833963215 +Khoai-tay-2,Electrode-Box-A2,3,0,83,-1.92063492063492,3.68883849836231 +Khoai-tay-2,Electrode-Box-A2,4,28,87,-0.920634920634921,0.847568657092467 +Khoai-tay-2,Electrode-Box-A2,5,31,125,0.0793650793650791,0.0062988158226253 +Khoai-tay-2,Electrode-Box-A2,6,62,144,1.07936507936508,1.16502897455278 +Khoai-tay-2,Electrode-Box-A2,7,87,141,2.07936507936508,4.32375913328294 +Khoai-tay-2,Electrode-Box-A2,8,105,152,3.07936507936508,9.4824892920131 +Khoai-tay-2,Electrode-Box-A2,9,75,148,4.07936507936508,16.6412194507433 +Khoai-tay-2,Electrode-Box-A2,10,101,149,5.07936507936508,25.7999496094734 +OM-2,Electrode-Box-A2,0,1,7,-4.92063492063492,24.2126480221718 +OM-2,Electrode-Box-A2,1,11,33,-3.92063492063492,15.371378180902 +OM-2,Electrode-Box-A2,2,19,62,-2.92063492063492,8.53010833963215 +OM-2,Electrode-Box-A2,3,29,117,-1.92063492063492,3.68883849836231 +OM-2,Electrode-Box-A2,4,73,126,-0.920634920634921,0.847568657092467 +OM-2,Electrode-Box-A2,5,53,135,0.0793650793650791,0.0062988158226253 +OM-2,Electrode-Box-A2,6,73,138,1.07936507936508,1.16502897455278 +OM-2,Electrode-Box-A2,7,80,131,2.07936507936508,4.32375913328294 +OM-2,Electrode-Box-A2,8,91,141,3.07936507936508,9.4824892920131 +OM-2,Electrode-Box-A2,9,90,135,4.07936507936508,16.6412194507433 +OM-2,Electrode-Box-A2,10,95,142,5.07936507936508,25.7999496094734 +Root-beer-1,Electrode-Box-B2,0,11,85,-4.92063492063492,24.2126480221718 +Root-beer-1,Electrode-Box-B2,1,18,76,-3.92063492063492,15.371378180902 +Root-beer-1,Electrode-Box-B2,2,40,105,-2.92063492063492,8.53010833963215 +Root-beer-1,Electrode-Box-B2,3,55,134,-1.92063492063492,3.68883849836231 +Root-beer-1,Electrode-Box-B2,4,75,136,-0.920634920634921,0.847568657092467 +Root-beer-1,Electrode-Box-B2,5,64,133,0.0793650793650791,0.0062988158226253 +Root-beer-1,Electrode-Box-B2,6,104,139,1.07936507936508,1.16502897455278 +Root-beer-1,Electrode-Box-B2,7,98,148,2.07936507936508,4.32375913328294 +Root-beer-1,Electrode-Box-B2,8,81,145,3.07936507936508,9.4824892920131 +Root-beer-1,Electrode-Box-B2,9,89,156,4.07936507936508,16.6412194507433 +Root-beer-1,Electrode-Box-B2,10,105,158,5.07936507936508,25.7999496094734 +Root-beer-2,Electrode-Box-A2,0,22,74,-4.92063492063492,24.2126480221718 +Root-beer-2,Electrode-Box-A2,1,31,87,-3.92063492063492,15.371378180902 +Root-beer-2,Electrode-Box-A2,2,49,134,-2.92063492063492,8.53010833963215 +Root-beer-2,Electrode-Box-A2,3,31,89,-1.92063492063492,3.68883849836231 +Root-beer-2,Electrode-Box-A2,4,60,140,-0.920634920634921,0.847568657092467 +Root-beer-2,Electrode-Box-A2,5,84,147,0.0793650793650791,0.0062988158226253 +Vu-vuong,Electrode-Box-A2,0,18,61,-4.92063492063492,24.2126480221718 +Vu-vuong,Electrode-Box-A2,1,35,91,-3.92063492063492,15.371378180902 +Vu-vuong,Electrode-Box-A2,2,61,127,-2.92063492063492,8.53010833963215 +Vu-vuong,Electrode-Box-A2,3,34,146,-1.92063492063492,3.68883849836231 +Vu-vuong,Electrode-Box-A2,4,61,141,-0.920634920634921,0.847568657092467 +Vu-vuong,Electrode-Box-A2,5,37,151,0.0793650793650791,0.0062988158226253 +Vu-vuong,Electrode-Box-A2,6,49,131,1.07936507936508,1.16502897455278 +Vu-vuong,Electrode-Box-A2,7,65,149,2.07936507936508,4.32375913328294 +Vu-vuong,Electrode-Box-A2,8,67,141,3.07936507936508,9.4824892920131 +Vu-vuong,Electrode-Box-A2,9,73,140,4.07936507936508,16.6412194507433 +Vu-vuong,Electrode-Box-A2,10,72,131,5.07936507936508,25.7999496094734 diff --git a/analysis/matlab/derived/mergeNaive_d0_13.csv b/analysis/matlab/derived/mergeNaive_d0_13.csv new file mode 100644 index 0000000..73a4c6e --- /dev/null +++ b/analysis/matlab/derived/mergeNaive_d0_13.csv @@ -0,0 +1,153 @@ +subject,group,day,success,total,day_c,day_c2 +Banh-mi-1,Electrode-Box-B2,0,13,84,-6.125,37.515625 +Banh-mi-1,Electrode-Box-B2,1,35,86,-5.125,26.265625 +Banh-mi-1,Electrode-Box-B2,2,47,110,-4.125,17.015625 +Banh-mi-1,Electrode-Box-B2,3,65,140,-3.125,9.765625 +Banh-mi-1,Electrode-Box-B2,4,70,127,-2.125,4.515625 +Banh-mi-1,Electrode-Box-B2,5,102,142,-1.125,1.265625 +Banh-mi-1,Electrode-Box-B2,6,90,131,-0.125,0.015625 +Banh-mi-1,Electrode-Box-B2,7,109,148,0.875,0.765625 +Banh-mi-1,Electrode-Box-B2,8,104,137,1.875,3.515625 +Banh-mi-1,Electrode-Box-B2,9,119,150,2.875,8.265625 +Banh-mi-1,Electrode-Box-B2,10,121,158,3.875,15.015625 +Banh-mi-1,Electrode-Box-B2,11,121,148,4.875,23.765625 +Banh-mi-1,Electrode-Box-B2,12,120,149,5.875,34.515625 +Banh-mi-1,Electrode-Box-B2,13,135,154,6.875,47.265625 +Banh-mi-2,Electrode-Box-A2,0,25,97,-6.125,37.515625 +Banh-mi-2,Electrode-Box-A2,1,22,101,-5.125,26.265625 +Banh-mi-2,Electrode-Box-A2,2,22,119,-4.125,17.015625 +Banh-mi-2,Electrode-Box-A2,3,29,118,-3.125,9.765625 +Banh-mi-2,Electrode-Box-A2,4,27,136,-2.125,4.515625 +Banh-mi-2,Electrode-Box-A2,5,43,146,-1.125,1.265625 +Banh-mi-2,Electrode-Box-A2,6,74,146,-0.125,0.015625 +Banh-mi-2,Electrode-Box-A2,7,70,148,0.875,0.765625 +Banh-mi-2,Electrode-Box-A2,8,65,130,1.875,3.515625 +Banh-mi-2,Electrode-Box-A2,9,79,151,2.875,8.265625 +Banh-mi-2,Electrode-Box-A2,10,93,152,3.875,15.015625 +Egg-tart-1,Electrode-Box-B2,0,7,56,-6.125,37.515625 +Egg-tart-1,Electrode-Box-B2,1,16,78,-5.125,26.265625 +Egg-tart-1,Electrode-Box-B2,2,23,103,-4.125,17.015625 +Egg-tart-1,Electrode-Box-B2,3,63,120,-3.125,9.765625 +Egg-tart-1,Electrode-Box-B2,4,69,132,-2.125,4.515625 +Egg-tart-1,Electrode-Box-B2,5,83,136,-1.125,1.265625 +Egg-tart-1,Electrode-Box-B2,6,71,142,-0.125,0.015625 +Egg-tart-1,Electrode-Box-B2,7,79,138,0.875,0.765625 +Egg-tart-1,Electrode-Box-B2,8,98,142,1.875,3.515625 +Egg-tart-1,Electrode-Box-B2,9,89,139,2.875,8.265625 +Egg-tart-1,Electrode-Box-B2,10,96,143,3.875,15.015625 +Egg-tart-1,Electrode-Box-B2,11,96,148,4.875,23.765625 +Egg-tart-1,Electrode-Box-B2,12,101,156,5.875,34.515625 +Egg-tart-1,Electrode-Box-B2,13,103,152,6.875,47.265625 +Egg-tart-2,Electrode-Box-A2,0,9,32,-6.125,37.515625 +Egg-tart-2,Electrode-Box-A2,1,2,38,-5.125,26.265625 +Egg-tart-2,Electrode-Box-A2,2,31,93,-4.125,17.015625 +Egg-tart-2,Electrode-Box-A2,3,44,101,-3.125,9.765625 +Egg-tart-2,Electrode-Box-A2,4,54,131,-2.125,4.515625 +Egg-tart-2,Electrode-Box-A2,5,84,139,-1.125,1.265625 +Egg-tart-2,Electrode-Box-A2,6,85,145,-0.125,0.015625 +Egg-tart-2,Electrode-Box-A2,7,79,143,0.875,0.765625 +Egg-tart-2,Electrode-Box-A2,8,76,131,1.875,3.515625 +Egg-tart-2,Electrode-Box-A2,9,88,149,2.875,8.265625 +Egg-tart-2,Electrode-Box-A2,10,81,151,3.875,15.015625 +Egg-tart-2,Electrode-Box-A2,11,78,152,4.875,23.765625 +Egg-tart-2,Electrode-Box-A2,12,96,155,5.875,34.515625 +Egg-tart-2,Electrode-Box-A2,13,84,155,6.875,47.265625 +Khoai-lang-1,Electrode-Box-B2,0,3,69,-6.125,37.515625 +Khoai-lang-1,Electrode-Box-B2,1,18,97,-5.125,26.265625 +Khoai-lang-1,Electrode-Box-B2,2,27,84,-4.125,17.015625 +Khoai-lang-1,Electrode-Box-B2,3,46,121,-3.125,9.765625 +Khoai-lang-1,Electrode-Box-B2,4,65,143,-2.125,4.515625 +Khoai-lang-1,Electrode-Box-B2,5,76,141,-1.125,1.265625 +Khoai-lang-1,Electrode-Box-B2,6,79,146,-0.125,0.015625 +Khoai-lang-1,Electrode-Box-B2,7,81,153,0.875,0.765625 +Khoai-lang-1,Electrode-Box-B2,8,98,144,1.875,3.515625 +Khoai-lang-1,Electrode-Box-B2,9,101,149,2.875,8.265625 +Khoai-lang-1,Electrode-Box-B2,10,103,150,3.875,15.015625 +Khoai-lang-1,Electrode-Box-B2,11,113,154,4.875,23.765625 +Khoai-lang-1,Electrode-Box-B2,12,117,148,5.875,34.515625 +Khoai-lang-1,Electrode-Box-B2,13,114,146,6.875,47.265625 +Khoai-lang-2,Electrode-Box-A2,0,0,0,-6.125,37.515625 +Khoai-lang-2,Electrode-Box-A2,1,0,0,-5.125,26.265625 +Khoai-lang-2,Electrode-Box-A2,2,10,47,-4.125,17.015625 +Khoai-lang-2,Electrode-Box-A2,3,11,52,-3.125,9.765625 +Khoai-lang-2,Electrode-Box-A2,4,9,56,-2.125,4.515625 +Khoai-lang-2,Electrode-Box-A2,5,34,95,-1.125,1.265625 +Khoai-lang-2,Electrode-Box-A2,6,21,72,-0.125,0.015625 +Khoai-lang-2,Electrode-Box-A2,7,23,99,0.875,0.765625 +Khoai-lang-2,Electrode-Box-A2,8,64,136,1.875,3.515625 +Khoai-lang-2,Electrode-Box-A2,9,75,131,2.875,8.265625 +Khoai-lang-2,Electrode-Box-A2,10,63,134,3.875,15.015625 +Khoai-lang-2,Electrode-Box-A2,11,59,139,4.875,23.765625 +Khoai-lang-2,Electrode-Box-A2,12,51,129,5.875,34.515625 +Khoai-lang-2,Electrode-Box-A2,13,73,143,6.875,47.265625 +Khoai-tay-1,Electrode-Box-A,0,14,62,-6.125,37.515625 +Khoai-tay-1,Electrode-Box-A,1,22,83,-5.125,26.265625 +Khoai-tay-1,Electrode-Box-A,2,6,79,-4.125,17.015625 +Khoai-tay-1,Electrode-Box-A,3,28,97,-3.125,9.765625 +Khoai-tay-1,Electrode-Box-A,4,60,134,-2.125,4.515625 +Khoai-tay-1,Electrode-Box-A,5,75,138,-1.125,1.265625 +Khoai-tay-1,Electrode-Box-A,6,81,137,-0.125,0.015625 +Khoai-tay-1,Electrode-Box-A,7,78,147,0.875,0.765625 +Khoai-tay-1,Electrode-Box-A,8,91,132,1.875,3.515625 +Khoai-tay-1,Electrode-Box-A,9,99,146,2.875,8.265625 +Khoai-tay-1,Electrode-Box-A,10,94,143,3.875,15.015625 +Khoai-tay-1,Electrode-Box-A,11,110,156,4.875,23.765625 +Khoai-tay-1,Electrode-Box-A,12,105,143,5.875,34.515625 +Khoai-tay-1,Electrode-Box-A,13,106,153,6.875,47.265625 +Khoai-tay-2,Electrode-Box-A2,1,21,68,-5.125,26.265625 +Khoai-tay-2,Electrode-Box-A2,2,6,79,-4.125,17.015625 +Khoai-tay-2,Electrode-Box-A2,3,0,83,-3.125,9.765625 +Khoai-tay-2,Electrode-Box-A2,4,28,87,-2.125,4.515625 +Khoai-tay-2,Electrode-Box-A2,5,31,125,-1.125,1.265625 +Khoai-tay-2,Electrode-Box-A2,6,62,144,-0.125,0.015625 +Khoai-tay-2,Electrode-Box-A2,7,87,141,0.875,0.765625 +Khoai-tay-2,Electrode-Box-A2,8,105,152,1.875,3.515625 +Khoai-tay-2,Electrode-Box-A2,9,75,148,2.875,8.265625 +Khoai-tay-2,Electrode-Box-A2,10,101,149,3.875,15.015625 +Khoai-tay-2,Electrode-Box-A2,11,102,154,4.875,23.765625 +Khoai-tay-2,Electrode-Box-A2,12,95,144,5.875,34.515625 +Khoai-tay-2,Electrode-Box-A2,13,77,149,6.875,47.265625 +OM-2,Electrode-Box-A2,0,1,7,-6.125,37.515625 +OM-2,Electrode-Box-A2,1,11,33,-5.125,26.265625 +OM-2,Electrode-Box-A2,2,19,62,-4.125,17.015625 +OM-2,Electrode-Box-A2,3,29,117,-3.125,9.765625 +OM-2,Electrode-Box-A2,4,73,126,-2.125,4.515625 +OM-2,Electrode-Box-A2,5,53,135,-1.125,1.265625 +OM-2,Electrode-Box-A2,6,73,138,-0.125,0.015625 +OM-2,Electrode-Box-A2,7,80,131,0.875,0.765625 +OM-2,Electrode-Box-A2,8,91,141,1.875,3.515625 +OM-2,Electrode-Box-A2,9,90,135,2.875,8.265625 +OM-2,Electrode-Box-A2,10,95,142,3.875,15.015625 +OM-2,Electrode-Box-A2,11,60,133,4.875,23.765625 +OM-2,Electrode-Box-A2,12,58,142,5.875,34.515625 +Root-beer-1,Electrode-Box-B2,0,11,85,-6.125,37.515625 +Root-beer-1,Electrode-Box-B2,1,18,76,-5.125,26.265625 +Root-beer-1,Electrode-Box-B2,2,40,105,-4.125,17.015625 +Root-beer-1,Electrode-Box-B2,3,55,134,-3.125,9.765625 +Root-beer-1,Electrode-Box-B2,4,75,136,-2.125,4.515625 +Root-beer-1,Electrode-Box-B2,5,64,133,-1.125,1.265625 +Root-beer-1,Electrode-Box-B2,6,104,139,-0.125,0.015625 +Root-beer-1,Electrode-Box-B2,7,98,148,0.875,0.765625 +Root-beer-1,Electrode-Box-B2,8,81,145,1.875,3.515625 +Root-beer-1,Electrode-Box-B2,9,89,156,2.875,8.265625 +Root-beer-1,Electrode-Box-B2,10,105,158,3.875,15.015625 +Root-beer-2,Electrode-Box-A2,0,22,74,-6.125,37.515625 +Root-beer-2,Electrode-Box-A2,1,31,87,-5.125,26.265625 +Root-beer-2,Electrode-Box-A2,2,49,134,-4.125,17.015625 +Root-beer-2,Electrode-Box-A2,3,31,89,-3.125,9.765625 +Root-beer-2,Electrode-Box-A2,4,60,140,-2.125,4.515625 +Root-beer-2,Electrode-Box-A2,5,84,147,-1.125,1.265625 +Vu-vuong,Electrode-Box-A2,0,18,61,-6.125,37.515625 +Vu-vuong,Electrode-Box-A2,1,35,91,-5.125,26.265625 +Vu-vuong,Electrode-Box-A2,2,61,127,-4.125,17.015625 +Vu-vuong,Electrode-Box-A2,3,34,146,-3.125,9.765625 +Vu-vuong,Electrode-Box-A2,4,61,141,-2.125,4.515625 +Vu-vuong,Electrode-Box-A2,5,37,151,-1.125,1.265625 +Vu-vuong,Electrode-Box-A2,6,49,131,-0.125,0.015625 +Vu-vuong,Electrode-Box-A2,7,65,149,0.875,0.765625 +Vu-vuong,Electrode-Box-A2,8,67,141,1.875,3.515625 +Vu-vuong,Electrode-Box-A2,9,73,140,2.875,8.265625 +Vu-vuong,Electrode-Box-A2,10,72,131,3.875,15.015625 +Vu-vuong,Electrode-Box-A2,11,89,158,4.875,23.765625 +Vu-vuong,Electrode-Box-A2,12,97,154,5.875,34.515625 +Vu-vuong,Electrode-Box-A2,13,93,145,6.875,47.265625 diff --git a/analysis/matlab/results/paper_mergeA2.txt b/analysis/matlab/results/paper_mergeA2.txt index 3ab9756..e89c4c4 100644 --- a/analysis/matlab/results/paper_mergeA2.txt +++ b/analysis/matlab/results/paper_mergeA2.txt @@ -1,7 +1,8 @@ ============================================================================== -PAPER LME REPLICATION -- mergeA2 +PAPER LME REPLICATION -- mergeA2 (full range) ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) [stim: Electrode-Box-B2=1 vs Electrode-Box-A2=0] +behavior = successful reaches (COUNT per session) N = 8 rats, 109 sessions (day raw; day 0 = paper "Day 1") day coverage: stim(B2) 0..22, control(A2) 0..14 ** WARNING: unequal day coverage -- the full-range stim:day interaction @@ -63,5 +64,9 @@ day (learning) t(105)= 9.82 F(1)= 96.388 p=1.573e-16 stim (main, Day 1) t(105)= 3.43 F(1)= 11.778 p=0.0008585 interaction 95% CI: [-3.80, -0.56] +INTERPRETATION + - stim x day interaction: SIGNIFICANT (p=0.0090, slope diff=-2.18) -> tDCS (Box-B2) improves SLOWER -- groups converge. + - stim main effect on Day 1 (our day 0): SIGNIFICANT (p=0.0009) -> groups already DIFFER on Day 1. + Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008; day t(227)=9.64, F(1)=267.64, p=1.2e-18; stim t(227)=0.23, F(1)=0.053, p=0.81. diff --git a/analysis/matlab/results/paper_mergeNaive_d0_10.txt b/analysis/matlab/results/paper_mergeNaive_d0_10.txt new file mode 100644 index 0000000..ba95638 --- /dev/null +++ b/analysis/matlab/results/paper_mergeNaive_d0_10.txt @@ -0,0 +1,71 @@ +============================================================================== +PAPER LME REPLICATION -- mergeNaive (days 0-10) +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) [stim: Electrode-Box-B2=1 vs Electrode-Box-A2=0] +behavior = successful reaches (COUNT per session) +N = 11 rats, 115 sessions (day raw; day 0 = paper "Day 1") +day coverage: stim(B2) 0..10, control(A2) 0..10 +(Equal day coverage -- the stim:day interaction over this window is NOT + confounded by the full-range coverage imbalance.) + +============================================================================== +FULL MODEL SUMMARY -- fitlme: behavior ~ stim + day + stim:day + (1|rat) +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 115 + Fixed effects coefficients 4 + Random effects coefficients 11 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + 952.54 969.01 -470.27 940.54 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 10.33 4.3573 2.3706 111 0.019482 + {'day' } 8.0907 0.51948 15.575 111 1.0806e-29 + {'stim' } 9.4432 7.1538 1.32 111 0.18954 + {'day:stim' } 1.6184 0.8216 1.9699 111 0.051345 + + + Lower Upper + 1.6953 18.964 + 7.0613 9.12 + -4.7326 23.619 + -0.0096134 3.2465 + +Random effects covariance parameters (95% CIs): +Group: rat (11 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 8.4877 + + + Lower Upper + 5.0001 14.408 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 13.352 11.652 15.299 + + + +effect t (df) F (df1) p +------------------------------------------------------------------ +stim x day (interaction) t(111)= 1.97 F(1)= 3.880 p=0.05134 +day (learning) t(111)= 15.57 F(1)= 242.567 p=1.081e-29 +stim (main, Day 1) t(111)= 1.32 F(1)= 1.742 p=0.1895 +interaction 95% CI: [-0.01, +3.25] + +INTERPRETATION + - stim x day interaction: n.s. (p=0.0513, slope diff=+1.62) -> slopes parallel -- no differential learning rate over this window. + - stim main effect on Day 1 (our day 0): n.s. (p=0.1895) -> groups are comparable on Day 1. + +Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008; day t(227)=9.64, + F(1)=267.64, p=1.2e-18; stim t(227)=0.23, F(1)=0.053, p=0.81. diff --git a/analysis/matlab/results/paper_mergeNaive_d0_13.txt b/analysis/matlab/results/paper_mergeNaive_d0_13.txt new file mode 100644 index 0000000..69f8ade --- /dev/null +++ b/analysis/matlab/results/paper_mergeNaive_d0_13.txt @@ -0,0 +1,71 @@ +============================================================================== +PAPER LME REPLICATION -- mergeNaive (days 0-13) +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) [stim: Electrode-Box-B2=1 vs Electrode-Box-A2=0] +behavior = successful reaches (COUNT per session) +N = 11 rats, 138 sessions (day raw; day 0 = paper "Day 1") +day coverage: stim(B2) 0..13, control(A2) 0..13 +(Equal day coverage -- the stim:day interaction over this window is NOT + confounded by the full-range coverage imbalance.) + +============================================================================== +FULL MODEL SUMMARY -- fitlme: behavior ~ stim + day + stim:day + (1|rat) +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 138 + Fixed effects coefficients 4 + Random effects coefficients 11 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + 1164.9 1182.4 -576.44 1152.9 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 16.254 4.2865 3.792 134 0.00022519 + {'day' } 6.4041 0.42677 15.006 134 1.7662e-30 + {'stim' } 8.9845 7.0391 1.2764 134 0.20403 + {'day:stim' } 1.7992 0.67672 2.6587 134 0.008801 + + + Lower Upper + 7.7764 24.732 + 5.5601 7.2482 + -4.9377 22.907 + 0.46073 3.1376 + +Random effects covariance parameters (95% CIs): +Group: rat (11 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 8.1481 + + + Lower Upper + 4.7633 13.938 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 14.825 13.109 16.766 + + + +effect t (df) F (df1) p +------------------------------------------------------------------ +stim x day (interaction) t(134)= 2.66 F(1)= 7.068 p=0.008801 +day (learning) t(134)= 15.01 F(1)= 225.182 p=1.766e-30 +stim (main, Day 1) t(134)= 1.28 F(1)= 1.629 p=0.204 +interaction 95% CI: [+0.46, +3.14] + +INTERPRETATION + - stim x day interaction: SIGNIFICANT (p=0.0088, slope diff=+1.80) -> tDCS (Box-B2) improves FASTER -- benefit accumulates over training. + - stim main effect on Day 1 (our day 0): n.s. (p=0.2040) -> groups are comparable on Day 1. + +Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008; day t(227)=9.64, + F(1)=267.64, p=1.2e-18; stim t(227)=0.23, F(1)=0.053, p=0.81. diff --git a/analysis/matlab/run_all.m b/analysis/matlab/run_all.m index 1f701d8..f9f662b 100644 --- a/analysis/matlab/run_all.m +++ b/analysis/matlab/run_all.m @@ -11,7 +11,8 @@ scenarios = {'unmerged_full', 'unmerged_d0_10', ... 'lme_unmerged_d0_13', 'lme_mergeA2_d0_13', 'lme_mergeB2_d0_13', ... 'phase_unmerged', 'phase_mergeA2', 'phase_mergeB2', ... 'paper_unmerged', 'paper_mergeA2', 'paper_mergeB2', ... - 'mergeNaive_full', 'paper_mergeNaive', 'phase_mergeNaive'}; + 'mergeNaive_full', 'paper_mergeNaive', 'phase_mergeNaive', ... + 'paper_mergeNaive_d0_10', 'paper_mergeNaive_d0_13'}; for i = 1:numel(scenarios) fprintf('\n\n### Running scenario: %s ###\n', scenarios{i}); diff --git a/analysis/matlab/tdcs_glm.m b/analysis/matlab/tdcs_glm.m index 4c428df..8d1951a 100644 --- a/analysis/matlab/tdcs_glm.m +++ b/analysis/matlab/tdcs_glm.m @@ -136,6 +136,12 @@ switch scenario case 'paper_mergeNaive' tdcs_paper_lme('mergeNaive', cfg); + case 'paper_mergeNaive_d0_10' + tdcs_paper_lme('mergeNaive', cfg, 'd0_10'); + + case 'paper_mergeNaive_d0_13' + tdcs_paper_lme('mergeNaive', cfg, 'd0_13'); + case 'phase_mergeNaive' tdcs_phase_lme('mergeNaive', cfg); diff --git a/analysis/matlab/tdcs_paper_lme.m b/analysis/matlab/tdcs_paper_lme.m index a697e99..d2ed67d 100644 --- a/analysis/matlab/tdcs_paper_lme.m +++ b/analysis/matlab/tdcs_paper_lme.m @@ -1,23 +1,40 @@ -function L = tdcs_paper_lme(mergeKey, cfg) +function L = tdcs_paper_lme(mergeKey, cfg, windowKey) %TDCS_PAPER_LME Replicate the paper's linear mixed model, verbatim formula: % behavior ~ stim + day + stim:day + (1|rat) % fit with fitlme on the Box-B2 (stim = 1, tDCS) vs Box-A2 (stim = 0, control) -% subset of the MERGEKEY grouping ('unmerged'|'mergeA2'|'mergeB2'), over the -% full training range. `behavior` = successful reaches, `day` = training day -% (raw; day 0 = the paper's "Day 1"), `rat` = subject. Reports the three -% effects (stim x day interaction, day, stim) as t(df) / F(1) / p with the -% interaction 95% CI, alongside the paper's reference values, and writes -% results/paper_.txt. +% subset of the MERGEKEY grouping ('unmerged'|'mergeA2'|'mergeB2'|'mergeNaive'). +% `behavior` = successful reaches (COUNT), `day` = training day (raw; day 0 = +% the paper's "Day 1"), `rat` = subject. Reports the three effects (stim x day +% interaction, day, stim) as t(df) / F(1) / p with the interaction 95% CI, +% alongside the paper's reference values, and writes a results/ txt file. +% +% L = TDCS_PAPER_LME(MERGEKEY, CFG) uses the full training range (default) and +% writes results/paper_.txt. +% +% L = TDCS_PAPER_LME(MERGEKEY, CFG, WINDOWKEY) restricts to a day window -- +% WINDOWKEY is 'full' (day <= 26), 'd0_10' (day <= 10), or 'd0_13' (day <= 13, +% the last day Box-A2 has data). The windowed fits give the two anchor groups +% EQUAL day coverage, so the stim:day interaction is not confounded by the +% full-range coverage imbalance; windowed runs write +% results/paper__.txt. % % (This is the same model as tdcs_lme -- success ~ day*tDCS + (1|subject) -- % written with the paper's exact term order and variable names.) % -% L fields: .model .nRats .nObs and .stim/.day/.interaction effect structs -% (.estimate .se .t .df .p from Coefficients; .F .df1 .df2 .Fp from ANOVA; -% .ci = coefficient 95% CI). +% L fields: .model .nRats .nObs .windowKey and .stim/.day/.interaction effect +% structs (.estimate .se .t .df .p from Coefficients; .F .df1 .df2 .Fp from +% ANOVA; .ci = coefficient 95% CI). -Sfull = tdcs_scenario_data([mergeKey '_full']); -A = Sfull(ismember(Sfull.group, {cfg.anchorLow, cfg.anchorHigh}), :); +if nargin < 3 || isempty(windowKey) + windowKey = 'full'; +end +if ~ismember(windowKey, {'full', 'd0_10', 'd0_13'}) + error('tdcs_paper_lme:badWindow', ... + 'windowKey must be ''full'', ''d0_10'', or ''d0_13'' (got "%s").', windowKey); +end + +S = tdcs_scenario_data([mergeKey '_' windowKey]); +A = S(ismember(S.group, {cfg.anchorLow, cfg.anchorHigh}), :); tbl = table(); tbl.behavior = A.success; @@ -29,6 +46,7 @@ model = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = model.Coefficients; An = anova(model); ci = coefCI(model); L.model = model; +L.windowKey = windowKey; L.nRats = numel(unique(tbl.rat)); L.nObs = height(tbl); L.maxDayCtrl = max(tbl.day(tbl.stim == 0)); @@ -54,18 +72,32 @@ e = struct('estimate', C.Estimate(i), 'se', C.SE(i), 't', C.tStat(i), ... end function localReport(L, mergeKey, cfg) +window = L.windowKey; +if strcmp(window, 'full') + scenarioName = ['paper_' mergeKey]; + windowLabel = 'full range'; +else + scenarioName = ['paper_' mergeKey '_' window]; + windowLabel = strrep(window, 'd0_10', 'days 0-10'); + windowLabel = strrep(windowLabel, 'd0_13', 'days 0-13'); +end + bar = repmat('=', 1, 78); s = sprintf('%s\n', bar); -s = [s sprintf('PAPER LME REPLICATION -- %s\n', mergeKey)]; +s = [s sprintf('PAPER LME REPLICATION -- %s (%s)\n', mergeKey, windowLabel)]; s = [s sprintf('%s\n', bar)]; s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) [stim: %s=1 vs %s=0]\n', ... cfg.anchorHigh, cfg.anchorLow)]; +s = [s sprintf('behavior = successful reaches (COUNT per session)\n')]; s = [s sprintf('N = %d rats, %d sessions (day raw; day 0 = paper "Day 1")\n', L.nRats, L.nObs)]; s = [s sprintf('day coverage: stim(B2) 0..%d, control(A2) 0..%d\n', L.maxDayStim, L.maxDayCtrl)]; if abs(L.maxDayStim - L.maxDayCtrl) > 2 s = [s sprintf(['** WARNING: unequal day coverage -- the full-range stim:day interaction\n' ... ' extrapolates the control group''s line and is CONFOUNDED here (the paper''s\n' ... ' groups had equal coverage). See the _d0_13 fair-window and phased analyses. **\n'])]; +else + s = [s sprintf(['(Equal day coverage -- the stim:day interaction over this window is NOT\n' ... + ' confounded by the full-range coverage imbalance.)\n'])]; end s = [s sprintf('\n')]; s = [s tdcs_model_summary(L.model, 'fitlme: behavior ~ stim + day + stim:day + (1|rat)') sprintf('\n')]; @@ -75,6 +107,18 @@ s = [s localRow('stim x day (interaction)', L.interaction)]; s = [s localRow('day (learning)', L.day)]; s = [s localRow('stim (main, Day 1)', L.stim)]; s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', L.interaction.ci(1), L.interaction.ci(2))]; +s = [s sprintf('\nINTERPRETATION\n')]; +if L.interaction.p >= 0.05 + interTxt = 'slopes parallel -- no differential learning rate over this window'; +elseif L.interaction.estimate > 0 + interTxt = 'tDCS (Box-B2) improves FASTER -- benefit accumulates over training'; +else + interTxt = 'tDCS (Box-B2) improves SLOWER -- groups converge'; +end +s = [s sprintf(' - stim x day interaction: %s (p=%.4f, slope diff=%+.2f) -> %s.\n', ... + localSigTxt(L.interaction.p), L.interaction.p, L.interaction.estimate, interTxt)]; +s = [s sprintf(' - stim main effect on Day 1 (our day 0): %s (p=%.4f) -> groups %s on Day 1.\n', ... + localSigTxt(L.stim.p), L.stim.p, localPick(L.stim.p < 0.05, 'already DIFFER', 'are comparable'))]; s = [s sprintf(['\nPaper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008; ' ... 'day t(227)=9.64,\n F(1)=267.64, p=1.2e-18; stim t(227)=0.23, F(1)=0.053, p=0.81.\n'])]; @@ -82,7 +126,7 @@ fprintf('%s', s); thisDir = fileparts(mfilename('fullpath')); resDir = fullfile(thisDir, 'results'); if ~exist(resDir, 'dir'); mkdir(resDir); end -fid = fopen(fullfile(resDir, ['paper_' mergeKey '.txt']), 'w'); +fid = fopen(fullfile(resDir, [scenarioName '.txt']), 'w'); if fid < 0; error('tdcs_paper_lme:fopen', 'Cannot open results file.'); end cleanup = onCleanup(@() fclose(fid)); %#ok fprintf(fid, '%s', s); @@ -91,3 +135,11 @@ end function r = localRow(name, e) r = sprintf('%-26s t(%d)=%6.2f F(%d)=%8.3f p=%.4g\n', name, e.df, e.t, e.df1, e.F, e.p); end + +function t = localSigTxt(p) +if p < 0.05; t = 'SIGNIFICANT'; else; t = 'n.s.'; end +end + +function t = localPick(b, yes, no) +if b; t = yes; else; t = no; end +end diff --git a/analysis/matlab/tests/tLme.m b/analysis/matlab/tests/tLme.m index d3e0d7a..d8f2457 100644 --- a/analysis/matlab/tests/tLme.m +++ b/analysis/matlab/tests/tLme.m @@ -59,6 +59,36 @@ classdef tLme < matlab.unittest.TestCase testCase.verifyError(@() tdcs_glm('lme_nonsense'), 'tdcs_glm:badScenario'); end + function testPaperMergeNaiveWindowedFairCoverage(testCase) + % The windowed paper_mergeNaive_* runs cap both anchor arms at the + % window end (equal coverage -> no confound warning), write their own + % results file, and embed the full fitlme summary. Unlike mergeA2, + % the pooled-naive control keeps the interaction significant in the + % fair d0_13 window (~ the paper's F=7.12, p=0.008). + here = fileparts(fileparts(mfilename('fullpath'))); % analysis/matlab + resDir = fullfile(here, 'results'); + for w = {'d0_10', 'd0_13'} + name = ['paper_mergeNaive_' w{1}]; + evalc(sprintf('tdcs_glm(''%s'')', name)); + txt = fileread(fullfile(resDir, [name '.txt'])); + testCase.verifyTrue(contains(txt, 'Equal day coverage'), ... + sprintf('%s: expected equal (fair) day coverage', name)); + testCase.verifyFalse(contains(txt, '** WARNING'), ... + sprintf('%s: fair window should not warn', name)); + testCase.verifyEqual(count(txt, 'Fixed effects coefficients (95% CIs):'), 1); + end + % Fair-window d0_13 interaction reproduces the paper (~F=7.1, p~0.009). + L = tdcs_paper_lme('mergeNaive', tdcs_config(), 'd0_13'); + testCase.verifyEqual(L.maxDayStim, L.maxDayCtrl); % equal coverage + testCase.verifyLessThan(L.interaction.p, 0.05); + testCase.verifyGreaterThan(L.interaction.estimate, 0); + end + + function testPaperLmeBadWindowErrors(testCase) + testCase.verifyError(@() tdcs_paper_lme('mergeNaive', tdcs_config(), 'bogus'), ... + 'tdcs_paper_lme:badWindow'); + end + function testReportsIncludeFullModelSummary(testCase) % Every scenario prints the full native fitlme summary. The lme_*, % paper_*, and phase_* reports each embed disp(model), whose