From 1606eb698b2f55f4449df1fbe2fee2ccf14d3a86 Mon Sep 17 00:00:00 2001 From: Experiments DB Dev Date: Fri, 24 Jul 2026 02:32:53 -0400 Subject: [PATCH] analysis(matlab): rate + count outputs, variation batch 4 Co-Authored-By: Claude Opus 4.8 --- .../variations/right_only_d0_10/analyze.m | 102 +++++++++++------- .../right_only_d0_10/learning_curve.png | Bin 41774 -> 41774 bytes .../right_only_d0_10/learning_curve_rate.png | Bin 0 -> 43145 bytes .../right_only_d0_10/logpower_result.txt | 11 +- .../right_only_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/right_only_d0_10/logpowersim.m | 77 +++++++------ .../variations/right_only_d0_10/plotcurve.m | 50 +++++---- .../right_only_d0_10/power_result.txt | 11 +- .../right_only_d0_10/power_result_rate.txt | 28 +++++ .../variations/right_only_d0_10/powersim.m | 69 ++++++------ .../variations/right_only_d0_10/result.txt | 6 +- .../right_only_d0_10/result_rate.txt | 68 ++++++++++++ .../variations/right_only_d0_13/analyze.m | 102 +++++++++++------- .../right_only_d0_13/learning_curve.png | Bin 44369 -> 44369 bytes .../right_only_d0_13/learning_curve_rate.png | Bin 0 -> 41551 bytes .../right_only_d0_13/logpower_result.txt | 11 +- .../right_only_d0_13/logpower_result_rate.txt | 35 ++++++ .../variations/right_only_d0_13/logpowersim.m | 77 +++++++------ .../variations/right_only_d0_13/plotcurve.m | 50 +++++---- .../right_only_d0_13/power_result.txt | 13 ++- .../right_only_d0_13/power_result_rate.txt | 28 +++++ .../variations/right_only_d0_13/powersim.m | 69 ++++++------ .../variations/right_only_d0_13/result.txt | 8 +- .../right_only_d0_13/result_rate.txt | 68 ++++++++++++ .../variations/right_only_d0_5/analyze.m | 102 +++++++++++------- .../right_only_d0_5/learning_curve.png | Bin 36462 -> 36277 bytes .../right_only_d0_5/learning_curve_rate.png | Bin 0 -> 37847 bytes .../right_only_d0_5/logpower_result.txt | 13 ++- .../right_only_d0_5/logpower_result_rate.txt | 35 ++++++ .../variations/right_only_d0_5/logpowersim.m | 77 +++++++------ .../variations/right_only_d0_5/plotcurve.m | 50 +++++---- .../right_only_d0_5/power_result.txt | 13 ++- .../right_only_d0_5/power_result_rate.txt | 28 +++++ .../variations/right_only_d0_5/powersim.m | 69 ++++++------ .../variations/right_only_d0_5/result.txt | 8 +- .../right_only_d0_5/result_rate.txt | 68 ++++++++++++ .../variations/right_only_d6_10/analyze.m | 102 +++++++++++------- .../right_only_d6_10/learning_curve.png | Bin 35558 -> 35630 bytes .../right_only_d6_10/learning_curve_rate.png | Bin 0 -> 37311 bytes .../right_only_d6_10/logpower_result.txt | 9 +- .../right_only_d6_10/logpower_result_rate.txt | 35 ++++++ .../variations/right_only_d6_10/logpowersim.m | 77 +++++++------ .../variations/right_only_d6_10/plotcurve.m | 50 +++++---- .../right_only_d6_10/power_result.txt | 13 ++- .../right_only_d6_10/power_result_rate.txt | 28 +++++ .../variations/right_only_d6_10/powersim.m | 69 ++++++------ .../variations/right_only_d6_10/result.txt | 6 +- .../right_only_d6_10/result_rate.txt | 68 ++++++++++++ .../variations/right_only_d6_13/analyze.m | 102 +++++++++++------- .../right_only_d6_13/learning_curve.png | Bin 41265 -> 41118 bytes .../right_only_d6_13/learning_curve_rate.png | Bin 0 -> 39957 bytes .../right_only_d6_13/logpower_result.txt | 9 +- .../right_only_d6_13/logpower_result_rate.txt | 35 ++++++ .../variations/right_only_d6_13/logpowersim.m | 77 +++++++------ .../variations/right_only_d6_13/plotcurve.m | 50 +++++---- .../right_only_d6_13/power_result.txt | 13 ++- .../right_only_d6_13/power_result_rate.txt | 28 +++++ .../variations/right_only_d6_13/powersim.m | 69 ++++++------ .../variations/right_only_d6_13/result.txt | 8 +- .../right_only_d6_13/result_rate.txt | 68 ++++++++++++ .../matlab/variations/unmerge_d0_10/analyze.m | 102 +++++++++++------- .../unmerge_d0_10/learning_curve.png | Bin 42379 -> 42379 bytes .../unmerge_d0_10/learning_curve_rate.png | Bin 0 -> 43385 bytes .../unmerge_d0_10/logpower_result.txt | 13 ++- .../unmerge_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/unmerge_d0_10/logpowersim.m | 77 +++++++------ .../variations/unmerge_d0_10/plotcurve.m | 50 +++++---- .../variations/unmerge_d0_10/power_result.txt | 13 ++- .../unmerge_d0_10/power_result_rate.txt | 28 +++++ .../variations/unmerge_d0_10/powersim.m | 69 ++++++------ .../variations/unmerge_d0_10/result.txt | 8 +- .../variations/unmerge_d0_10/result_rate.txt | 68 ++++++++++++ 72 files changed, 1869 insertions(+), 891 deletions(-) create mode 100644 analysis/matlab/variations/right_only_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/right_only_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_10/result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/right_only_d0_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_13/result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_5/learning_curve_rate.png create mode 100644 analysis/matlab/variations/right_only_d0_5/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_5/power_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d0_5/result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/right_only_d6_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_10/result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/right_only_d6_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/right_only_d6_13/result_rate.txt create mode 100644 analysis/matlab/variations/unmerge_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/unmerge_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/unmerge_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/unmerge_d0_10/result_rate.txt diff --git a/analysis/matlab/variations/right_only_d0_10/analyze.m b/analysis/matlab/variations/right_only_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/right_only_d0_10/analyze.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_10/learning_curve.png b/analysis/matlab/variations/right_only_d0_10/learning_curve.png index 7e11bfd4d5e49fca162309085f04f7935824b58b..7354cbeebffe7286ff0a59a2d01f9fc60676651e 100644 GIT binary patch delta 32 qcmV+*0N?+v#saR!0+2%nC>Mmo*rJh1RS7gOIx;h_=AD_br-!286b?-Q delta 32 ocmZ2?jA`95rU}k$GOT9;qGTs}hH@HNSQ(hwxwj{7T;9G20KRhzsQ>@~ diff --git a/analysis/matlab/variations/right_only_d0_10/learning_curve_rate.png b/analysis/matlab/variations/right_only_d0_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..9c30c9e497b7b4f3568cf31998f9703647f62c6f GIT binary patch literal 43145 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 Jk`#=t{|}BO)O-K{ literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/right_only_d0_10/logpower_result.txt b/analysis/matlab/variations/right_only_d0_10/logpower_result.txt index 2743f7f..8f55caf 100644 --- a/analysis/matlab/variations/right_only_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/right_only_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_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,7 +10,7 @@ stim x log(day) interaction: F(1,68)=8.420 p(resid)=0.004998 p(Satt)=0.005011 honest per-animal random slope (log-day): F(1,22.8)=7.55 p=0.01151 Cohen's f (interaction, partial eta^2=0.016) = 0.126 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+11.36, ratSD=4.91, resSD=11.42) --- +--- power simulation (log-day ground truth: stim:logday=+11.36, ratSD=4.911, resSD=11.42) --- true stim:log(day) = +11.36 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.016) = 0.126 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +5.68 (50% of observed) + true stim:log(day) = +5.682 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.13 | 0.29 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.016) = 0.126 (small-medium; f: .10 smal 16 | 0.93 | 0.93 24 | 0.99 | 0.99 -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/right_only_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/right_only_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..af17f14 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_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)=13.480 p(resid)=0.0004756 p(Satt)=0.0004808 (df=67) + honest per-animal random slope (log-day): F(1,62.4)=13.42 p=0.0005158 +Cohen's f (interaction, partial eta^2=0.033) = 0.185 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.095, ratSD=0.04259, resSD=0.07524) --- + + true stim:log(day) = +0.095 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.63 | 0.95 <- observed + 5 | 0.99 | 1.00 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.0475 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.23 | 0.42 <- observed + 5 | 0.55 | 0.66 + 8 | 0.78 | 0.82 + 12 | 0.96 | 0.97 + 16 | 0.98 | 1.00 + 24 | 0.99 | 1.00 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/right_only_d0_10/logpowersim.m b/analysis/matlab/variations/right_only_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/right_only_d0_10/logpowersim.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_10/plotcurve.m b/analysis/matlab/variations/right_only_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/right_only_d0_10/plotcurve.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_10/power_result.txt b/analysis/matlab/variations/right_only_d0_10/power_result.txt index 01766dd..e6c5418 100644 --- a/analysis/matlab/variations/right_only_d0_10/power_result.txt +++ b/analysis/matlab/variations/right_only_d0_10/power_result.txt @@ -1,9 +1,9 @@ ============================================================================== -POWER SIMULATION -- right_only_d0_10 +POWER SIMULATION -- right_only_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.73/day, rat SD=5.35, residual SD=11.96, days=11 +ground truth: stim:day=+1.73/day, rat SD=5.346, residual SD=11.96, days=11 true stim:day interaction = +1.73 (100% of observed) N/group | per-animal power | LME power @@ -15,7 +15,7 @@ ground truth: stim:day=+1.73/day, rat SD=5.35, residual SD=11.96, days=11 16 | 0.98 | 0.98 24 | 1.00 | 1.00 - true stim:day interaction = +0.87 (50% of observed) + true stim:day interaction = +0.865 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.12 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.73/day, rat SD=5.35, residual SD=11.96, days=11 16 | 0.62 | 0.62 24 | 0.74 | 0.71 -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/right_only_d0_10/power_result_rate.txt b/analysis/matlab/variations/right_only_d0_10/power_result_rate.txt new file mode 100644 index 0000000..cf79116 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- right_only_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.01393/day, rat SD=0.04403, residual SD=0.08402, days=11 + + true stim:day interaction = +0.01393 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.28 | 0.53 <- observed + 5 | 0.65 | 0.81 + 8 | 0.89 | 0.90 + 12 | 0.99 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.006967 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.16 <- observed + 5 | 0.15 | 0.23 + 8 | 0.36 | 0.44 + 12 | 0.43 | 0.48 + 16 | 0.72 | 0.72 + 24 | 0.84 | 0.87 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/right_only_d0_10/powersim.m b/analysis/matlab/variations/right_only_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/right_only_d0_10/powersim.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_10/result.txt b/analysis/matlab/variations/right_only_d0_10/result.txt index a1b04e2..49bda1e 100644 --- a/analysis/matlab/variations/right_only_d0_10/result.txt +++ b/analysis/matlab/variations/right_only_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: right_only_d0_10 +VARIATION: right_only_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.83 F(1)= 3.336 p=0.07218 p=0.07218 (df=68) day (learning) t(68)= 10.55 F(1)=111.222 p=5.943e-16 p=4.533e-16 (df=70) stim (main, window start) t(68)= 0.37 F(1)= 0.134 p=0.7159 p=0.7187 (df=19) -interaction 95% CI: [-0.16, +3.62] +interaction 95% CI: [-0.1602, +3.62] HONEST LME (per-animal random slope, day|rat): interaction F(1,20.5)=2.56, p=0.1246 (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.07218, slope diff=+1.73) -Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008. +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d0_10/result_rate.txt b/analysis/matlab/variations/right_only_d0_10/result_rate.txt new file mode 100644 index 0000000..fe2622a --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: right_only_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, Right-Electrode +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 + -130.99 -117.33 71.495 -142.99 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF + {'(Intercept)'} 0.22977 0.037841 6.0719 68 + {'day' } 0.040867 0.0053407 7.652 68 + {'stim' } 0.00041563 0.049782 0.008349 68 + {'day:stim' } 0.013934 0.006676 2.0872 68 + + + pValue Lower Upper + 6.3632e-08 0.15426 0.30528 + 9.3879e-11 0.03021 0.051524 + 0.99336 -0.098922 0.099754 + 0.040617 0.00061265 0.027256 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.044032 + + + Lower Upper + 0.021261 0.09119 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.084023 0.070735 0.099809 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(68)= 2.09 F(1)= 4.357 p=0.04062 p=0.04064 (df=68) +day (learning) t(68)= 7.65 F(1)= 58.553 p=9.388e-11 p=8.647e-11 (df=69) +stim (main, window start) t(68)= 0.01 F(1)= 0.000 p=0.9934 p=0.9934 (df=17) +interaction 95% CI: [+0.0006126, +0.02726] +HONEST LME (per-animal random slope, day|rat): interaction F(1,67.1)=4.40, p=0.03968 + (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.04062, slope diff=+0.01393) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d0_13/analyze.m b/analysis/matlab/variations/right_only_d0_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/right_only_d0_13/analyze.m +++ b/analysis/matlab/variations/right_only_d0_13/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/right_only_d0_13/learning_curve.png b/analysis/matlab/variations/right_only_d0_13/learning_curve.png index fde70c70ead5811e8f2662f6a77289a410b1af84..f427c40d564742e7265d636d35a84c8f83715fd6 100644 GIT binary patch delta 32 ocmcb3i|OJmrU}k$8dATCmdH=^4COR2ure~c-;*h}arvq>0N+0idjJ3c delta 32 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 G7yk!M_^bK= literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/right_only_d0_13/logpower_result.txt b/analysis/matlab/variations/right_only_d0_13/logpower_result.txt index ff80186..c76cc4a 100644 --- a/analysis/matlab/variations/right_only_d0_13/logpower_result.txt +++ b/analysis/matlab/variations/right_only_d0_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_13 +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_13 [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,7 +10,7 @@ stim x log(day) interaction: F(1,80)=13.182 p(resid)=0.0004969 p(Satt)=0.00049 honest per-animal random slope (log-day): F(1,18.9)=11.35 p=0.003237 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=+12.18, ratSD=5.40, resSD=10.82) --- +--- power simulation (log-day ground truth: stim:logday=+12.18, ratSD=5.4, resSD=10.82) --- true stim:log(day) = +12.18 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.017) = 0.131 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +6.09 (50% of observed) + true stim:log(day) = +6.089 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.25 | 0.47 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.017) = 0.131 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 -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/right_only_d0_13/logpower_result_rate.txt b/analysis/matlab/variations/right_only_d0_13/logpower_result_rate.txt new file mode 100644 index 0000000..cdd2c9c --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_13 [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,80)=20.061 p(resid)=2.465e-05 p(Satt)=2.466e-05 (df=80) + honest per-animal random slope (log-day): F(1,71.2)=19.98 p=2.882e-05 +Cohen's f (interaction, partial eta^2=0.035) = 0.191 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.1007, ratSD=0.04245, resSD=0.07232) --- + + true stim:log(day) = +0.1007 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.85 | 0.99 <- observed + 5 | 1.00 | 1.00 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.05035 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.40 | 0.66 <- observed + 5 | 0.74 | 0.86 + 8 | 0.97 | 0.99 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/right_only_d0_13/logpowersim.m b/analysis/matlab/variations/right_only_d0_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/right_only_d0_13/logpowersim.m +++ b/analysis/matlab/variations/right_only_d0_13/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/right_only_d0_13/plotcurve.m b/analysis/matlab/variations/right_only_d0_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/right_only_d0_13/plotcurve.m +++ b/analysis/matlab/variations/right_only_d0_13/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/right_only_d0_13/power_result.txt b/analysis/matlab/variations/right_only_d0_13/power_result.txt index ac5a438..29b02c8 100644 --- a/analysis/matlab/variations/right_only_d0_13/power_result.txt +++ b/analysis/matlab/variations/right_only_d0_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- right_only_d0_13 +POWER SIMULATION -- right_only_d0_13 [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.70/day, rat SD=0.00, residual SD=14.12, days=14 +ground truth: stim:day=+1.7/day, rat SD=3.135e-15, residual SD=14.12, days=14 - true stim:day interaction = +1.70 (100% of observed) + true stim:day interaction = +1.7 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.28 | 0.67 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.70/day, rat SD=0.00, residual SD=14.12, days=14 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +0.85 (50% of observed) + true stim:day interaction = +0.8501 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.15 | 0.24 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.70/day, rat SD=0.00, residual SD=14.12, days=14 16 | 0.75 | 0.82 24 | 0.87 | 0.85 -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/right_only_d0_13/power_result_rate.txt b/analysis/matlab/variations/right_only_d0_13/power_result_rate.txt new file mode 100644 index 0000000..ec546e3 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- right_only_d0_13 [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.01351/day, rat SD=0.03866, residual SD=0.09009, days=14 + + true stim:day interaction = +0.01351 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.37 | 0.82 <- observed + 5 | 0.85 | 0.93 + 8 | 0.99 | 0.99 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.006756 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.20 | 0.34 <- observed + 5 | 0.33 | 0.39 + 8 | 0.66 | 0.69 + 12 | 0.78 | 0.82 + 16 | 0.93 | 0.94 + 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/right_only_d0_13/powersim.m b/analysis/matlab/variations/right_only_d0_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/right_only_d0_13/powersim.m +++ b/analysis/matlab/variations/right_only_d0_13/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/right_only_d0_13/result.txt b/analysis/matlab/variations/right_only_d0_13/result.txt index 752106e..a19fe47 100644 --- a/analysis/matlab/variations/right_only_d0_13/result.txt +++ b/analysis/matlab/variations/right_only_d0_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: right_only_d0_13 +VARIATION: right_only_d0_13 [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(80)= 2.01 F(1)= 4.031 p=0.04804 p=0.04788 (df=84) day (learning) t(80)= 9.45 F(1)= 89.224 p=1.171e-14 p=7.518e-15 (df=84) stim (main, window start) t(80)= 0.63 F(1)= 0.401 p=0.5285 p=0.5284 (df=84) -interaction 95% CI: [+0.02, +3.39] +interaction 95% CI: [+0.01501, +3.385] HONEST LME (per-animal random slope, day|rat): interaction F(1,20.2)=2.92, p=0.1029 (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.04804, slope diff=+1.70) -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.04804, slope diff=+1.7) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d0_13/result_rate.txt b/analysis/matlab/variations/right_only_d0_13/result_rate.txt new file mode 100644 index 0000000..e43cd19 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: right_only_d0_13 [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, Right-Electrode +control (stim=0): Electrode-Box-A2 +N = 7 rats, 84 sessions raw day coverage: treat 0..13, control 0..13 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 84 + 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 + -145.93 -131.35 78.967 -157.93 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.25632 0.035875 7.1447 80 3.7358e-10 + {'day' } 0.032358 0.0046124 7.0154 80 6.6273e-10 + {'stim' } 0.0062182 0.046891 0.13261 80 0.89483 + {'day:stim' } 0.013512 0.0056067 2.41 80 0.018249 + + + Lower Upper + 0.18492 0.32771 + 0.023179 0.041537 + -0.087097 0.099534 + 0.0023542 0.02467 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.038665 + + + Lower Upper + 0.017826 0.083864 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.090086 0.076927 0.1055 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(80)= 2.41 F(1)= 5.808 p=0.01825 p=0.01818 (df=82) +day (learning) t(80)= 7.02 F(1)= 49.216 p=6.627e-10 p=5.568e-10 (df=83) +stim (main, window start) t(80)= 0.13 F(1)= 0.018 p=0.8948 p=0.8959 (df=19) +interaction 95% CI: [+0.002354, +0.02467] +HONEST LME (per-animal random slope, day|rat): interaction F(1,81.6)=5.93, p=0.01709 + (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.01825, slope diff=+0.01351) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d0_5/analyze.m b/analysis/matlab/variations/right_only_d0_5/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/right_only_d0_5/analyze.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_5/learning_curve.png b/analysis/matlab/variations/right_only_d0_5/learning_curve.png index 01c8d4f77e02c8932e6bf19ffd7ce59b181def34..54d94cfeeebfe74c3c28e86867d5629c958bd508 100644 GIT binary patch literal 36277 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 AP5=M^ diff --git a/analysis/matlab/variations/right_only_d0_5/learning_curve_rate.png b/analysis/matlab/variations/right_only_d0_5/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ba618396f4e2d1114a750b624b1d3cf50f933d GIT binary patch literal 37847 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�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

8J7_fBxFJr`$l1S}$o)!8{T6%9i_6XJojUD*INO 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 FzX0|~e-!`# literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/right_only_d0_5/logpower_result.txt b/analysis/matlab/variations/right_only_d0_5/logpower_result.txt index 963643d..eff0965 100644 --- a/analysis/matlab/variations/right_only_d0_5/logpower_result.txt +++ b/analysis/matlab/variations/right_only_d0_5/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_5 +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_5 [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,38)=5.667 p(resid)=0.02241 p(Satt)=0.0219 (df honest per-animal random slope (log-day): F(1,9.0)=4.64 p=0.05966 Cohen's f (interaction, partial eta^2=0.036) = 0.194 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+16.20, ratSD=0.00, resSD=13.20) --- +--- power simulation (log-day ground truth: stim:logday=+16.2, ratSD=0, resSD=13.2) --- - true stim:log(day) = +16.20 (100% of observed) + true stim:log(day) = +16.2 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.33 | 0.65 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.036) = 0.194 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +8.10 (50% of observed) + true stim:log(day) = +8.101 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.09 | 0.24 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.036) = 0.194 (small-medium; f: .10 smal 16 | 0.69 | 0.69 24 | 0.92 | 0.92 -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/right_only_d0_5/logpower_result_rate.txt b/analysis/matlab/variations/right_only_d0_5/logpower_result_rate.txt new file mode 100644 index 0000000..d113d38 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_5/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d0_5 [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,38)=15.000 p(resid)=0.0004109 p(Satt)=0.0004502 (df=35) + honest per-animal random slope (log-day): F(1,10.8)=11.68 p=0.005855 +Cohen's f (interaction, partial eta^2=0.111) = 0.353 (medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.1583, ratSD=0.04781, resSD=0.07931) --- + + true stim:log(day) = +0.1583 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.62 | 0.93 <- observed + 5 | 0.95 | 0.98 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.07917 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.16 | 0.42 <- observed + 5 | 0.52 | 0.62 + 8 | 0.81 | 0.82 + 12 | 0.93 | 0.92 + 16 | 0.98 | 0.98 + 24 | 1.00 | 1.00 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/right_only_d0_5/logpowersim.m b/analysis/matlab/variations/right_only_d0_5/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/right_only_d0_5/logpowersim.m +++ b/analysis/matlab/variations/right_only_d0_5/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/right_only_d0_5/plotcurve.m b/analysis/matlab/variations/right_only_d0_5/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/right_only_d0_5/plotcurve.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_5/power_result.txt b/analysis/matlab/variations/right_only_d0_5/power_result.txt index ce0bc1d..8baf17f 100644 --- a/analysis/matlab/variations/right_only_d0_5/power_result.txt +++ b/analysis/matlab/variations/right_only_d0_5/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- right_only_d0_5 +POWER SIMULATION -- right_only_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=+5.31/day, rat SD=5.25, residual SD=9.96, days=6 +ground truth: stim:day=+5.307/day, rat SD=5.248, residual SD=9.964, days=6 - true stim:day interaction = +5.31 (100% of observed) + true stim:day interaction = +5.307 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.38 | 0.80 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+5.31/day, rat SD=5.25, residual SD=9.96, days=6 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +2.65 (50% of observed) + true stim:day interaction = +2.654 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.11 | 0.28 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+5.31/day, rat SD=5.25, residual SD=9.96, days=6 16 | 0.83 | 0.85 24 | 0.95 | 0.97 -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/right_only_d0_5/power_result_rate.txt b/analysis/matlab/variations/right_only_d0_5/power_result_rate.txt new file mode 100644 index 0000000..f221424 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_5/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- right_only_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.04981/day, rat SD=0.04929, residual SD=0.07366, days=6 + + true stim:day interaction = +0.04981 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.60 | 0.91 <- observed + 5 | 0.97 | 0.98 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.0249 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.15 | 0.37 <- observed + 5 | 0.49 | 0.55 + 8 | 0.73 | 0.81 + 12 | 0.88 | 0.89 + 16 | 0.97 | 0.97 + 24 | 1.00 | 1.00 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/right_only_d0_5/powersim.m b/analysis/matlab/variations/right_only_d0_5/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/right_only_d0_5/powersim.m +++ b/analysis/matlab/variations/right_only_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/right_only_d0_5/result.txt b/analysis/matlab/variations/right_only_d0_5/result.txt index a2f22a5..630bf5f 100644 --- a/analysis/matlab/variations/right_only_d0_5/result.txt +++ b/analysis/matlab/variations/right_only_d0_5/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: right_only_d0_5 +VARIATION: right_only_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.92 F(1)= 8.511 p=0.005897 p=0.006128 (df=35) day (learning) t(38)= 7.17 F(1)= 51.382 p=1.458e-08 p=2.321e-08 (df=35) stim (main, window start) t(38)= -0.73 F(1)= 0.534 p=0.4696 p=0.4735 (df=20) -interaction 95% CI: [+1.62, +8.99] +interaction 95% CI: [+1.625, +8.99] HONEST LME (per-animal random slope, day|rat): interaction F(1,7.0)=3.94, p=0.08763 (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.005897, slope diff=+5.31) -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.005897, slope diff=+5.307) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d0_5/result_rate.txt b/analysis/matlab/variations/right_only_d0_5/result_rate.txt new file mode 100644 index 0000000..ac77b29 --- /dev/null +++ b/analysis/matlab/variations/right_only_d0_5/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: right_only_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, Right-Electrode +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 + -78.771 -68.345 45.385 -90.771 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.2186 0.041919 5.2147 38 6.7762e-06 + {'day' } 0.043366 0.010166 4.2656 38 0.00012743 + {'stim' } -0.074496 0.055454 -1.3434 38 0.18712 + {'day:stim' } 0.049806 0.013449 3.7033 38 0.00067357 + + + Lower Upper + 0.13374 0.30346 + 0.022785 0.063946 + -0.18676 0.037766 + 0.02258 0.077032 + +Random effects covariance parameters (95% CIs): +Group: rat (7 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.049289 + + + Lower Upper + 0.023894 0.10168 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.073663 0.058279 0.093108 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(38)= 3.70 F(1)= 13.715 p=0.0006736 p=0.0007295 (df=35) +day (learning) t(38)= 4.27 F(1)= 18.195 p=0.0001274 p=0.0001438 (df=35) +stim (main, window start) t(38)= -1.34 F(1)= 1.805 p=0.1871 p=0.1975 (df=16) +interaction 95% CI: [+0.02258, +0.07703] +HONEST LME (per-animal random slope, day|rat): interaction F(1,7.0)=9.42, p=0.0181 + (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.0006736, slope diff=+0.04981) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d6_10/analyze.m b/analysis/matlab/variations/right_only_d6_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/right_only_d6_10/analyze.m +++ b/analysis/matlab/variations/right_only_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/right_only_d6_10/learning_curve.png b/analysis/matlab/variations/right_only_d6_10/learning_curve.png index beec2c175373e62c168506ab3f4c391b14accf95..8cedcddf562a7fffefbf0ef677aaef36d2501114 100644 GIT binary patch delta 16689 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 diff --git a/analysis/matlab/variations/right_only_d6_10/learning_curve_rate.png b/analysis/matlab/variations/right_only_d6_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6182e39ddfeb89fd2e0e47c4eef7bc45c10d98 GIT binary patch literal 37311 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

b9Uq%>O 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/right_only_d6_10/logpower_result.txt b/analysis/matlab/variations/right_only_d6_10/logpower_result.txt index 1a2bb3c..226dc36 100644 --- a/analysis/matlab/variations/right_only_d6_10/logpower_result.txt +++ b/analysis/matlab/variations/right_only_d6_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d6_10 +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_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)=1.327 p(resid)=0.2599 p(Satt)=0.2608 (df= honest per-animal random slope (log-day): F(1,6.0)=0.96 p=0.3641 Cohen's f (interaction, partial eta^2=0.021) = 0.145 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+23.04, ratSD=5.69, resSD=8.25) --- +--- power simulation (log-day ground truth: stim:logday=+23.04, ratSD=5.689, resSD=8.25) --- true stim:log(day) = +23.04 (100% of observed) N/group | per-animal power | LME power @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.021) = 0.145 (small-medium; f: .10 smal 16 | 0.25 | 0.25 24 | 0.45 | 0.52 -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/right_only_d6_10/logpower_result_rate.txt b/analysis/matlab/variations/right_only_d6_10/logpower_result_rate.txt new file mode 100644 index 0000000..d1368af --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_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.485 p(resid)=0.4924 p(Satt)=0.4929 (df=24) + honest per-animal random slope (log-day): F(1,6.0)=0.24 p=0.644 +Cohen's f (interaction, partial eta^2=0.009) = 0.094 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.09523, ratSD=0.03826, resSD=0.05641) --- + + true stim:log(day) = +0.09523 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.04 | 0.10 + 5 | 0.15 | 0.19 + 8 | 0.17 | 0.23 + 12 | 0.20 | 0.27 + 16 | 0.40 | 0.38 + 24 | 0.54 | 0.54 + + true stim:log(day) = +0.04761 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.06 | 0.11 + 5 | 0.09 | 0.09 + 8 | 0.06 | 0.07 + 12 | 0.12 | 0.12 + 16 | 0.14 | 0.14 + 24 | 0.22 | 0.22 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/right_only_d6_10/logpowersim.m b/analysis/matlab/variations/right_only_d6_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/right_only_d6_10/logpowersim.m +++ b/analysis/matlab/variations/right_only_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/right_only_d6_10/plotcurve.m b/analysis/matlab/variations/right_only_d6_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/right_only_d6_10/plotcurve.m +++ b/analysis/matlab/variations/right_only_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/right_only_d6_10/power_result.txt b/analysis/matlab/variations/right_only_d6_10/power_result.txt index 5374fde..fe348a6 100644 --- a/analysis/matlab/variations/right_only_d6_10/power_result.txt +++ b/analysis/matlab/variations/right_only_d6_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- right_only_d6_10 +POWER SIMULATION -- right_only_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=+2.42/day, rat SD=5.71, residual SD=8.18, days=5 +ground truth: stim:day=+2.425/day, rat SD=5.709, residual SD=8.18, days=5 - true stim:day interaction = +2.42 (100% of observed) + true stim:day interaction = +2.425 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.06 | 0.25 @@ -15,7 +15,7 @@ ground truth: stim:day=+2.42/day, rat SD=5.71, residual SD=8.18, days=5 16 | 0.71 | 0.74 24 | 0.94 | 0.94 - true stim:day interaction = +1.21 (50% of observed) + true stim:day interaction = +1.212 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.12 @@ -25,5 +25,4 @@ ground truth: stim:day=+2.42/day, rat SD=5.71, residual SD=8.18, days=5 16 | 0.23 | 0.23 24 | 0.40 | 0.47 -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/right_only_d6_10/power_result_rate.txt b/analysis/matlab/variations/right_only_d6_10/power_result_rate.txt new file mode 100644 index 0000000..bdd92d5 --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- right_only_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.0102/day, rat SD=0.03828, residual SD=0.05632, days=5 + + true stim:day interaction = +0.0102 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.09 + 5 | 0.13 | 0.18 + 8 | 0.16 | 0.24 + 12 | 0.19 | 0.24 + 16 | 0.36 | 0.36 + 24 | 0.47 | 0.47 + + true stim:day interaction = +0.0051 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.11 + 5 | 0.07 | 0.10 + 8 | 0.06 | 0.08 + 12 | 0.10 | 0.12 + 16 | 0.12 | 0.13 + 24 | 0.19 | 0.19 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/right_only_d6_10/powersim.m b/analysis/matlab/variations/right_only_d6_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/right_only_d6_10/powersim.m +++ b/analysis/matlab/variations/right_only_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/right_only_d6_10/result.txt b/analysis/matlab/variations/right_only_d6_10/result.txt index e952e59..6c7527b 100644 --- a/analysis/matlab/variations/right_only_d6_10/result.txt +++ b/analysis/matlab/variations/right_only_d6_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: right_only_d6_10 +VARIATION: right_only_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) @@ -64,5 +64,5 @@ interaction 95% CI: [-2.18, +7.03] HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.90, p=0.3784 (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.289, slope diff=+2.42) -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.289, slope diff=+2.425) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d6_10/result_rate.txt b/analysis/matlab/variations/right_only_d6_10/result_rate.txt new file mode 100644 index 0000000..6f97191 --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: right_only_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, Right-Electrode +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 + -68.28 -59.872 40.14 -80.28 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.52619 0.041043 12.82 26 9.5461e-13 + {'day' } 0.0099391 0.012595 0.78916 26 0.43716 + {'stim' } 0.090314 0.050267 1.7967 26 0.084015 + {'day:stim' } 0.0102 0.015425 0.66127 26 0.51426 + + + Lower Upper + 0.44182 0.61055 + -0.015949 0.035828 + -0.013012 0.19364 + -0.021507 0.041907 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.038283 + + + Lower Upper + 0.016862 0.086916 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.056325 0.042446 0.074741 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(26)= 0.66 F(1)= 0.437 p=0.5143 p=0.5147 (df=24) +day (learning) t(26)= 0.79 F(1)= 0.623 p=0.4372 p=0.4377 (df=24) +stim (main, window start) t(26)= 1.80 F(1)= 3.228 p=0.08402 p=0.09376 (df=14) +interaction 95% CI: [-0.02151, +0.04191] +HONEST LME (per-animal random slope, day|rat): interaction F(1,6.0)=0.23, p=0.6495 + (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.5143, slope diff=+0.0102) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d6_13/analyze.m b/analysis/matlab/variations/right_only_d6_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/right_only_d6_13/analyze.m +++ b/analysis/matlab/variations/right_only_d6_13/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/right_only_d6_13/learning_curve.png b/analysis/matlab/variations/right_only_d6_13/learning_curve.png index d731fff2d32c5db7b55ff4df090db9d4b72bbc0b..7b1fc7f8dc128321b96566252875db9862f60a3c 100644 GIT binary patch literal 41118 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/(5xd;It2Zp0PvOIu$d!m%zd`9A->fpObWak? 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

  • Q`?6|^Re}ugprSiJgR^e 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%0DV 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/right_only_d6_13/logpower_result.txt b/analysis/matlab/variations/right_only_d6_13/logpower_result.txt index 1f4088d..dea8a5c 100644 --- a/analysis/matlab/variations/right_only_d6_13/logpower_result.txt +++ b/analysis/matlab/variations/right_only_d6_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d6_13 +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d6_13 [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,38)=5.774 p(resid)=0.02125 p(Satt)=0.02133 (d honest per-animal random slope (log-day): F(1,0.0)=3.19 p=NaN Cohen's f (interaction, partial eta^2=0.036) = 0.194 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+28.42, ratSD=6.48, resSD=7.39) --- +--- power simulation (log-day ground truth: stim:logday=+28.42, ratSD=6.482, resSD=7.389) --- true stim:log(day) = +28.42 (100% of observed) N/group | per-animal power | LME power @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.036) = 0.194 (small-medium; f: .10 smal 16 | 0.90 | 0.92 24 | 1.00 | 1.00 -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/right_only_d6_13/logpower_result_rate.txt b/analysis/matlab/variations/right_only_d6_13/logpower_result_rate.txt new file mode 100644 index 0000000..82fa8b3 --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- right_only_d6_13 [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,38)=4.975 p(resid)=0.0317 p(Satt)=0.03178 (df=38) + honest per-animal random slope (log-day): F(1,4.9)=0.25 p=0.6396 +Cohen's f (interaction, partial eta^2=0.039) = 0.201 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.1853, ratSD=0.04282, resSD=0.05196) --- + + true stim:log(day) = +0.1853 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.53 | 0.80 + 5 | 0.88 | 0.96 + 8 | 0.99 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.09266 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.16 | 0.27 + 5 | 0.31 | 0.42 + 8 | 0.52 | 0.62 + 12 | 0.74 | 0.79 + 16 | 0.86 | 0.89 + 24 | 0.98 | 0.99 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/right_only_d6_13/logpowersim.m b/analysis/matlab/variations/right_only_d6_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/right_only_d6_13/logpowersim.m +++ b/analysis/matlab/variations/right_only_d6_13/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/right_only_d6_13/plotcurve.m b/analysis/matlab/variations/right_only_d6_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/right_only_d6_13/plotcurve.m +++ b/analysis/matlab/variations/right_only_d6_13/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/right_only_d6_13/power_result.txt b/analysis/matlab/variations/right_only_d6_13/power_result.txt index 2e054dd..34247c9 100644 --- a/analysis/matlab/variations/right_only_d6_13/power_result.txt +++ b/analysis/matlab/variations/right_only_d6_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- right_only_d6_13 +POWER SIMULATION -- right_only_d6_13 [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=+2.76/day, rat SD=6.47, residual SD=7.37, days=8 +ground truth: stim:day=+2.758/day, rat SD=6.469, residual SD=7.367, days=8 - true stim:day interaction = +2.76 (100% of observed) + true stim:day interaction = +2.758 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.56 | 0.83 @@ -15,7 +15,7 @@ ground truth: stim:day=+2.76/day, rat SD=6.47, residual SD=7.37, days=8 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +1.38 (50% of observed) + true stim:day interaction = +1.379 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.15 | 0.28 @@ -25,5 +25,4 @@ ground truth: stim:day=+2.76/day, rat SD=6.47, residual SD=7.37, days=8 16 | 0.93 | 0.93 24 | 0.99 | 0.99 -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/right_only_d6_13/power_result_rate.txt b/analysis/matlab/variations/right_only_d6_13/power_result_rate.txt new file mode 100644 index 0000000..6a86d4c --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- right_only_d6_13 [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.01878/day, rat SD=0.04274, residual SD=0.05164, days=8 + + true stim:day interaction = +0.01878 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.54 | 0.82 + 5 | 0.92 | 0.97 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.009388 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.15 | 0.28 + 5 | 0.33 | 0.51 + 8 | 0.58 | 0.65 + 12 | 0.77 | 0.81 + 16 | 0.88 | 0.90 + 24 | 0.98 | 0.99 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/right_only_d6_13/powersim.m b/analysis/matlab/variations/right_only_d6_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/right_only_d6_13/powersim.m +++ b/analysis/matlab/variations/right_only_d6_13/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/right_only_d6_13/result.txt b/analysis/matlab/variations/right_only_d6_13/result.txt index e0a7616..d611f97 100644 --- a/analysis/matlab/variations/right_only_d6_13/result.txt +++ b/analysis/matlab/variations/right_only_d6_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: right_only_d6_13 +VARIATION: right_only_d6_13 [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.32 F(1)= 5.379 p=0.02585 p=0.02591 (df=38) day (learning) t(38)= 1.70 F(1)= 2.885 p=0.09761 p=0.09766 (df=38) stim (main, window start) t(38)= 1.64 F(1)= 2.685 p=0.1096 p=0.1304 (df=11) -interaction 95% CI: [+0.35, +5.17] +interaction 95% CI: [+0.3507, +5.165] HONEST LME (per-animal random slope, day|rat): interaction F(1,21.2)=4.96, p=0.03697 (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.02585, slope diff=+2.76) -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.02585, slope diff=+2.758) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/right_only_d6_13/result_rate.txt b/analysis/matlab/variations/right_only_d6_13/result_rate.txt new file mode 100644 index 0000000..5233cd6 --- /dev/null +++ b/analysis/matlab/variations/right_only_d6_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: right_only_d6_13 [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, Right-Electrode +control (stim=0): Electrode-Box-A2 +N = 6 rats, 42 sessions raw day coverage: treat 6..13, control 6..13 +(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 6 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -107.29 -96.867 59.646 -119.29 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.53543 0.038925 13.755 38 2.4576e-16 + {'day' } 0.0034157 0.0070712 0.48304 38 0.63184 + {'stim' } 0.077975 0.047524 1.6407 38 0.1091 + {'day:stim' } 0.018776 0.0083266 2.2549 38 0.029981 + + + Lower Upper + 0.45663 0.61423 + -0.010899 0.017731 + -0.018233 0.17418 + 0.0019195 0.035632 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.042741 + + + Lower Upper + 0.021774 0.083895 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.051638 0.041022 0.065002 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(38)= 2.25 F(1)= 5.085 p=0.02998 p=0.03003 (df=38) +day (learning) t(38)= 0.48 F(1)= 0.233 p=0.6318 p=0.6318 (df=38) +stim (main, window start) t(38)= 1.64 F(1)= 2.692 p=0.1091 p=0.1287 (df=11) +interaction 95% CI: [+0.00192, +0.03563] +HONEST LME (per-animal random slope, day|rat): interaction F(1,4.0)=0.24, p=0.6492 + (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.02998, slope diff=+0.01878) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/unmerge_d0_10/analyze.m b/analysis/matlab/variations/unmerge_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/unmerge_d0_10/analyze.m +++ b/analysis/matlab/variations/unmerge_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/unmerge_d0_10/learning_curve.png b/analysis/matlab/variations/unmerge_d0_10/learning_curve.png index 0d415ccd6ec7dff8b7e28879f8b317a17e512230..508966985b79f2a862dd4df2a2ea04da3901d756 100644 GIT binary patch delta 32 ocmeA^&D4FGX@WDGhT2ux8#5+)hH{!1SQ%R=>X!y=T>fMU0LV-XZ~y=R delta 32 ocmeA^&D4FGX@WDG4A0h{M>{8ahH@HNSQ#4av`}u|xctcy0MaH6L;wH) diff --git a/analysis/matlab/variations/unmerge_d0_10/learning_curve_rate.png b/analysis/matlab/variations/unmerge_d0_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..0b30787d30fb3b82133500c0deca860397351cec GIT binary patch literal 43385 zcmbTe2RzmP`!{}?NJgntRw|oRLLo|}B9ZK^l1*gqJ`oKmGb<{TtWq4=p=4+8RfO!l zxu0*J?|t9D`~L6$d3?rk&U?Jx*Xw#+*Yo+juGe{}c=aO9w*A{kBofW#OXrnHq)iR@ z*Oqc4J`pyK+=Ty8-MOT3mqcRRN&LIPD7qF$ktl30%U_`QOR;wgH`nX^1GM<)uX~S`LoK7k;5HM+RBD& zYZGS5&(7AHw?E&-Pd+eqJT6STtipyzzQ!_HThshnT}-q|kX)R}mWQfcNfq_GsCU+F z<_k49xFaWjefsJ#jpIAARc>wG;_eYCHfJqz+hDe7YQoKx&F5~)sk<9G=T=_QH7#hr z|NGZ;1IAe(@Ym6qu*VrvLjNEY#v*3-SNYmCc9ymI-~P#3S>KBsi@2hzKzbCY1E2~ zi>nPYEDxC(tShOVKkYJ`q?v9yH`?K`x?mI~W*07Ml~Ok-%z;Ipb`o`{1WeE=| z()dZfA%)4w$?s40T~}8(UVQ)K$B*57s$M=m;!^jDeCYD$e?4BB8&iAvIUv8wc_?|V z)1`VkM>fuR^h-ade0cA25NV#TF`7im3H_??I9+qG@_`lmd0pMkOzYph-J|1L{OTXN zSC_^_w{@u|X?*%_KEFp=Sxt?Liz`(pyD^Ms!?;zi70GjMu{Th`eQm{IFw>+ie(F!9 zoSdB22mP~k@$zwjB~Mwj(oKVfte!u6_Tg4(Kv|hA`}r$Zt|Y1^C;5x+-9FV{9h%Q9 zW;-z1S1z?OT}Q#{ct-Mz{@0E7zjjw7k>-yzdTbgu2;@@0px)Rn*UAZ=UL1H+mbf>YF*@BaFDj{vWrpx&q3@|v2hrGZ?D@84Ty_B_bU z%)ItSrXgV}|KJ5f!#*0(_5&=U7Ol4ZRZ(gw+8XJm4Mx#!A)%p7cznx_Ecx&g33vOe zqRQWRbN@~sZ*!6Y}wM+*Vm+dw^ClT*%EhW z7Pn8bUHw!o$t2~TQ*=GcapE=oYlET(m@Ot@)B0!Z=P)cfzTbppR+pUy=Nq-G0 zd1@!t0b9-uw;b}~K5}GrG<$68_PyQX#2ihEdV1EyoZYlAzq~L7UuNLE@}so$xx#2y zzQ@|?3I_j}Q7}ZIFu)i3Sv7@d$*ADqbhoA1&!0b6MTtwz zwclkDF@L6)4f`Lv`5g}=zKMcXxvKZqx5pC`6J730$&iis$n^f-zklJ~ZWG@aC&L)HuJYrc zq6akPp@OMe`JS9q;XsCWtswhtVzm~?Ck85)*2cuOjbFsws)n$ zQ&P0ZSDiRvL9uu5-l>1O?Z=!K><}U4vD%t$7TlvXJ6SHs*K`;wlvqeM^LewaW@EW? zo%c3T=(>!gOH&5Rreg)tNiF{zt`OA8`h2@`f8Dr%7kp0f!Pv8B&k#QFUp@B)!#@>a zlMBu>Dev?7b#vxN$Xy|Y4tMU{N!87LK+D3*Snsho_?G8-{ENI$9Z4(z!+F|m+y2%k zT>o^tvMTZv0~?#wEQb#*OMrj2{mA>ASfvEZoC%pvhel==hf?zq??e!2ic|AfdD*&b z>*UMi%Br}ku26Y;9P-#id9qA}15<@ZP@vep_k;EC?~##_PE&tM*|jJ?V#s~eaB@C2 zE)EWwy+`%SLj?3ZR_x5plU!Hf_1cI#Z?8rjKYrYOzK6o;)noc!xXmJ*wO3GTZF!2# zWBHocX#1Bb(Jt31MB`kz7U52j{DA=hj~+j+tXlr=P8SLr{ixwL^16w+tO*3 z3l}a-S|f=1rDPb_NJ~mu|MDujn`r%&yrZv#wU7BpUPXENT}N5cGSdRnnKR-ZtFC0r zjy;09?O*Qp|EY{vTk2X}JA* zj5ild<|#jFa99PA&Q z_~5YLe&GOr;-SPOM6-iJL;0k5_a>KKbJx(-9ldpP4{7z$GR=XXr{OJSS!p(vmQGGz za&|v{{`}Czty{KSE+J;BJ|WOG!C|bkNyj0|Hc2TVC^1A%RyOwjC!=bFg0g(Nk=E;I{(3zKmE*eo@nZzx;B_4p800|-}9IE)df4x z{55n|vTQICqcKQR*HF^YNsg>Q=rc6o+`W4@*VRbluDsm14XTk6PD+xh?y4V8sAzFZ zZReIc`z2`EhxQZVZIE7;g(}IFdaZ$UAjaFfJ2;UEjl-Q5??P?yeZBgklwMq6wreePVa-u}w6cixX{^hwVY*S2<(gBB`w_HCodR(E=p zJC~$I9xZ;zki0$9rteXW7=^VRBV*WP;C+*chG9+nH*`#NlJhY&7pXbgBD|W*-`Vg# zZ}NSd$dGe>q4eu?(SyhJKwg-rNiDt1J73>L#kn%?*~6KtxRJy$DN2$u_Q(95<=391u>#3-yo=4LzBM?2=dZ{DL&&%68L7Dedc$Y($n^;s;Y1j*; z)#qPrZ!ik#^7HWtxdq!Kmq&Z7n%Jr=Eak2)4w)H*WITNID1dxqajIG>*ke@Dvi*0n zGz;mT=L{Fg^@UBtMR)hSNhLeG^vN(OtGZX`C>GS?lvt2=RV@>>bKHA>?0Az%LC1Q+ z?V)U(($(+A2F?~AB|jp=y>L?rJ)+Y~x0QmHS+Vg4U_hExm*ik(R+gswrFxp6F^=l9 zua~)u7H#=Smwt2+H#=1vBA^w-F)kk=@`YQr@eyzxH`}>(fTc-O0|SE_H+~g*QzIW- z|Kzesss&+m+#^3h^&byQsFDUWu^Ed#+X24n(Q6bYX6wD?i^g$Ff6g!AMC%Bcc7n z)}@5*`5odEh~Ld7aP3 zH8@5-@tf-Q{Uuie=kt5tp%0IoZ6tU_3VK>w` z(*ET-<+W?qj=3+-&yKW-n${0Utu6R#x2!bfug(B1wzyYI0v8N5%Ij`<9v&Y4{CQ29 zVfpLVuYnn1c3v$v;tx)RmpP6THwMeeUG6Ro?^O`eI>z$Xj*R8C0JMhcxwrIKWdP&? z4bNwfqRuq}o)(wV!|Q{>Y(rm2y^cKp^QAV*+VZ+Z?6j!8jf`!)+Q z4XZ?R&qFHq(X62(a{k+{yf}JRG9;9$AyLf=u;6!ze`u8vVB786ym~4~JuRP%#Peg= zJo8_#(iHeKr0T6DlRJ-hgvGh9EY|)Bn%pPY{_w-qC^0tI@v~!{xqU*ww{6)Dsm$kY z-n#ag`XRZsGIS;du zYttuN_teMU36>5%U5@+&kVRmw@$vC3)O)x^KPjgidVl?GRRD)vkjH@HUpzD3GN+V@ zCjn~$5M&KXNwA;4b7vf`Jov~+eZxG>Uo0oBXh}Cf2LcyhxkidRq-cD){qf^R1<8e5 zfHS?Ey9>1(4w~1$tAX34VOsGIu~3YvA`?(PDOG`bSS# zw$DFcvdjcyyZDruXXNJClbDzo%&H?M9q1M|OoSmE9p^h7x>g3>_=}j-#sZ$&>}WNv zu0afleM`Konm_dXczy_pIr~qz8CWYp8^Ev%R(iB1yYJK4k9E2s62MvB)X&C(Ft{yF z1NdA4YLht5LCTZv8!tLRB6S4>2Xlz-$LuYEA^mAtAf3^F@4Yw&3`4A-X!pgz>A^bS zRX8}J7{M@Fq$@LNo0P723KC}q4bC}(ZjJSQI`3?8K-uYGh z@H#LX+#gF;#;jzM5h7-F^k(vh{a=mO$Gkm;kch{Z1cmDwB+2_V$k&l`)(~@?+og`0pO|ppD&IA4jXaBV5%+dJU5)>Z3 zpNYw=j~45n1j#7T)9+UQHY8eQkBIniQIR(EAw|H9C)$h@cQP{0 zwVI{2rDhk?CLS<-22L?2=B>%kNy2?{%)gVmGx-fG^hG zi=#P2BE|0)G0(j5?GeNb8Wyn=SWSlypN~^QDnaTU?D1i%`tbvBSCq1g)P44;lt)-# z;B^fR9xp|a)Zm%F4MT9(E|0a`nTQ`A^MUrp*8`UFO;7A6hIuamYZneWG0jgR-9D+i zwhCV2MZe!K9*!TcCT{oluopKs_feWgS)FYA;92cvB*B_Ez)UK30 zfY}!iAZXbnmsjSx*d$#YL2Q8*bn;vmVC+7MV}!<~*YCKZ)q3S??PLHzIk%5SKuE|e zC{I12{uji#-mmlTIQ1nynLTL`J7i?ggos{A0ieB{X_UyvxL7Wbx z|IlN<9Ul;ZMMstjWewR%Z%EXnJ@X^|uinzY+o=E$(XZoo!*58Qbk-6cqQ*b_2Y~mbe%57vyrx-XLh~)8RdGr1Q(&xAeb4v@ES11BeT#;R4j` zFF}Mrmf@=_&o8nf2`XTItgR;~*j$gAHS)6;!?xn~!`yU7zzvDTKReQ29W5B`+WY+C z{u9QEIywZwT^lc=gJab$;Cnwdsl1#V32tuV<@t%KD^OcW~=~8h{Q73VM;v?K1`dxx&lK%XYZgy7_|v_^5J%az^{vw{>oS zLy+rQ@esH$LKGGSum}jr42G{|6-``levi=PS{l$V!EchYfk^4 zEjZ2JU=j1 z%(hR?6(u)84dA>QxtEE_rHDrK{KboO@D(Tvj7PNZ%q+pqR%cf2Demi9O~=*j%dCW; z_9-n*;^e(=j~V^<3-j{vC1z!badO5ZXb_7Oh`Qk3rpJ#SNt`@};j#8wHR0hoN=p~4 zt;_rz%hEng{r%NXhYdY{d0x@K`^sQe}nYD!K{4uYAAs%m^}EQE=E9NDDnVu2O6*0r|e z0S)6?=QxZ2;b#KUVl~t$W@hFcJFEen2_;#ksOshE>^nV$fbXF}K}2)`*MCI*>0*s* zAftC=J6Ks;f0T_g1@r<00z7TbahhsfWQQ7&KUv1NY3p`%#L^E2MX%qyF&nB92|r;{ zi@#bkEX-{4kcy-+zuQEsDPSwMg*Fvg^OO%EhqF^qK-)baVk6G69M$)% z*)9suIsBHwDq{6a6np=AX^501FtO=j%v+X}jtt8xSD9 zTYRQI3-uA%9v7s3a)*6{ZQ6$qce)Gii9>ONfEsi5erzCbuq@>2& z7kaI3ZaE~=%o=4T=dK+&C0cX%@QdU(q9(Py!0-Zsf}y}y2PGtOpqT5qPJDwj*Sjn* z*pUs+<4q3|I$9f7zPhqR$0o_&H&$O?4`SHdtbWRsn!Vn12ILN;O!n1uSV3WPc{)}`lE1S~m%42F7B)r$TTP&f~y zmYd(7T$Yvn3k4ss-`v9jgfF?`tNzjLpojWLm$9hfmk#aL1WUtuR^k(dgLgjZ7hFN% zr4prqqqYNz?8OUH{nU6NYi!#FNhnT8<~JtI()JHfrpnX$p&4mk@v)pb<7NnyKhq55 zf@L{4{y>?NrI~qRxtEzaY5DL0uXjLC`R*$+PxjV;<^pZM6tj~Je`VWX`=DwFiylP_ z6x=}Y8#MF32p|kjO-_Pxs_5vj?AoQQp>cWYEQz#n^URp%9pu)apdi>O;C5}r;=`BzFhBM zIJ2Iz=|$KEY@J5=EW@-x_PuK=Q1!6sqy21`b8H6#h|)xa?lvl_9nwL;!KG^$q59i^ zw82O8zkpf5NTlqCU&y?1f^Uo44#cP?4%H_R@gOK@7gN5xi?CTEaF+>ua}wT>u9@6o zRnkyzYNxDRAA30v8A<5Yk7v->^ih0>5_hm)yMh$k_AKAe32IY%MsVd9*u!}lT%MRPY)2)9p-JWFcIZPr>Wa-rVwVu?*4fq8yCQuY2KI= zCi7;8bZ>7jw@;LmN9Vv3Wyg@llpo-f?^P1LqDGd78zATdLaC{$a&mIErfudB5}I<9 zf1=v-<8NcK%W(5YOd5hj4me_rKr9Z@y{QTE&H%;A(y*S9dVv@ce> zrsQ3m^Y*2)?AtmjcG%W%jE2p5;8k~bH*yq;cBNdX+xAz49rD_H{FZOd%|4`BZ+gf! z_omOs(*y9`K)!*LihPPH4x_YrTZVimX%gHKoG9S$03rVi3X)HRVR50NFcjs``Ef4$ znS9vsI4l9+UrbL#k?6;o`HA1&^n9vG>K|{Q4jX3+h!ltdZyr<~RC9=0fLb-o>$nHN z;$Ur^8S|UVm+qKMXi*-smaB|^^WS>`ew}A82I*g28S}vH%piF}ElJIxTSl6Xb{YKw z!J*Bn8S4`vs3}=%&YMwpFV-AL-U-99Ao0=6n~)N9vTVbI%|aw5!;D^*2^YahGfsyhZk!}FUU4f0GaTv;Mh;oVV-t7hG2mQCQ zKVB;$Hq?~rFyBw4F@#rYc3IhB%@e)I!7@+w3q$&?e0h2aykg(+TR))V*#VJ^bYzS2 z^Ye3Xd{Y`>2B@YX@Me0e@AR}{RMoJGytMRr=d8rXUDCeDOhUGQP_~1$Pz4E%5ND#$g)~eQy;W61O#1BrP(757 z=x7gZ1+!IpoQ3-0m9XRA>gtYF$29RdWCmqLWo8YtoK#X$ns#2nJta=>K*S2awq{R} zu9}!cAo4;7fwHQqyutVgiPO|T_~CYEHx2uY!G*M8^M#zVZ_VB`eij3F>qv@e!k9Wy7}eWUTO<} zAImsxJ$#)4Hw?HgXUhD>kE%f?vE%4IoKSzHMA8lyz2x!pnOjW7;@*z4=UUrEM#Jdv zrNq;9_GH9EK7CEqd!4Q@t+S*8jWP>`C#r_VzkZ)S!4oRfYX0#s&!9)>&Yk?ZkCsQI zC*GWxY#lxPP4f|2tD+3j zv~wIkqL;(+#gkYp90-dju15z11`_&X##}H_{*d;CW-m4U^W0?V5uGdv^hW@k&SN>Z zOL34a&nXy_c21HL54X|h^*y&Vrf>&@=8y|Py#I~x3}!QiYBiF+nEmiO=DQHofrRfM zZeWB^AD~nH9JE!Cm^iPj93;Vc?AS43VLPblbBKgEoowEsq^+H#nuuV)%Es39<*pI? zd9+<1v&T*Vz3-9U&LlDn9kA@j53~~OJz@M4cmqXbs0}I2&CSryT31J}q9eznFIWx0 z@B{EC3U?PSUTkWNvH)3%#b1aqjRUR_p1tT%&a`|91POS0D1uPh=h9~dxHbOPw>2HxB#pM#dsMiyd#bR@z7CK6~WbT zL`iWmB|Cb!1ig;#-Hux?0Sw=~aRVUGswrDM;r~dFWTM1o1-@b>EW*K){56pH?%es% zB3COE6W>qtc(E6w_Ga7!fy7hrphvb>=bv!_e+Qk_BmDf42+=6mBXW!D7mx;f34sY< z6wz^DX7R&^4^aB>o@h1zB18gcihHJ`qZ1VrG!5p$ariLev5qFU64_FRy_l%3fD@r& zA?M)o>mk=xI#$=-AI}Bz=6}KEMxl!%B_d?&sjAK*Ty~)xRC^SN-0MeWWrOhvh-K#h zq++Ks^0SGWp%=XZ6iIZnK&Sg)(^m#{sMXE~{UaQrqD_l0&_35@rLL>{G9)Ae1iQOi zf59I?v%vp(zMtPE{tvmfI$8lra^@QRmO6#pel2$V2?+@hI#(8F0>OoD6nar1JD}e6 z3mEow-C%}A8_}JGY>KMP&4FrC zv0DPZyqSUx;#_m?_FrW`Z*Fd`uKvR23RDGrH;Z(N5}a0;r&ZP$(D+Ei%Eu!O$6NtrZm&LGrI%+p)kj zZe{xIQ?S}dX`xW)8P8X1F>8F>-1O4u0@T`fce3{~dohrOk@IEe9%vx1BwAiypnhYZ z1Y5>2CTpe#Y!zP~P5%WpV-CFVFPqUE5>36PuHFpvNjMZ%g2IcV25=3~n3%N#BviVW zN7ev8xL2KKYj)oMdccd4it1SI;nT9}s`d@x%ud0+oBsLdpGem^&6*?)A(LE!pT<#T zMr$TNee{UXN5Gx+OJ=J_Vca>j2OsNS3qkyJ{!Yd!T<#G)0{@RFHCP+57o zpk5wyBD~tsxyA0)a*HST=)r@9aYEBSvJ;ix18ougGk{+#0LyXl_heCMN&dL@u-@>S z^8YDkkV}P9=zf2OE9J&gh!~Lh#l(hf?0GA*T5qPTt*u2nY_Dr-hR^p8RzL#UYf+(l z?b@rRA#ZxLBz$xrb0}twc9_-wS4yz|^fgmeaLkEtbkto30z}Y4nfWe2l}sqafmnt8 z{|h1DcGIm?Y4f_aKXgyNH$4J3EiG*)m^SKNy@BBPiwGg-q@~dt%F2Eoon9$WM$*#K z&=?SxmZr4-I=WTSZy6F4guwp?sV8I3E$%kw!h&#Wk@cSr^gKyI_cm(Xc=i7d@Ov*u zy_9gW0ptghFhRqKNyL5tKO=RIU(&6{c8fW_z4bdk(R^c&G11N)iHn7{NAzz&zF33w zn4+2f9%Kb8051?X=w&!yw=|~K2pxPxRzqS!ut%{1!NGpCJq!T@iI3=f?c7o+?Hgg4 zH39!F-`c_(IOro7vd3P0)Bkh^ zn&1Woj43*&k!cV_+R$h^JKEvWSGIfTew3?&3;DTd?K;w4Jaw0%trE--4G)N;gba^* zGrR$@9r|7-NYR^&0R&;Sz0->Uy|>;7g=|e6ZslvE1{=qVlAQqEhGn}H6iN>EWrT-_ zy!W~(JL7*C|G&$ZLih_5Wtwnk%^$ z?Kic&nk@pI-8t9hx)xM~x9#()-xnF?GiqyVSC;0aCW;wezN91-Y=848Mq`+?tt)QX z)$l#Pcs9Ry+q96#0#n||8-Gbt6i`_l+It2cl1LRt2WD*Ix_<5TNcAt&+s7Z2>(^WI z&5oO2`K7@M@H~7Ve{I!;tBI&8G?#}+jlE#GyaFICFr5EJ%J`Y!m$zGpHh0tK0v>J8 zgAa4?G--e)15WE_OzF?wJHC)J8uLokK8J!-K+VG@d3`lbQu*!8N>NwMu)bN&kne$@ z2%hB$yM?6;a}~k*fv80V3p7+)sT)teRQZHUdoC%i*|R&0e!vJwb01bpHPxc=(j8i$xk)We%wtT^60kXrwso3~Lkgi+df z=T5K6n)Y{X{}x8*3p4&9bF!bUs(Ynr0U2?|1?t0-td8|N(El`d`k=(?$fT0iplJb& zcG)JaC9WsjYja;l=<)T6%0^{BI#pRYa-X!Q8y!*EY)al8Pvj7Sk5n?TIK(kx?%9d#DsffVceL`YVE87i~G2KoZtGL(o3BeGSAqs5j7zsfSLKd7nSt9WjnQvb(8is}Oo7Bc-d;oGtQd^^gy65JxD=Ni9_ zK4WDn@y+UKF`K5SCzCWm0^f{rA$oK@C0b?KMo?pC{cw%#bux6rt(6wr14N}H4& zGYuWtrlGnqOnu#U?^w$EX<3-Y9$UAkD6oXgm;84N)zjXOTF5@klTbV;O4Ben?DlXI zk5v7noVlQT#I|Sukaw)#D#(I9$m~qq8pl>w?{;H_M;%p7o-Dr$mc+()_DgZ?o$&vM z99+#h$x){Q%0%+aPT0L>7F*Hf{%Oyi)e^ba86K1~Z{CV0CFMR}E3ce3*+aNW!5TN& zKOs1{(v!FciBgf(zqQe!=c9x0m*P&NGc2x*T<)sNVUGz*Ygcji?wfXInme5OjVkk? zsT@=BvRhKa`*h8rwx8U#UFW;6&&$vz3l@P(gH&qpMG_IU1BqZajmY2PuFi-Kk3mXmw>i!cGt9)uV1q7 z{@4wPWdG1txVp!qR~zONih#%n_pl$iZ26nU?6fKMg$o%OV&m`D#T3M>Pl3}-Q4O2M zulp1co>0JH-W3ve_*Ba~{=cu?J<8q*Xn#@GOm4`yEGINDQ?_gL^^Az_!J|@kC)fSX zG+Kw_Z$RwfLF+4O{7v?D^%>HdkgA_9i+gVEeoI?Ikoq$tpUBiNKksS(IF~k2dMVRK zGqIt#gre##EycfI-%U!i_492V-?To|UF7t}l;F0FtQU#JlwmXY;5nY=Y`qNW0I^hr z+H*v+Ioa=3{iLKPj^7v+@g_rK^)uHg{dFsnk2@c|X6iPQv70ePD^cKz2#V$laW&-{ zcmF9kiz^n$#}1qAx*V71k}~joxayt79+!Ykw+T1DLoxJCpU3-R>|60YUr)293m7Qa z6zn3594ho8D7Ug~-T&2pC%e9DVZ%xBguODg5nDzM^?loGQy&uY#KoyT<9uhJwg#n< zg3adjP?KV)7MyjMr*tW?l@`qXl~~lWTLO>EA>Y`A;_1_0*I^G8ys^Sh4?R5+e-k@zx~uuqJ3swn#IRva2K#JCpl><+#1 zvMNX=F8j`qmdna|<{vAP`$PEUnPh8DC%N8A2V$EGjHpO08xZLKz$b#HE8NSA*4ul> z;Gl5l`M_sqCYZ)u2np!Uqu_8Nyrvi>5{_ak=YJFN)mV^nGbOPIXw!~4mDg)pM0`GR zUpJbK@h$V^$*mjL9WuKmA}1JMy}Qb#_LZvZObik1^eK!2L`mzXiX3#>^lmpXbEan| zw<LT8$5byFY;GOsSXSi#3`ubYyo)BzI7htGQwfOV_d4LTXRaBvfzQE)Ta$+D>)Nr!v15m?%_q%Y+uuisVm9MI%W|nUA|BZ9WRG1| z0J$M~Igl?kd&{u|elZ z>Ww&^n0c-+lbt&^W6m7vWD*7X#vB>fo6FGJwDNz^T-M&+K0iMX6{XRUXzM{OiTRYx zVH7bT$7?2MK*@(N;|@7`a%zf8K71PYZcMmd66Um#l;iU?cGzMM=AnG}IPaN1%Bv9I z2%R0Zh!8K(`d=NAdUXn)#OjrSY6ZzYfs1wys4jT7h9u z`N)$WaTv-pL_@vM)Mk<+ogDQ)X6GkoFWd_|-{4Mu&5~X|vFrwPjuP}$%3}tFn|WNz zQL=A>LI4Y)c`WbyGRlxP?8Si!k|v+)#i7*k@s;-sZXo463+}H?I^eW)B!FALY+^a; zKMi67sDutSKzn9^h!2IG>>h|dl=gOQ_F}iWj{b2}ukv0G|9!wEysfWPg5+K@vAlu~ zdMfr4`{kk0$fw%>t-nlpO;J(*=-ztM^g&W7R0Zs^LWvAj2Y=>MY3N$Rw4$5*72!6h zY##EL*tuuVpYe6K(KlM%+RcY{jMfu6B@D6z2HSpun25!u?SO;m6Z+J0`6?@W`+%(ALkUR zmlO7Tu35XTJglE8R>}#f#yV5~^02*m2}P1)Sws&hcrx0Iu(<-1W)p2S1F1V(y0pvF zpRz(X@G1JE7}vjPE+$hO3p)i^qVro ztHp_<3Ht{z3W*f`V#RbPmtV8Cze^5n3#6$I_%Yqf>li%gf57J+t|@oZnnY+ zRVi?fuT@Lhw*e*ae2}YRspR4fB+0jjPc0ZbW?qv!jw+2$Vc~yjHi;)tza1RhmA_%0 z4_*UJdn?WU!(Q`{*Dx{fatKDpxO+Dh(I8{F!fBeWnN2MQ>};y2&fT5w>%vsi{cJ>Bes7@M{QuaVhK34ndh|_{1;U2dBRYqk1PG)# zXdUJgOtkC?xHQ=@t6&0v8 z8AG*(E{;7MgIEsevcZll6Bou4Uhm_Vt()wL8APH;Hs-o7q+K*rdhK z^!;YWD|57al~;P$eqA)_^~f!&ZWdcri6GKA^ZCh)@`l8l;=ZaL{Z{W+$LU&)(_7G@ z=gSs1@iR7uz+>H%Mup_Gt0A%PwsDP1)si-n@S#52eO)~;$`^y4D6YeUiUY2jXm8?X z2IbNoPO&x&2Z68()W7=fh#$$N>hkmp%C$rhteL7-uqCZbFC<9wwd=2pr{%Y|kj77= zMt8BO$gdDs?bSI0_8unEE$4_L@}MKG(QTD5PCm4;^Vk;pYZ& zE~bipfZJu0=Wd(s46{ly0mvwgy{yPQm#?b23Qv0U2L{OAkdFJUm>eQ?lGJ(TuZ5D< zJuS*t=58>TC&^I6$>%QtNFf0@8$a3hsy4r$ksp!(Gz$4ki+mWNtB zByUq=Fq=8cI!PNNbKVz+oVLBf@uaqywb4&AA9VddH+|lQ%?J87VGF8@T>x$V+B<<% z;lE2)iTg-T&K{6=U0!Rn_lP?g{Ve9ohw4MuH!ep6R?COew9C}?UqHo6@3-5N(K9&w z%-Q)_{`6lhWj_NpPAKdr>SP0XFC!Scr6RYtPx9_)BlDn)Sl54H?}!br+}^ljOkJgD zzg{yQqbU&lB6TOC7T^BKcz*k}c1r+cSEZgv%&Pm-G*Obn@z$4|OJ~C131vHJT~5`# zJ5Sr*s1|(k3{!HWOk(gtTiFV6t!m0HQv3JMTlpWl9MfZD*l(4#y;Y`jUuG1+J=Sjh z973bvldBK@+Nz!2LP<(Ld@8+IR_{3+g;At%!aa)x2nrrI?N53r> z&ahPE4Z=fJS8@KP zbzVI$g1M8B)-4)26S}kKke{qJAxB6)!GRW$?dD4HkE!G%+Tv&b^tr&Vx&xb)Ivw_{ zeAG3i=t-TC(rUf2S%0BUtzNZTq%buCXXg2&k^PTni^qHxd?=KS=h3o>7>!{sNPN{< zbm3l`uLx)T1&3L}CC6U`^!DyA@iI-9nK3UU`@jFzvEg3puUp-XJgfEwH`UIvc#L9g zds2XO*KIlc{pPNY>=xYp)EDssidv?8cOp{urycX4kah{&PduWi;_R%+>?rL(ZE0qp z%{9N{(bqQHF*R+mJcM=nOSgjTPTuUHeXEZ|SeR5uR`}%LaK^)#^%_%hNIqj<^;xFm z*|+}tbiY{;!_mn0AS~iYh1Z=7nUw*nnXe-E_NA_9} zM-9z|yp0sVpSwI}V`56xcPF*)*4U+u4xa0i`Yv5F`(?heS$ayucGJ+7G;+|3xJ2Pm zT4Q?#29B~G_xpM`^oggWfPdI0%TaQ8ENzr~sPW!Zu0-j>Q>;Iy2J__rrOe{j!f$6kG16ORs3 z-pRnr;$xbgH6@=Y%y(V{PJr?YB=vn$)V~R04^3;v9ysvxcvC}@LrnqFy z>RP44qbVw?aOx$AV~3U;KMY$?^^I%x+!_usdDDOuWIibTu;4rbU8oSDENqr{bwwI` z86IGi5L~V5?x5_X%h1szbT`d!E+|*vV=nXP>ASO;t&cinZ+q-mZe~Yj_B7Mj)>Zg! z`}Wj+Z$m3Na{(U;`-7j4*^7U&y{H)(v%Em@$A3Sej&@6{7Lt$hZYp{lCf`}8RYcy| zcjvnOH%q~_mBNd}yr^7>aOEo!b@iqT&J}pYe8jh7oD=hXhpLdwHcl99gE}pjeGxT| zjR^^}m}GhWvPy}e>lX!XyYUtC%Sg=|CXr zCz~;Tk)ZpN9Qy@jF(gH^3Xz4|bIe`8N^p(k80M?Pvs+c&w@iA(+fvZfN@b8BX?eCH zN!i`Ij;oN%dY+DKr*qr{Ti0(Ka@*RovJp0Y7#dpiuwz{fyR)aK?d`SMj9B~fp2hoH z-w4i7&}0}n+#t_QJ;;AFzYQmz^p?CY>6hl<7b)ly;a4Sc+acTj0b{YHe}Kr+^fbRK zp)fFCoS)SR${p!bKh<7at+5a=?X*MYOJz#4yd2FuGjWkZ^FXUYa%#-*$kFVw9zZUE zePaLSoXsDZHr$5?+28bG>AC=KY*wcwPgtV2#C+eC;RhbXN_86$8p!5$X%ai-JwzAO zQhTp$C!b)@-+^Mwc?Mj)`QG@*8*Z2EpylqUV4KX`*yc(rigjTs<8^h6|LfrqkusZ1 zf$~iG9oai5VMu+3Lb4z}-l24=y|a%y>xH5{=S3nWoT;Sj$|LgP7`)7L|IgmGenj-G z7_ZKZ6>IAGZeldT2x{kA+T@IHN_(G{D@Z@~3h`rI{LyEX&vSbk8k!p@;8lbA+L!4e z1)bT?HGd&*Fhv*EFVu+A))SKX?H5Pp_jp;2{aL|8Rv+S>O8`!uuM_f}5b3uXTM*u0 zsfcbGNEtUXN*#O(r3=Xpfa_F%E}=eSp23oWufHEdL3LOD4n_PLPJv3ZK?&K>qeZ;n z-*v)oQC8$WNqGhCIM24YeUV;JZ^VLEQZX@SGG4-3@J~6H-LY32mNspGEyhI)$#fIn z(#ScNUG#xZ@QuxGi2{%Ply`7C{XdfT^NQX*;hmZU^d$7gRK@@7^=Q1HaAs$oo3~&{ z?henOTu!*oq%~3A*-72CY2N~qry2@LGE~hKdl@AtOfpJEd)laxW-26$F3vw-Osh9j zqGb2*oc^R6_<NY8KWR)D=Jcb!YCoR#J%Z^ zNi!3q?iCy`ZWJ${w*~OI`x@lWd4X{3a>=2eu_CQL93P1qws>@f!H~3ytvLmBVIxA9 z=HYWM6hog(jIJv`Cq4Z|nqY-zc=;0ySk}Vd2%QSCEgE zu=kRIfx&OkB@Jt;Zt*zA|?B2rv%mOxukAYIMIc8e;uXet@Ix%4iBRv9ttGnfxot5 ze5n;>Wjm!mqgPAi`X>5k+nsaIriSM8msg?IYa@j4<^Strxu;=5M=U^I-uW)3&HIHG zvLSAM`SJxnu<-}GP6dL=*l3WAUwC3akL@%%;%7-4faeHJmRin>9-Du#ZZs2xbI%7_ zMe8dsbGlOOl4}z%WaAF39$J@|t;cdm3daNUA+u$pR}1#Qo(R|4*vsU0o5!}D`bV*Q za2DI|!otG#?c0Y2H|$KtZU*ZyuMP8DbsQbC*c>BcXoY;lVlB98B`V6AjY(P{I`>f5 zM}KTpWo6U}lK|IMY+F&Ly`G?qk1^YK7nnE9i{Jl}M&1n@vCEXx!F4?sxcDh(_Q%#3 z1o;DxEiGfplyMH+~?m24kv8WUss2OMz zgtR<3vxt55(P#of(I3Bfl7&lPcYL3@?tlsfXwkW zco+osGek3^~dk=Z)-8qc+SVZOZF#AwHTY1x02Wr`p2+Q z4!i57(0*y;x`uwT;r>S?F9w&}@hr(qfOUu{yn+3jB zoFy6W3|?Nr&w2R%Kv$YkWq6!6e$Hj*b9B@{x&&F&V=AIcVrlpjuIf1cm4fKJ8+o)v z|3GIH*R<2n^OBEp7)!yvgbJwzbU~fJRq^5&O>W7pm*w!lCXPoxuq2l9FC=R|yd*F0x0Hr03OFkl&3zkE=sh>oINjLZS#qRhd8?<8 zQfU|ZpARajs{YBU&9KngaSFczwUh?QRz^k!b$~9rBYGG z%o0gLrBFx-DME(KmP$pGC}dWW5He(pm1NG42pP+qG4r_W^Vaje@BSUXfA-(|*pBCT zD&Mu%eXskvuFrU$=Z9DbPQPl_$Q$v7+w*8WOi!10K$w8ZA3cpa`<{2{)hzyZ@2;9L z;eQs7t^-sWu6pdJy}Wlv#GZ;zg*-p*nG%~x)bAv9hm7NUFB!mb2ziw61DpNfx0s#K zO(NJg7fsWf!Kn*OxK2HfI^4|Fr#a*6=Dy<8+riFV)G9V4+orT z0yJ}?x{Q?~WKeiP+5eVtiR647&%-xN?>9A|3h8G=#bP1wu#12F$gaTGs`Gzuz7}c;gd;RSIfvhsZuz56H&a|vmd?AT3F<6ArU?88)(*&{~ggM=Zo=#?+qdPqvEm z67)2X(tre>4y38gTRF6KPOr>E;v6Dt=Qfe5-qbD2f(HY4_XA`?puqKkwf}sd*GN1J zRsW>jdL71fjcrWZElmGtm`1vvIxwzbgc`1l#n1W>O+dIxY`-*HL07< zuUi~_pV%JM*Z_)9{$w3gT)e!z5VwV#;vY6&745KNHCZo-Tmgwj`$~%s zb%n2FiNj6C*96Z}eL;%E@xYO>{L#!U+CwYkh@*pD?!S5S^*U; zGx1RsgMb(IkBQABjRb)F`%Lih->GvEvhs3X#Uzg_ZzrQj3KNcYk)qc-FI!yX%x`>4qtFPq@mv@A%Ku-i~RkHLOJRL}-xZzg_jbPuXkM<|iyWS@$>fE}K zu%PzYLCa~o?KzW%L$o4r!lKcU6bXx_r;(Acg9DKi!eD3m#!mee!44@b~^#nq!2!n2rd6&)8x6#T+menxd$ zxUW`Fh@Xr)M_6f?q2XMk^k${kaN4k4w+t*AlOxOzdmQ?8*!r}R^ScYI?~FRxVRcE5 zv1I{Df8;gT9qR=upBI>v$6AAzW+=;B{IUB#vC;E9ca-@fEGI3k8~Dlag(N+RQ>(lK zo|4@k5w(C2{9l5o6T;V4w+m<}dxgU((4;Ucn01~BE@5qbV@smf6qs{?1|4tO<-)rl z%Rp@BI-;u&A3nhU<$wX-8cetl-hlA%cj_-mcYRb0I9Xux6kHHVz({8jVH&g!A>gLp zm3sta3p4=*47p{U?aBjoqd%YQ)e1e9pPSe7WXnit(s!)=1Q$uaK5%Ii&HrVXXVH*T z$@_!#ZOVZX=y$#V_X_H+cNwg-tavdE2TR1BlB<;thp;d2DlW}UfIgcKRy^cG&q4SU zs{!DwlG37;34pHXwToQ&>=>kTW)bl}gNo)RJ81R0G6J#;ds`=ZDr z&Z50=BbVIgdT>ramwgS?0rmv~sZe2)lOUso>U_s>A@Yj(`FSWgIpG^sE%1{T?^m;S zUFqc^(Vn?Cm&eTTuxLvG(CZ6je0~UI1cc1Z&2d!l(~jo?M66C__9&DNcDRle;)6^# zul+QNle&v=HcVnKCg{9Syy-<39AdGAP$PD1i61u^QVo#rfekfq9*9NC z0m`NQk?nx=QVEHa)2E+;00D5p8@5Tvl;TUm?Mp^f_qy#;7?qh0J0Fsyy~*YfoW>V~ zi}Zq1iv+}Fxr=)l$|s8xQOiSr#v-AD3cvO|g+RVgmWHj6)g~n-LdFodmcVhINMP3q zJvL}n5quQ9A01xzW|QE#OH~9E1wG!7s$QtjE*3G$TQsYzo~*c%o?|7Mn4+rst+VhM z93@MsAPrCUx!x!!q*8HlCVxm{rX>97lMMj=K;YK`SR+xm48h#%1_zQ?_~uVhzqreU z{t=<;=#T5P%$!BoK**Uj)YrEHA5V0Zd+Ann?!g7>vU7Hi2qC^94ddK^o$Pf2`fXs3 z0Gb@9zlcL~kQd^vR{2xfP%S|8fV;Kn2`aTcyanEw)gLs3g-aFC7Qn*IuL$JS^SiGn zxg)OFc?(uR@y^NRaw3u71uQMa_h+UpfcTX}}dw5ivxCr6mhT-t1V@{y@@ZE<}3j@{QM zx_G0BbNo_aHVDxoj|`1PxT^7D>yV4kWY_-D8ygyo(r1|F7~;p zA23Owb{jX-U)vEUKOl41w_dV1IfV%KkG>9|w1Clk=FBaS;z29htMgpkQl}{E)yI$e zO07{o1JzSwTqa!~nSmC%2whdku0n@|W9!!DFZ0XSKp@5c%=-nwK)GLJI?*rl?Q+GV z&oN?(fr0f+`gV~dh5pm3H8`+@m;*Ri0AVQ^1Cara7mNS?l#g|87r_3_?y+D@Zfe7a zmF#~Za!mu63g}26@(a_KBT*20a70BUH8T!><9aEuyCc=~664K3hgtLr?uFbVF-e^p zcfcM3s05h#R6OF z;xavCN?xnXr_O)u!N%*qB_Dido&{#5!yzgQUghZWFJ8I zJrX62@tgtOA057(S8fbdwda3kWTD*Y_2SeUXiPtFA3{D3S==sWW@fO`uJ0{f7)h%X zG#7s_ubJVsE|5K%Yslct)7@gbkoHfqdtzri2J0N#-w|f(LEtgpz-6(1tcX zzABc3&z+q6)`g+*ZTBZ`k5JxF8V(XLIKjcekkBP!-w_9-(z0f?(W=k*p+g1}=?-TO zQn!tvHMoL6U7S!#1_|l7`w*NO+($w?Ffj>9NjJa0c`U3F>(9g(-J|&HOz@9xGo9+{ zuW5N!%`98P9xn%=PFp{b<&|OC=8SM6A&WTaGJGPClffCowCS-v$90u`pR0u$4oE<+*65ZyPE1Gax?sju+b{L|o#1kcLq(cd7 zC$fY_U~dT;KMp`%*Ar>tt>NL|7EdDz0ar;^38s3KdME;x9&Y7P8Gs@YP+9z(OEc?3 z-e7WV@jfK~w*^mw@_j%vB zKaN1yQ*vri*0%RlPe?F!8fsK9H@7JZxL@xwd@_9d2;uzMd`#LuI$c}zNAv*AJhubp z_-BEuCh6eOKJPP5+w;Cga&vz%Iv1PD&B)^m)4aUcCm$wZbz3R|7)uJMGf2ISV6s+sJ)j=O}-f31T6=yjRT{v%UxC zoOJ&rRSsGg<;LKSyEn{AgWmJYPAc%4@v2&Xn9Y8f@t-PE|AhrOEZ|pV)jLC@K#w#U z#jHn2LVSHK79&vF;D5G{_mwj17aFs#@P7}jq%?iM{3}P0M3r`v9YE^I%)E_g^D*T+ zVQx!f253C9f7hRz3HG$&E0@Wi@T>-6L>*aQfSMq)Kj=KE{#k^Q7pgGq{!nqGeJf0I z*Rh$mO~dzN@e8@oZ#{S^a@t!wK6i>s;SudEvqZWOUf+AP@E9+Z2-&qhK9y zOP+{{qWJ{cTA(wKJ(!$_4H1hIf*oe439asAKje3KOpxqM4#e^h(ea0Un-$a?H*VkT zzr*|oZ6e1k7ZC%h)N5+WjhFGk85m|-TyS$+f=Ya#4-E2RM++}6V(U8y({=8#&}4*{ zekzRl$S);^nk51=+OP?6Bfyr8Sg(K${MjdCCi-|^qKhKQ0w?FKkgI6LV33D~Z! ztf=_NZU;!H5@b0=r_19hD&slwOePK{D#k;2>52+7#wDZafb}b$+Y3#f!`}t55g6Z*FZVK%f%&-?_6L z3TQrMV4|ZWPRM2P0_qCy*lrH;FOe|PWlE9cVkW*c5ygiGFC!^@yu7gfE|7T0|68(+ zP~j60IJ?8M8A{AP#Wv-;gMGQA#dq#J`u!x0=+~HuU2@W4)vWh^p(4idz?rJOYu7IH zj?A^!d-VS0IAW%uy3=*rMr_hgC(czHuBv558p&ICwJP-TmU|@PyZXK^TpYGOfJJv6QZ^nqt^XVxT8)X9?B6JRyvcGZal<&-4>{zta z)FE8-fy1MuUuGR05@nB_FxUV8y{h117wNg0*vn_|-{+3G5ri5gfpNhu_Y(sZQJZpN%_CUgz^CqCYLj+y=_J>3D~oCu~zBc5A|y|H#fKg z(11}HPP0Kp85z&_%*!NskxPB5$09i5Z65`$HMuPwG`~u(q@Qm-xy$s^Rvk`@iM+oWzO4r5bMg|>`bxL) z-*xeYM&|DWd4YnPNr%=?Epjn4A4aGSan50QB`BMzoH^q^&hr%pQujcRnqZDGXcj=; zhH9_(q;oOtwNgtgu#`XTG-tnX$8b5Im`=NU(}CrmH%(Hn@Min1+%#i;gk6cr%aZ(v z-oE{L2_J#Y0&gbN;R$7~F zb9<(PDnt$@%f{Npny0#@-jZ{9Yj59gF7E_O4dO@j} zo$W>8;ymQwAjRi?aGiqVy2R>7 )3jp{$0;{Ybvcnn4zg3~`6Y2H3kSF@ecX<`?; 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/unmerge_d0_10/logpower_result.txt b/analysis/matlab/variations/unmerge_d0_10/logpower_result.txt index 85ffb18..330d817 100644 --- a/analysis/matlab/variations/unmerge_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/unmerge_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- unmerge_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- unmerge_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=3 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,57)=6.230 p(resid)=0.01548 p(Satt)=0.01528 (d honest per-animal random slope (log-day): F(1,15.0)=5.28 p=0.0363 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=+11.60, ratSD=0.00, resSD=12.93) --- +--- power simulation (log-day ground truth: stim:logday=+11.6, ratSD=0, resSD=12.93) --- - true stim:log(day) = +11.60 (100% of observed) + true stim:log(day) = +11.6 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.34 | 0.69 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.017) = 0.131 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +5.80 (50% of observed) + true stim:log(day) = +5.801 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.10 | 0.25 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.017) = 0.131 (small-medium; f: .10 smal 16 | 0.90 | 0.90 24 | 0.97 | 0.97 -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/unmerge_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/unmerge_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..c75ff5b --- /dev/null +++ b/analysis/matlab/variations/unmerge_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- unmerge_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=3 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,57)=9.174 p(resid)=0.003684 p(Satt)=0.003695 (df=57) + honest per-animal random slope (log-day): F(1,35.1)=8.84 p=0.005302 +Cohen's f (interaction, partial eta^2=0.030) = 0.177 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.08869, ratSD=0.04059, resSD=0.08029) --- + + true stim:log(day) = +0.08869 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.54 | 0.85 <- observed + 5 | 0.95 | 0.98 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.04434 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.17 | 0.33 <- observed + 5 | 0.40 | 0.52 + 8 | 0.69 | 0.68 + 12 | 0.89 | 0.90 + 16 | 0.95 | 0.96 + 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/unmerge_d0_10/logpowersim.m b/analysis/matlab/variations/unmerge_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/unmerge_d0_10/logpowersim.m +++ b/analysis/matlab/variations/unmerge_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/unmerge_d0_10/plotcurve.m b/analysis/matlab/variations/unmerge_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/unmerge_d0_10/plotcurve.m +++ b/analysis/matlab/variations/unmerge_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/unmerge_d0_10/power_result.txt b/analysis/matlab/variations/unmerge_d0_10/power_result.txt index dfc1f55..91a393c 100644 --- a/analysis/matlab/variations/unmerge_d0_10/power_result.txt +++ b/analysis/matlab/variations/unmerge_d0_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- unmerge_d0_10 +POWER SIMULATION -- unmerge_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=3 nrep=120, alpha=0.05 -ground truth: stim:day=+1.56/day, rat SD=5.35, residual SD=12.51, days=11 +ground truth: stim:day=+1.558/day, rat SD=5.354, residual SD=12.51, days=11 - true stim:day interaction = +1.56 (100% of observed) + true stim:day interaction = +1.558 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.15 | 0.31 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.56/day, rat SD=5.35, residual SD=12.51, days=11 16 | 0.93 | 0.95 24 | 0.99 | 1.00 - true stim:day interaction = +0.78 (50% of observed) + true stim:day interaction = +0.7788 (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.56/day, rat SD=5.35, residual SD=12.51, days=11 16 | 0.47 | 0.47 24 | 0.63 | 0.60 -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/unmerge_d0_10/power_result_rate.txt b/analysis/matlab/variations/unmerge_d0_10/power_result_rate.txt new file mode 100644 index 0000000..ce7f9f3 --- /dev/null +++ b/analysis/matlab/variations/unmerge_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- unmerge_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=3 nrep=120, alpha=0.05 +ground truth: stim:day=+0.01218/day, rat SD=0.04284, residual SD=0.08704, days=11 + + true stim:day interaction = +0.01218 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.20 | 0.36 <- observed + 5 | 0.51 | 0.64 + 8 | 0.77 | 0.79 + 12 | 0.96 | 0.97 + 16 | 0.97 | 0.97 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.006089 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.11 <- observed + 5 | 0.11 | 0.18 + 8 | 0.28 | 0.31 + 12 | 0.36 | 0.41 + 16 | 0.58 | 0.62 + 24 | 0.71 | 0.72 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/unmerge_d0_10/powersim.m b/analysis/matlab/variations/unmerge_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/unmerge_d0_10/powersim.m +++ b/analysis/matlab/variations/unmerge_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/unmerge_d0_10/result.txt b/analysis/matlab/variations/unmerge_d0_10/result.txt index d9b1736..6c8b6c9 100644 --- a/analysis/matlab/variations/unmerge_d0_10/result.txt +++ b/analysis/matlab/variations/unmerge_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: unmerge_d0_10 +VARIATION: unmerge_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(57)= 1.49 F(1)= 2.208 p=0.1428 p=0.1428 (df=57) day (learning) t(57)= 10.08 F(1)=101.556 p=2.832e-14 p=1.931e-14 (df=59) stim (main, window start) t(57)= 0.68 F(1)= 0.466 p=0.4974 p=0.5037 (df=17) -interaction 95% CI: [-0.54, +3.66] +interaction 95% CI: [-0.5416, +3.657] HONEST LME (per-animal random slope, day|rat): interaction F(1,13.0)=1.46, p=0.2479 (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.1428, slope diff=+1.56) -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.1428, slope diff=+1.558) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/unmerge_d0_10/result_rate.txt b/analysis/matlab/variations/unmerge_d0_10/result_rate.txt new file mode 100644 index 0000000..95601b0 --- /dev/null +++ b/analysis/matlab/variations/unmerge_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: unmerge_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-A2 +N = 6 rats, 61 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 61 + 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 + -105.35 -92.689 58.677 -117.35 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.22998 0.038137 6.0304 57 1.2826e-07 + {'day' } 0.040747 0.0055227 7.378 57 7.4583e-10 + {'stim' } 0.02493 0.053569 0.46538 57 0.64343 + {'day:stim' } 0.012178 0.0073113 1.6656 57 0.10127 + + + Lower Upper + 0.15361 0.30635 + 0.029687 0.051806 + -0.082339 0.1322 + -0.0024627 0.026819 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.04284 + + + Lower Upper + 0.01883 0.097462 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.087035 0.072173 0.10496 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(57)= 1.67 F(1)= 2.774 p=0.1013 p=0.1013 (df=57) +day (learning) t(57)= 7.38 F(1)= 54.435 p=7.458e-10 p=6.427e-10 (df=59) +stim (main, window start) t(57)= 0.47 F(1)= 0.217 p=0.6434 p=0.6483 (df=15) +interaction 95% CI: [-0.002463, +0.02682] +HONEST LME (per-animal random slope, day|rat): interaction F(1,40.5)=2.61, p=0.1136 + (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.1013, slope diff=+0.01218) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.