From 0a438a46491dc62584bc7e6efa0b4018b5e07b1a Mon Sep 17 00:00:00 2001 From: Experiments DB Dev Date: Fri, 24 Jul 2026 02:32:51 -0400 Subject: [PATCH] analysis(matlab): rate + count outputs, variation batch 1 Co-Authored-By: Claude Opus 4.8 --- .../matlab/variations/boxa_a2_d0_10/analyze.m | 102 +++++++++++------- .../boxa_a2_d0_10/learning_curve.png | Bin 41896 -> 41896 bytes .../boxa_a2_d0_10/learning_curve_rate.png | Bin 0 -> 43478 bytes .../boxa_a2_d0_10/logpower_result.txt | 11 +- .../boxa_a2_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_a2_d0_10/logpowersim.m | 77 +++++++------ .../variations/boxa_a2_d0_10/plotcurve.m | 50 +++++---- .../variations/boxa_a2_d0_10/power_result.txt | 13 ++- .../boxa_a2_d0_10/power_result_rate.txt | 28 +++++ .../variations/boxa_a2_d0_10/powersim.m | 69 ++++++------ .../variations/boxa_a2_d0_10/result.txt | 8 +- .../variations/boxa_a2_d0_10/result_rate.txt | 68 ++++++++++++ .../matlab/variations/boxa_a2_d0_5/analyze.m | 102 +++++++++++------- .../boxa_a2_d0_5/learning_curve.png | Bin 36303 -> 36123 bytes .../boxa_a2_d0_5/learning_curve_rate.png | Bin 0 -> 37552 bytes .../boxa_a2_d0_5/logpower_result.txt | 11 +- .../boxa_a2_d0_5/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_a2_d0_5/logpowersim.m | 77 +++++++------ .../variations/boxa_a2_d0_5/plotcurve.m | 50 +++++---- .../variations/boxa_a2_d0_5/power_result.txt | 13 ++- .../boxa_a2_d0_5/power_result_rate.txt | 28 +++++ .../matlab/variations/boxa_a2_d0_5/powersim.m | 69 ++++++------ .../matlab/variations/boxa_a2_d0_5/result.txt | 8 +- .../variations/boxa_a2_d0_5/result_rate.txt | 68 ++++++++++++ .../matlab/variations/boxa_a2_d6_10/analyze.m | 102 +++++++++++------- .../boxa_a2_d6_10/learning_curve.png | Bin 36226 -> 36547 bytes .../boxa_a2_d6_10/learning_curve_rate.png | Bin 0 -> 38861 bytes .../boxa_a2_d6_10/logpower_result.txt | 13 ++- .../boxa_a2_d6_10/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_a2_d6_10/logpowersim.m | 77 +++++++------ .../variations/boxa_a2_d6_10/plotcurve.m | 50 +++++---- .../variations/boxa_a2_d6_10/power_result.txt | 13 ++- .../boxa_a2_d6_10/power_result_rate.txt | 28 +++++ .../variations/boxa_a2_d6_10/powersim.m | 69 ++++++------ .../variations/boxa_a2_d6_10/result.txt | 8 +- .../variations/boxa_a2_d6_10/result_rate.txt | 68 ++++++++++++ .../matlab/variations/boxa_b2_d0_10/analyze.m | 102 +++++++++++------- .../boxa_b2_d0_10/learning_curve.png | Bin 42469 -> 42469 bytes .../boxa_b2_d0_10/learning_curve_rate.png | Bin 0 -> 43659 bytes .../boxa_b2_d0_10/logpower_result.txt | 13 ++- .../boxa_b2_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_b2_d0_10/logpowersim.m | 77 +++++++------ .../variations/boxa_b2_d0_10/plotcurve.m | 50 +++++---- .../variations/boxa_b2_d0_10/power_result.txt | 13 ++- .../boxa_b2_d0_10/power_result_rate.txt | 28 +++++ .../variations/boxa_b2_d0_10/powersim.m | 69 ++++++------ .../variations/boxa_b2_d0_10/result.txt | 8 +- .../variations/boxa_b2_d0_10/result_rate.txt | 68 ++++++++++++ .../matlab/variations/boxa_b2_d0_5/analyze.m | 102 +++++++++++------- .../boxa_b2_d0_5/learning_curve.png | Bin 37343 -> 36794 bytes .../boxa_b2_d0_5/learning_curve_rate.png | Bin 0 -> 38461 bytes .../boxa_b2_d0_5/logpower_result.txt | 11 +- .../boxa_b2_d0_5/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_b2_d0_5/logpowersim.m | 77 +++++++------ .../variations/boxa_b2_d0_5/plotcurve.m | 50 +++++---- .../variations/boxa_b2_d0_5/power_result.txt | 13 ++- .../boxa_b2_d0_5/power_result_rate.txt | 28 +++++ .../matlab/variations/boxa_b2_d0_5/powersim.m | 69 ++++++------ .../matlab/variations/boxa_b2_d0_5/result.txt | 8 +- .../variations/boxa_b2_d0_5/result_rate.txt | 68 ++++++++++++ .../matlab/variations/boxa_b2_d6_10/analyze.m | 102 +++++++++++------- .../boxa_b2_d6_10/learning_curve.png | Bin 35871 -> 35943 bytes .../boxa_b2_d6_10/learning_curve_rate.png | Bin 0 -> 37940 bytes .../boxa_b2_d6_10/logpower_result.txt | 11 +- .../boxa_b2_d6_10/logpower_result_rate.txt | 35 ++++++ .../variations/boxa_b2_d6_10/logpowersim.m | 77 +++++++------ .../variations/boxa_b2_d6_10/plotcurve.m | 50 +++++---- .../variations/boxa_b2_d6_10/power_result.txt | 11 +- .../boxa_b2_d6_10/power_result_rate.txt | 28 +++++ .../variations/boxa_b2_d6_10/powersim.m | 69 ++++++------ .../variations/boxa_b2_d6_10/result.txt | 8 +- .../variations/boxa_b2_d6_10/result_rate.txt | 68 ++++++++++++ 72 files changed, 1873 insertions(+), 895 deletions(-) create mode 100644 analysis/matlab/variations/boxa_a2_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_a2_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d0_10/result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d0_5/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_a2_d0_5/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d0_5/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d0_5/result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d6_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_a2_d6_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d6_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_a2_d6_10/result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_b2_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_10/result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_5/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_b2_d0_5/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_5/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d0_5/result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d6_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/boxa_b2_d6_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d6_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/boxa_b2_d6_10/result_rate.txt diff --git a/analysis/matlab/variations/boxa_a2_d0_10/analyze.m b/analysis/matlab/variations/boxa_a2_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/analyze.m +++ b/analysis/matlab/variations/boxa_a2_d0_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_a2_d0_10/learning_curve.png b/analysis/matlab/variations/boxa_a2_d0_10/learning_curve.png index 3a10526eceb0105bd93e440850ab3ba9697d60a9..3cf72c50f90412148ad9c585c4cdbfd18606bc15 100644 GIT binary patch delta 32 ocmZ2+oN2{zrU}k$>T*@>H76%}hH@HPS{WNWxRdu|<8sEu0M`-?rT_o{ delta 32 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 P|A#b=sHdr&y83?s2R4a< literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/boxa_a2_d0_10/logpower_result.txt b/analysis/matlab/variations/boxa_a2_d0_10/logpower_result.txt index bc3cd4f..bacc259 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/boxa_a2_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 @@ -10,7 +10,7 @@ stim x log(day) interaction: F(1,68)=3.821 p(resid)=0.05474 p(Satt)=0.05451 (d honest per-animal random slope (log-day): F(1,14.6)=3.22 p=0.09348 Cohen's f (interaction, partial eta^2=0.009) = 0.097 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+8.69, ratSD=0.00, resSD=13.42) --- +--- power simulation (log-day ground truth: stim:logday=+8.69, ratSD=2.979e-15, resSD=13.42) --- true stim:log(day) = +8.69 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.009) = 0.097 (small; f: .10 small, .25 16 | 0.99 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +4.34 (50% of observed) + true stim:log(day) = +4.345 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.12 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.009) = 0.097 (small; f: .10 small, .25 16 | 0.62 | 0.64 24 | 0.75 | 0.78 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_a2_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/boxa_a2_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..b9524d1 --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,68)=5.247 p(resid)=0.02509 p(Satt)=0.02516 (df=66) + honest per-animal random slope (log-day): F(1,25.2)=4.88 p=0.0364 +Cohen's f (interaction, partial eta^2=0.017) = 0.131 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.06695, ratSD=0.03723, resSD=0.0875) --- + + true stim:log(day) = +0.06695 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.25 | 0.57 <- observed + 5 | 0.71 | 0.84 + 8 | 0.92 | 0.93 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.03347 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.09 | 0.16 <- observed + 5 | 0.14 | 0.27 + 8 | 0.41 | 0.46 + 12 | 0.52 | 0.55 + 16 | 0.78 | 0.77 + 24 | 0.88 | 0.87 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_a2_d0_10/logpowersim.m b/analysis/matlab/variations/boxa_a2_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/logpowersim.m +++ b/analysis/matlab/variations/boxa_a2_d0_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d0_10/plotcurve.m b/analysis/matlab/variations/boxa_a2_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/plotcurve.m +++ b/analysis/matlab/variations/boxa_a2_d0_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_a2_d0_10/power_result.txt b/analysis/matlab/variations/boxa_a2_d0_10/power_result.txt index 9543b93..2d1643a 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/power_result.txt +++ b/analysis/matlab/variations/boxa_a2_d0_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_a2_d0_10 +POWER SIMULATION -- boxa_a2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 -ground truth: stim:day=+1.20/day, rat SD=0.00, residual SD=13.47, days=11 +ground truth: stim:day=+1.198/day, rat SD=0, residual SD=13.47, days=11 - true stim:day interaction = +1.20 (100% of observed) + true stim:day interaction = +1.198 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.17 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.20/day, rat SD=0.00, residual SD=13.47, days=11 16 | 0.72 | 0.72 24 | 0.88 | 0.88 - true stim:day interaction = +0.60 (50% of observed) + true stim:day interaction = +0.5992 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.08 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.20/day, rat SD=0.00, residual SD=13.47, days=11 16 | 0.29 | 0.30 24 | 0.31 | 0.33 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d0_10/power_result_rate.txt b/analysis/matlab/variations/boxa_a2_d0_10/power_result_rate.txt new file mode 100644 index 0000000..aa77d1b --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_a2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 +ground truth: stim:day=+0.007205/day, rat SD=0.04049, residual SD=0.08883, days=11 + + true stim:day interaction = +0.007205 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.16 <- observed + 5 | 0.18 | 0.19 + 8 | 0.28 | 0.33 + 12 | 0.53 | 0.51 + 16 | 0.62 | 0.62 + 24 | 0.84 | 0.85 + + true stim:day interaction = +0.003602 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.07 <- observed + 5 | 0.04 | 0.06 + 8 | 0.09 | 0.10 + 12 | 0.15 | 0.16 + 16 | 0.25 | 0.26 + 24 | 0.23 | 0.26 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d0_10/powersim.m b/analysis/matlab/variations/boxa_a2_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/powersim.m +++ b/analysis/matlab/variations/boxa_a2_d0_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d0_10/result.txt b/analysis/matlab/variations/boxa_a2_d0_10/result.txt index 9d79605..55f74d6 100644 --- a/analysis/matlab/variations/boxa_a2_d0_10/result.txt +++ b/analysis/matlab/variations/boxa_a2_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_a2_d0_10 +VARIATION: boxa_a2_d0_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(68)= 1.18 F(1)= 1.397 p=0.2414 p=0.2412 (df=72) day (learning) t(68)= 12.04 F(1)=144.862 p=1.64e-18 p=6.575e-19 (df=72) stim (main, window start) t(68)= 1.16 F(1)= 1.336 p=0.2517 p=0.2515 (df=72) -interaction 95% CI: [-0.83, +3.22] +interaction 95% CI: [-0.8251, +3.222] HONEST LME (per-animal random slope, day|rat): interaction F(1,14.0)=0.68, p=0.4245 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.2414, slope diff=+1.20) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.2414, slope diff=+1.198) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_a2_d0_10/result_rate.txt b/analysis/matlab/variations/boxa_a2_d0_10/result_rate.txt new file mode 100644 index 0000000..6da1ffc --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_a2_d0_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2 +N = 7 rats, 72 sessions raw day coverage: treat 0..10, control 0..10 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 72 + Fixed effects coefficients 4 + Random effects coefficients 7 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -124.36 -110.7 68.18 -136.36 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.21277 0.032537 6.5394 68 9.4885e-09 + {'day' } 0.04572 0.0046771 9.7753 68 1.3713e-14 + {'stim' } 0.042139 0.049417 0.85273 68 0.3968 + {'day:stim' } 0.0072048 0.0067664 1.0648 68 0.29074 + + + Lower Upper + 0.14785 0.2777 + 0.036387 0.055053 + -0.056471 0.14075 + -0.0062973 0.020707 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.040493 + + + Lower Upper + 0.018248 0.089857 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.088826 0.074767 0.10553 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(68)= 1.06 F(1)= 1.134 p=0.2907 p=0.2908 (df=67) +day (learning) t(68)= 9.78 F(1)= 95.556 p=1.371e-14 p=1.275e-14 (df=68) +stim (main, window start) t(68)= 0.85 F(1)= 0.727 p=0.3968 p=0.4044 (df=19) +interaction 95% CI: [-0.006297, +0.02071] +HONEST LME (per-animal random slope, day|rat): interaction F(1,29.1)=0.97, p=0.3332 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.2907, slope diff=+0.007205) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_a2_d0_5/analyze.m b/analysis/matlab/variations/boxa_a2_d0_5/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_a2_d0_5/analyze.m +++ b/analysis/matlab/variations/boxa_a2_d0_5/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_a2_d0_5/learning_curve.png b/analysis/matlab/variations/boxa_a2_d0_5/learning_curve.png index 5ca4e381fe689d834216fb78f5c1e3a5cbffcc88..5cb589f960395ad22e875794ad2d006c82b83403 100644 GIT binary patch literal 36123 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 literal 36303 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 oz{|^uM=nvOM0dKw30%snj>ee)JcQ2%U*WKM+ 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 logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d0_5/plotcurve.m b/analysis/matlab/variations/boxa_a2_d0_5/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_a2_d0_5/plotcurve.m +++ b/analysis/matlab/variations/boxa_a2_d0_5/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_a2_d0_5/power_result.txt b/analysis/matlab/variations/boxa_a2_d0_5/power_result.txt index 2b2b2ae..9524dd0 100644 --- a/analysis/matlab/variations/boxa_a2_d0_5/power_result.txt +++ b/analysis/matlab/variations/boxa_a2_d0_5/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_a2_d0_5 +POWER SIMULATION -- boxa_a2_d0_5 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 -ground truth: stim:day=+4.68/day, rat SD=0.00, residual SD=12.01, days=6 +ground truth: stim:day=+4.676/day, rat SD=0, residual SD=12.01, days=6 - true stim:day interaction = +4.68 (100% of observed) + true stim:day interaction = +4.676 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.23 | 0.54 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+4.68/day, rat SD=0.00, residual SD=12.01, days=6 16 | 0.99 | 0.99 24 | 1.00 | 1.00 - true stim:day interaction = +2.34 (50% of observed) + true stim:day interaction = +2.338 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.08 | 0.20 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+4.68/day, rat SD=0.00, residual SD=12.01, days=6 16 | 0.56 | 0.60 24 | 0.82 | 0.84 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d0_5/power_result_rate.txt b/analysis/matlab/variations/boxa_a2_d0_5/power_result_rate.txt new file mode 100644 index 0000000..0eef27a --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d0_5/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_a2_d0_5 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=4 nrep=120, alpha=0.05 +ground truth: stim:day=+0.04308/day, rat SD=0.03963, residual SD=0.08479, days=6 + + true stim:day interaction = +0.04308 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.36 | 0.73 <- observed + 5 | 0.78 | 0.91 + 8 | 0.98 | 0.98 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.02154 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.11 | 0.25 <- observed + 5 | 0.26 | 0.38 + 8 | 0.44 | 0.46 + 12 | 0.68 | 0.72 + 16 | 0.81 | 0.81 + 24 | 0.95 | 0.94 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d0_5/powersim.m b/analysis/matlab/variations/boxa_a2_d0_5/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_a2_d0_5/powersim.m +++ b/analysis/matlab/variations/boxa_a2_d0_5/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d0_5/result.txt b/analysis/matlab/variations/boxa_a2_d0_5/result.txt index e88076d..74da2ac 100644 --- a/analysis/matlab/variations/boxa_a2_d0_5/result.txt +++ b/analysis/matlab/variations/boxa_a2_d0_5/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_a2_d0_5 +VARIATION: boxa_a2_d0_5 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(38)= 2.13 F(1)= 4.551 p=0.03941 p=0.03878 (df=42) day (learning) t(38)= 7.35 F(1)= 53.982 p=8.377e-09 p=4.651e-09 (df=42) stim (main, window start) t(38)= -0.08 F(1)= 0.007 p=0.9342 p=0.9342 (df=42) -interaction 95% CI: [+0.24, +9.11] +interaction 95% CI: [+0.2389, +9.113] HONEST LME (per-animal random slope, day|rat): interaction F(1,7.0)=2.87, p=0.1341 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.03941, slope diff=+4.68) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.03941, slope diff=+4.676) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_a2_d0_5/result_rate.txt b/analysis/matlab/variations/boxa_a2_d0_5/result_rate.txt new file mode 100644 index 0000000..8796b45 --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d0_5/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_a2_d0_5 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2 +N = 7 rats, 42 sessions raw day coverage: treat 0..5, control 0..5 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 42 + Fixed effects coefficients 4 + Random effects coefficients 7 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -70.223 -59.797 41.112 -82.223 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.19895 0.036526 5.4467 38 3.2657e-06 + {'day' } 0.049304 0.010134 4.8651 38 2.0216e-05 + {'stim' } -0.034105 0.055794 -0.61127 38 0.54466 + {'day:stim' } 0.043083 0.01548 2.7831 38 0.008341 + + + Lower Upper + 0.125 0.27289 + 0.028788 0.06982 + -0.14705 0.078844 + 0.011745 0.074421 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.039633 + + + Lower Upper + 0.015473 0.10151 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.084789 0.067081 0.10717 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(38)= 2.78 F(1)= 7.746 p=0.008341 p=0.008621 (df=35) +day (learning) t(38)= 4.87 F(1)= 23.669 p=2.022e-05 p=2.41e-05 (df=35) +stim (main, window start) t(38)= -0.61 F(1)= 0.374 p=0.5447 p=0.5472 (df=22) +interaction 95% CI: [+0.01175, +0.07442] +HONEST LME (per-animal random slope, day|rat): interaction F(1,9.1)=5.64, p=0.0412 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.008341, slope diff=+0.04308) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_a2_d6_10/analyze.m b/analysis/matlab/variations/boxa_a2_d6_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/analyze.m +++ b/analysis/matlab/variations/boxa_a2_d6_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_a2_d6_10/learning_curve.png b/analysis/matlab/variations/boxa_a2_d6_10/learning_curve.png index 48596de5084ae861f07b52e314edba37395be98b..fcbb813d7bb610e4506798bf92d278470f98948b 100644 GIT binary patch literal 36547 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

XP4}w9ZGIycjMVd>7at$#KyAR*zJ%;P~flb=X zHgr^3FIOmGeYs{_Lzg3qO=ETGG#fYI&&K#x?L>rVQ~|RHtMC^ywzeJ|8iEu4dVYQ- zxCDZt@^uPX4Z1@x5Q|4WPf`+LVRg6HiI{#N6+|<6V!B1Y+hVy_?NR z;MUd)s2rwLkwVh76MdB*zy9c4KJ@8oH!b*xm2uP!>zDuozl^3q1(kO5AR7MC772~f z^^-Numr?4hGEt4S{aLk-7fMdD41SCE>@&C~Gk4JF$dUeuA={5{8n&^%!vY3IEBV=n zg@PHq!s@s!JJ^s+mGR<8(|7g1XfhS?Y03||b(D?N>6FLi*6y|?+&moWL#-yp@f`|-Umer=Z=2%Ho!7eOhhB6GI!h-?+u8T`RfyX zckm9x{^haT!M5;Q>4p?!NA!*Od&yn>?6EQ99x2rf6m%jjS1Xr!r*EbdR^AidC#rI| z%Pz9Wi~FVa?@k@}-ic>a?{~xnRX}RDPf_J?LQvoC!Ag9NdMLf?UUW7vDA1;?bJkIlkPzzP?jE47*{#NqJP_;|5zhGRsub&S<^r-MoTO_924cCGl|5KD`LrH-N8%v? zKs$Il8NHPs3<3@h3cvj|ft6l^l+RM9pZ&!)xrDDU&?RRif0@eRwyWd9mh%3!%fI0h z$(X!p^!RiqN7@`!yC4ojXCU^dQy%BQ_~#d%*-p^Y4(Sk9yio*_J`NplT1+h-P73h zS&?bPEBz1r8dSbYqA%rBmwK*yyRq2)$7VWzKBapx5exIgb8eSz)9+bws+5h&6uBo{ z7F@sWpc0PfKxcx>u+8PLW#4oLXo}b+kGflG znp0it$srpUc>D0mgw@?hJ{C{sq#nRxpDuOxcx7zFEpx3MD<~^W2B=>;+Oka(-za08 z!H%mfsmCi%JrC?HM_Q$N*m{WywIdG6c}!N4%HbD3M3@T>j~;8k5KCaCVxbA$!ImFW zcLUKWLe0)}+mNKvn%~K9Ks(eK#q5Ul-9de)~U!HlG zd^}lOV3da(iXEX$vWkz*m6XPpOm}$+)mMm#e1dWYF@!pNC2@GYK6$Bi`0jjzwtGy@ z+gl1UWzK@YC)%{6bor^WK#ARbc{f*6^jZ`W-Uw(Lt3Ty_wHlRLM&-lCh|LlnK0lr0pMOH_BjW`6pu zE>-En-G{B#Qq(8ND7qX`5F#z_ z>%l)EWA9==O|YrHe=GxO!dU_g{m)N{im&V`8d~*_U^UW%k1m8B4bj)tD=#Wv|6NbO zf6BG$U#vIlr2RYxc}c;JJGxkM3B^xlc-Tc@#|$5q3_Bk^ubTV3&n#>IyOxXEEcEn6 z)iL$2#Xz)~nFb&7DgU=DWp8mt>FIaE8WB9p-v0E(`nOp`|0(D2-|R;D@6QN?>LR&0nlOx;QOV<0cm*U9%|uZete_sZ9Sgf#yYu)LLm!se{hx*> z4-Z_470qpKY)ni}CU(XN2|KjV8Yecy;0M4Ht2$sDb7>v{N(BxIA}TECvOq{69l`AZ z`R(Z;tO7x=zbr(4H7N;2kv|6&h>$&7%t7>GLV`nQxA>UgeU?m?HclX&M#JhB+|;0& zU>61J7_%BC(Ow{63_9LD)&DmzCg=pΝ$#0!Jn$CV)t&9{Z>V%mZezXw{;-0V9|+ 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 literal 36226 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/boxa_a2_d6_10/logpower_result.txt b/analysis/matlab/variations/boxa_a2_d6_10/logpower_result.txt index 0ceae98..aadd11a 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/logpower_result.txt +++ b/analysis/matlab/variations/boxa_a2_d6_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d6_10 +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,26)=0.252 p(resid)=0.6199 p(Satt)=0.6202 (df= honest per-animal random slope (log-day): F(1,6.0)=0.19 p=0.6783 Cohen's f (interaction, partial eta^2=0.004) = 0.065 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+9.52, ratSD=6.32, resSD=8.30) --- +--- power simulation (log-day ground truth: stim:logday=+9.522, ratSD=6.321, resSD=8.298) --- - true stim:log(day) = +9.52 (100% of observed) + true stim:log(day) = +9.522 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.02 | 0.06 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.004) = 0.065 (small; f: .10 small, .25 16 | 0.14 | 0.16 24 | 0.32 | 0.34 - true stim:log(day) = +4.76 (50% of observed) + true stim:log(day) = +4.761 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.06 | 0.10 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.004) = 0.065 (small; f: .10 small, .25 16 | 0.09 | 0.12 24 | 0.12 | 0.15 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_a2_d6_10/logpower_result_rate.txt b/analysis/matlab/variations/boxa_a2_d6_10/logpower_result_rate.txt new file mode 100644 index 0000000..de8b0bb --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d6_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_a2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,26)=0.064 p(resid)=0.8023 p(Satt)=0.8025 (df=24) + honest per-animal random slope (log-day): F(1,6.0)=0.04 p=0.8568 +Cohen's f (interaction, partial eta^2=0.001) = 0.034 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=-0.03226, ratSD=0.04467, resSD=0.05581) --- + + true stim:log(day) = -0.03226 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.05 <- observed + 5 | 0.03 | 0.03 + 8 | 0.07 | 0.08 + 12 | 0.12 | 0.12 + 16 | 0.15 | 0.12 + 24 | 0.08 | 0.09 + + true stim:log(day) = -0.01613 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.07 <- observed + 5 | 0.07 | 0.04 + 8 | 0.04 | 0.03 + 12 | 0.06 | 0.07 + 16 | 0.06 | 0.05 + 24 | 0.07 | 0.07 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_a2_d6_10/logpowersim.m b/analysis/matlab/variations/boxa_a2_d6_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/logpowersim.m +++ b/analysis/matlab/variations/boxa_a2_d6_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d6_10/plotcurve.m b/analysis/matlab/variations/boxa_a2_d6_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/plotcurve.m +++ b/analysis/matlab/variations/boxa_a2_d6_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_a2_d6_10/power_result.txt b/analysis/matlab/variations/boxa_a2_d6_10/power_result.txt index a531d82..baa3a43 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/power_result.txt +++ b/analysis/matlab/variations/boxa_a2_d6_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_a2_d6_10 +POWER SIMULATION -- boxa_a2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 -ground truth: stim:day=+1.00/day, rat SD=6.34, residual SD=8.21, days=5 +ground truth: stim:day=+1/day, rat SD=6.344, residual SD=8.208, days=5 - true stim:day interaction = +1.00 (100% of observed) + true stim:day interaction = +1 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.03 | 0.05 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.00/day, rat SD=6.34, residual SD=8.21, days=5 16 | 0.12 | 0.14 24 | 0.27 | 0.32 - true stim:day interaction = +0.50 (50% of observed) + true stim:day interaction = +0.5 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.09 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.00/day, rat SD=6.34, residual SD=8.21, days=5 16 | 0.08 | 0.11 24 | 0.12 | 0.12 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d6_10/power_result_rate.txt b/analysis/matlab/variations/boxa_a2_d6_10/power_result_rate.txt new file mode 100644 index 0000000..2974399 --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d6_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_a2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 +ground truth: stim:day=-0.003749/day, rat SD=0.04471, residual SD=0.05566, days=5 + + true stim:day interaction = -0.003749 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.04 <- observed + 5 | 0.03 | 0.04 + 8 | 0.07 | 0.08 + 12 | 0.11 | 0.13 + 16 | 0.15 | 0.12 + 24 | 0.09 | 0.09 + + true stim:day interaction = -0.001874 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.07 <- observed + 5 | 0.07 | 0.04 + 8 | 0.04 | 0.03 + 12 | 0.05 | 0.07 + 16 | 0.06 | 0.05 + 24 | 0.07 | 0.06 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_a2_d6_10/powersim.m b/analysis/matlab/variations/boxa_a2_d6_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/powersim.m +++ b/analysis/matlab/variations/boxa_a2_d6_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_a2_d6_10/result.txt b/analysis/matlab/variations/boxa_a2_d6_10/result.txt index ff825b2..89a0020 100644 --- a/analysis/matlab/variations/boxa_a2_d6_10/result.txt +++ b/analysis/matlab/variations/boxa_a2_d6_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_a2_d6_10 +VARIATION: boxa_a2_d6_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(26)= 0.47 F(1)= 0.223 p=0.6409 p=0.6413 (df=24) day (learning) t(26)= 2.11 F(1)= 4.466 p=0.04433 p=0.04517 (df=24) stim (main, window start) t(26)= 1.73 F(1)= 2.983 p=0.09599 p=0.1083 (df=13) -interaction 95% CI: [-3.36, +5.36] +interaction 95% CI: [-3.356, +5.356] HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.18, p=0.6872 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.6409, slope diff=+1.00) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.6409, slope diff=+1) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_a2_d6_10/result_rate.txt b/analysis/matlab/variations/boxa_a2_d6_10/result_rate.txt new file mode 100644 index 0000000..9e57932 --- /dev/null +++ b/analysis/matlab/variations/boxa_a2_d6_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_a2_d6_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2 +N = 6 rats, 30 sessions raw day coverage: treat 6..10, control 6..10 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 30 + Fixed effects coefficients 4 + Random effects coefficients 6 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -67.521 -59.114 39.761 -79.521 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF + {'(Intercept)'} 0.54193 0.035861 15.112 26 + {'day' } 0.015949 0.010163 1.5693 26 + {'stim' } 0.10168 0.050715 2.0049 26 + {'day:stim' } -0.0037489 0.014373 -0.26083 26 + + + pValue Lower Upper + 2.1656e-14 0.46821 0.61564 + 0.12868 -0.0049418 0.036839 + 0.05549 -0.0025676 0.20592 + 0.79628 -0.033292 0.025795 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.044709 + + + Lower Upper + 0.021196 0.094306 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.055665 0.041949 0.073866 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(26)= -0.26 F(1)= 0.068 p=0.7963 p=0.7964 (df=24) +day (learning) t(26)= 1.57 F(1)= 2.463 p=0.1287 p=0.1297 (df=24) +stim (main, window start) t(26)= 2.00 F(1)= 4.020 p=0.05549 p=0.06743 (df=12) +interaction 95% CI: [-0.03329, +0.02579] +HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.04, p=0.8467 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.7963, slope diff=-0.003749) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d0_10/analyze.m b/analysis/matlab/variations/boxa_b2_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/analyze.m +++ b/analysis/matlab/variations/boxa_b2_d0_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_b2_d0_10/learning_curve.png b/analysis/matlab/variations/boxa_b2_d0_10/learning_curve.png index 64415b42788505fb85d54db5a491c4ec0598569b..99834fabad7a12eb4ab04a0408758c54868e06d1 100644 GIT binary patch delta 32 ocmaEQn(66jrU}k$>guXZUk*<64COSov@*7w$#5-Z<8r&D0N_0hH~;_u delta 32 ocmaEQn(66jrU}k$(pnk^J~mJE4COR3w=yxBqjP-1#^rWP0pW=adH?_b diff --git a/analysis/matlab/variations/boxa_b2_d0_10/learning_curve_rate.png b/analysis/matlab/variations/boxa_b2_d0_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..34e00b2000c4969551eaf2ffaa5a713b82a0791a GIT binary patch literal 43659 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/boxa_b2_d0_10/logpower_result.txt b/analysis/matlab/variations/boxa_b2_d0_10/logpower_result.txt index b4a06b3..708e186 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/boxa_b2_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,68)=5.859 p(resid)=0.01817 p(Satt)=0.0182 (df honest per-animal random slope (log-day): F(1,21.8)=5.17 p=0.03322 Cohen's f (interaction, partial eta^2=0.013) = 0.115 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+10.40, ratSD=5.52, resSD=12.53) --- +--- power simulation (log-day ground truth: stim:logday=+10.4, ratSD=5.517, resSD=12.53) --- - true stim:log(day) = +10.40 (100% of observed) + true stim:log(day) = +10.4 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.32 | 0.62 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.013) = 0.115 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +5.20 (50% of observed) + true stim:log(day) = +5.199 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.10 | 0.20 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.013) = 0.115 (small-medium; f: .10 smal 16 | 0.86 | 0.85 24 | 0.93 | 0.93 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_b2_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/boxa_b2_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..21c6c85 --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,68)=8.517 p(resid)=0.004766 p(Satt)=0.004783 (df=67) + honest per-animal random slope (log-day): F(1,40.6)=8.18 p=0.006648 +Cohen's f (interaction, partial eta^2=0.026) = 0.164 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.08588, ratSD=0.04132, resSD=0.08572) --- + + true stim:log(day) = +0.08588 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.43 | 0.79 <- observed + 5 | 0.89 | 0.95 + 8 | 0.98 | 0.99 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.04294 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.28 <- observed + 5 | 0.30 | 0.43 + 8 | 0.65 | 0.62 + 12 | 0.79 | 0.82 + 16 | 0.93 | 0.93 + 24 | 0.99 | 0.99 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_b2_d0_10/logpowersim.m b/analysis/matlab/variations/boxa_b2_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/logpowersim.m +++ b/analysis/matlab/variations/boxa_b2_d0_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d0_10/plotcurve.m b/analysis/matlab/variations/boxa_b2_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/plotcurve.m +++ b/analysis/matlab/variations/boxa_b2_d0_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_b2_d0_10/power_result.txt b/analysis/matlab/variations/boxa_b2_d0_10/power_result.txt index 0d19c3b..6840f87 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/power_result.txt +++ b/analysis/matlab/variations/boxa_b2_d0_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_b2_d0_10 +POWER SIMULATION -- boxa_b2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 -ground truth: stim:day=+1.60/day, rat SD=6.05, residual SD=12.42, days=11 +ground truth: stim:day=+1.604/day, rat SD=6.047, residual SD=12.42, days=11 - true stim:day interaction = +1.60 (100% of observed) + true stim:day interaction = +1.604 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.17 | 0.33 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.60/day, rat SD=6.05, residual SD=12.42, days=11 16 | 0.95 | 0.97 24 | 1.00 | 1.00 - true stim:day interaction = +0.80 (50% of observed) + true stim:day interaction = +0.802 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.11 | 0.11 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.60/day, rat SD=6.05, residual SD=12.42, days=11 16 | 0.51 | 0.53 24 | 0.67 | 0.66 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d0_10/power_result_rate.txt b/analysis/matlab/variations/boxa_b2_d0_10/power_result_rate.txt new file mode 100644 index 0000000..32690f0 --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_b2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 +ground truth: stim:day=+0.01317/day, rat SD=0.04399, residual SD=0.08748, days=11 + + true stim:day interaction = +0.01317 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.23 | 0.45 <- observed + 5 | 0.56 | 0.71 + 8 | 0.82 | 0.86 + 12 | 0.99 | 0.99 + 16 | 0.98 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.006586 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.13 <- observed + 5 | 0.12 | 0.19 + 8 | 0.33 | 0.34 + 12 | 0.38 | 0.42 + 16 | 0.64 | 0.64 + 24 | 0.77 | 0.77 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d0_10/powersim.m b/analysis/matlab/variations/boxa_b2_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/powersim.m +++ b/analysis/matlab/variations/boxa_b2_d0_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d0_10/result.txt b/analysis/matlab/variations/boxa_b2_d0_10/result.txt index 0e12cda..4a601bc 100644 --- a/analysis/matlab/variations/boxa_b2_d0_10/result.txt +++ b/analysis/matlab/variations/boxa_b2_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_b2_d0_10 +VARIATION: boxa_b2_d0_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(68)= 1.63 F(1)= 2.647 p=0.1084 p=0.1084 (df=68) day (learning) t(68)= 10.15 F(1)=103.100 p=2.916e-15 p=2.368e-15 (df=69) stim (main, window start) t(68)= 0.26 F(1)= 0.068 p=0.7946 p=0.7968 (df=18) -interaction 95% CI: [-0.36, +3.57] +interaction 95% CI: [-0.3634, +3.571] HONEST LME (per-animal random slope, day|rat): interaction F(1,22.2)=2.05, p=0.1666 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.1084, slope diff=+1.60) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.1084, slope diff=+1.604) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d0_10/result_rate.txt b/analysis/matlab/variations/boxa_b2_d0_10/result_rate.txt new file mode 100644 index 0000000..6335136 --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_b2_d0_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-A, Electrode-Box-B2 +control (stim=0): Electrode-Box-A2 +N = 7 rats, 72 sessions raw day coverage: treat 0..10, control 0..10 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 72 + Fixed effects coefficients 4 + Random effects coefficients 7 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -125.6 -111.94 68.799 -137.6 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.22991 0.038687 5.9428 68 1.07e-07 + {'day' } 0.040788 0.0055544 7.3434 68 3.402e-10 + {'stim' } 0.0034269 0.050885 0.067345 68 0.9465 + {'day:stim' } 0.013172 0.0069458 1.8964 68 0.062154 + + + Lower Upper + 0.15271 0.30711 + 0.029705 0.051872 + -0.098113 0.10497 + -0.00068802 0.027032 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.043995 + + + Lower Upper + 0.020897 0.092622 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.087482 0.073647 0.10392 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(68)= 1.90 F(1)= 3.596 p=0.06215 p=0.06217 (df=68) +day (learning) t(68)= 7.34 F(1)= 53.926 p=3.402e-10 p=3.124e-10 (df=69) +stim (main, window start) t(68)= 0.07 F(1)= 0.005 p=0.9465 p=0.9471 (df=18) +interaction 95% CI: [-0.000688, +0.02703] +HONEST LME (per-animal random slope, day|rat): interaction F(1,62.1)=3.56, p=0.06388 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.06215, slope diff=+0.01317) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d0_5/analyze.m b/analysis/matlab/variations/boxa_b2_d0_5/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_b2_d0_5/analyze.m +++ b/analysis/matlab/variations/boxa_b2_d0_5/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_b2_d0_5/learning_curve.png b/analysis/matlab/variations/boxa_b2_d0_5/learning_curve.png index 945d7727f05f64868e80bf930bb83c2669f26167..3ace26df9c74ef71de5cf1429d42d0f9ec91109f 100644 GIT binary patch literal 36794 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 Q`=F=;`?U6^D4SmSACVR=#{d8T diff --git a/analysis/matlab/variations/boxa_b2_d0_5/learning_curve_rate.png b/analysis/matlab/variations/boxa_b2_d0_5/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..cde4eaa4a12ea65ccb7c9ac54ca2ae53b4686373 GIT binary patch literal 38461 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 logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d0_5/plotcurve.m b/analysis/matlab/variations/boxa_b2_d0_5/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_b2_d0_5/plotcurve.m +++ b/analysis/matlab/variations/boxa_b2_d0_5/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_b2_d0_5/power_result.txt b/analysis/matlab/variations/boxa_b2_d0_5/power_result.txt index acb4cba..387db8a 100644 --- a/analysis/matlab/variations/boxa_b2_d0_5/power_result.txt +++ b/analysis/matlab/variations/boxa_b2_d0_5/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_b2_d0_5 +POWER SIMULATION -- boxa_b2_d0_5 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 -ground truth: stim:day=+4.71/day, rat SD=5.87, residual SD=11.30, days=6 +ground truth: stim:day=+4.707/day, rat SD=5.872, residual SD=11.3, days=6 - true stim:day interaction = +4.71 (100% of observed) + true stim:day interaction = +4.707 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.27 | 0.59 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+4.71/day, rat SD=5.87, residual SD=11.30, days=6 16 | 0.99 | 0.99 24 | 1.00 | 1.00 - true stim:day interaction = +2.35 (50% of observed) + true stim:day interaction = +2.354 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.10 | 0.20 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+4.71/day, rat SD=5.87, residual SD=11.30, days=6 16 | 0.62 | 0.62 24 | 0.85 | 0.87 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d0_5/power_result_rate.txt b/analysis/matlab/variations/boxa_b2_d0_5/power_result_rate.txt new file mode 100644 index 0000000..1e013ca --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d0_5/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_b2_d0_5 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=4, control n=3 nrep=120, alpha=0.05 +ground truth: stim:day=+0.0427/day, rat SD=0.04855, residual SD=0.08495, days=6 + + true stim:day interaction = +0.0427 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.35 | 0.74 <- observed + 5 | 0.78 | 0.91 + 8 | 0.98 | 0.98 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.02135 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.11 | 0.25 <- observed + 5 | 0.25 | 0.36 + 8 | 0.44 | 0.47 + 12 | 0.68 | 0.73 + 16 | 0.80 | 0.82 + 24 | 0.95 | 0.94 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d0_5/powersim.m b/analysis/matlab/variations/boxa_b2_d0_5/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_b2_d0_5/powersim.m +++ b/analysis/matlab/variations/boxa_b2_d0_5/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d0_5/result.txt b/analysis/matlab/variations/boxa_b2_d0_5/result.txt index c30cd85..8766375 100644 --- a/analysis/matlab/variations/boxa_b2_d0_5/result.txt +++ b/analysis/matlab/variations/boxa_b2_d0_5/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_b2_d0_5 +VARIATION: boxa_b2_d0_5 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(38)= 2.28 F(1)= 5.206 p=0.02821 p=0.02871 (df=35) day (learning) t(38)= 6.32 F(1)= 39.947 p=2.071e-07 p=2.928e-07 (df=35) stim (main, window start) t(38)= -0.61 F(1)= 0.378 p=0.5425 p=0.5456 (df=20) -interaction 95% CI: [+0.53, +8.88] +interaction 95% CI: [+0.5306, +8.884] HONEST LME (per-animal random slope, day|rat): interaction F(1,7.0)=2.92, p=0.131 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.02821, slope diff=+4.71) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.02821, slope diff=+4.707) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d0_5/result_rate.txt b/analysis/matlab/variations/boxa_b2_d0_5/result_rate.txt new file mode 100644 index 0000000..90cffcd --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d0_5/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_b2_d0_5 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-A, Electrode-Box-B2 +control (stim=0): Electrode-Box-A2 +N = 7 rats, 42 sessions raw day coverage: treat 0..5, control 0..5 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 42 + Fixed effects coefficients 4 + Random effects coefficients 7 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -68.33 -57.904 40.165 -80.33 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.2186 0.045229 4.8332 38 2.2327e-05 + {'day' } 0.043366 0.011725 3.6987 38 0.00068267 + {'stim' } -0.059971 0.059832 -1.0023 38 0.32253 + {'day:stim' } 0.042705 0.01551 2.7533 38 0.0089978 + + + Lower Upper + 0.12704 0.31016 + 0.01963 0.067101 + -0.1811 0.061153 + 0.011306 0.074103 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.048546 + + + Lower Upper + 0.021809 0.10806 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.084953 0.067211 0.10738 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(38)= 2.75 F(1)= 7.581 p=0.008998 p=0.00929 (df=35) +day (learning) t(38)= 3.70 F(1)= 13.680 p=0.0006827 p=0.0007391 (df=35) +stim (main, window start) t(38)= -1.00 F(1)= 1.005 p=0.3225 p=0.3289 (df=19) +interaction 95% CI: [+0.01131, +0.0741] +HONEST LME (per-animal random slope, day|rat): interaction F(1,8.8)=5.05, p=0.05179 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates) (p=0.008998, slope diff=+0.0427) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d6_10/analyze.m b/analysis/matlab/variations/boxa_b2_d6_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/analyze.m +++ b/analysis/matlab/variations/boxa_b2_d6_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/boxa_b2_d6_10/learning_curve.png b/analysis/matlab/variations/boxa_b2_d6_10/learning_curve.png index 462271943eac6d8711fd804f49050ecb0e4edfe9..766bfc9cf480466727a5eed66f5fa5dcc2e33d7d 100644 GIT binary patch delta 17498 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/boxa_b2_d6_10/logpower_result.txt b/analysis/matlab/variations/boxa_b2_d6_10/logpower_result.txt index 4c4b367..6068b9d 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/logpower_result.txt +++ b/analysis/matlab/variations/boxa_b2_d6_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d6_10 +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=4, control n=2 nrep=120, alpha=0.05 @@ -10,7 +10,7 @@ stim x log(day) interaction: F(1,26)=0.850 p(resid)=0.365 p(Satt)=0.3657 (df=2 honest per-animal random slope (log-day): F(1,6.0)=0.67 p=0.4431 Cohen's f (interaction, partial eta^2=0.014) = 0.118 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+18.32, ratSD=6.21, resSD=8.20) --- +--- power simulation (log-day ground truth: stim:logday=+18.32, ratSD=6.212, resSD=8.198) --- true stim:log(day) = +18.32 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.014) = 0.118 (small-medium; f: .10 smal 16 | 0.57 | 0.63 24 | 0.75 | 0.78 - true stim:log(day) = +9.16 (50% of observed) + true stim:log(day) = +9.162 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.11 @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.014) = 0.118 (small-medium; f: .10 smal 16 | 0.20 | 0.20 24 | 0.31 | 0.31 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_b2_d6_10/logpower_result_rate.txt b/analysis/matlab/variations/boxa_b2_d6_10/logpower_result_rate.txt new file mode 100644 index 0000000..7f58343 --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d6_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- boxa_b2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=4, control n=2 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,26)=0.195 p(resid)=0.6626 p(Satt)=0.6629 (df=24) + honest per-animal random slope (log-day): F(1,6.0)=0.11 p=0.7527 +Cohen's f (interaction, partial eta^2=0.004) = 0.059 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.05955, ratSD=0.03763, resSD=0.05566) --- + + true stim:log(day) = +0.05955 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.02 | 0.04 + 5 | 0.06 | 0.12 + 8 | 0.11 | 0.09 + 12 | 0.11 | 0.14 + 16 | 0.12 | 0.15 + 24 | 0.27 | 0.31 + + true stim:log(day) = +0.02978 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.06 | 0.09 + 5 | 0.07 | 0.07 + 8 | 0.04 | 0.07 + 12 | 0.09 | 0.08 + 16 | 0.09 | 0.10 + 24 | 0.12 | 0.15 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/boxa_b2_d6_10/logpowersim.m b/analysis/matlab/variations/boxa_b2_d6_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/logpowersim.m +++ b/analysis/matlab/variations/boxa_b2_d6_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d6_10/plotcurve.m b/analysis/matlab/variations/boxa_b2_d6_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/plotcurve.m +++ b/analysis/matlab/variations/boxa_b2_d6_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/boxa_b2_d6_10/power_result.txt b/analysis/matlab/variations/boxa_b2_d6_10/power_result.txt index 8d66ba9..bf0fd85 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/power_result.txt +++ b/analysis/matlab/variations/boxa_b2_d6_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- boxa_b2_d6_10 +POWER SIMULATION -- boxa_b2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=4, control n=2 nrep=120, alpha=0.05 -ground truth: stim:day=+1.90/day, rat SD=6.23, residual SD=8.12, days=5 +ground truth: stim:day=+1.9/day, rat SD=6.231, residual SD=8.123, days=5 - true stim:day interaction = +1.90 (100% of observed) + true stim:day interaction = +1.9 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.04 | 0.17 @@ -25,5 +25,4 @@ ground truth: stim:day=+1.90/day, rat SD=6.23, residual SD=8.12, days=5 16 | 0.18 | 0.19 24 | 0.25 | 0.28 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d6_10/power_result_rate.txt b/analysis/matlab/variations/boxa_b2_d6_10/power_result_rate.txt new file mode 100644 index 0000000..8a249eb --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d6_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- boxa_b2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=4, control n=2 nrep=120, alpha=0.05 +ground truth: stim:day=+0.006202/day, rat SD=0.03766, residual SD=0.05555, days=5 + + true stim:day interaction = +0.006202 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.04 + 5 | 0.08 | 0.13 + 8 | 0.08 | 0.08 + 12 | 0.10 | 0.13 + 16 | 0.12 | 0.11 + 24 | 0.24 | 0.24 + + true stim:day interaction = +0.003101 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.09 + 5 | 0.07 | 0.07 + 8 | 0.05 | 0.07 + 12 | 0.07 | 0.08 + 16 | 0.08 | 0.10 + 24 | 0.10 | 0.12 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/boxa_b2_d6_10/powersim.m b/analysis/matlab/variations/boxa_b2_d6_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/powersim.m +++ b/analysis/matlab/variations/boxa_b2_d6_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/boxa_b2_d6_10/result.txt b/analysis/matlab/variations/boxa_b2_d6_10/result.txt index 4d49b78..12d3d33 100644 --- a/analysis/matlab/variations/boxa_b2_d6_10/result.txt +++ b/analysis/matlab/variations/boxa_b2_d6_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: boxa_b2_d6_10 +VARIATION: boxa_b2_d6_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(26)= 0.85 F(1)= 0.729 p=0.4009 p=0.4015 (df=24) day (learning) t(26)= 1.32 F(1)= 1.746 p=0.1979 p=0.1989 (df=24) stim (main, window start) t(26)= 1.56 F(1)= 2.448 p=0.1297 p=0.142 (df=13) -interaction 95% CI: [-2.67, +6.47] +interaction 95% CI: [-2.673, +6.473] HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.61, p=0.4631 (Satterthwaite DF ~= residual on this random-intercept model; the random-slope model above is the honest learning-rate test -- DF collapses toward the animal count.) -INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.4009, slope diff=+1.90) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.4009, slope diff=+1.9) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/boxa_b2_d6_10/result_rate.txt b/analysis/matlab/variations/boxa_b2_d6_10/result_rate.txt new file mode 100644 index 0000000..561a131 --- /dev/null +++ b/analysis/matlab/variations/boxa_b2_d6_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: boxa_b2_d6_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-A, Electrode-Box-B2 +control (stim=0): Electrode-Box-A2 +N = 6 rats, 30 sessions raw day coverage: treat 6..10, control 6..10 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 30 + Fixed effects coefficients 4 + Random effects coefficients 6 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -69.131 -60.724 40.566 -81.131 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.52619 0.040432 13.014 26 6.8005e-13 + {'day' } 0.0099391 0.012422 0.80014 26 0.43088 + {'stim' } 0.099864 0.049519 2.0167 26 0.054168 + {'day:stim' } 0.0062025 0.015213 0.4077 26 0.68683 + + + Lower Upper + 0.44308 0.6093 + -0.015594 0.035472 + -0.0019243 0.20165 + -0.025069 0.037474 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.037656 + + + Lower Upper + 0.016562 0.085613 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.055552 0.041864 0.073715 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(26)= 0.41 F(1)= 0.166 p=0.6868 p=0.6871 (df=24) +day (learning) t(26)= 0.80 F(1)= 0.640 p=0.4309 p=0.4315 (df=24) +stim (main, window start) t(26)= 2.02 F(1)= 4.067 p=0.05417 p=0.06308 (df=14) +interaction 95% CI: [-0.02507, +0.03747] +HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.10, p=0.7623 + (Satterthwaite DF ~= residual on this random-intercept model; the random-slope + model above is the honest learning-rate test -- DF collapses toward the animal count.) +INTERPRETATION: stim x day interaction n.s. -- slopes parallel (no differential learning rate) (p=0.6868, slope diff=+0.006202) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.