From 0e16690c8f10294094e56039892e07f7793f0210 Mon Sep 17 00:00:00 2001 From: Experiments DB Dev Date: Fri, 24 Jul 2026 02:32:52 -0400 Subject: [PATCH] analysis(matlab): rate + count outputs, variation batch 3 Co-Authored-By: Claude Opus 4.8 --- .../variations/naive_boxa_d0_10/analyze.m | 102 +++++++++++------- .../naive_boxa_d0_10/learning_curve.png | Bin 42706 -> 42706 bytes .../naive_boxa_d0_10/learning_curve_rate.png | Bin 0 -> 43933 bytes .../naive_boxa_d0_10/logpower_result.txt | 13 ++- .../naive_boxa_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/naive_boxa_d0_10/logpowersim.m | 77 +++++++------ .../variations/naive_boxa_d0_10/plotcurve.m | 50 +++++---- .../naive_boxa_d0_10/power_result.txt | 13 ++- .../naive_boxa_d0_10/power_result_rate.txt | 28 +++++ .../variations/naive_boxa_d0_10/powersim.m | 69 ++++++------ .../variations/naive_boxa_d0_10/result.txt | 8 +- .../naive_boxa_d0_10/result_rate.txt | 68 ++++++++++++ .../variations/naive_boxa_d0_13/analyze.m | 102 +++++++++++------- .../naive_boxa_d0_13/learning_curve.png | Bin 44117 -> 44117 bytes .../naive_boxa_d0_13/learning_curve_rate.png | Bin 0 -> 41560 bytes .../naive_boxa_d0_13/logpower_result.txt | 13 ++- .../naive_boxa_d0_13/logpower_result_rate.txt | 35 ++++++ .../variations/naive_boxa_d0_13/logpowersim.m | 77 +++++++------ .../variations/naive_boxa_d0_13/plotcurve.m | 50 +++++---- .../naive_boxa_d0_13/power_result.txt | 13 ++- .../naive_boxa_d0_13/power_result_rate.txt | 28 +++++ .../variations/naive_boxa_d0_13/powersim.m | 69 ++++++------ .../variations/naive_boxa_d0_13/result.txt | 8 +- .../naive_boxa_d0_13/result_rate.txt | 68 ++++++++++++ .../variations/naive_boxa_d0_5/analyze.m | 102 +++++++++++------- .../naive_boxa_d0_5/learning_curve.png | Bin 37557 -> 37359 bytes .../naive_boxa_d0_5/learning_curve_rate.png | Bin 0 -> 38133 bytes .../naive_boxa_d0_5/logpower_result.txt | 13 ++- .../naive_boxa_d0_5/logpower_result_rate.txt | 35 ++++++ .../variations/naive_boxa_d0_5/logpowersim.m | 77 +++++++------ .../variations/naive_boxa_d0_5/plotcurve.m | 50 +++++---- .../naive_boxa_d0_5/power_result.txt | 13 ++- .../naive_boxa_d0_5/power_result_rate.txt | 28 +++++ .../variations/naive_boxa_d0_5/powersim.m | 69 ++++++------ .../variations/naive_boxa_d0_5/result.txt | 8 +- .../naive_boxa_d0_5/result_rate.txt | 68 ++++++++++++ .../variations/naive_boxa_d6_10/analyze.m | 102 +++++++++++------- .../naive_boxa_d6_10/learning_curve.png | Bin 36445 -> 36521 bytes .../naive_boxa_d6_10/learning_curve_rate.png | Bin 0 -> 36440 bytes .../naive_boxa_d6_10/logpower_result.txt | 9 +- .../naive_boxa_d6_10/logpower_result_rate.txt | 35 ++++++ .../variations/naive_boxa_d6_10/logpowersim.m | 77 +++++++------ .../variations/naive_boxa_d6_10/plotcurve.m | 50 +++++---- .../naive_boxa_d6_10/power_result.txt | 13 ++- .../naive_boxa_d6_10/power_result_rate.txt | 28 +++++ .../variations/naive_boxa_d6_10/powersim.m | 69 ++++++------ .../variations/naive_boxa_d6_10/result.txt | 8 +- .../naive_boxa_d6_10/result_rate.txt | 68 ++++++++++++ .../variations/naive_boxa_d6_13/analyze.m | 102 +++++++++++------- .../naive_boxa_d6_13/learning_curve.png | Bin 40740 -> 40747 bytes .../naive_boxa_d6_13/learning_curve_rate.png | Bin 0 -> 40355 bytes .../naive_boxa_d6_13/logpower_result.txt | 11 +- .../naive_boxa_d6_13/logpower_result_rate.txt | 35 ++++++ .../variations/naive_boxa_d6_13/logpowersim.m | 77 +++++++------ .../variations/naive_boxa_d6_13/plotcurve.m | 50 +++++---- .../naive_boxa_d6_13/power_result.txt | 13 ++- .../naive_boxa_d6_13/power_result_rate.txt | 28 +++++ .../variations/naive_boxa_d6_13/powersim.m | 69 ++++++------ .../variations/naive_boxa_d6_13/result.txt | 8 +- .../naive_boxa_d6_13/result_rate.txt | 68 ++++++++++++ .../matlab/variations/prev_f_full/analyze.m | 102 +++++++++++------- .../variations/prev_f_full/learning_curve.png | Bin 40076 -> 39673 bytes .../prev_f_full/learning_curve_rate.png | Bin 0 -> 40682 bytes .../prev_f_full/logpower_result.txt | 13 ++- .../prev_f_full/logpower_result_rate.txt | 35 ++++++ .../variations/prev_f_full/logpowersim.m | 77 +++++++------ .../matlab/variations/prev_f_full/plotcurve.m | 50 +++++---- .../variations/prev_f_full/power_result.txt | 13 ++- .../prev_f_full/power_result_rate.txt | 28 +++++ .../matlab/variations/prev_f_full/powersim.m | 69 ++++++------ .../matlab/variations/prev_f_full/result.txt | 8 +- .../variations/prev_f_full/result_rate.txt | 68 ++++++++++++ 72 files changed, 1875 insertions(+), 897 deletions(-) create mode 100644 analysis/matlab/variations/naive_boxa_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_boxa_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_10/result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_boxa_d0_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_13/result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_5/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_boxa_d0_5/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_5/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d0_5/result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_boxa_d6_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_10/result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_boxa_d6_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_boxa_d6_13/result_rate.txt create mode 100644 analysis/matlab/variations/prev_f_full/learning_curve_rate.png create mode 100644 analysis/matlab/variations/prev_f_full/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/prev_f_full/power_result_rate.txt create mode 100644 analysis/matlab/variations/prev_f_full/result_rate.txt diff --git a/analysis/matlab/variations/naive_boxa_d0_10/analyze.m b/analysis/matlab/variations/naive_boxa_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/analyze.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_10/learning_curve.png b/analysis/matlab/variations/naive_boxa_d0_10/learning_curve.png index 58d5ff53145b6e83527be0e29224530b862785b9..dd07c2bbf2b984fb317cc1c3ebef1e1070fc1559 100644 GIT binary patch delta 32 ocmca~mg&-2rU}k$8f@>1e*{eQ4COR2ure@vyNi3u#^u_}0OV&4o&W#< delta 32 ocmca~mg&-2rU}k$(iXQX8%|I34COR3w=y+riZVK}ak=&~0OFAiQvd(} diff --git a/analysis/matlab/variations/naive_boxa_d0_10/learning_curve_rate.png b/analysis/matlab/variations/naive_boxa_d0_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7956e6a42b7d8618906f946cf89080d9aeeee8 GIT binary patch literal 43933 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

KR_O5wGG&74#mS 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 Bk6Hi# literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_boxa_d0_10/logpower_result.txt b/analysis/matlab/variations/naive_boxa_d0_10/logpower_result.txt index 60b6e42..3af794c 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=8 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,111)=3.705 p(resid)=0.05681 p(Satt)=0.05696 ( honest per-animal random slope (log-day): F(1,8.2)=2.03 p=0.1913 Cohen's f (interaction, partial eta^2=0.007) = 0.086 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+8.43, ratSD=8.13, resSD=14.95) --- +--- power simulation (log-day ground truth: stim:logday=+8.428, ratSD=8.126, resSD=14.95) --- - true stim:log(day) = +8.43 (100% of observed) + true stim:log(day) = +8.428 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.17 | 0.35 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.007) = 0.086 (small; f: .10 small, .25 16 | 0.95 | 0.96 24 | 0.99 | 1.00 - true stim:log(day) = +4.21 (50% of observed) + true stim:log(day) = +4.214 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.07 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.007) = 0.086 (small; f: .10 small, .25 16 | 0.55 | 0.53 24 | 0.63 | 0.62 -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/naive_boxa_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..f3a0479 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=8 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,109)=4.842 p(resid)=0.02988 p(Satt)=0.03001 (df=103) + honest per-animal random slope (log-day): F(1,7.9)=3.23 p=0.1106 +Cohen's f (interaction, partial eta^2=0.013) = 0.116 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.06771, ratSD=0.04956, resSD=0.1034) --- + + true stim:log(day) = +0.06771 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.23 | 0.47 <- observed + 5 | 0.57 | 0.71 + 8 | 0.85 | 0.87 <- observed + 12 | 0.98 | 0.99 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.03385 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.12 <- observed + 5 | 0.12 | 0.17 + 8 | 0.32 | 0.39 <- observed + 12 | 0.36 | 0.39 + 16 | 0.63 | 0.66 + 24 | 0.75 | 0.78 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_boxa_d0_10/logpowersim.m b/analysis/matlab/variations/naive_boxa_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/logpowersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_10/plotcurve.m b/analysis/matlab/variations/naive_boxa_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/plotcurve.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_10/power_result.txt b/analysis/matlab/variations/naive_boxa_d0_10/power_result.txt index 64b5503..eb8153d 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/power_result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_boxa_d0_10 +POWER SIMULATION -- naive_boxa_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=8 nrep=120, alpha=0.05 -ground truth: stim:day=+1.18/day, rat SD=8.67, residual SD=13.71, days=11 +ground truth: stim:day=+1.178/day, rat SD=8.671, residual SD=13.71, days=11 - true stim:day interaction = +1.18 (100% of observed) + true stim:day interaction = +1.178 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.17 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.18/day, rat SD=8.67, residual SD=13.71, days=11 16 | 0.68 | 0.70 24 | 0.88 | 0.88 - true stim:day interaction = +0.59 (50% of observed) + true stim:day interaction = +0.589 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.07 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.18/day, rat SD=8.67, residual SD=13.71, days=11 16 | 0.28 | 0.27 24 | 0.28 | 0.29 -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/naive_boxa_d0_10/power_result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_10/power_result_rate.txt new file mode 100644 index 0000000..017911b --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_boxa_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=8 nrep=120, alpha=0.05 +ground truth: stim:day=+0.008893/day, rat SD=0.05104, residual SD=0.09808, days=11 + + true stim:day interaction = +0.008893 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.08 | 0.16 <- observed + 5 | 0.21 | 0.25 + 8 | 0.36 | 0.43 <- observed + 12 | 0.62 | 0.68 + 16 | 0.72 | 0.73 + 24 | 0.88 | 0.88 + + true stim:day interaction = +0.004446 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.08 <- observed + 5 | 0.05 | 0.08 + 8 | 0.11 | 0.11 <- observed + 12 | 0.17 | 0.19 + 16 | 0.30 | 0.29 + 24 | 0.33 | 0.35 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_boxa_d0_10/powersim.m b/analysis/matlab/variations/naive_boxa_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/powersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_10/result.txt b/analysis/matlab/variations/naive_boxa_d0_10/result.txt index a972e49..67d4c5a 100644 --- a/analysis/matlab/variations/naive_boxa_d0_10/result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_boxa_d0_10 +VARIATION: naive_boxa_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(111)= 1.31 F(1)= 1.707 p=0.1941 p=0.1943 (df=104) day (learning) t(111)= 16.91 F(1)=285.824 p=1.743e-32 p=6.758e-32 (df=106) stim (main, window start) t(111)= 1.55 F(1)= 2.392 p=0.1248 p=0.1361 (df=22) -interaction 95% CI: [-0.61, +2.96] +interaction 95% CI: [-0.6088, +2.965] HONEST LME (per-animal random slope, day|rat): interaction F(1,10.1)=0.83, p=0.3836 (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.1941, slope diff=+1.18) -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.1941, slope diff=+1.178) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d0_10/result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_10/result_rate.txt new file mode 100644 index 0000000..5f1e72e --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_boxa_d0_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2, Naive +N = 11 rats, 113 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 113 + Fixed effects coefficients 4 + Random effects coefficients 11 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -177.53 -161.16 94.764 -189.53 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.19077 0.027729 6.8796 109 3.9606e-10 + {'day' } 0.044032 0.0036365 12.108 109 6.709e-22 + {'stim' } 0.064146 0.051551 1.2443 109 0.21605 + {'day:stim' } 0.0088928 0.0065096 1.3661 109 0.17471 + + + Lower Upper + 0.13581 0.24572 + 0.036824 0.051239 + -0.038027 0.16632 + -0.0040089 0.021795 + +Random effects covariance parameters (95% CIs): +Group: rat (11 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.05104 + + + Lower Upper + 0.028096 0.092721 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.09808 0.085453 0.11257 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(109)= 1.37 F(1)= 1.866 p=0.1747 p=0.1749 (df=103) +day (learning) t(109)= 12.11 F(1)=146.612 p=6.709e-22 p=1.131e-21 (df=105) +stim (main, window start) t(109)= 1.24 F(1)= 1.548 p=0.2161 p=0.2244 (df=26) +interaction 95% CI: [-0.004009, +0.02179] +HONEST LME (per-animal random slope, day|rat): interaction F(1,9.6)=1.38, p=0.2681 + (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.1747, slope diff=+0.008893) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d0_13/analyze.m b/analysis/matlab/variations/naive_boxa_d0_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/analyze.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_13/learning_curve.png b/analysis/matlab/variations/naive_boxa_d0_13/learning_curve.png index 026ae49948f1a2f29d915d2115785e341207e9d3..fa988ed92b9189867abcf77a6c0fe54275688a68 100644 GIT binary patch delta 32 ocmcb5gX!uGrU}k$8k}`!o*ta&8Omv5U}a!g%PPjYarwH{0ODW_<^TWy delta 32 ocmcb5gX!uGrU}k$(w1xLHpEW!4COR3w=y;V8p{;7arwH{0N>LMZ2$lO diff --git a/analysis/matlab/variations/naive_boxa_d0_13/learning_curve_rate.png b/analysis/matlab/variations/naive_boxa_d0_13/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..1962484de7344f62aa6e0f0d70cf2ee15ac76873 GIT binary patch literal 41560 zcmeFZWmr|;`YyaM5Je;;6a)mNOS(akM!H)`X;^d#3Mdi+Qqo8WN=YLvf;0%yEh*g~ zQsaeS$Vc$v;qg^gxXHw%SwE+wxDGo@&~mtsI$e%h(#T3Tchsfa9r=;~%0;pEz0A z+1^&OurWn(aIwfbTeEQ7rhAq_cW%#`Sw2h96hr!#xL_K9|K|z(emvygt>Z*<$6n)ypCVu;$*&D44PACD%Uf@ zfwjN~Y*KS#65gOBFv&kvzOBb?@46&`%H=6^PRZ7mdA{G`>y zy@cw(FGaqtu7=))Hzf%dm%U2o<=W%D(Z0UE#Kc5WZp#aoF75yBG2WQ^s{TpMVTz2L z&wi?tck<|9AtjTo`3?Eu-{k@l*UhdZ!MdZZ_SxB4tHFFCLPE6ygBpjK@0fm1>U}YG zmj_*^vQZW1(|CNhOoxk1^C`|HQV9!t4}E?@!e$WFZDNMJC`7#6I^((7+1W8LFid@7 zJ32btx96Lhn@7=`aEj(oGS`i%2gRB#9UVeWzkh7awJ&tUT_+~i*i*)^rz8wVp{he$ zO<>GX9Og`!Sy^E>*s0mr3PRQiNJs|rba}}fT?`B+!l@p1pv!t!N6QU8S4)o%_hTK@ zP-9n=$xu@^BF8(bUlP+@R!6oMy2C<4y%&;PEeG>il7u|>R^qv>+O~*uGz*@smJZsE zRZ!JPQg?c6r!9H0eq8DP zxq23H2?-YcN;QFJhpXk6a7dk2M@os9G*(7Rmm31GNkc!V=V-9i{xQl@ND30+<>YjP zzaQ?ei+b)^YiMXR1rd>PJ^fK;GfMUFrN6)bJAEM-NI~6+jzBWM<2+nEj6(SDm}9q$ z`4w#J$hU8gj*s)M7U);GEDsjMQdYu>n5TG`*-h4#l$7M==34fD;*xh#{KSO;Y(LAj<@qSCuwcbflm zk-~j8q9q|k&$_Nr*pA}ZOuPF$diGYINc&8)v0n>4ZtRmHB1(8{?zyI+|Vv44X5}q9=c53XPj<|1RYaF&=G}cY^bf3wx;jt>0f8uYzA{y$@w^=jP^M zO!95RVu1{*A6ocFO*jHxy;>jp@^eN1?b%D@^l1CtyLUxwySi}Zkei&dID`3mUy7WU z2kdGO%ziZlL^EptVTnmje)g;3;$j7OOWSC%LXtp#zW!nP8 zyyt9$)O<(W&s=RzUDh{&fi2zLv2O&Oey4h6!wI(v(J#q-Nm6|;`06UT_*Z~|`d_|2 zo5-@gxfv(unjiI=2DvTxd^UrOkgzXZDvX##N7|5>n3z@T^W*i28k*We&TgSQl`i^(S5#Ca>*Y$8 zr&VYKCRbZqi$ltl4L6E*E2#bZX{+t%=m`IgB)y}{?oz*>pI`JoC)m5sa$fl?n^j*n zJ`oX(&%xfP9n8PJfI+2`g^o_V)7blmm*(=?6YOdk7OV{oCm}Anf~|sO_r?{QcfTRy z&9|N`kycPh7V)l3EXKyhhBN!Uc(FG2g%cKBE|!(ZI|ywwWIaFH+`RDq6-AL-X3gK- z<^3iS!=ZP@0eIk1ILDF0hE!3aXmUXp=G|~q1yvdks$8kiNaBExhlhuTW-eOOV7T0F z(sk0C*QgQe;62<)C>d{?;j=%#UTsa6HBL-6C z61xQv9%ideYVO5#sz%Y%gKlu}%Ty2)sPEjF!>V}v^#xc^&HjWZ8LzF^{sEfe|MrgEIAaEKz!%4bD^x0~s-j054;M{fEz;A{ zW*1k%;TTR?cp&h=+5ykGBE#ZBc)6tA`?jLDidit z($7*LFP4HuVWLa{6YDzc_=3}^)bxKXt`b3>(@8=(X(yQOqtuxOMP)1rm`Pj zU8u)Vh5)__xvF-jS1yuP{%x%n7z2##Isrij8$@14!{JZrOkd{z6gE>trgv|5i?YRP zoNj!>rKvTZ`5v0UZAF`>6B(rLvGbcs^zUlwJ9pE$L`!=jY~HcfUq6X&RI~?NL<}j!sBm z@^?F!i=7iC6@m~5-&d>c^1~HDa)-{XPet~6H@#Lf^`2^dLC^j8p){91Ugf&Ky&YMn z9mnM+)6;7{ce7a3utK)fvL76FFkK24%`@eVWD^B@dwZC>DD#ueFrSv@w%auR5H)ok zJ?a1#=}H#X<#Lu;o2b#9P7vAcQ^h7`4u7-1GOVhkbi2OFWbt(2T5Wgw8QYJ{5c|9 zCu`Bf+Wb{)Ioib^w%XGq2>mYM@-Q8|xk@ z%tztlp6fLdij1#xoKoV!*ISxtPVyeoJbU)c!otG5D{;8a=M;_@%vQd$cm&f;`{>=& zTPh5t%f+xTZ;EPO5@~B|&oqa{{?vky0EkSj+;$v1e_>&veKpc%5RCET(nG95n4!JZ zQ91AB49*7+9yD>I*M#FE?#0?Z z0#uE!D4)@nPeV@H3TCSvs&ux>)6jh{7Eo$67{7ayIf>x(ma@}^7}i{hc#w;)vWpp4 z)v|pNjN#IS3qp{y0IIGJi#XN zSN<+ojw2-8-j$Vn{i+X&DYaIEto$7eRZ)R;StT$MErZ67$sr+Ei)nwf#W{au3;J^? zZYL=z*)teXDcjyb`x25W89x4#J-QbFM5kZVCI6nNsoI)dNbzB%tlJy0I{iCXH_Ha; z#h};K`1(NtLDSLAuPdGrT()CcA}0{AIw{om=#(|4_#VJ2NJ@Us(=Cs>Lnw9u?q=u5 zLp04JG@3)1Y=aaK`-U0=1H;zlH(b%&v3Ea=a4QJz7+KoW}$12}G3*4iaS>3x^?iWhjv zoW|JCEJaOL=^8LXD2L|Qa4`M0BxLswNSr6V_gkC6M$AnA(niW0TyBZywPT&Uoy6xL z#?K7~NB)J$=*g2O+w+~|99;zPaT?$ia3uB{SA{)xl)7@|9??cRN}j84MHV8u=;~nZ zT~{by+Sod&qE9H+*xan^<>2Gv zbMO-?r=zv1_1RZY;_13KoIshfyT8x2JG4STNNBC;8ll{6jsmRF4XkI$g z;d%n!Dk{tK8)|Lh=-C#0_bz8h!QkQQw9=+`u$RRiKAe+q24K|P+8Xhu^Fv7h-Z)tJ zkJRT*iAhPqrfr1$-&QATJOMUR`W$V(xQIRBzCb=l5o+oHq3vLMLGD+t2?qj6PhtQK z%_Uq2l}yi_dnf910;o09II@)syclq|oZ;U;f9PEuJ32d)gxre~-)Clq-;oRn7fe}! z(?f*m-2_aMvvP@=jiLrUC+p@`QB*9Y{ox2opVQyzVQq$8ahy`gBZ|_}S{3$B92C`D zo_ihd4jLO75fBiF9Lz=nYS*d$K)AKN?MM`r!-9R~N)#>;G4bDn1L5PHpIa9x0X_jJ z834p>+8zVo$`z`nE%E@39PY#G7^tv$V+Z-mD8AvP{v7k}WEOIyZiZsFO$wJ>;O;v9 zbwa`t@I|V|Fwv8t8c$bu{#1o52rJ`&@?q^@m;jpW`GXD)56i8P0@DGk2_RNtA~wu` zw$rYOxOn4yXF{~Om$x_6c0n%nfYf|B@(&IUxNSzb?%a78w<7xY_nl(fA1)UCpQ81w zf4qPAsK)zPlpH33Xv;5v+##t8xvnLmN!^zEKDLFb z&37eLS@tt7R)E=U?d-wC{M}i+v)fX&knCAzJI+Xy^C*$e0pjJ>Pk>A73k$AO_0IuH zKvn1sZWqgD7(=lHc?S^Y+_CM7(H<2x6&Tjm))uQlwN{PCE)W#$G+pbphqhW;@0`4# zKp`=3dtiGs!{F4TV>S15HQBqk!F5ZnyN3qTiahP6j==E)Jd7vP&VFj$_lh2@`FVZ(8dy@QkH z1)P^koEBBwdj$jq5218McjW_YaB_0eMwk8Z+-(B11R)_A0LFaBP17#h@yb%KSn7`u z#pzPKdaGRR4mu#DAYP}LqmtP+YFC%nG2EL`;G~x>848)I1((}y!V92n?Q6$;4H!!E(~jLgh~zkh*HXxXJ00KhAg z^^?KV_1!Lo@)FqQXqk;D;Gr7N{bWH`RzX4C^d2tDzHG4EhcB;w1n93_TUF({-nQA( z+?)lgQdn4sK$I93-Dd}LBvj%`N=i^iLK&@7B5c(ENgWs;A^1L&$xxgD_MWKqt^$d$@!kVG-?GchgqYZ^wUFX-CUm=1jN1c(QQ7R!^SsGwj_WFq6{=63&nJrbyB zA=0M@N|1Qit6eS3+cPKt|SoB6A~3iSoVXQT#DR#p~BQkY1QPtU_po0n0W6((C;S_X&A3b4C_CrNCgE+wVLaE!)1Udqzf&$KUEfxOkTa@;%Wn4Bdg~X^Yj4W#X=DYs?ywv}^@c*6Plw14HZ7g-5 z?_cKjsJV`bjF;|?WloC;*ZkePQTCx<@otbUCvGAmiu%A1jl`lPgwDG@FW*m1NJoeX) zPY%}+qHJ{^tU*Dt&jmBG=jmSN@J+r>h(~}X*BUUG4XWKBk$|VOF*95Dq)7mhK!DHJ zOO!iH{mVdtvEBkw-kvY5tn!hhv82<^!RLE(20Z+iFE4y+VBJ|)oN_5TBP-0hA#NwF zzQwppOM9{)ddk4eoG9pOYh*MHLj+*93#4oTBtD2mdKLEXLwtT*d{NTTw0Tl=zriA$mPzJc;|7YXnXn#2MjlXcOg!|XA> zA5PJMu{lubE_!KcMFx{3-AiWCEo=P#9SFuH$a_GeTl8fk6(=`DK}PjYErU+W11!SA z$IAtEtn~C+P>x32kwWtSddtl9KsM+_evu2m^wMa0G~%p!)Sj$hjU z_Q`g&g``u-h)tP!XFSpM>v#O!c6tzEB_TT683Y4JE|b8J>KB{I196?%4zMKvPcogI zk#Pwai(9}i11W`+st}(6rUMn+&US-@WFHg-x&H6^l}*F3uXpg8BH{##BH^Ow41^n*q@dur;DntQ2=6 z#5eGum^h?-vyLsDoj6bhFJ{If6+Rd+;N*7IcAj`xCZL>h4X?u;dB2sAk>d z-cG#;^Udyaas=S70+y(^72`an5KxE<1{;7HogQoz&@VPy^=*AKj=1k3 zH@Bhg>wd>R1LRG#0;mjdpz!V6kAcO8Xe}1l(9m!Zo4AEU8aM<&tASkj9oRI}-VB*7 z>}zB^D=<3%#5_T8Am36RtMSyt+63CqZn$U;{5r*ZZy3POsz(46!9XZz)qVK<`Ntj! z!0b>EK!9!W_Vxy)gu4m}JY%<%N5=wAj%^fM-=Ia9b642XfM~epr_F-Yi}QSY+ig zKjFEqZeYPh8i0o^?64`KUw~bLh>~HS7#GLjT)^r10BA4M-y~vSsWe<%B|fJo;Q9Z` z!x{LpVZ`K5h5?Fvgir@W6&Q!}pWxB7)YRKx55NKh1O!0BhRBfmlM;oRc%{9Hrea~S zf$#{<#X_nZtRYC4G#4H8Wsa#kMU?GCuhpFP_U$S7Cg5;lu_JJ&-qy6}0W^C#GZT|l z>suNaI#WDf<|o`&2_oKqVfN}y{w@P}5QSi4Ssg(14|xL915gu=)h#q?f`giYegXVS z7Y4a6`&IVpu|kT7@Z)-4s0E??aDr+MSg+Xm;<~>}Ou=(_H2H+p-iKv)V(C4E-oKMQ z*YL$a9c(#eI?=QFm|^Wn?T<`>W4EyD-imgT0s0GF$S1_o14JRqwo)|34-;nuR0+^qK#$;pX|Yhx zcIGte_ygQ`o?$U0A(;PB?zhNap*EwTpG>7HIl1VwF{9}yOF4uw#G+aPvO1|6idrbWqhmqZBq4tSG)**k z#U>IIZ2ft*KrrF8n*c4O7(Lepb3!=yUUBhvPdbguZHD~mOdz)*Ab|b^)qoCoYX?Pi zyk(9W3plkNnER(6zjrHJq{-L@NUtuu4|$)JElYy}aCj$rCQ zyX2*$q_iN|}$hs~DS(cHly{(Ny@Qys4ToWDec_lzdJuzPw@FKjqCIQpgUl+G29Wua6+dJWg zU_vYgM!>s;=qLySkLmXS%VDmK$kWgsk`2f=P&x*MhDIxznS z#o7d_Lk62B01p-#r0{CTg*RIlK~#K3)d+O->?(oXL^Y_E7c5+kAV)*WXu>gr8HPjk zicDVDOa?Fu2~|Jv!-PyST5PWP(XdhSj?^0;gTPmYS> za^IQ-3^jW4;`#IE5P5PzUxs`l0zL;!?j0eaBS5Smr6~bN1q=a$AwT3&pq>pYofd&B zT7bnzh6@XZ+-S!;b}@E+VZhx$2S9}kw_UsWo$NZD0(h=5fQKT}cBl`bMt_M*c>?)P z=T=C`^-fJgZ}p{aq_8PA>m(2}F&R?dRV4*JhLX=dH7u+%qU_-FS$^p=h``I#{o*K`#cr-G8h(S^!Vdu(&J1K)Eog++kiwoyLI25A zkCz&Yzw-+q;AD=cAg91fU-(x0Bgu5MsPxClz>&z|x#l#9;1J0fSSfvBJiy&`Pc%kv za(UFCZFSQJBa6xDsi@uq!IVz{pwyQ?jYmiqa4Rr5FR$L5UV0Ab>s@*Qdb|t#OCsGVcWjKB2aJ{JW z;xLUs7NRuMQaP*{b4)_~HzeEG6FLR&FwqXCJR zPQumr;QsZ$M}GM2eDlfAZl?Vr8NP_?JjY(AH%Y1m?IAJ<^6~Mpv-k9$KS+Sg3Hf3? z;5;x}&Zj5GfIxKsV`E>V;bmXN@#wBJa`qUde0DGXfj$vxJH#6-PmZiW2#r(paL5I`3vB`06) z*pFTv`%;{mnu@T+kbTs0G(fy{=uHQb&AGK6mXS1Y#PW3+mHDWrsW$L^Mh*U#K~V)J z!~!H3T7^V6AjXQV5IzM&+#f%FfJzBS07%Y!fTnVCa;gT1rad(^1=S+d;N6M*#ULDk zqV^a}ih&-RAR$#|^!K#m4341l;NO!g&Q3Lrtv zlLVY8+@_xYQ-JZ%(PaT=24j5MlNNxN1~h~i7HGI5Rt3kP6tn1*JRPej)L%D{gd_x9 z5?jqq?W{#V1shJAX^?}Y_TB_%ux z3W$cgK=s-}Fjh%sWo8Zu3eqXF);2Mjg&PC#!04Z?RhWin1mO_I6*2!Q01wfMpr&;O z=?PMGE%bsx$qFGAXgu%e$Vg6;mT;hMq+<{M{K2A9QBiRc7>8~em{-=M^5gM#X~u3u zdj%~M4MlFZ$e}efs=3rOKwpchib}4bD#+qv4-roT{X}; zR!AYk+B=HdI3AnpefAa`QBKQcO)XKLy`R){JOTY*u?Y!eq@;`s)>Mta;scHC0agh4 zm+b0GC=@cXvNZE_km0NJ5{bc7KZ@sK;NjT=A{qDyT&_I&UD5=I=n!uu)*REWDbS}VTWmPP>LargQBAX z)(4Iv1kz24*Om-8DzZe2wOA;W+a=4=&ZaJG=EL9{it#I!@A8%;d7vJsfqG^4+CXpG zH&}8KZ)r=>tbR*%(q!yOZy@SHiV=b$1(Np%g(OS4V<^lypPd|-FAsvI_v!blzqqCE z5J1l2Z6u{!xdIs_h2Z*ia;@lVfU$#tG4KwgMW=RskA8z0EqHtp6VuGZL|TGW791TU z99S@T0n!u03Z_!=FhaOl^7nERe0gaLTL)X z8RSKV-Qb~Y;P%A=VcmdlR1%4cjok-cV6xI#F6*cB+L-n#JHUjj_rBs1fAQqUj$ZaG zb1?HPy}6aG>KQ35^Z4-;XptWt#UZ&1hB*d$9^_bfiHL|GU>mp`yfm?ZE5PMYaF|E~ zRQ&br)o7{J!pux0SS|2R5C{RL5ovl^O8~#}v$q#m#~N@tFn$*8qKpcr_N_HRmlbJg zX*@CDFWV>ZWj|@;2>?UGZv5TEB&xL3{WVaDUXaBBIA6QP_ZjX5LOzfHkbRJH4=C!i z^z_aVasXgq-*d|D22zwAh!haRI@;Psz~un#Q;?F9 z0+ZIk+1)ZI1oReU?Zd&klew9hVj#f&{BfgdtUK8)fXhN!jhdFvdKA|SwJdxYa@-Dp zjsZ5-nX1vMx=IkskXKRli%>?5+zLn_5bO|E5~$NLC>bD#m+Gv7=u&quPxhe%1GT{+ zQpP3bVjc{oZ^_dLJZd52HP-))AqIWDZMw`^eDNyWDug>|p+fK8hebMhscqv{wz9GU z1Occnl^(a@!}-9G4Qr5$9U%Qvdakf*;zD4ozokr;Yy*WXuzgI%c>r2{Nq^r@OZ#n9 z_L)7Is}+|&>oNdZ--PzSH>{hac?JbN%SrccNKpY@?$&Ek*lF1C`qn}9uZ&hI-LC*P z-MAuq-bIEhHE?4-d~BWT_X8hpYOEK`E% zXWnnlgcLToJ3=Q9d0esoE*Rj;xjho%EzUzXm6d&x!a|&S0;kxa2Lpu~ zcuFWo5v`n%8BULX@h*Je%Xs$rf4^xFgN;nt4E^erKU=+O96`Ox%U90iDfP2YQ0iw| z$dpac=r0vSHd%diR(05=kNr~7F3;;(cE-ogC)51$@P7{PUuD$)+1prP>r*bM+hRe_ zXk!zW`)8(5cz_Rk-WhY5iA%&KiBb}O;JyKx4r$E<&3Pv7vn%Pb-4UpK+7dH&_wMZ7 zyIdi`+qot3X9LsgFtOmM%HDqRMBzrr`F|8OBT$pB)%B8}-RP9;S!MY3doX8On$Xke zyJr@fA7yOrRJQLy0=o%dRiamtGR-s)f1qFg&k41s@zgc-RI;-9XA~a@0|s@vUyrOH z(~BDXT>CIXLdWl`pIPZ^WOeL$;5P8dZ9D~S;#jH0LN~Mh&k8y|^?!t%;>0}e8?s($ ztQ@_5A4)EQtPkIbpQbH#j)mvq>Tnp)X_5@|?K?$0#^5xbT!4 zv7^huW1gUs}%=V^?fBLM-LfB=FL z%tZQNm8G@iV~$bfe>{RPR**(z%Jv4y0=Gp%oAsqL9Wzzy12x=05-zr5!{fdfeDWkx zy!%})w~;%)UkLmG`Lj$ij+>z*fA_OEMt_~1DJCxDJCFxtY+Zpt=x^$8%^t!55|`re z$-PCGJ5~hyNw4C}Ok)k3iX%~(qBVwJ4c1EIVj~6b{4K$B$2UE{Mf}Q58M0cRLY!pv z5PZ-Sn2xODhIHAZiukK9>xZ-!LYj#wc+EV`KW4tRVX(0}?HFUdJXyv(*C!!KT=SiY z>{A6EGH>-yG6+724VVyHMNWXq&7Ksm%d&=2^gL}VksxbdB;n1Z) zmQ1MNr54uvtCDRESM$D3Y0RiG+IEOx>6>H(W17b8p1T_T&eTEq(?^G@7_{uW4h>x7 zGTk{;#9~hgdnT<-6Gp$&&b{kQFY^o;o>mbXmEpaL4k)jQ7$l}q2ptVh%wt66uAb6o zn7;i{nVR2|&G&T;DL1uRkau88au9*~rW~=4pAW3A(XRO4c}q zk_A~I{fAK%vpu<9+UbM5A;HBJ{lQ9i(apF!>(+^+<>dp32{ItnVW952KM^*O3npcm z(6iY23sYUZXpY<&lLqdff=zMd{-p{kT}uh;gYAG}AFH(k!xYJa z@(P>`i74rhp>P*#?bii=VAwWI=-{uX1_yp-xAdIcU$aGwq#irEQln820+6aF1D*Am zTTFaYE~QTHl8-?nvhrHHpGzU8UVh`=&|F?hNK}RGl3!&$!%F3R_g@NI5-YS}FgZJSoQV$-mPVmv}fCZBpda9D8c@NdPvUVaFTYj&}e zdP5u;P^y5gZGF%;E*_yX@6PVZoeX4Y`=zn8Ap(E)^q!mmriy^q< zb`b_&|CK9hW`5U&!M)xA)T6u81KQj-j|?1 zoJaZg-n$vfFPXk;VZFJ}U>RyKd5@L#j=;!tR|LdZ0kMYmvuX53rrfT?)|AOP)PV8^ znH2|V=Q-DJ6?|em)n^_u)aH>V-D9ybEloqymM!1)QWHrSz63)>vk@b>sq|+f(0HA6 znA;bGLN1KLzNOA|F6wOkHb}tCq=$S%k%8aGvXnp(Ay=gzl&3hgMHO6mzPcb&k}L5i`_i$ds?4$b3*5i zNvVpq3kaO8O~DE`!a`Rng&()xnIeF7oC_$r@|mw=AzHEQ$ht+dQih`Rc<(;R%~r6* z3$Cm`86hY8ZZ*gfO&Jcl=@8v+>x!Ygstx@Y31eZy4xUPny39z))+A>rP96A(!KRe* z=ZheMWZWf0ErrJvi7=yyRHtH z$<{=K)=2!)7%&_;)UQ%}9i{2wcs>_d&|4jaf@}iS*TnO?Vq+(xD{AC=7Ghr1D3+jW zYEt|LYO13f#U5j;7)m0@_^uhRcLkeTDCH&Q6PvP14gB7P z6x5;fv&AVQ!ggq7c*Yjj7aa(9Xn(`g)u1Ga#rd`=ND=3ajpZfNIqC#V@UvuvHuq5U zb}*N|MQ^clZI~@SD_CY`xqN1QBUvy=dKK;Fylv{WwfdaHzG@q;JAs&}i&6n);A5$^ z-nVO)qE3muLVOcoE_^R3Vd@=(T%V2_S9BdSH!y4MM$bFR)kkfMJ9YtXuKIaYUTYERZnB%_R5UU) z94-%G9AQ-bILuRhjr92675(`ZgL|m6ZFN&1l$=Vuu6c~A7l!q#XNh7pk)tQaK<%r2 z?T5Ir1u;l~`*yui*8pU^KTdluFi_=90Cp-uqT{R~S#xRT^)C-&W1@rz;o^GrG2tu` z`!CqB$IhS!Y6@yb)RY?FTd~0DHi@8|${3FWhIAf&GG8L7{$;BrC&hAbd-$H*19^iC zNeQjivJX&vF`F3-zr^3{T3w}+FWf$t#F>l^hB@j|(rbzNyVE0f0acA4z&=w?Z3x#$ zY`o9nZ(V=&Vxz)!P%nH!l!L;?>zkL6L}f1|#`72-{*sQ{(-NU`Q21{N18N1BNhwBs zKYWxg5+{9)--Ud?l^zj}g9=Ax10&aI^SW4gF~;j6-=W-hci(=(bh`tAAnLN|u~h=0lWA`KPvYNi@;LF*&GC-% zB|ajv4s|ma-P6%Ew*iJfzFzsqy}a)9jUDyUDSl}aKULQ;eyQ-9s}L#{&Ue4{>AiC( zdL%7rJ#4~4@ku$<+!prWbcdLRZiZkSB8ddn3z0q9Jxb*XcaD7P? z{i>$zEfy#Q**rXF#PW(G6ZB-m--M}Kd3O}_Q!dz1kUd*eUDWdAR}ak6;}Ako1R?S4 zGeK$q-akV-0 zY*^fhf(j2zrr*<=#6H1!6k_SwutOsRIS*m zEC|#mbWs4M1Hy+0${fu<$UK|u4QTYQ9UFN9v&d%#x#RRdk2QcqvJ&ZoqovGm1&r%|olLN0UQk}0_nn~^ta;ka zjlXchSJ1!gtSC`wsn*0kl2|;qJWgkMKGTfK5?Y_IsG!T;_&5$!h7@1~n}SKyZ<3(+ zpeh%lBsM$T)$w}{Jk+90y3)0M6RJnB zQ3!geK^eGt6_crZ3>vEO(x4OD5(fv>HYIj?VkSqG8EOG&j)gS>YAMTMw~O>F{JNv1 zM?F`lnXCN*vd5v323Sp`We=1M7Teyx&^@qTy$zeFfmmOXu1 zgOd}H0f8k2i3J+fJlDRMLla{c`8|}Dap6<(u3-WT_Bga{LL$zPSbQa`ei={6k1JFw z9%&`+cdJTcAA(t$diwy2HzO1I>g1|c;0S0L!9hXspij!mwjsNRw~;=*Ee=Y`laZ+kZ$!9G_j_@jx?ZC`)`qu86d5m3ba8o77 zd318^S~qfX81vFYE)8Pr@11rxc#f-gNnYQ|X8OAZ77P+(W2fEkvQuLEDiD`7Y?m?; zSi=r)(w8+$gQAagRsa4$mEHqe?_;8))uHtY`cEfe*CWzR3wx;(`DIa`8$29%9^VNr z>`$_~aVuJ`O$BZ9hf{r&Z!Qt3G@-08Lcs*$^P=9 zKASnT0BO^;tQLUE{t27JpwE@xh70wWO*g3cIf46_la4m}^}{0PkB4KR!$U$0rIR;% zKDsg!dLujdM)tDk%!}dM;|KGXOz~|TBUE-Oui}29Ey62Z=uUw}?*}Pyx%-j4d=i(1 z3dpO_@R!v!gi5_YX#R~#$U&epUoXw>J&SXz^Kfw~Ld`ecPvVe-9ZJFP_3$cIf8ld0 zyNv&l$ZOw7eKQXs12!w`!4L`3k!{$Z1#)n3K$h2gF>TEk)GVJhoFM0)bh+v`T9Sm( zmRRqzQPEurwdS2X8Xp{_|L4|0Sl=nYRia zYd##Ads2NOusbi-@EJo&C+yF9W+4GWAQEP@#2k2Tbxka?<91$QjMl5V0N>6qkdHz$ z>bOg~t@w~y9^SFUy~&XQyL+Lb;TRfp-oTDy|BcPf!mSceh9Cy)z}7$LyY9L{i&9F& ziHdn2z~f?&nj`h=aqc^2g+8V)ezH_4W%WTYLBgkDPc(NTzmk`tdjfh60SlnZz?s1{=A&4N* znFbm!$fm57;vCRA3B4Wv2z88Mc=z4KdjcB)5sh27%yu`M+=Hkn;Gi_|{d?I{g7Tm| zgE+Zc)JCZalVZ9Q8joZ*Mk#?1fyJ!pETBZyC0y9UV>kqHDd|rZ-J*P;I0#a=s{JQ>QggK7dFB{bcU=hWY+NxI(GYVwGnF)1pyWMsGvz4oDa5UZO?>> z)^2wRt{9%LFQo6{`6m4G6Fg95$J_}bauMUVJ4QK|<_MU49)?q*|LBJ<C_yfq%hWQsHrZ@Dfxa4SzViuFOCDL+3y>_P!|i|K-G zKEh&wpep}4JZz7JtpuR>wLuC%ciqQuqX{bhWio3$h)xODtR#vwBV(5=Xs2&-oelqs zH>!MnPKP+n@PO-Iqv5_e{sr`p7i-P zkn{n|y&8N~uL>D7OyuuVI1`|^)%A4{P^}BMk+m8f0C^HD3(3^Jt#L?v?J}Vp!d)xmTMR9hx#k#Eofa|#SzhZR0UXn1hUOmWG{bA#CqReY!18ipJ zs=SJBl|s+A&{oTxFd=FmZRn(caGE0Iz6D69rL`5>3KgIgAv)(SM*S5uk6zPsOgQVU zu=5OAOVLT}1PZg+<=aLFPfVLKR%dOxzf>`m2ZfFh2f#CZ{Qa}J2vHPwLDFfoD)Cu! zdRoXQc#lUT?<hvV!(U$K6z*YH6)#?&~3qBrQb#pC7+5^NuEdxlCm-umFbE5s{>_N*He6ci*R zywKm{>x)_lyX?FF9=t&HS((36c@jy@+u8t)p<-qgsJtg0PrYU&6yAkXH#asS50+XT z-G^`oo>&9@xZ6^g^)|yQ*?AekA$R{7%$rQy9`TW*ZR6BQ?4Zy0a)jZjBG8%v&x(M} zb_?Sm*@FiM;OXR*!IOT74XMGo#@Wx=bC#7*MksTg%c3%Why(qDJbQ;Tuku2wi+nNz zvTe#JGw#wguL(z@+-N+rN=mKE4Nk;I!{z$^c(=xcE6G3_FmrW~aJNc&%js@`6QZVFQa!0v%cm=@iS%0?A|Tix zH5je~3ZPyDbisVn2tv!)hi#LwZMRl7817%PRiBCeX@SyvgB$>L(VNvcKPVoIyvsDTZ5BG#Q!-Ss3=vbc#BBy5o`e_3=z&*}!A_lv&G6`6rTUeUyWr zb24Aii|UG<+jvUs5_|#01pBV+JTWdO4Bp3qhS7Repht$rX#g~j+8Pj$a!gXB#-5!Q4}DIq?#CnBl|yMggk0FY(c+=wh~OG7is*uR`-rX zJzXgc9gj~Pj=YC*J0)*M|UHl1uqvDmreeKZTdvoRQeRru(%eP4X$2@BLYE4FPf`J=>|@Nmto%8BJ`R-4j|Y!m znupR~NShTE2Bv+-(lv(^wQ)Bf8+M#5!Lyqnj@nGt3UhI(2|&jsy+0NX4)V+wNLuia z8qb~IPl|^jfzR}KV7Oi2CnJ5(g_&w~MHz`3Vu3I$0U;qh0rbJv99%~diyf*qcr*-^ zI5c)4PZ{u+mXq7oD?|x3@SBs#)1rBV!dR#B)d!nT`kO% z)$ptc;Ar^yKMi8l`w=?wB#1O@BM}ByDR2b3M+n8vo)}@olMsLh9aCTC`>pqV9B z5p#-+d2@5t`YDVOj@EiU8^n|!&KhWqJXHXyTnVfmXaqd`d2+O^i0m&8|0{8BKNT($`kk9|mv+{H|;M+_J`nO@tCR*Al1~yle zs{n+>);1Be=Sb`7N3*GEdB1nM%O~bGiLXN62$#r5eP7EX4KQYhr z>;x)?ZBHyj(LAUc)xZ(hBj*nL5n;Q&Rq=4f9cTeMd+Nn?*an4UT5Kxd5EgzcVWzVE z>t0If-$b*QK5#eQLv|{_b_%Funds?%L#D5Pe*XNq6W96DK?7a53FuZuIu$YfzN%)P z%Qijxem|;|snYS@>5G#4{Fc~MND+~*FW6K?%4>TBalD00h63;qJThkp{<8QptDs^! zsHLR^8vGRB-FpukA=cFF;UO_dtEH12Jj?(Z%f{R(Q0ih`0~Zf#qrTmH-TF$PcGenI z`>7#&^+msBw4)192*uqZx;i?Hxr1d=|-v`WYP%cLhoD2*M zXlI?*vsn+?7oE(B-=CcU7}rYWPY^5LN^-m!w{09YY)D4Vma6i3PE9$(pALQLRNfCK z=ODnf05tE~wQB)$mh;#{5ZI@9sv&m);N&9!vbD7V4UN2gd;hq_S&TMrXm@B8DDlYh zpQfbrI96=S;=Wzn1qfAkUp&2^a!qIB&PzfrR|V5G>^JYtefs1Hq2(nL1YY{iT}!iT zx{5Dn+{-0yyQ4$b!)-5F*3Rx(#iKh!EY$e;IvoKg%#!kkpoyMd%xZB+aK)5VBwru! zBpbFa{%K()UWAzMcD+({9ryP_bplp#h*o{R@nyTG5iCA`xQO{(_Q{GQkhr zz56AUFs{F8Ojg?QgJT#0CLJ3GM>Qq?1FaLg@eaLn=VriAB&41YaRL&F+Uag+T|nev zzp?M81a@LH5YUum%L}HTCR0{WmXQgvef~;YatZ-!)V+JuWQUS*p@n{!Qh&NBAz>OI zA36PxFl`0>XBY3D!(+u=$TT7(0l-d9{z}MX&@d~jsi`R{7LBB5q|eJy&F{S=R9YEl zl3%{Nyoz49%3AWwyQtfZjGt2F^EqYhZQR8U9+Z__HC_l4F;BN?mCZiylCysqVW_J+ zG|*COIF6MDMGWAKGr@Z0;P~+`q*{Pp@$87kD17X?p$KBe2ioDA{+hT6L+)k2IB~u91zwGQuEN%dZBf}IAw1W|p zv}6O8RpLP9{8vYw-|4&LWMv8YAfedttda=|pweEBC~)Fd@54~Qk3bNSphgVqydYda ziJOiKzs6pDOTpL>&9mI19PCfpy7INWEin#nJyae9XKQUE^*w>3GB;1AlPUhHLG1*L zHY6W0*w6)BY=O4N;W4)SwW21*PL;d(B#~{66PhVlk)l?$Nacvsf=oy-aIJ`uM95YZ z+;N4;Y1AO5+fDU zIt{wQVzE3{5OywrgD~7~^=?NGL6+m^NE>O0QFL#wW|Jjr{l|^Ls1|v}%CweYl|UUO z3E0k$aiV7>MX;#AFdZHQl$KC`VF;O*n41{{a9F1GGXg(l0NGkF(6Z)}?*%?qKb z3hxVPIxrmGJBbPjxgt`Z+63AGc&a&_b{npfA>eNT=I*zo*OY-oH;mMw=#}k=1R{WL45=^`+xSr&9hHgFI=Azfm=f`b7 zuuuCK7J^xF+tTNF7Alf&LiU=Qi;vs~ZgOW84S=2tCM3a`h9;gDu=!9z`3WV&oiexf ziN3(5oqAtcSqXqB98nMUKRfHK(9lf4f;~JI;D!(c-H(kmfRfad*P<`Y~A3-HMFV{W&r8F3gS(~baQgPL|{_lGJFh? z85Bz~AxUN8{j@cmlYaWQ+UF8W{LlH&lZK)$wfaE%BZZl5?V2^9OM|Fk?)wvRggpKt z_#|BWUl8_XWn~G>c5?%k+_|RBov1eu^x>J|mW=a~{U}$R3E%m=$GDvTdpY;-moYVF zy2G@7&k?1d4l#?RX(!Z;;w6jsOcMzBii-*#FJ?n3Z)x(bV3qDU29AK#hT94 z%gt?}Z9(l$X1AtJ3MUmTog%&F;FKLlbhw2Ky56_MI6d&8nUxMt7xNhxGwKeR*cT^Ic=_+15L4UF0#!BacSwKzWm+XY=bpW}Ksbr> zQZE447K%OHr9tnry1;V>b}P8i7>PfP6s@52^|G6x5|cb47Bu=sw!`80MBk2kS$R-l7=y z=uYcV0=sHDNq<9S&VU$3c#tdDS#4lc5fj=%z}orU+TlvO4(s$Bj=9wCkRC zNjOWp6H%-3gYGWTa_!j>d5y>gI)I~hCc0uVVpiIb$Ut9NXC@nQY{Nrwoz=j4SH{{& zYswgXi;pUCBLzVq3a-H#?C}yvKXx;~3 zS6X@^whpomBI=Qw=lL%c_y)U)9}T}BdA4mrFn1rRp9;f({fa}HM(~zah=d4K32dmy zFbHMMz^5T+n2I5aQYeg`ID5FC_L*hw(rFbhFGZI;x@&Rcf$0K^8pAPdWyRY`XLfvG z6qJOULui8?$;Zzx7#5b6 z>E~Jc2ZPg@9%fvToZ&832}=L5mUKdzOepwBPQG5-oalq+tLK2ClOpw<*jP`*TrJ%j zD2eHYl;W=CBxUZ~@3MngN!E8|T8(g`2W2`iCqVkuer`1G^%h|Raq5EzwzRYqN@KGq z2&@cTk#e|lo${CUpT)v^=3LB*ITxOk{91S+ZPyTzsKxW+69_!fvWogg@U~H zq(+__m-C?_af1%DGuI`>VgKf4O~DUq{>m!4xa=y9mhq>{x82_xs-44F$R}*2JJ_zf zuRvEg^r*5@*Ftad%S;=~wSHBwEifw&Va{MTBlvuu)vVH;j_etJLTY2&$80YU^SSSB zK$h$2`^TT9MH<>NMVJ_3Z(EJzAUmXqj~RD7Qx8eyq53zlS#z@yxm41NJ2xmoc!JL# z1Q5qx*+@V@wA@6_!rqPKTKm`kC|}m62LG~m&vQh6*s;UHZA8=zYYw~tbfIyEfkRaB z&&YiK;M@v=T@eBJPERQhV_RzUtsgar_{c~qx0o?%f9fkLV;*?;g4E(@8s8KG&A(w;} zgkjGJ$vFDBssGaHz?b$iuH(TI`*;*6fht>H-E~m-_#thGO_Ahx@l043EFh?K$QnNr zYUH4sK6}Pv(_I6%03SmfVqver9?V*&_%-A_sFO=eo2t8gpULd}=e|UticZP&<`76d zm7Nr&sB}Sv<5MfRwn;7;YEJ@mz zPq5A*AWBFNKxfpYOc){@AZ9@c!c@mK;mSUFh5PU4HU@`;x?7a&Bl%ThHgUkck;Q#K z2ZsVR*^u&WJncVNfNjIlU2?~Sg?}S+d0M#bTx7)%@m<%q=U&onr6v8n{r`2hc?IK> zy!L&T_1OV^mv6}}kzPx2o@aPzQOiJnhg?V!l(=uz>(@zI7xPK(p23M9BV3C)~3~6==X##Yb=1uAOk! zRg7)g-uJ|Pd-76Pq~u4R<7%F18-te%m8=3HH7=7R)yWjZOIyg8-myP-nl~ZPq}*FS ze=sXxhBa6;)*NSh@+R5_#UsD4)tr}VjC~g5s7(a^%*UU++VxhZYx#PmJc&eqBg+-$ z7m5~fw{O#}{HBR}_1_x^F3M~D7MsOz3|J9$v-)>)Qi3K*S#aw(oF%kg5CJ0E$a?vG z&!Q(mMLv6$@J%x_F64Jm7(H>0Gr{Us*!)`OfXnkA?EGB<^BeI;)&TCXlCS-fx*I}b1lGSDn z=yJdt?hUPia?55yIvW+40k3-K?I0q~a=7fbEE*ox*gPk3e%&V0ndE)>2)qdPG=e{Z z`-+{8Q=;aAJD>?e$!@4K_Xl)Hu+~SLl&QQgS-HH^d~R+n>P8bnS10C*^8*@N&VL{P<0Jh{uE{D z@~#jT?UyYN<;PfXfni>Gh&>~fbZ$_WpZ>n*0SB!X>B4!1G@A-SWT-tTH&*|)GjR^s zkRGo|aHT^+LWnR~pLf&bdM$m$ZYIX+eFb6J9n_@Pr!gIfG9Eo&J9!j;62Gs)GP^pp z69@^Ri1ln}4CNJkI=8g+Jhc;o5kdw<qpWqgNxWN!;orOS#k9Pofs%szheRgMfsgzAod-WYRf8eH zcFF=mC|O$%fwnx`c#4+Lfk%pwZ?Gf5m>9XW=Xqo}rbFe1 zcJg042xWrL8cUVSg!Lv9g)58@4@~BQSsx3tQx5gRj~f{to8@dLNuNF^Md`K^BFjRU zZ+zF zo5Ra*Q80+00Da3L|GGU?B*DjY`NH;HUl+tk52xa9`b_q}-f*Fp)N%DR~gxRqe$jx*25Ir?;gbWc5 z6x$OdXp#=_BxhQDPycE+>?IGPqTo}yd}!7X)O=Ja-ds3xFEVodx^>iKWo2ckMBk2# zJQR;62g?x2^hC@H^vU%3SAHrqI)}M7-wex&R2{pBTYs?B>_ds8CHb*oogz8LrA|^G zg@()2)Fn;|p;n?<&jOWtlzC}cP7wS_ILm_^9FU9es*qc|%V|h}JATKGv(vg`fm>_< zf=x#p)ZAEulda!KS!*{!Ztw;jB5gvi+n=uR^CgutXBtsgD6s34X$>fc)d4wz=7v@d zp)%{wblmcm*H?%Dz$)#KfySGWq{xNWB=S3uSGAsRZ)9R<{uDhg7{z6{gVX=Q8NkoE zcNTXchGUe;v+vfHyh{LOQ2IdaCXyCkp-KG<^}lpOwth*o^KmBv?WI&TL)v*>+%7Ou z%vjX2;kDn*4S`0A+>MZ>Hk_d@ci0JSA*0?@3~yeuaWya_xZ=4d5-8Wk`8-@czRPd* zv?SY)JHO&KPf2F(vdv*3`Socs?YHU3eoQxjT>o~sU3bChRr#L97NR`wPrYT!*+OY) z6>e~M{G#PRxHnBGH@wg=M*Rnt`!9i!p}=nX*mVH4Tm)vWen3w%1+pJ;$H zBDkjOwM>`(cQNzWDkf)P*+X^qhQrhMtC(ys=#-GRr1yxS5sJKm7y?8ApciwPlT(Qr zT^{gQ!V7T-nO4KMv8RPpeN{4Dd(I6@7c4Q1VtYk=FUT6=Qfgr`6G%Eh^3zYD%ST=9 zA&L)?k+bj~iV9mdTwi+Yi`vwqBPKG?oK{o}T9P^BM+;|Ka#`~(W5`uHHlNVSO4rdR zN97+2Y^LuKbsvw@#<_)ef7mcRy~6Rmq=Yp$Qkfwk3^xItAVLXAJ0l-885p;*wv1>m z8C1;R=+H}|7mkidP_p%3i^nlG!^Vf4H=Z3*a~3Ohc69l1Ve!5iwp!{*kM(zPF{Nqp zRMprV6a|nteMQ+HikcZl`xB_JTee3A*kxI-BUvkBdY3L2o~@6fdC(EC$EU)B)>XfY zMLXrH9f_2egp)@MiR2_{|Lkphd@uORTZ1&ovvG)vS>(Lu&{HYM&==Hb4QbX}w zep0w{7)DK*sENjY-)but%YO_A>Pc={`~Hh@3JTUXIsq-sPaZO!Ob2d(jwji0*Z1@vb{k$$ zk(L3rr+zb}s3r1jLWk2vkUkQ2OS*Q%y@d37QCAUTl?rB$Z?z1;fdNx(UR+)wJw5T^ ze%nzm63J_W#$KP$8+jSz|H<5lp_{brtO%@SJuWuz1nCBQA;0rI*Yi60EF_WuQ0ps| zLyGw?%M+<>!%3vSfVukw-^jB)Tosx_*TQrF36r0cnW6nWr+$~<_VTKMD;0|Wvu;V{ z3atTBrsVMlN33)ipXJmDn-%+aR6E#I?7{Pru2Ip?lNp+`9=n%d=LPLG%VTA~Ik8U_ zD@hu5sL#YDnVkrMt2U5c13vzD%NCn<|7k?Ew_u*u!mjGZW zbO9IKt+6fO;tQk)mbqRnK9UB_lyUtA?c|FGEWdU15e~bbCQ-;Mbmxoly&d#{8Dt5A zdu5^@4c`s9K8RUgPDNsoZw*k-c~>nSXt(kFHa#sGol_%j_hJNzKUF;w@(R>Siy8mu zaep132!HZ;r74Nj$XMK!db{EZbFfTeQogg(WAXL1R?Qu*8wtaG24ZFBYD@|lzd4(l z3S9DjEZ+8kXA6V%Nc6h8=0#$D-5J*&oZLP)8k*`<#){1Vvk7tvt4XG*OV-H3azN8| zyb?x5f3Aj!kt1BUBit%`Aw=o|p4IQc0ZNk08`qYPQS_+M~;|qeZxq-B9D_&J~+ylpn zcP6ZtwI6zPNV1GLlzH>aL(a>RxT`#ng1mFzRhQ)ME|ExjFRNm(ef7E}x>whUMIphf zpt&O-!Ff=u%jeb3AD-_!gNcRgr;qi+$0?K>${r!Go0yD@PCM43Q>Lb4(VGH~Gc<1? zC44$6y=KYjVeX;&5Z{Pg!wbZ>wMy&k6&sAp9oB89gZU(-0uj*Tcz@F!5rJHdZMVV* zO`}AinKus~Z$Gzo^{!bGg(MHaqsr?%GZYw$o*Rhg>{pVtcQ>vN+HO}kv6~nN;)QcHJ~uZln%vbt z?-%oUyZY)XI&mvCbaN;FQ4^{Dy*;8u+QpB*+RZ9BO=c%9 z>^DNDRBU0YpF1*lVI%1^cgKBZ7K@wVQVc9=cr7bn9bOxvR5+hF61VhQb+^UB&jRs* zX5Q$74G&zwRJMa!vhp9cAfoRluId-%IfK5UYS(=8lUcgGUO-FP?Np zv1c)MdG6c4McOKv(HSSo!0FYQ}b>_#v^mu2l+j|Jpry!kR9hn0}j_+`_Q zRpl-i!W*ffh&sR6_4OCYKc@fPe%PgG&s}1-Ofn=2QMPqw+ET49C1$&iVfwFKN4wq- z8`OHEq5ZjfijYAa137WoEjLr+(Iyj-lJ8^fhx2|a#ilde(<3Z4P8=(C{il|An6hxO zY2bOPp}CNiZvodq_9|@N9@`bVVUdbXEz@%O$KI`3n(7Z$w<>sjT*)0-QM*!}h^gM9 ze$Z)DIYdn&=~p}xx~KQBt1Xhv%5!y)tif~sfP#jWSbW^L;p!$hx%Ia6)iyg<78<9k zk-4uzRxik2+;!%Rxe$tbl+`_&py!hR`1POPLvbvh?2UDW7rvKeJM_FQzRcU9)3jh@ zF7?}V+bH`x<8E$-n7XKWyWv5UdyGfkV0^b6cx~-~eM!xNm@gHm zZvH&%+T-BPv^vO6vi66m!@|_uD3;t081m1E880OgIUa16$OgrP{RhRav_(&Zu^r6& z``h`!&91qnX9o5;H8KY;AYgp1+H!Z07GJbU<8t$if22~7H z2b&&ywns0mF3v=2)~nUO!uBR%f(1fq*)+rzyIGEZcHmky%6Yf4gqGzWsHWyo{oFq* zeP@PFbfL*gYt!n}9gwxBy_vhnUB0y5p50zHWnPfMP5wOBAuETIW7_{#89(tB6vLjf zEx!I*sX|6FHhncwU#TN_%%EqWd`TzKmC$9O{sJ|-s@I=Tk{Q%o@6}Rmr zwlyAPdwvFRbUvSKonzEI)%wsMh0wfr)#^0{msNg`Pn>YZVFyCdlv*}!=2`7qJ?0b2 zt6TMoZ0nqpmU4$oP|;C&AY=|*jD%v6nY!{~R*BEOo%d2!ln-osH=(~8fDCQd=oWtI z8K6TxH9tV*4D{v&-oz#K64?HJyjJSt-QEhF_ZO{~K)u{9*W zEKuF*L{+rX8q($8Mv34f>=CWabELqI@p`6Pr^cenRo%*tT9*3zz&sY8YMr}H z*(%if!6MAzl7o%TVj4w5(6lg?;aQHmQ@q+n8b(QN^Q%=p5|DU^WTSXqi`7%!V|V7F z?7Q`$d3lD8K|PUKEV`Tvmrnh7&D?WHHph?R%O}k3^h327mlwk#S@%2l98N5`B%U(t zD3FciwP#Ee->7oECviiLfu!-5s}oBr!A{Cw+Z4yOMp|sscSCZ8ORiPh(7x_O>y@`r zorQTAXMv7p*OOsAh?iPF{O+$}+Rt`)z(#*BgOfl!WDdT*8XO{>w6$2g7 zZd%c27qAHPZlz`xQ_Pbn7w_n9qv5p==bh9U9TVh^q-Kg9 zHI(^!(ma1bQ$@U3MKSV;V0xi_vMHO}e8u`S*bT*?E}uFpeF#S(ltu32rtPp@jdz^O zn?aaXTUq&QuxE`%OCer8aFrgWoTysKVRRWTS?7EIFDJ*KW-cE;%@y-s-g zzyc%);A_%b?4n-q=u|qApYE)7bl18b@rJzq6#Fu1qY!duo%?!DB%syw+LSQn|aLzr-*cn?S`Gb z>y69p#C0YJQ}X1+z2^ma<8p2^uJf)fFo#Hqdi7agYxph1WE{ydqJ6r}Mg zO35_FUBsC%OCC3n9Qwkz0RfMptbIe1V$=ts#PLMEAaAzzOQbXh9F3uw-@6t}YHB9^LnR=}D@Q4#NTsBpAlbXqW5 z;N$DUl%-N@bQ_Bl=5c$YvXfq9q>K%<;I0~Q8Chn&)#MF!MNp=zia$bw9iVb z_+4X8%J|%nBGSy4EVXH7Q4QKlvs>*$tB$(0QbKV>$sibJqtbVck5lT__~L~}&@2tl za3!9MBuH4R)h8*vK}ElMSu;vUb3ypM27w1d!87BrMT?e|>?jpHf-!D&6F? z+F;GI-v&S3zmJ;Pr(^(UNye3=n+>K7d+_T|Hp(JT?X~q&)nL&f2w_=!uq;hmzpJW9 zWQ`ccG=F=(_u0(6yz4K&V!tPBVA}ud4CIq%bSW%$9hT=4a9a;&BFDMm!s|=*z1#hkp(6kstLrLeIDrA98DK{>1Mb zAP6@y{cF9ehB$jgv8x(4Ed#_}DZ#1Z2dr&WxG1zpVDJ7+lz^n+3Fz=07&GW1A3f^R z-JF#w!80cIE-w&k(~2(N`>L5rx3P19Pi5%QW@`jKG5 z68c?p*0i|q@%@xh7G8VL)eE?0-v}*Rz5hm@#Df3xTNsWtiLwaEnnA;$8c9qIYYXv| zjeB5hbGC_Nxm0b>pA9CK2=UwHo2$RUJ! zVr&S1_-W%}l+c#HxYp1b4TFvQp62aFOi5~7n^-{e?*8gBA0( zc`?dWQFZI;zh51o*j_VJ0W%V-%vaX_w4=36?rTWG`_aM(vHrU%Hjtz~VHqSjUw5yc z-x7G^@7TW^MDjrEbe~>Bme^^pqmM}c-=eil7pNnUya?HY|B_I{JGFX9 zcefq*_cw#f|8mp+{W(XMye9KY(_eAKS4`Y`8Dh6hRYgVmQakXkJqqxq_>)`x>i!}s zAb9nEOM0z=UnoCPRe5wDo`h|(g8$#~zuH=36kapvCif6I?G+28oTyTqb*@>?YF3)5V|IE@G zn*R2<`oZk{RHIp)Oguj=bK96Ix5grPS4+Uj0%+z2q!{{~7&+Go0szJ$V12uAR5N5| zL`g+uvB7tFa9sa$O0`ZYi|>A-UFfp*Xo}_I>FB&LBbK?J(O1&+e3V9KzCBKgcP~wr zxE`HXJ@o7J=NR_HIrI{l1RnjpFb?EmagKWT?j`h=A>`kI?+zjMEU9g9NpBno4o<6Z zpa=mAC-CPu2?2~4$Rss29{@vM8SckB&oCQ>bpdv#62-Hfz~N1yII^x zELVoeC>of z0olBnkhf)JVVQ8$0k#N?#)JMq!vr#N5fezMs?}JW|1~HR1eDt0Ue7wg_L?7fo%Ck_ zA_qhdSEv)*7w@giul)zM=OMLcB z^;d85dLu|m?k6e9o;(M<3R%|CFbrh<-_yW$}*yv~uf9vjo%n&PJL-)D}ml31o+y9N~F3w5G z?*PKz^|Pnkx125!XFDvJgkeu5rUmql9ji@3aNo6w- zIv7YXnIQB(5&JxgX283*20-2u(7)=vgbpl85QEQ5M|T90=j3-_H!pzW1vy#>q`wXW6@*};@|V=7v@<)r-NMs zXf=ROfSr1vfiZaF(Ck=1uYgajQzvm6R{#F}OCSip9za_V@IOBn*vFo81&#z-&+gs! zg*}&Qd5L|QvY8B#b?YNc4$%0;`JHFs-E=N~{yv-|0RTu5*n?ksiN3b(z(%8k959w( z>7F`uiV)F-#B$TJZ(ut*z`KB@0h#y}z(D}fw$ANDM=rpLcJAKY3E(Vj*v1VTu9V0t z;1C&vIzy-^Kvcuo*%|FPalQ``b^wX`aO8~*_ZjC-fP6L$j;wib<k{ zB!lcY+LRPX$9DX9OG)HkDDh%hg02xAK7%%xpkQFMFG=bhu!zSo^M`w!fI#1ID6noa zg~mA6br}%K&~AVffralSMa3E@%L?pT$DNoK&qJ_d=uENJ0fx9uyNoNN!yuRkXHWRz zvvVAtwHO-+#s0$m@fa4L6T6FJH_$Q_Lw<{+b?qV;ov#+>cI@8G=?z;g3=FG6S(+1| zX7>ebngLx(jzvoc0H&G5UF}RvzTiCkoA0B$uV24*>-BgFmQZi%%tZn`4)TWhy&wAp z1ZK(>C(tnPE`w2n40UWBPDx*YiCBoXNwYBkHlTUUpH(0}!$i?9p zq&*8d`cQCz$~{1mfrEg75-e5%4()h;iv?N^Lug&tKy{n%-+s`(CJ zNI?IZTS1;2+WjqXEkJ_d+z@>q^>`S_vgpPH!R*rRgOXV9xOES(X0VtXy7H8`7BSw@ zMqfdtDFZ=^Xh%cH&ja?-{05T+ROCsA^&XFAG97><{|62P@LB{XiDJ_%z36+fltHh<-w@Luhs%J>|0x+6 zs7m8p6lN6IH}u%_MURDH_4@8sUwRtNX66Hi%19R(Np*UwK*vXK zE(C>!qL-sJPXBRSUkr{ZBvLR7P+8gLssL?of}!H)=ZAj8eXia17(Bg~mn<|jn?X*( zeqo@ee*wHGTDBO8dGwWegXn%3{oP(&$!FAw_=^eaIgy*3{BGI&^pZKgGV)%ovB$Sa z5Hmj9DF!QrK-Qxd9EJ-J3IX#PI(~))s6G%9?jU`@``!tAX7oyopC9PUE1=yGcluDw z*DzlbqTX?F#1~+%v60Cp&`a*k(5EI#g31q;G8PyJ=ltr*%Ew|<0WzeeZX9YDC+N$V zC2N7Q$+ueor{L$~L-WW*+#-(QekpZT<5Om?8jo zw{18D;7$CM5l$PSguFZ#U?xCjBS7dWz79ab{{_AsBt^7ZUwplm)~+k>eaWkF;5M^B zinYuIAovuvHXbf>=p+0ZybU^tM#ILA;C^s4FQNCe_m{)a(Xw9wy4ypSYv#7i`ChuD zaPs6;<;ZjIR|yW7vBl@k{3`QV^s7P_W^;33|)RC*>rzfI_*0i7B=7 zs$rVa3AC8Q7VBhvjy|RU`~pK=h$)A=_7tXoif*{tYOU6c35N9{-2l4j0kQ8n-T>wN z34mbXDbOu*0UO;@fOV62}9_9Jc~beg?g-nSgXhr(8E%=eauJK58;S z-2=)~NsNB`cJSB0w0ypaOf*&|S`gsr#V|$aVu=PHEg>47AavpW(IkoJAo4dPamLCY zc<*wEI3N^Q0wn}(#0}7B86Fl7gQxYLe6z84oQ^=R$OJ)fMC(r`I;!fHx;p`T0?cOA z{rf|etUXt}-~t-Wyau=Bux-7an%XrO*~`5D1P0 zX-D%`ggavKPtuwMeo);7kRI&EVf5cQTUs^_U|n-V9sJ0ZyvA}gimZir6W}(7Y5iwL z+xgLO4%ERM=KJySeE@U(EIScb-Ui1@w0}-1C!?F|w%y0R7IZt5AR>kl`I*VaeBQ0+ zGU2LgYOOnV#g1RDRjXv&Hm#cqFUQIjiQ|80ldmtK`S1ls0Venh*cl*4 zdSlTddtf*GlEsfnlnDyX+HVJSFFKjC{JU-?}HvX7SsgHMi-gb5;;$7gpUk=D1wC9?~WzF$`m{ zO9rk%|5q=TEbPs51n=mXa5FS?_RsUT^l6;==w-Kf9q|-+RvaK(ZTc~d<~O!vfBCX6 z=>ALegd|9}pf3RP)B`9QjqkPgV>Vnm4`^K2nScN3dfzNV^}KW{*h^~}e`RE1Dnc8U z9}z^eR=Ayz6(5^D=kRH4=I7^MUV`aH&m45c4h{}(e*5-4zCun;4r4X<58Z|^7`$Oe z5nlw6fD88;R%e@4hsgwib|Kn#$neUcB@21>r6EU=A&=&wadgA!|Gt2Zt66jd@hg9y z1`BEt`=@m8l}A~9blm3GA0RM+MeD|7K9ckd7 zAVVQKiG#lh79$abx7Qk#d3k`De7W7wN+_0FLiErfP)Pak4*Yjk+I|9nL4?ld@D^mf z66oiN*E{VB0Mdn@@F>YES6oTbL5C8X7WUjuqO${nFftccILZj)5b#cEeTz<%@Q0&~Zx91mX{>G)KTs1j8*dGIAFqBP*hKWD>ad2qTqx<2xKm zeUy;Of$t00=WulOA3vVU=W1VVa1vVz!w)tFV1@+28PGUZI1jWnhrkkgr+$rqUF-nC zU^r3YXQZ70LLH0@);c1<4<9}xU&j@(mchw2!#yGiO}>tt5S?;L;AGImyw_*Z9-qtY zw3|}zfx$y3k0Oz2B;@d#VL?I2K*vE6KB4`Xt>+ba%3(;Z%lDKEYqVUt1AeS8oI zrKt26#--ih=JKZ#inWKv5W1~3SK~jy5k(;U5{VV4o?h=lEV}t4ypR!bx^jb$hkb-- zgwHV1N?=c+efN_)J%`OfZe3aax$?as-WNbnkj)V^^kPYNz1;jxZtW%XXhB3VRR?on zj%NT{YYTV5W-{0cM6)Hdu#+zCge3zv0_H)SXASSBEn5uAyk5F7GB}p;Xf8g}9=%OI z1t#9GqZgVTp*sjTMl@Tu{zXsWPTxhH@No<>C=3iBM3M2M-?HzdzyGvoWMHSVbVp^<&3#J(RNeuv0jiPdl=#m(D|YhA*@nX@;JC zTZ}5vyBNz7q{Cv}rE}CKN0{=m{i5Go&_%L>3Jsiy`4J|rD^H4nho<>ik@CEub9{>+UpBEyDIBhrQUKLP^+kcX8R zeFW_WpCG!5fn<*v0+_YXn2Uppi-H|9MJql0a|$VIjPS)r?am;ue2X>)OFn~W_J*t! zP*3g&Pp(b0w7%bCtOQ=H$@}lI%o5^43%8@WohQ&5vK_?y6qqXPNDuEr9vN-L2$oPv z3+8*$iSQJhC}2)M!8$e0s(bJ%Dl1?47O4a1f8K(Mmx;;adoNQ~*y`zcb*6k#Xbt^)~_nP^1$>!)9oTK`$=avQVOV zOYgQHK0eE4;S%irw?WBRDkIaQxae14ZKAz5 zbr--@IA^SFXefvAMm0q8BICf|%)Iv}R6{RX97mgYKdc?@h^QvN^#A=b7|$fXVlYHA zTzpmoeFC?K>i$SE8kCh9uIXo9J+1bq$*~&xwfL<1!3~F6*BwMvNTSIsa31Sw9x&>S zTbYiaNh>^QL&J0H)7IflgTM7qpY4enXNT4e=}bF3=^yxJAB2R^6f%aD;+9y!eq~AB zJV_$nawV~v#tB6l!ee0KvB!|OjF<+>NchCh>gG1ucRHAE!Pm|ll#=pAyD0EPu*w}= zg9KkNf5e3d4M%M0EdBfs7mgH(oZTWg`hV`%paVrc4$VMaYLjCzfIJV5UrK*%evGI9 z;8KV%FMB_Ea{(}D{7kEw1pm+Q6k3!JV$Oc`*e@qgg2WrWN7A0U%(M@~^TQ-Tl(o2- z>Mpo#Xd0_?*(6y1Y4y)s7F&j5-fm_n%=;CLp^&`i6yhpjRD^peQtAY|-xTIrR%2n2B7V2p-0E>O^w{bU4ynKdd30 zV+OX|uOzv)Hx>!C=WmCL?E`0-_EYs|6!FlLKF>l=!J`D|$VY_Ow4vAo8X%RaF!fx* zsJFovppv0L?F5E0e#Z~mLY^&lYfaTa??2??bTUXlZ7{sZHQW&qj>Uh03nu7t!0LlE z-3&j5{}J9~3j>d%(FJ$J_RZ5sCTcelEyhqjEA#dw%VMHYd_#w;7F5$6w#mMn^ABv(-f;%&Ccv)F@(M(C{J?t#v;V`6q zF7TJWE6YgK++MB!je%z5)px-h5m_s-qtQGSozIBp&M>3( z-TmGmN)sX8(w%G9t|30!C*pVk@jcdbq){o;&YcJS5A*Z$^YD0K=%8B4*+*pc5S>9^ zaSK4vp`DPwd=L&uO;z>Y#qVFg9%N@nx3nLuUXy5Xb@gvvByybr#0@z1;ON=9bt@_i zP+wSpM~UJ$&YHiSmzM|Oh~Zqt54E+q2wYygfUSknjW`;756{E*;!E}P^^37M37fl+ z2Fmf_CEq)&Ye+1BlwuK}9s{8Z@CnaSH^DmNca)Ae$mEm7!u$72Q)_5yPNBF3k`|(a zufXZ=J7yl_LeSnpsO8^6hGfVBD${T_;F-@O(ey;Hj284nK?WS*7cY*ruWwD8ZVw+t zi$g&P32$5;F)fG}-9=7GGdJtwrOH7j(D%KIH6`<*6SINALvkYy|Bd?Q2FT7wpj&Pv90sKF& zZuVYGtCx zu!(q`x%lnMZ{HP;*|S(53=i#T@rws+33FUdw1=!kZMD$fwF}<_4^MW23By~bYb}dmR`Sl z(~!NR;}I#T`1rRPP_94%1WS&3>iaJmC`j77xVmok(vg?nz{qx%?M~1{>)h|(2ASH7 zYS5Fx<*CVtg=zY1vE7`x_?ExE-%;%Ryk*!ruI|_G-^c~O_#WisOv}nrd){uFuOFy@ zx+-R{-VCH-9Pj~8o6Mf>Q1#5vC{ zAkf;G1UBah(D4vtKo|+7k(QPge>y(4osZh~N7pVq{QO4tYT?~YasIWmdRW)KUZBaG z<6_>oZ|9V}L;CLPJw!gZ*pKoGy4&H{;y1*Na&nIHrFmbt;5S+JTg5?}m&{LEm53xt6Bm_qJ9vQkP_Aj-wK` z?pq$!>(g|rUxJcdOMu$b!S?tkvl7etAaUoJy#kY$8{68x zHMaEhoL0BO8P#%*A`;axlC`cb6R)q@DSLf2gU4q?&YhU&^rtRFk-X6|i62a}C*2jU1J@ZaNnK|zaCy8-&_Tyj&6)2$#HovyVOvG- z9mvz=5qNVd0XD0}Wqf3W68JfMV!{DkaF0kHIdWTQe(y?MT^&y665by?{v;{+$&+SH zKV$%}UcEBSamS8+8~vXp<)5fWci_N*E3e9)KCL!CwlpVmIbWZb{w6gU$uuq^6kBJR zi+~Z^1TGe~@6q>D!h(XLwSle&0!(OFPAF36=w~91n0Z?XF%v{_-@blbw_(F2&$jY> zw1L#8PcA7DN89%N{5DGd+{{etr%#mpF1W`)=ZH%$g9&xiI_Tk|0uu@;!=g+Ft#DU+f6-^RJmqd)cf7dHdVS6O`0Tz0p@)h4iMFxNV zBo0Vq6pfAJwKKH1A~)ZVNoryWtwK4$T3}D4vK;mB&`=Q2+#sv|e11d+Y2QrMJS+~} z>*1Z7Q#8?s6VIllt<7G#W)t}Jcghr(vZka8hp!13$A__%#;Cp z$dK9WV9jt<`5>Cdyel?epk_s?^$ZfiI1}a84-oP%- z*SA+w3yY7Bmt{kF?|KERDbAHLQ5K-+;Xq1xB?FKrhK{xkB)`sEVPR9#k2jGq4l~8GdRa+s z(KyP0AqtUYTT}&OC@>LYmpX}|R*|}LxODpm`pYgnwDB&)o&W#KX zCbf@Z@;(;swAH-R_yu6mVotC*uDa|O5Aw`A7_q=kY*z>YK-La!bbKnrJ zUZsjrWng7BK6h>>J^cW_l(c&1B+`A>8jK8n?lZ2Cz8X9YpW3+0N&H($PE9sT=EAlA E1+noDTL1t6 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_boxa_d0_13/logpower_result.txt b/analysis/matlab/variations/naive_boxa_d0_13/logpower_result.txt index 264e541..c0b8d44 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/logpower_result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d0_13 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=3, control n=8 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,134)=4.865 p(resid)=0.02911 p(Satt)=0.02918 ( honest per-animal random slope (log-day): F(1,7.9)=3.22 p=0.1109 Cohen's f (interaction, partial eta^2=0.007) = 0.083 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+8.27, ratSD=8.74, resSD=14.51) --- +--- power simulation (log-day ground truth: stim:logday=+8.265, ratSD=8.74, resSD=14.51) --- - true stim:log(day) = +8.27 (100% of observed) + true stim:log(day) = +8.265 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.21 | 0.55 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.007) = 0.083 (small; f: .10 small, .25 16 | 0.98 | 0.98 24 | 1.00 | 1.00 - true stim:log(day) = +4.13 (50% of observed) + true stim:log(day) = +4.133 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.08 | 0.17 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.007) = 0.083 (small; f: .10 small, .25 16 | 0.64 | 0.68 24 | 0.76 | 0.78 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_boxa_d0_13/logpower_result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_13/logpower_result_rate.txt new file mode 100644 index 0000000..21868f6 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=3, control n=8 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,132)=5.963 p(resid)=0.01593 p(Satt)=0.01598 (df=127) + honest per-animal random slope (log-day): F(1,8.1)=4.16 p=0.07502 +Cohen's f (interaction, partial eta^2=0.012) = 0.111 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.06399, ratSD=0.05139, resSD=0.1) --- + + true stim:log(day) = +0.06399 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.26 | 0.66 <- observed + 5 | 0.57 | 0.78 + 8 | 0.93 | 0.96 <- observed + 12 | 1.00 | 1.00 + 16 | 0.99 | 0.99 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.032 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.09 | 0.23 <- observed + 5 | 0.23 | 0.28 + 8 | 0.48 | 0.53 <- observed + 12 | 0.55 | 0.61 + 16 | 0.76 | 0.78 + 24 | 0.85 | 0.82 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_boxa_d0_13/logpowersim.m b/analysis/matlab/variations/naive_boxa_d0_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/logpowersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_13/plotcurve.m b/analysis/matlab/variations/naive_boxa_d0_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/plotcurve.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_13/power_result.txt b/analysis/matlab/variations/naive_boxa_d0_13/power_result.txt index 37e92dd..8282c2b 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/power_result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_boxa_d0_13 +POWER SIMULATION -- naive_boxa_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=3, control n=8 nrep=120, alpha=0.05 -ground truth: stim:day=+1.31/day, rat SD=8.76, residual SD=15.18, days=14 +ground truth: stim:day=+1.306/day, rat SD=8.76, residual SD=15.18, days=14 - true stim:day interaction = +1.31 (100% of observed) + true stim:day interaction = +1.306 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.32 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.31/day, rat SD=8.76, residual SD=15.18, days=14 16 | 0.95 | 0.96 24 | 0.97 | 0.98 - true stim:day interaction = +0.65 (50% of observed) + true stim:day interaction = +0.6532 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.17 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.31/day, rat SD=8.76, residual SD=15.18, days=14 16 | 0.42 | 0.51 24 | 0.62 | 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/naive_boxa_d0_13/power_result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_13/power_result_rate.txt new file mode 100644 index 0000000..9ebdf75 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_boxa_d0_13 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=8 nrep=120, alpha=0.05 +ground truth: stim:day=+0.009461/day, rat SD=0.04773, residual SD=0.1046, days=14 + + true stim:day interaction = +0.009461 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.37 <- observed + 5 | 0.40 | 0.52 + 8 | 0.70 | 0.72 <- observed + 12 | 0.96 | 0.96 + 16 | 0.97 | 0.97 + 24 | 0.99 | 0.99 + + true stim:day interaction = +0.00473 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.18 <- observed + 5 | 0.18 | 0.20 + 8 | 0.34 | 0.32 <- observed + 12 | 0.38 | 0.39 + 16 | 0.48 | 0.53 + 24 | 0.64 | 0.63 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_boxa_d0_13/powersim.m b/analysis/matlab/variations/naive_boxa_d0_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/powersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_13/result.txt b/analysis/matlab/variations/naive_boxa_d0_13/result.txt index 506fa7e..0f3226c 100644 --- a/analysis/matlab/variations/naive_boxa_d0_13/result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_boxa_d0_13 +VARIATION: naive_boxa_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(134)= 1.74 F(1)= 3.015 p=0.08481 p=0.08489 (df=129) day (learning) t(134)= 16.74 F(1)=280.201 p=1.213e-34 p=2.161e-34 (df=131) stim (main, window start) t(134)= 1.48 F(1)= 2.198 p=0.1405 p=0.1519 (df=23) -interaction 95% CI: [-0.18, +2.79] +interaction 95% CI: [-0.1817, +2.794] HONEST LME (per-animal random slope, day|rat): interaction F(1,25.3)=2.32, p=0.1403 (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.08481, slope diff=+1.31) -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.08481, slope diff=+1.306) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d0_13/result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_13/result_rate.txt new file mode 100644 index 0000000..24c125d --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_boxa_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 +control (stim=0): Electrode-Box-A, Electrode-Box-A2, Naive +N = 11 rats, 136 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 136 + Fixed effects coefficients 4 + Random effects coefficients 11 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -202.35 -184.87 107.17 -214.35 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.22695 0.026364 8.6084 132 1.9298e-14 + {'day' } 0.034099 0.0028279 12.058 132 4.9136e-23 + {'stim' } 0.061777 0.049323 1.2525 132 0.2126 + {'day:stim' } 0.009461 0.0052125 1.8151 132 0.071786 + + + Lower Upper + 0.1748 0.2791 + 0.028506 0.039693 + -0.035788 0.15934 + -0.00084987 0.019772 + +Random effects covariance parameters (95% CIs): +Group: rat (11 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.047732 + + + Lower Upper + 0.026198 0.086966 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.10455 0.092342 0.11837 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(132)= 1.82 F(1)= 3.294 p=0.07179 p=0.07185 (df=128) +day (learning) t(132)= 12.06 F(1)=145.397 p=4.914e-23 p=5.237e-23 (df=131) +stim (main, window start) t(132)= 1.25 F(1)= 1.569 p=0.2126 p=0.2207 (df=28) +interaction 95% CI: [-0.0008499, +0.01977] +HONEST LME (per-animal random slope, day|rat): interaction F(1,10.0)=2.86, p=0.1216 + (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.07179, slope diff=+0.009461) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d0_5/analyze.m b/analysis/matlab/variations/naive_boxa_d0_5/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_boxa_d0_5/analyze.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_5/learning_curve.png b/analysis/matlab/variations/naive_boxa_d0_5/learning_curve.png index c59672a1c72c151ef70b3b563afd9ded1ea8cb0b..ec2dd120b741cbf623ef9789a4892c2f9a6f71a8 100644 GIT binary patch literal 37359 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 L?nzTVe&zoF`w%93 literal 37557 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

5)E{B7D~G!^`Z4 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 B6;uEK diff --git a/analysis/matlab/variations/naive_boxa_d0_5/learning_curve_rate.png b/analysis/matlab/variations/naive_boxa_d0_5/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b3c3be72667967732ef6c7d712c55d87efe7e4 GIT binary patch literal 38133 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 z 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 oTm)-VH_nKEr99-R$rpW6!)A?(%xfj>$Y1y9?9 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/naive_boxa_d0_5/plotcurve.m b/analysis/matlab/variations/naive_boxa_d0_5/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_boxa_d0_5/plotcurve.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_5/power_result.txt b/analysis/matlab/variations/naive_boxa_d0_5/power_result.txt index 6223e39..e584fe8 100644 --- a/analysis/matlab/variations/naive_boxa_d0_5/power_result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_5/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_boxa_d0_5 +POWER SIMULATION -- naive_boxa_d0_5 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=8 nrep=120, alpha=0.05 -ground truth: stim:day=+6.40/day, rat SD=9.10, residual SD=12.48, days=6 +ground truth: stim:day=+6.403/day, rat SD=9.103, residual SD=12.48, days=6 - true stim:day interaction = +6.40 (100% of observed) + true stim:day interaction = +6.403 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.36 | 0.77 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+6.40/day, rat SD=9.10, residual SD=12.48, days=6 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +3.20 (50% of observed) + true stim:day interaction = +3.202 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.11 | 0.24 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+6.40/day, rat SD=9.10, residual SD=12.48, days=6 16 | 0.82 | 0.84 24 | 0.95 | 0.94 -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/naive_boxa_d0_5/power_result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_5/power_result_rate.txt new file mode 100644 index 0000000..72c4d9a --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_5/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_boxa_d0_5 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=8 nrep=120, alpha=0.05 +ground truth: stim:day=+0.05713/day, rat SD=0.05041, residual SD=0.09994, days=6 + + true stim:day interaction = +0.05713 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.42 | 0.85 <- observed + 5 | 0.86 | 0.96 + 8 | 1.00 | 1.00 <- observed + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.02856 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.32 <- observed + 5 | 0.32 | 0.44 + 8 | 0.57 | 0.66 <- observed + 12 | 0.74 | 0.79 + 16 | 0.89 | 0.88 + 24 | 0.97 | 0.99 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_boxa_d0_5/powersim.m b/analysis/matlab/variations/naive_boxa_d0_5/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_boxa_d0_5/powersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d0_5/result.txt b/analysis/matlab/variations/naive_boxa_d0_5/result.txt index f8f2c4c..23ba3d9 100644 --- a/analysis/matlab/variations/naive_boxa_d0_5/result.txt +++ b/analysis/matlab/variations/naive_boxa_d0_5/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_boxa_d0_5 +VARIATION: naive_boxa_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(61)= 3.15 F(1)= 9.909 p=0.002545 p=0.002679 (df=54) day (learning) t(61)= 8.14 F(1)= 66.293 p=2.506e-11 p=5.765e-11 (df=54) stim (main, window start) t(61)= 0.15 F(1)= 0.022 p=0.8814 p=0.8822 (df=24) -interaction 95% CI: [+2.34, +10.47] +interaction 95% CI: [+2.336, +10.47] HONEST LME (per-animal random slope, day|rat): interaction F(1,10.5)=5.80, p=0.03561 (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.002545, slope diff=+6.40) -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.002545, slope diff=+6.403) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d0_5/result_rate.txt b/analysis/matlab/variations/naive_boxa_d0_5/result_rate.txt new file mode 100644 index 0000000..f869ce0 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d0_5/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_boxa_d0_5 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2, Naive +N = 11 rats, 63 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 63 + Fixed effects coefficients 4 + Random effects coefficients 11 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -89.552 -76.693 50.776 -101.55 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF + {'(Intercept)'} 0.20761 0.03353 6.1919 59 + {'day' } 0.035262 0.0090474 3.8975 59 + {'stim' } -0.042773 0.060953 -0.70173 59 + {'day:stim' } 0.057126 0.016495 3.4631 59 + + + pValue Lower Upper + 6.1978e-08 0.14052 0.27471 + 0.000251 0.017158 0.053365 + 0.4856 -0.16474 0.079194 + 0.0010002 0.024119 0.090133 + +Random effects covariance parameters (95% CIs): +Group: rat (11 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.050413 + + + Lower Upper + 0.02388 0.10643 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.099938 0.082348 0.12129 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(59)= 3.46 F(1)= 11.993 p=0.001 p=0.00108 (df=52) +day (learning) t(59)= 3.90 F(1)= 15.190 p=0.000251 p=0.0002756 (df=53) +stim (main, window start) t(59)= -0.70 F(1)= 0.492 p=0.4856 p=0.4879 (df=32) +interaction 95% CI: [+0.02412, +0.09013] +HONEST LME (per-animal random slope, day|rat): interaction F(1,12.0)=9.63, p=0.009127 + (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.001, slope diff=+0.05713) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d6_10/analyze.m b/analysis/matlab/variations/naive_boxa_d6_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/analyze.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_10/learning_curve.png b/analysis/matlab/variations/naive_boxa_d6_10/learning_curve.png index 4e669288a9b0ed262b04e2a95840befbd70244aa..604d88b16f845ab989d2dcb5fddeeeb4379223b1 100644 GIT binary patch delta 17629 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_boxa_d6_10/logpower_result.txt b/analysis/matlab/variations/naive_boxa_d6_10/logpower_result.txt index 08f1714..e09ca2d 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/logpower_result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d6_10 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 @@ -10,7 +10,7 @@ stim x log(day) interaction: F(1,46)=0.613 p(resid)=0.4376 p(Satt)=0.4382 (df= honest per-animal random slope (log-day): F(1,10.0)=0.43 p=0.5247 Cohen's f (interaction, partial eta^2=0.005) = 0.069 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=-15.28, ratSD=11.24, resSD=10.10) --- +--- power simulation (log-day ground truth: stim:logday=-15.28, ratSD=11.24, resSD=10.1) --- true stim:log(day) = -15.28 (100% of observed) N/group | per-animal power | LME power @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.005) = 0.069 (small; f: .10 small, .25 16 | 0.10 | 0.11 24 | 0.13 | 0.14 -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/naive_boxa_d6_10/logpower_result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_10/logpower_result_rate.txt new file mode 100644 index 0000000..a2be137 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,46)=2.393 p(resid)=0.1287 p(Satt)=0.1297 (df=40) + honest per-animal random slope (log-day): F(1,10.0)=1.69 p=0.2224 +Cohen's f (interaction, partial eta^2=0.021) = 0.147 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=-0.1921, ratSD=0.0649, resSD=0.06429) --- + + true stim:log(day) = -0.1921 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.25 <- observed + 5 | 0.24 | 0.36 + 8 | 0.49 | 0.56 + 12 | 0.78 | 0.80 + 16 | 0.88 | 0.89 + 24 | 0.97 | 0.95 + + true stim:log(day) = -0.09607 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.09 <- observed + 5 | 0.07 | 0.12 + 8 | 0.17 | 0.21 + 12 | 0.17 | 0.17 + 16 | 0.33 | 0.37 + 24 | 0.36 | 0.38 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_boxa_d6_10/logpowersim.m b/analysis/matlab/variations/naive_boxa_d6_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/logpowersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_10/plotcurve.m b/analysis/matlab/variations/naive_boxa_d6_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/plotcurve.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_10/power_result.txt b/analysis/matlab/variations/naive_boxa_d6_10/power_result.txt index 0da438b..5bc7b7a 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/power_result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_boxa_d6_10 +POWER SIMULATION -- naive_boxa_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 -ground truth: stim:day=-1.62/day, rat SD=11.24, residual SD=10.14, days=5 +ground truth: stim:day=-1.619/day, rat SD=11.24, residual SD=10.14, days=5 - true stim:day interaction = -1.62 (100% of observed) + true stim:day interaction = -1.619 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.08 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=-1.62/day, rat SD=11.24, residual SD=10.14, days=5 16 | 0.28 | 0.30 24 | 0.41 | 0.45 - true stim:day interaction = -0.81 (50% of observed) + true stim:day interaction = -0.8095 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.03 | 0.08 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=-1.62/day, rat SD=11.24, residual SD=10.14, days=5 16 | 0.11 | 0.09 24 | 0.12 | 0.13 -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/naive_boxa_d6_10/power_result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_10/power_result_rate.txt new file mode 100644 index 0000000..b58db33 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_boxa_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 +ground truth: stim:day=-0.02112/day, rat SD=0.06482, residual SD=0.06465, days=5 + + true stim:day interaction = -0.02112 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.10 | 0.23 <- observed + 5 | 0.21 | 0.33 + 8 | 0.47 | 0.53 + 12 | 0.73 | 0.78 + 16 | 0.87 | 0.87 + 24 | 0.93 | 0.93 + + true stim:day interaction = -0.01056 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.10 <- observed + 5 | 0.07 | 0.11 + 8 | 0.16 | 0.21 + 12 | 0.15 | 0.17 + 16 | 0.32 | 0.38 + 24 | 0.33 | 0.35 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_boxa_d6_10/powersim.m b/analysis/matlab/variations/naive_boxa_d6_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/powersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_10/result.txt b/analysis/matlab/variations/naive_boxa_d6_10/result.txt index d33c85c..f918c3a 100644 --- a/analysis/matlab/variations/naive_boxa_d6_10/result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_boxa_d6_10 +VARIATION: naive_boxa_d6_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(46)= -0.73 F(1)= 0.535 p=0.4682 p=0.4687 (df=40) day (learning) t(46)= 4.77 F(1)= 22.779 p=1.877e-05 p=2.436e-05 (df=40) stim (main, window start) t(46)= 2.54 F(1)= 6.429 p=0.01469 p=0.02198 (df=16) -interaction 95% CI: [-6.07, +2.84] +interaction 95% CI: [-6.074, +2.836] HONEST LME (per-animal random slope, day|rat): interaction F(1,10.0)=0.41, p=0.5344 (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.4682, slope diff=-1.62) -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.4682, slope diff=-1.619) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d6_10/result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_10/result_rate.txt new file mode 100644 index 0000000..cd9fa18 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_boxa_d6_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A, Electrode-Box-A2, Naive +N = 10 rats, 50 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 50 + Fixed effects coefficients 4 + Random effects coefficients 10 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -102.02 -90.545 57.008 -114.02 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.4775 0.030961 15.422 46 8.4559e-20 + {'day' } 0.033319 0.0077275 4.3117 46 8.4717e-05 + {'stim' } 0.1661 0.056527 2.9385 46 0.0051416 + {'day:stim' } -0.021119 0.014108 -1.4969 46 0.14124 + + + Lower Upper + 0.41518 0.53982 + 0.017764 0.048873 + 0.052321 0.27989 + -0.049518 0.0072795 + +Random effects covariance parameters (95% CIs): +Group: rat (10 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.064825 + + + Lower Upper + 0.038261 0.10983 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.064653 0.05193 0.080492 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(46)= -1.50 F(1)= 2.241 p=0.1412 p=0.1423 (df=40) +day (learning) t(46)= 4.31 F(1)= 18.591 p=8.472e-05 p=0.0001028 (df=40) +stim (main, window start) t(46)= 2.94 F(1)= 8.635 p=0.005142 p=0.009071 (df=17) +interaction 95% CI: [-0.04952, +0.00728] +HONEST LME (per-animal random slope, day|rat): interaction F(1,10.0)=1.71, p=0.2198 + (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.1412, slope diff=-0.02112) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d6_13/analyze.m b/analysis/matlab/variations/naive_boxa_d6_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/analyze.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_13/learning_curve.png b/analysis/matlab/variations/naive_boxa_d6_13/learning_curve.png index 01ba17f4ab8bf5491035aad28d579d3b91f8afad..480a1eed06d6dcb33503768af4ac06a7b9277372 100644 GIT binary patch literal 40747 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

o>+LsG^@aMm> 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 literal 40740 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_boxa_d6_13/logpower_result.txt b/analysis/matlab/variations/naive_boxa_d6_13/logpower_result.txt index 25c42f8..71ba4a8 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/logpower_result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_d6_13 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=3, control n=7 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,69)=0.239 p(resid)=0.6263 p(Satt)=0.6264 (df= honest per-animal random slope (log-day): F(1,9.1)=0.07 p=0.8013 Cohen's f (interaction, partial eta^2=0.001) = 0.034 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+6.70, ratSD=10.78, resSD=11.38) --- +--- power simulation (log-day ground truth: stim:logday=+6.701, ratSD=10.78, resSD=11.38) --- - true stim:log(day) = +6.70 (100% of observed) + true stim:log(day) = +6.701 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.07 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.001) = 0.034 (small; f: .10 small, .25 16 | 0.06 | 0.07 24 | 0.12 | 0.11 -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/naive_boxa_d6_13/logpower_result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_13/logpower_result_rate.txt new file mode 100644 index 0000000..98940c6 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_boxa_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=3, control n=7 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,69)=0.000 p(resid)=0.9874 p(Satt)=0.9874 (df=65) + honest per-animal random slope (log-day): F(1,8.6)=0.03 p=0.8653 +Cohen's f (interaction, partial eta^2=0.000) = 0.000 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.001382, ratSD=0.06213, resSD=0.07275) --- + + true stim:log(day) = +0.001382 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.06 <- observed + 5 | 0.08 | 0.07 + 8 | 0.01 | 0.02 + 12 | 0.03 | 0.05 + 16 | 0.05 | 0.07 + 24 | 0.02 | 0.03 + + true stim:log(day) = +0.0006912 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.04 | 0.06 <- observed + 5 | 0.04 | 0.04 + 8 | 0.08 | 0.04 + 12 | 0.05 | 0.04 + 16 | 0.05 | 0.04 + 24 | 0.05 | 0.04 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_boxa_d6_13/logpowersim.m b/analysis/matlab/variations/naive_boxa_d6_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/logpowersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_13/plotcurve.m b/analysis/matlab/variations/naive_boxa_d6_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/plotcurve.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_13/power_result.txt b/analysis/matlab/variations/naive_boxa_d6_13/power_result.txt index f391e92..40d1ec7 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/power_result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_boxa_d6_13 +POWER SIMULATION -- naive_boxa_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=3, control n=7 nrep=120, alpha=0.05 -ground truth: stim:day=+0.87/day, rat SD=10.75, residual SD=11.53, days=8 +ground truth: stim:day=+0.8737/day, rat SD=10.75, residual SD=11.53, days=8 - true stim:day interaction = +0.87 (100% of observed) + true stim:day interaction = +0.8737 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.11 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+0.87/day, rat SD=10.75, residual SD=11.53, days=8 16 | 0.28 | 0.33 24 | 0.38 | 0.41 - true stim:day interaction = +0.44 (50% of observed) + true stim:day interaction = +0.4368 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.06 | 0.10 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+0.87/day, rat SD=10.75, residual SD=11.53, days=8 16 | 0.07 | 0.07 24 | 0.16 | 0.15 -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/naive_boxa_d6_13/power_result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_13/power_result_rate.txt new file mode 100644 index 0000000..d8f2f16 --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_boxa_d6_13 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 +ground truth: stim:day=+0.001651/day, rat SD=0.06197, residual SD=0.07346, days=8 + + true stim:day interaction = +0.001651 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.04 <- observed + 5 | 0.10 | 0.08 + 8 | 0.05 | 0.03 + 12 | 0.04 | 0.05 + 16 | 0.06 | 0.07 + 24 | 0.03 | 0.06 + + true stim:day interaction = +0.0008253 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.07 <- observed + 5 | 0.04 | 0.06 + 8 | 0.07 | 0.05 + 12 | 0.03 | 0.05 + 16 | 0.03 | 0.05 + 24 | 0.07 | 0.07 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_boxa_d6_13/powersim.m b/analysis/matlab/variations/naive_boxa_d6_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/powersim.m +++ b/analysis/matlab/variations/naive_boxa_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/naive_boxa_d6_13/result.txt b/analysis/matlab/variations/naive_boxa_d6_13/result.txt index 869fbd6..ce8141f 100644 --- a/analysis/matlab/variations/naive_boxa_d6_13/result.txt +++ b/analysis/matlab/variations/naive_boxa_d6_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_boxa_d6_13 +VARIATION: naive_boxa_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(69)= 0.63 F(1)= 0.397 p=0.5308 p=0.5309 (df=65) day (learning) t(69)= 4.26 F(1)= 18.109 p=6.446e-05 p=6.931e-05 (df=64) stim (main, window start) t(69)= 2.21 F(1)= 4.886 p=0.03039 p=0.0412 (df=17) -interaction 95% CI: [-1.89, +3.64] +interaction 95% CI: [-1.893, +3.641] HONEST LME (per-animal random slope, day|rat): interaction F(1,8.5)=0.16, p=0.6966 (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.5308, slope diff=+0.87) -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.5308, slope diff=+0.8737) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_boxa_d6_13/result_rate.txt b/analysis/matlab/variations/naive_boxa_d6_13/result_rate.txt new file mode 100644 index 0000000..db3fcde --- /dev/null +++ b/analysis/matlab/variations/naive_boxa_d6_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_boxa_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 +control (stim=0): Electrode-Box-A, Electrode-Box-A2, Naive +N = 10 rats, 73 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 73 + Fixed effects coefficients 4 + Random effects coefficients 10 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -143.92 -130.17 77.958 -155.92 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.50639 0.029658 17.074 69 1.7857e-26 + {'day' } 0.013881 0.0046444 2.9887 69 0.0038784 + {'stim' } 0.13179 0.05426 2.4289 69 0.017756 + {'day:stim' } 0.0016506 0.0088296 0.18693 69 0.85226 + + + Lower Upper + 0.44722 0.56555 + 0.0046157 0.023146 + 0.023544 0.24004 + -0.015964 0.019265 + +Random effects covariance parameters (95% CIs): +Group: rat (10 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.061972 + + + Lower Upper + 0.036939 0.10397 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.073458 0.061716 0.087434 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(69)= 0.19 F(1)= 0.035 p=0.8523 p=0.8523 (df=65) +day (learning) t(69)= 2.99 F(1)= 8.933 p=0.003878 p=0.003964 (df=64) +stim (main, window start) t(69)= 2.43 F(1)= 5.899 p=0.01776 p=0.02572 (df=18) +interaction 95% CI: [-0.01596, +0.01927] +HONEST LME (per-animal random slope, day|rat): interaction F(1,8.1)=0.00, p=0.9836 + (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.8523, slope diff=+0.001651) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/prev_f_full/analyze.m b/analysis/matlab/variations/prev_f_full/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/prev_f_full/analyze.m +++ b/analysis/matlab/variations/prev_f_full/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/prev_f_full/learning_curve.png b/analysis/matlab/variations/prev_f_full/learning_curve.png index 5b7419f433b8de782f42b41cea76f6922f3dea9d..7971adbddf295881b7d7aadf616d7e15bd92b4bb 100644 GIT binary patch literal 39673 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

fi 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 DG7IJ8 diff --git a/analysis/matlab/variations/prev_f_full/learning_curve_rate.png b/analysis/matlab/variations/prev_f_full/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6ddf19df01271f13cc177b7c166f247702fcb5 GIT binary patch literal 40682 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/prev_f_full/logpower_result.txt b/analysis/matlab/variations/prev_f_full/logpower_result.txt index 2cac7ea..cc0652b 100644 --- a/analysis/matlab/variations/prev_f_full/logpower_result.txt +++ b/analysis/matlab/variations/prev_f_full/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- prev_f_full +LOG-DAY MODEL + COHEN'S f + POWER -- prev_f_full [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=12, control n=12 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,227)=8.356 p(resid)=0.004218 p(Satt)=0.004253 honest per-animal random slope (log-day): F(1,24.3)=3.32 p=0.08079 Cohen's f (interaction, partial eta^2=0.012) = 0.112 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+2.39, ratSD=4.33, resSD=4.34) --- +--- power simulation (log-day ground truth: stim:logday=+2.389, ratSD=4.328, resSD=4.338) --- - true stim:log(day) = +2.39 (100% of observed) + true stim:log(day) = +2.389 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.15 | 0.28 @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.012) = 0.112 (small-medium; f: .10 smal 16 | 0.92 | 0.94 24 | 0.99 | 0.98 - true stim:log(day) = +1.19 (50% of observed) + true stim:log(day) = +1.195 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.09 @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.012) = 0.112 (small-medium; f: .10 smal 16 | 0.46 | 0.49 24 | 0.46 | 0.49 -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/prev_f_full/logpower_result_rate.txt b/analysis/matlab/variations/prev_f_full/logpower_result_rate.txt new file mode 100644 index 0000000..9156a86 --- /dev/null +++ b/analysis/matlab/variations/prev_f_full/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- prev_f_full [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=12, control n=12 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,227)=2.888 p(resid)=0.0906 p(Satt)=0.09072 (df=208) + honest per-animal random slope (log-day): F(1,23.7)=2.05 p=0.1655 +Cohen's f (interaction, partial eta^2=0.006) = 0.079 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.02595, ratSD=0.06838, resSD=0.08017) --- + + true stim:log(day) = +0.02595 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.06 | 0.07 + 5 | 0.17 | 0.18 + 8 | 0.33 | 0.38 + 12 | 0.38 | 0.47 <- observed + 16 | 0.55 | 0.62 + 24 | 0.64 | 0.60 + + true stim:log(day) = +0.01298 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.04 | 0.04 + 5 | 0.07 | 0.11 + 8 | 0.10 | 0.12 + 12 | 0.17 | 0.17 <- observed + 16 | 0.10 | 0.15 + 24 | 0.15 | 0.17 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/prev_f_full/logpowersim.m b/analysis/matlab/variations/prev_f_full/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/prev_f_full/logpowersim.m +++ b/analysis/matlab/variations/prev_f_full/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/prev_f_full/plotcurve.m b/analysis/matlab/variations/prev_f_full/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/prev_f_full/plotcurve.m +++ b/analysis/matlab/variations/prev_f_full/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/prev_f_full/power_result.txt b/analysis/matlab/variations/prev_f_full/power_result.txt index 9368d88..91f2c44 100644 --- a/analysis/matlab/variations/prev_f_full/power_result.txt +++ b/analysis/matlab/variations/prev_f_full/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- prev_f_full +POWER SIMULATION -- prev_f_full [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=12, control n=12 nrep=120, alpha=0.05 -ground truth: stim:day=+0.56/day, rat SD=4.32, residual SD=4.49, days=10 +ground truth: stim:day=+0.5602/day, rat SD=4.316, residual SD=4.489, days=10 - true stim:day interaction = +0.56 (100% of observed) + true stim:day interaction = +0.5602 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.13 | 0.27 @@ -15,7 +15,7 @@ ground truth: stim:day=+0.56/day, rat SD=4.32, residual SD=4.49, days=10 16 | 0.91 | 0.93 24 | 0.98 | 0.98 - true stim:day interaction = +0.28 (50% of observed) + true stim:day interaction = +0.2801 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.04 | 0.07 @@ -25,5 +25,4 @@ ground truth: stim:day=+0.56/day, rat SD=4.32, residual SD=4.49, days=10 16 | 0.33 | 0.37 24 | 0.45 | 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/prev_f_full/power_result_rate.txt b/analysis/matlab/variations/prev_f_full/power_result_rate.txt new file mode 100644 index 0000000..8970c48 --- /dev/null +++ b/analysis/matlab/variations/prev_f_full/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- prev_f_full [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=12, control n=12 nrep=120, alpha=0.05 +ground truth: stim:day=+0.006292/day, rat SD=0.06824, residual SD=0.08152, days=10 + + true stim:day interaction = +0.006292 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.06 | 0.09 + 5 | 0.17 | 0.16 + 8 | 0.28 | 0.35 + 12 | 0.37 | 0.41 <- observed + 16 | 0.55 | 0.62 + 24 | 0.62 | 0.62 + + true stim:day interaction = +0.003146 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.04 + 5 | 0.07 | 0.05 + 8 | 0.12 | 0.15 + 12 | 0.17 | 0.18 <- observed + 16 | 0.12 | 0.17 + 24 | 0.15 | 0.13 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/prev_f_full/powersim.m b/analysis/matlab/variations/prev_f_full/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/prev_f_full/powersim.m +++ b/analysis/matlab/variations/prev_f_full/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/prev_f_full/result.txt b/analysis/matlab/variations/prev_f_full/result.txt index 0383c95..3b0d61b 100644 --- a/analysis/matlab/variations/prev_f_full/result.txt +++ b/analysis/matlab/variations/prev_f_full/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: prev_f_full +VARIATION: prev_f_full [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(227)= 2.66 F(1)= 7.088 p=0.008315 p=0.008365 (df=208) day (learning) t(227)= 8.94 F(1)= 79.838 p=1.43e-16 p=2.16e-16 (df=209) stim (main, window start) t(227)= 0.92 F(1)= 0.839 p=0.3606 p=0.3656 (df=37) -interaction 95% CI: [+0.15, +0.97] +interaction 95% CI: [+0.1456, +0.9749] HONEST LME (per-animal random slope, day|rat): interaction F(1,24.0)=3.01, p=0.09541 (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.008315, slope diff=+0.56) -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.008315, slope diff=+0.5602) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/prev_f_full/result_rate.txt b/analysis/matlab/variations/prev_f_full/result_rate.txt new file mode 100644 index 0000000..1ef97a5 --- /dev/null +++ b/analysis/matlab/variations/prev_f_full/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: prev_f_full [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): b2_f +control (stim=0): a2_f +N = 24 rats, 231 sessions raw day coverage: treat 0..9, control 0..9 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 231 + Fixed effects coefficients 4 + Random effects coefficients 24 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -441.62 -420.96 226.81 -453.62 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.25306 0.024155 10.477 227 3.3213e-21 + {'day' } 0.017111 0.0027396 6.246 227 2.0536e-09 + {'stim' } 0.040889 0.034129 1.1981 227 0.23214 + {'day:stim' } 0.006292 0.0038198 1.6472 227 0.1009 + + + Lower Upper + 0.20547 0.30066 + 0.011713 0.02251 + -0.026361 0.10814 + -0.0012348 0.013819 + +Random effects covariance parameters (95% CIs): +Group: rat (24 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.06824 + + + Lower Upper + 0.049364 0.094332 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.081522 0.07404 0.08976 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(227)= 1.65 F(1)= 2.713 p=0.1009 p=0.101 (df=209) +day (learning) t(227)= 6.25 F(1)= 39.012 p=2.054e-09 p=2.316e-09 (df=209) +stim (main, window start) t(227)= 1.20 F(1)= 1.435 p=0.2321 p=0.2378 (df=41) +interaction 95% CI: [-0.001235, +0.01382] +HONEST LME (per-animal random slope, day|rat): interaction F(1,22.9)=1.78, p=0.1956 + (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.1009, slope diff=+0.006292) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.