From 6ba21a1a358b5520e85a599ff2207317a6d0136b 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 2 Co-Authored-By: Claude Opus 4.8 --- .../variations/matched_current_d0_3/analyze.m | 102 +++++++++++------- .../matched_current_d0_3/learning_curve.png | Bin 36306 -> 36231 bytes .../learning_curve_rate.png | Bin 0 -> 38888 bytes .../matched_current_d0_3/logpower_result.txt | 11 +- .../logpower_result_rate.txt | 35 ++++++ .../matched_current_d0_3/logpowersim.m | 77 +++++++------ .../matched_current_d0_3/plotcurve.m | 50 +++++---- .../matched_current_d0_3/power_result.txt | 13 ++- .../power_result_rate.txt | 28 +++++ .../matched_current_d0_3/powersim.m | 69 ++++++------ .../matched_current_d0_3/result.txt | 8 +- .../matched_current_d0_3/result_rate.txt | 68 ++++++++++++ .../variations/naive_a2_d0_10/analyze.m | 102 +++++++++++------- .../naive_a2_d0_10/learning_curve.png | Bin 41673 -> 41673 bytes .../naive_a2_d0_10/learning_curve_rate.png | Bin 0 -> 42499 bytes .../naive_a2_d0_10/logpower_result.txt | 13 ++- .../naive_a2_d0_10/logpower_result_rate.txt | 35 ++++++ .../variations/naive_a2_d0_10/logpowersim.m | 77 +++++++------ .../variations/naive_a2_d0_10/plotcurve.m | 50 +++++---- .../naive_a2_d0_10/power_result.txt | 13 ++- .../naive_a2_d0_10/power_result_rate.txt | 28 +++++ .../variations/naive_a2_d0_10/powersim.m | 69 ++++++------ .../variations/naive_a2_d0_10/result.txt | 8 +- .../variations/naive_a2_d0_10/result_rate.txt | 68 ++++++++++++ .../variations/naive_a2_d0_13/analyze.m | 102 +++++++++++------- .../naive_a2_d0_13/learning_curve.png | Bin 43341 -> 43341 bytes .../naive_a2_d0_13/learning_curve_rate.png | Bin 0 -> 40417 bytes .../naive_a2_d0_13/logpower_result.txt | 13 ++- .../naive_a2_d0_13/logpower_result_rate.txt | 35 ++++++ .../variations/naive_a2_d0_13/logpowersim.m | 77 +++++++------ .../variations/naive_a2_d0_13/plotcurve.m | 50 +++++---- .../naive_a2_d0_13/power_result.txt | 13 ++- .../naive_a2_d0_13/power_result_rate.txt | 28 +++++ .../variations/naive_a2_d0_13/powersim.m | 69 ++++++------ .../variations/naive_a2_d0_13/result.txt | 8 +- .../variations/naive_a2_d0_13/result_rate.txt | 68 ++++++++++++ .../matlab/variations/naive_a2_d0_5/analyze.m | 102 +++++++++++------- .../naive_a2_d0_5/learning_curve.png | Bin 36164 -> 35985 bytes .../naive_a2_d0_5/learning_curve_rate.png | Bin 0 -> 37001 bytes .../naive_a2_d0_5/logpower_result.txt | 11 +- .../naive_a2_d0_5/logpower_result_rate.txt | 35 ++++++ .../variations/naive_a2_d0_5/logpowersim.m | 77 +++++++------ .../variations/naive_a2_d0_5/plotcurve.m | 50 +++++---- .../variations/naive_a2_d0_5/power_result.txt | 13 ++- .../naive_a2_d0_5/power_result_rate.txt | 28 +++++ .../variations/naive_a2_d0_5/powersim.m | 69 ++++++------ .../variations/naive_a2_d0_5/result.txt | 8 +- .../variations/naive_a2_d0_5/result_rate.txt | 68 ++++++++++++ .../variations/naive_a2_d6_10/analyze.m | 102 +++++++++++------- .../naive_a2_d6_10/learning_curve.png | Bin 36347 -> 36422 bytes .../naive_a2_d6_10/learning_curve_rate.png | Bin 0 -> 36012 bytes .../naive_a2_d6_10/logpower_result.txt | 9 +- .../naive_a2_d6_10/logpower_result_rate.txt | 35 ++++++ .../variations/naive_a2_d6_10/logpowersim.m | 77 +++++++------ .../variations/naive_a2_d6_10/plotcurve.m | 50 +++++---- .../naive_a2_d6_10/power_result.txt | 13 ++- .../naive_a2_d6_10/power_result_rate.txt | 28 +++++ .../variations/naive_a2_d6_10/powersim.m | 69 ++++++------ .../variations/naive_a2_d6_10/result.txt | 8 +- .../variations/naive_a2_d6_10/result_rate.txt | 68 ++++++++++++ .../variations/naive_a2_d6_13/analyze.m | 102 +++++++++++------- .../naive_a2_d6_13/learning_curve.png | Bin 40520 -> 40462 bytes .../naive_a2_d6_13/learning_curve_rate.png | Bin 0 -> 40074 bytes .../naive_a2_d6_13/logpower_result.txt | 13 ++- .../naive_a2_d6_13/logpower_result_rate.txt | 35 ++++++ .../variations/naive_a2_d6_13/logpowersim.m | 77 +++++++------ .../variations/naive_a2_d6_13/plotcurve.m | 50 +++++---- .../naive_a2_d6_13/power_result.txt | 13 ++- .../naive_a2_d6_13/power_result_rate.txt | 28 +++++ .../variations/naive_a2_d6_13/powersim.m | 69 ++++++------ .../variations/naive_a2_d6_13/result.txt | 8 +- .../variations/naive_a2_d6_13/result_rate.txt | 68 ++++++++++++ 72 files changed, 1874 insertions(+), 896 deletions(-) create mode 100644 analysis/matlab/variations/matched_current_d0_3/learning_curve_rate.png create mode 100644 analysis/matlab/variations/matched_current_d0_3/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/matched_current_d0_3/power_result_rate.txt create mode 100644 analysis/matlab/variations/matched_current_d0_3/result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_a2_d0_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_10/result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_a2_d0_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_13/result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_5/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_a2_d0_5/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_5/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d0_5/result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_10/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_a2_d6_10/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_10/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_10/result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_13/learning_curve_rate.png create mode 100644 analysis/matlab/variations/naive_a2_d6_13/logpower_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_13/power_result_rate.txt create mode 100644 analysis/matlab/variations/naive_a2_d6_13/result_rate.txt diff --git a/analysis/matlab/variations/matched_current_d0_3/analyze.m b/analysis/matlab/variations/matched_current_d0_3/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/matched_current_d0_3/analyze.m +++ b/analysis/matlab/variations/matched_current_d0_3/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/matched_current_d0_3/learning_curve.png b/analysis/matlab/variations/matched_current_d0_3/learning_curve.png index ff1a27d7f9eff689bc628462f445c4fa2833a2b5..04c2af3f07316db776c5de2881259d772d3527b0 100644 GIT binary patch literal 36231 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 !#m(r39?sb? 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 DnPvV@ literal 36306 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 diff --git a/analysis/matlab/variations/matched_current_d0_3/learning_curve_rate.png b/analysis/matlab/variations/matched_current_d0_3/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..81a1872e707eb89dba11ff8e4b44d80697a324a8 GIT binary patch literal 38888 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 Nwt1(~gH3z?{%_CE6cGRb literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/matched_current_d0_3/logpower_result.txt b/analysis/matlab/variations/matched_current_d0_3/logpower_result.txt index 00090ba..9ede5ad 100644 --- a/analysis/matlab/variations/matched_current_d0_3/logpower_result.txt +++ b/analysis/matlab/variations/matched_current_d0_3/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- matched_current_d0_3 +LOG-DAY MODEL + COHEN'S f + POWER -- matched_current_d0_3 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 @@ -10,7 +10,7 @@ stim x log(day) interaction: F(1,20)=7.043 p(resid)=0.01524 p(Satt)=0.0139 (df honest per-animal random slope (log-day): F(1,18.5)=7.24 p=0.01475 Cohen's f (interaction, partial eta^2=0.102) = 0.336 (medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+20.79, ratSD=0.00, resSD=9.99) --- +--- power simulation (log-day ground truth: stim:logday=+20.79, ratSD=0, resSD=9.991) --- true stim:log(day) = +20.79 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.102) = 0.336 (medium; f: .10 small, .25 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +10.40 (50% of observed) + true stim:log(day) = +10.4 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.11 | 0.23 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.102) = 0.336 (medium; f: .10 small, .25 16 | 0.79 | 0.84 24 | 0.95 | 0.97 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/matched_current_d0_3/logpower_result_rate.txt b/analysis/matlab/variations/matched_current_d0_3/logpower_result_rate.txt new file mode 100644 index 0000000..4e180af --- /dev/null +++ b/analysis/matlab/variations/matched_current_d0_3/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- matched_current_d0_3 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,20)=7.974 p(resid)=0.01049 p(Satt)=0.01125 (df=18) + honest per-animal random slope (log-day): F(1,18.3)=7.99 p=0.01106 +Cohen's f (interaction, partial eta^2=0.157) = 0.431 (large; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.1785, ratSD=0.01747, resSD=0.08062) --- + + true stim:log(day) = +0.1785 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.42 | 0.82 <- observed + 5 | 0.88 | 0.95 + 8 | 1.00 | 0.99 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.08926 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.26 <- observed + 5 | 0.39 | 0.50 + 8 | 0.53 | 0.63 + 12 | 0.82 | 0.82 + 16 | 0.87 | 0.90 + 24 | 0.97 | 0.98 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/matched_current_d0_3/logpowersim.m b/analysis/matlab/variations/matched_current_d0_3/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/matched_current_d0_3/logpowersim.m +++ b/analysis/matlab/variations/matched_current_d0_3/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/matched_current_d0_3/plotcurve.m b/analysis/matlab/variations/matched_current_d0_3/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/matched_current_d0_3/plotcurve.m +++ b/analysis/matlab/variations/matched_current_d0_3/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/matched_current_d0_3/power_result.txt b/analysis/matlab/variations/matched_current_d0_3/power_result.txt index 1ec16ec..86ec573 100644 --- a/analysis/matlab/variations/matched_current_d0_3/power_result.txt +++ b/analysis/matlab/variations/matched_current_d0_3/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- matched_current_d0_3 +POWER SIMULATION -- matched_current_d0_3 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 -ground truth: stim:day=+10.20/day, rat SD=2.92, residual SD=8.54, days=4 +ground truth: stim:day=+10.2/day, rat SD=2.916, residual SD=8.54, days=4 - true stim:day interaction = +10.20 (100% of observed) + true stim:day interaction = +10.2 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.55 | 0.91 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+10.20/day, rat SD=2.92, residual SD=8.54, days=4 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +5.10 (50% of observed) + true stim:day interaction = +5.1 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.11 | 0.33 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+10.20/day, rat SD=2.92, residual SD=8.54, days=4 16 | 0.97 | 0.97 24 | 1.00 | 1.00 -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/matched_current_d0_3/power_result_rate.txt b/analysis/matlab/variations/matched_current_d0_3/power_result_rate.txt new file mode 100644 index 0000000..f0dee6a --- /dev/null +++ b/analysis/matlab/variations/matched_current_d0_3/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- matched_current_d0_3 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=3 nrep=120, alpha=0.05 +ground truth: stim:day=+0.07723/day, rat SD=0.01983, residual SD=0.07841, days=4 + + true stim:day interaction = +0.07723 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.39 | 0.78 <- observed + 5 | 0.86 | 0.94 + 8 | 0.98 | 0.99 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.03861 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.07 | 0.21 <- observed + 5 | 0.35 | 0.47 + 8 | 0.53 | 0.62 + 12 | 0.78 | 0.79 + 16 | 0.82 | 0.87 + 24 | 0.97 | 0.97 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/matched_current_d0_3/powersim.m b/analysis/matlab/variations/matched_current_d0_3/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/matched_current_d0_3/powersim.m +++ b/analysis/matlab/variations/matched_current_d0_3/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/matched_current_d0_3/result.txt b/analysis/matlab/variations/matched_current_d0_3/result.txt index 1eefca1..6a20a91 100644 --- a/analysis/matlab/variations/matched_current_d0_3/result.txt +++ b/analysis/matlab/variations/matched_current_d0_3/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: matched_current_d0_3 +VARIATION: matched_current_d0_3 [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(20)= 3.27 F(1)= 10.700 p=0.003822 p=0.004244 (df=18) day (learning) t(20)= 2.89 F(1)= 8.337 p=0.009105 p=0.009807 (df=18) stim (main, window start) t(20)= -1.42 F(1)= 2.025 p=0.1701 p=0.1703 (df=20) -interaction 95% CI: [+3.70, +16.70] +interaction 95% CI: [+3.695, +16.7] HONEST LME (per-animal random slope, day|rat): interaction F(1,9.8)=9.76, p=0.01107 (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.003822, slope diff=+10.20) -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.003822, slope diff=+10.2) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/matched_current_d0_3/result_rate.txt b/analysis/matlab/variations/matched_current_d0_3/result_rate.txt new file mode 100644 index 0000000..9666498 --- /dev/null +++ b/analysis/matlab/variations/matched_current_d0_3/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: matched_current_d0_3 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A2 +N = 6 rats, 24 sessions raw day coverage: treat 0..3, control 0..3 +(equal day coverage over this window) + +============================================================================== +FULL MODEL SUMMARY -- fitlme +============================================================================== + +Linear mixed-effects model fit by ML + +Model information: + Number of observations 24 + Fixed effects coefficients 4 + Random effects coefficients 6 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -40.724 -33.656 26.362 -52.724 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.23952 0.039567 6.0535 20 6.443e-06 + {'day' } 0.027914 0.020245 1.3788 20 0.18317 + {'stim' } -0.089781 0.055956 -1.6045 20 0.12428 + {'day:stim' } 0.077228 0.02863 2.6974 20 0.013857 + + + Lower Upper + 0.15698 0.32205 + -0.014316 0.070144 + -0.2065 0.026941 + 0.017506 0.13695 + +Random effects covariance parameters (95% CIs): +Group: rat (6 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.019829 + + + Lower Upper + 0.00093276 0.42155 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.078408 0.056558 0.1087 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(20)= 2.70 F(1)= 7.276 p=0.01386 p=0.01473 (df=18) +day (learning) t(20)= 1.38 F(1)= 1.901 p=0.1832 p=0.1848 (df=18) +stim (main, window start) t(20)= -1.60 F(1)= 2.574 p=0.1243 p=0.1235 (df=21) +interaction 95% CI: [+0.01751, +0.1369] +HONEST LME (per-animal random slope, day|rat): interaction F(1,18.0)=7.28, p=0.01473 + (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.01386, slope diff=+0.07723) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_10/analyze.m b/analysis/matlab/variations/naive_a2_d0_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/analyze.m +++ b/analysis/matlab/variations/naive_a2_d0_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/naive_a2_d0_10/learning_curve.png b/analysis/matlab/variations/naive_a2_d0_10/learning_curve.png index 427a9498d43239b3445d047eea66a48c9a0cacf0..456dcfa1c835d317e80a8e5a042e33153fd623da 100644 GIT binary patch delta 32 ocmX?klc;jF3VSAchH@HPTA3OiZ2b9R<8q}%0MFqKN&o-= delta 32 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 BJ)Qsn literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_a2_d0_10/logpower_result.txt b/analysis/matlab/variations/naive_a2_d0_10/logpower_result.txt index 5d48bf7..f6617ad 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/logpower_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_10 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,100)=4.633 p(resid)=0.03378 p(Satt)=0.03391 ( honest per-animal random slope (log-day): F(1,7.2)=2.24 p=0.177 Cohen's f (interaction, partial eta^2=0.010) = 0.101 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+9.59, ratSD=8.17, resSD=14.84) --- +--- power simulation (log-day ground truth: stim:logday=+9.586, ratSD=8.17, resSD=14.84) --- - true stim:log(day) = +9.59 (100% of observed) + true stim:log(day) = +9.586 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.23 | 0.44 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.010) = 0.101 (small-medium; f: .10 smal 16 | 0.99 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +4.79 (50% of observed) + true stim:log(day) = +4.793 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.10 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.010) = 0.101 (small-medium; f: .10 smal 16 | 0.62 | 0.64 24 | 0.75 | 0.78 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d0_10/logpower_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_10/logpower_result_rate.txt new file mode 100644 index 0000000..a1547d8 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,98)=6.255 p(resid)=0.01404 p(Satt)=0.01413 (df=93) + honest per-animal random slope (log-day): F(1,6.5)=3.64 p=0.1012 +Cohen's f (interaction, partial eta^2=0.019) = 0.138 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.07796, ratSD=0.04949, resSD=0.1018) --- + + true stim:log(day) = +0.07796 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.25 | 0.57 <- observed + 5 | 0.71 | 0.84 + 8 | 0.92 | 0.95 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.03898 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.09 | 0.15 <- observed + 5 | 0.14 | 0.26 + 8 | 0.41 | 0.46 + 12 | 0.52 | 0.56 + 16 | 0.78 | 0.78 + 24 | 0.88 | 0.89 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d0_10/logpowersim.m b/analysis/matlab/variations/naive_a2_d0_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/logpowersim.m +++ b/analysis/matlab/variations/naive_a2_d0_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d0_10/plotcurve.m b/analysis/matlab/variations/naive_a2_d0_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/plotcurve.m +++ b/analysis/matlab/variations/naive_a2_d0_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/naive_a2_d0_10/power_result.txt b/analysis/matlab/variations/naive_a2_d0_10/power_result.txt index 853c454..4bed4d9 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/power_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_a2_d0_10 +POWER SIMULATION -- naive_a2_d0_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 -ground truth: stim:day=+1.43/day, rat SD=8.75, residual SD=13.78, days=11 +ground truth: stim:day=+1.434/day, rat SD=8.753, residual SD=13.78, days=11 - true stim:day interaction = +1.43 (100% of observed) + true stim:day interaction = +1.434 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.09 | 0.23 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.43/day, rat SD=8.75, residual SD=13.78, days=11 16 | 0.84 | 0.84 24 | 0.95 | 0.94 - true stim:day interaction = +0.72 (50% of observed) + true stim:day interaction = +0.7169 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.09 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.43/day, rat SD=8.75, residual SD=13.78, days=11 16 | 0.38 | 0.36 24 | 0.47 | 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/naive_a2_d0_10/power_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_10/power_result_rate.txt new file mode 100644 index 0000000..2088156 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_a2_d0_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 +ground truth: stim:day=+0.01123/day, rat SD=0.05096, residual SD=0.098, days=11 + + true stim:day interaction = +0.01123 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.28 <- observed + 5 | 0.39 | 0.47 + 8 | 0.54 | 0.59 + 12 | 0.84 | 0.84 + 16 | 0.89 | 0.93 + 24 | 0.97 | 0.98 + + true stim:day interaction = +0.005617 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.08 | 0.10 <- observed + 5 | 0.07 | 0.12 + 8 | 0.18 | 0.19 + 12 | 0.28 | 0.28 + 16 | 0.43 | 0.40 + 24 | 0.56 | 0.56 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d0_10/powersim.m b/analysis/matlab/variations/naive_a2_d0_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/powersim.m +++ b/analysis/matlab/variations/naive_a2_d0_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d0_10/result.txt b/analysis/matlab/variations/naive_a2_d0_10/result.txt index 3bef4cc..9a87fe2 100644 --- a/analysis/matlab/variations/naive_a2_d0_10/result.txt +++ b/analysis/matlab/variations/naive_a2_d0_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_a2_d0_10 +VARIATION: naive_a2_d0_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(100)= 1.54 F(1)= 2.382 p=0.1259 p=0.1261 (df=95) day (learning) t(100)= 15.09 F(1)=227.710 p=1.598e-27 p=4.059e-27 (df=96) stim (main, window start) t(100)= 1.48 F(1)= 2.192 p=0.1418 p=0.1543 (df=20) -interaction 95% CI: [-0.41, +3.28] +interaction 95% CI: [-0.4093, +3.277] HONEST LME (per-animal random slope, day|rat): interaction F(1,9.0)=1.16, p=0.3093 (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.1259, slope diff=+1.43) -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.1259, slope diff=+1.434) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_10/result_rate.txt b/analysis/matlab/variations/naive_a2_d0_10/result_rate.txt new file mode 100644 index 0000000..8ef1f31 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_a2_d0_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A2, Naive +N = 10 rats, 102 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 102 + 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 + -159.21 -143.46 85.607 -171.21 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.19588 0.02981 6.571 98 2.4247e-09 + {'day' } 0.04169 0.0039441 10.57 98 7.0294e-18 + {'stim' } 0.05903 0.05266 1.121 98 0.26504 + {'day:stim' } 0.011235 0.0066828 1.6812 98 0.095917 + + + Lower Upper + 0.13672 0.25504 + 0.033863 0.049517 + -0.045471 0.16353 + -0.002027 0.024497 + +Random effects covariance parameters (95% CIs): +Group: rat (10 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.050962 + + + Lower Upper + 0.027158 0.095633 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.098003 0.084761 0.11331 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(98)= 1.68 F(1)= 2.826 p=0.09592 p=0.09609 (df=93) +day (learning) t(98)= 10.57 F(1)=111.730 p=7.029e-18 p=9.281e-18 (df=96) +stim (main, window start) t(98)= 1.12 F(1)= 1.257 p=0.265 p=0.2735 (df=24) +interaction 95% CI: [-0.002027, +0.0245] +HONEST LME (per-animal random slope, day|rat): interaction F(1,8.4)=2.15, p=0.1786 + (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.09592, slope diff=+0.01123) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_13/analyze.m b/analysis/matlab/variations/naive_a2_d0_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/analyze.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d0_13/learning_curve.png b/analysis/matlab/variations/naive_a2_d0_13/learning_curve.png index 6122b312d199cc23c781e6bec96fa449a8de34ca..7b244a36ef4f303ad18faee3bc336a7fb9b1a74e 100644 GIT binary patch delta 32 ocmX?miRtVmrU}k$>Sq2%SBximhH@HPTA7+`e9fD_arv?p0MV)p{r~^~ delta 32 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 literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_a2_d0_13/logpower_result.txt b/analysis/matlab/variations/naive_a2_d0_13/logpower_result.txt index be8d54f..07def22 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/logpower_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_13 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_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=7 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,120)=6.786 p(resid)=0.01035 p(Satt)=0.01039 ( honest per-animal random slope (log-day): F(1,5.5)=5.06 p=0.06966 Cohen's f (interaction, partial eta^2=0.011) = 0.104 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+9.94, ratSD=8.36, resSD=14.40) --- +--- power simulation (log-day ground truth: stim:logday=+9.939, ratSD=8.359, resSD=14.4) --- - true stim:log(day) = +9.94 (100% of observed) + true stim:log(day) = +9.939 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.27 | 0.71 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.011) = 0.104 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +4.97 (50% of observed) + true stim:log(day) = +4.969 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.25 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.011) = 0.104 (small-medium; f: .10 smal 16 | 0.80 | 0.85 24 | 0.92 | 0.93 -Read the per-animal column as the honest power; the LME column matches the -paper's power code (anova interaction p, observation-level DF) and is optimistic. +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d0_13/logpower_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_13/logpower_result_rate.txt new file mode 100644 index 0000000..ec94263 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_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=7 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,118)=8.542 p(resid)=0.00416 p(Satt)=0.00418 (df=115) + honest per-animal random slope (log-day): F(1,5.1)=7.00 p=0.04487 +Cohen's f (interaction, partial eta^2=0.019) = 0.141 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.07789, ratSD=0.04775, resSD=0.09872) --- + + true stim:log(day) = +0.07789 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.38 | 0.80 <- observed + 5 | 0.84 | 0.93 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.03895 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.31 <- observed + 5 | 0.31 | 0.38 + 8 | 0.59 | 0.63 + 12 | 0.75 | 0.78 + 16 | 0.92 | 0.92 + 24 | 0.95 | 0.95 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d0_13/logpowersim.m b/analysis/matlab/variations/naive_a2_d0_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/logpowersim.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d0_13/plotcurve.m b/analysis/matlab/variations/naive_a2_d0_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/plotcurve.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d0_13/power_result.txt b/analysis/matlab/variations/naive_a2_d0_13/power_result.txt index 4de41e2..0a410b9 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/power_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_a2_d0_13 +POWER SIMULATION -- naive_a2_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=7 nrep=120, alpha=0.05 -ground truth: stim:day=+1.61/day, rat SD=8.46, residual SD=15.26, days=14 +ground truth: stim:day=+1.614/day, rat SD=8.46, residual SD=15.26, days=14 - true stim:day interaction = +1.61 (100% of observed) + true stim:day interaction = +1.614 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.22 | 0.53 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.61/day, rat SD=8.46, residual SD=15.26, days=14 16 | 0.98 | 0.98 24 | 1.00 | 1.00 - true stim:day interaction = +0.81 (50% of observed) + true stim:day interaction = +0.8068 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.21 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.61/day, rat SD=8.46, residual SD=15.26, days=14 16 | 0.64 | 0.72 24 | 0.78 | 0.75 -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_a2_d0_13/power_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_13/power_result_rate.txt new file mode 100644 index 0000000..99903c5 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_a2_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=7 nrep=120, alpha=0.05 +ground truth: stim:day=+0.01209/day, rat SD=0.0442, residual SD=0.1045, days=14 + + true stim:day interaction = +0.01209 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.27 | 0.64 <- observed + 5 | 0.62 | 0.75 + 8 | 0.88 | 0.93 + 12 | 0.98 | 1.00 + 16 | 0.99 | 0.99 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.006044 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.24 <- observed + 5 | 0.21 | 0.24 + 8 | 0.46 | 0.47 + 12 | 0.53 | 0.55 + 16 | 0.70 | 0.77 + 24 | 0.82 | 0.81 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d0_13/powersim.m b/analysis/matlab/variations/naive_a2_d0_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/powersim.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d0_13/result.txt b/analysis/matlab/variations/naive_a2_d0_13/result.txt index 91593bb..6ae17f7 100644 --- a/analysis/matlab/variations/naive_a2_d0_13/result.txt +++ b/analysis/matlab/variations/naive_a2_d0_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_a2_d0_13 +VARIATION: naive_a2_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(120)= 2.08 F(1)= 4.320 p=0.0398 p=0.03986 (df=117) day (learning) t(120)= 14.57 F(1)=212.424 p=2.547e-28 p=3.246e-28 (df=119) stim (main, window start) t(120)= 1.44 F(1)= 2.062 p=0.1536 p=0.1655 (df=21) -interaction 95% CI: [+0.08, +3.15] +interaction 95% CI: [+0.07651, +3.151] HONEST LME (per-animal random slope, day|rat): interaction F(1,41.7)=3.81, p=0.05781 (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.0398, slope diff=+1.61) -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.0398, slope diff=+1.614) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_13/result_rate.txt b/analysis/matlab/variations/naive_a2_d0_13/result_rate.txt new file mode 100644 index 0000000..e154fc1 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_a2_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-A2, Naive +N = 10 rats, 122 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 122 + 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 + -181.33 -164.5 96.663 -193.33 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.23325 0.027564 8.4623 118 8.2776e-14 + {'day' } 0.031488 0.0030917 10.184 118 7.3141e-18 + {'stim' } 0.055421 0.048873 1.134 118 0.2591 + {'day:stim' } 0.012089 0.0053578 2.2563 118 0.025894 + + + Lower Upper + 0.17867 0.28783 + 0.025365 0.03761 + -0.041361 0.1522 + 0.0014788 0.022699 + +Random effects covariance parameters (95% CIs): +Group: rat (10 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.044199 + + + Lower Upper + 0.022679 0.086139 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.10453 0.091674 0.1192 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(118)= 2.26 F(1)= 5.091 p=0.02589 p=0.02593 (df=116) +day (learning) t(118)= 10.18 F(1)=103.724 p=7.314e-18 p=6.719e-18 (df=119) +stim (main, window start) t(118)= 1.13 F(1)= 1.286 p=0.2591 p=0.2666 (df=27) +interaction 95% CI: [+0.001479, +0.0227] +HONEST LME (per-animal random slope, day|rat): interaction F(1,97.3)=5.06, p=0.02667 + (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.02589, slope diff=+0.01209) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_5/analyze.m b/analysis/matlab/variations/naive_a2_d0_5/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/analyze.m +++ b/analysis/matlab/variations/naive_a2_d0_5/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/naive_a2_d0_5/learning_curve.png b/analysis/matlab/variations/naive_a2_d0_5/learning_curve.png index 78345a869fdf52fe22eb740de691d3d656002ed3..0e8cc677e62487d23d0fca0de49ba934a1992643 100644 GIT binary patch literal 35985 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%0DL_2 z%CZip4Cah-a8;j2V8b`tsyi~WB242yWjtWRMJr& zXmSAa?m-2ZstX258cY$jFnoA=IuEEa-I6JUC{G-1kSlKRwUB4*95<;bi1EBz5|8Wr z3lO7To$x@$ku?wTsSZo}7b*VYZM5{ni;+y|l)%G7jd`9or0L-AM78j*pC9Z;NRUFQ zg@V;`tPOU2%6g@tDUiMUZ%>XbG;t6B0-8Vnc@19Xq5l$nM?Q+CPzA`K7|AFL%77Gh zzx-SWl1Ud(AtKEL34NM=5r9cWcxc>G=x4uibK6?5v80IgpgsX!s9f3Z2G&045My>8 zaO{)CJ2q=qt+wFje+PJw*lfSap=e;--s`bi4@eW-cKvb{L{A}C0ve+mKOrPu8nJVPn`|6klG_TkR$(w7dN z%{IBGN}1c2u#-zOT%0r9l-j_caBitt;4(oL{NM0&kk{kcz2Se~GB2W(6#VLieMZes z2<{4YT#5NR1lLRodl*x~iQ!g-P)ZPq>r>Uc$n!}kt>Bdv;AU#V$? z-I$&@7yMMy{O7HQ5BdcRB1CDnv|P@UG|I|NGf+@)@J#uqeBu4%fc+z6X_@-`i@Vzr z?=KT|CBJfEey^CId3*fcTYfOQgp+dHqZj@CG20}5-XLQoLo3SPTBZ3lJgX@ck({&5 z8r|C{_Z&Upuz|bY;SUpS&vi;cMEc_LWqTG%QN$%>ZCC*;8rLq?nF?16Or_JBq6|i7 z`qbR3g1f|9e$O%|57^UCzHsU!E|%2yu3#^vbf)&qrlDJea+_!2YFL*hJ`Y@rbhPMc z|99gFX&m^e=aK%rysL*o9?UL4~oeS`WYD-b4>qS@QCNbnMlaP z;7iVp^8M%9B&jTMoG?m3B z|7`X3K3Xjk(Om_Jdug@4Kb>B}6u2uR;X;vWd0kd+I?q&mI*ciOuonv#^ z43yEgvWB{Dpwwbpw}!g@lX$){WhmocH%Kh}Gr3ULfn&t5(yLUuBj_pSaf<1C@is~h zok+XS-N1<0Ex$Vtu!rZ_ne*BWv&3g#eB>P0m7yOXgkB^aVTvti(0GeRbAA8*L_X~D zcvT4H9me}5wv^R*lW*?tzcW@XtvAJyG90~4SQE)T{At-|M0YhDKitqQPT3+I;aJA7 zhAJ8x6!pS?YE0&zpcu>UlO}HiMIE%}vim73lkb1o-dLF!cn{1FPKp z9@n=KE1YC8up)g4SNyuKY?lfysAC~kDzeu)M}4hkxW{VYuIo3> zs9i1D$0teL;HbNZu)BI}(=Y6!RF=Nv*565Wg&Q_JD9PZXygh%2-<@AFqX|x1hVJ*5 zSFRBhKf#ls%WdDvLHWq=gOYQCl;1AzY&-q!L%)FRW1cvD{+{zR7EP3MbSUOe@CMD; z8NuHQsCw=!I+IohuPyXm<-{;$_+NAcD|gRO{G-`6wbB!Ul-1(Q(V4UevtLvoHk~I@ zaj2wis6&q8J~kz`uVv!h|5o5QZN$t+LO8Mh%mG1Oil)LBdcTc8lzF$>P zfABNP!Qo2=5P+-QzWwAB6YdpEe4CFse@dx|vPTiryXlgu2(RI%c1_p5m4?`(bh88Y zt&Ei44&gV-4yKdv8wD)n@P$f@?jerEX`0=1Ybn#ryb-)%4JBZm)+feIxOCO-90|$@ zdBZ){5h{L)%U$=8Fi*neQr#tPYZjJLs&LooL`Gbb75^qB@+6f8u}^Qf{-+4w&`xot z^%|7bOHHGk;=a&=2=3lBF-M7=PyG5pXU?;ib9asB8`$`>;Jb^F@?1=Ol`n3_zw z)LF(hS%pfNiBYZ)`e3achk}-d2I8%Og8xe+&8HGNPbo_vD|Nh~Taj~dk=ZqGMr&iucPDKokYB*wJIrfOcg&-YWcv4@JE zx9*}8b5!|_JGDIo(`x3a(NpUmr|nnuq;-BA%{*ZE2|-<(8&s2EyYLsVSt01&0+kiX z&Osu5yVN%yMR9ZMB7(m!m7-MH+iSLQ<3{rp2p`QqudX~NXhkHlM6VXwoWyQnuq(=G zO_8U)`as$z>2EK)ruO;hvMO2-py#u*`wg+@%iP?Q3ZmFcsIEZ`JqEi#4j>Aykmoe- z5yXvSmQaAgmi33gD`J0)br`KDi6rXUAgXjPoId@K;ayYHRSW~H z1XNr^#TU8`FpybNra&~tRTJOAO;0Kho4J>!Yfe(}9bPvtEiSH44RUD{}i z17V5ZnsxmZ-0^N?>Ib2r=l=*}FOQq|_}jl>V)@*I8Y4x)TPd*b*Pb<7eIijPW`>V|66uNo7a}0!O*7Tkb`6k4K>Jezd-3AFW&>U;3l)Fj>{sX&NmsrrZ%(iKo`Wj|A2zw zOii@59 zcJLIXxB&>c0;S;9@%aziwU0!!J%?DfLwlvHdn5vSSm{LLQ{kMhT_zH}VUQfHin}WVJ4pf<%FVi5@=u@@E!mVX)el*REZ28vJsi z`6gU*?qP?T)Lbc(w5F;S!srB;^P)o?5_5%P<3WU%fr;oVbDHRV3(^Y$NiJ^gOJF^i zcEg3ZaGTFv8BpGDEr{Yu?okufc)6Ang=_WXsD72h%us$+?S4$>XPD0EZ!EdBX} z#RNawHu+;cDe=yQ8cs8A94=74G#uTY~?ApTk(vlYlN=T1cR-fFs zaUA3{I$q4FsNm{VSmaC$XW+3k+9Y&t;*5mIOsYT{?cwqIk3F3V#wuCCRaAnPiA z1H8Gp%an>mk*S+a)}D%odDp88(QxQz zo_+zj)QuihEiFQjfa1zc28br}f6gIHKf9A%G<7E+J^d{yXVpt~oKv{*5j-2{LM>=}y#2qm-kdfBSqv35C9Xeh^aju|r zA3P*pJb6Uh%TOXOD0I* z%oKQG>N*iSV#>`y(1Kwrc!#^DPa-Np6PNpuf8X_7`#0I)vE>oakwBOo9vL|}JPadL zrwgV5G$UrTX=r?ObQIz?G~IyBDiVeY?Z}ZiqBrmp==@BRqIxjMyWX!Sy_p$~@P0YC zEk~Pbau!QlagWs#RCR>fG`iU+C6LLpme( zOfT}o z&zrvZs*7=hD*S~q?0^#QC3JBO;FK_uWoA2_prQk(T?bJB0|SFuRvk`=Cr-%G$~Q~1 zs1Ds^K*>Jbm=K$xR>ASX`gtjrMA^hUI&uKwQ&7lOh?^>+)k$iY9FCGdLx}9m!%oM^ zepL>CwbWlwjdivbI$YrRfV#8!FbA$)e8g&_9~$*MiVVZdx1TKd8|bz_~?D- zCLVL%-bnJJ=YKtztLo;q;oioh=4NpA@SfCv&`wt+04@JE^4$D9Z*gi`8XbpKOSUcH z?9E~@>Nk7W&3AnIq)bg1_3#g{;HW?d`u}Xoh|29ied#6xX!nhw0 z(^=yF5>z#y23$zN!~{}C7T))_`K!y2nLS#f(h2{*vU8V>`~a8e zD)ls2D1?R>t(v*3Kr`2I95gJs-v9wG_4YzS86H_D_5&h@T`9Ub2CMG5z zbcSEChoC^8Rft-5z43pv0JxY&omdp~ABU$Wlh4B4yXyzpT!6}jGazr`m3^h@kEP4Uy z894xDJtL0*RM?FO(-DL}Jbd`@Klq{3vF`&7rKUraXC+W^(Eh!N zCHKjVy=KFixlpcVmMxj@k9ydBOT5OgkC#_<;UTmajP8q+!$9!$sN)@!Q$hm9f|P7@ z{JG6J7~Xb-4&W4W0D7EvFfq|`G-sdj1Ym$n6S^VZVxr-V`umR`7a|;BaDh26xX_vF zTF;|ZJdYWeTmmG3>X#^kpycQT$u0OVj-p6>3dtniX}>!n4_E)E5h9;%$c zaqD?x7Ad&X>>B230Sr%(fP6atxaYC7;95h|6fCV)?vuEnN%!`j(GbEv?j!K%)5c^u>k$1(Sc$BTqUXqOEwSL=F_Vw6)-amP3 zkV4$yvNzQ5(!zfqbcIT(?dF!|(Xs1)`}XR@`z=72P!Zr^3`ywM@G3y{oE!ji#DLq| z9?5?NhD-Vxt^Q8JtN?Vr(z}8$zFLmITm>QoZvAzIS6GJzm9=X(bx%)DV!jQQqBcHj zNjdCPEhf4%^sNFX^FzWt`Bsl5hp%a`tqqx=N7)2sviGq0xJuh(7E9H@!&^h;=EK9o zcp?EYVR#5saR+8lu8mMTb>{^RaS+cURbq;mq*wLw0N=#`rfiPQJ4AOmt8WF!fRmmSbRC{tsn6^WRPgI9$C-57{O_zRomZdIxY^J~wZweQTh` zTy~S;my6(J-nDuArzr}_bvu34aCrS0Ak#Y7wHGn_3lXWp&%HBNgjFRh6+@Db#gBMdAl*c=+vc>KpULD4JnmzE)L1 z3LrL_h~$Ao0nZ!IbmvD}>5qjiKGo+>d____qoZi9R#klEP45G{s!IEFhkQ}di$yP7 z`}J?1U!pzUn9}%iw;Toc4kA|Mj-qbxu+l!U>afE*V|y;+v5`G58u>3;-+KG<&<*9+ zPghOd_rdc(_v?f*7N>e7k?jFMD@sFxNQee75^?~usoP`A+fk+-yn=$+g>{(!686_4 z7!5;McKDo5_(npFgo>4)pC95L^DF~2OxMJs{7Qwb-xULBIl+On(@EKS-J6s|*%4TMZbFndUD5avZOas*q7FjdQCTG<*|`W69%^!f^;A@- zB4#7}K%@)cZUk=wlmpy6Js4xZYyR>Y5)U(sdQ^dhyQKQ-(G?~lf;%GNB_z5~oFLLo z|89PE${GqED7^XYLUvqU=|F=STwul7gqWCOO7ak}b-x@Q^6|8;p}`4?5#5MtB-{{I zU-sfemS_GcT0PNFbSD@A+9$z>Y=F~pk#Wi1AX-` zs?LY@_$+GfC=Wb`)rMv%RSt9C~<+-}@>Cbq2;-+5u zyuygSJ1U8DCxcjoY@_p^M6g5}JvFyxZqaM?iL}i!&d4jeXBZu2vps7fD#hI0u)0R` zf&%|BY9U)Qn$|m(cSP>&Dwn^f+3@AuPO8D!!PrS{Uf4v)FzK>UE%{#;|Z623FT+K{(MCApyog>sNA*& zjwc$OR@gqQ(tvZd>FVY!TM|HzKt{c9-##^U^&an8LOSI;+vSR0@;0E}D_3$D`Vbk( z)X8-`i-sv9^$$HD$`FL0c1GXI>KDC4XK!T?iL{m$K*;->+uM#njTQ84N4#@|$>PE$ z8>J~dhs^>o+q>=8lmalQWV4ds8Mt`}^7)XP6s(FL&t00M$#@#cpz z?vwcbI0Q)$w1Fj&9vFww!mKrC!n%A{m+edbRKU*A7V4`uZ)~+MYDV4RDq1i(6jTDZ ze00~4e$rq@<%4H8*mH}_6JUdk7Vk}M69P2!^l@Nzj&G4YKtFT;tyv)?18Ax-f=cBK z4IN!ZdioL9-?5`}&z|uOJGoEx*+pyUo;)d=aDa4l7Ky{eNgpHZPFOkQVZ8n-Dk@i2 zzn~?jb)%)x`nbW%}Nyvgv+N6-QX=@N9n5Dr&wCW0M9QnnoviBv)) z+95xad&g29jik1=p8oT<@`#-c4)kZnG$ed*m#b(XDwG=le({_c-AX>d$*F2UJaE8& z4iBn8MjA^M6&|i4?F-Fx;mUJxTU)-((9hAS>zhxF-DYk)GxK#P^8;BSm#)s8tF%4j z{1w@YpYKB~2|*T6)?qn0)0xX~`kv?@M*?U)lFtyOI6hRk~nnYkTTc6Q0rY5;q2i!Jz;*!KD@Zb7~6R z=7?J>NEo+3!2%#~dlO4NHUw=M1>GLjXi6dn?6xm)zylc!8j<}syt=)Mc>MpB|MqKai~yi`e7SY;0cA;##;fR5|*sZ-NHr|2a3 zlv}%L%a*esUcscrW}|JYe5TzRl#MJ96CODNmG=)f2{Eyz;qcfFyW%nMqw0|d-HHAf zFgl-%@kv%Ot8nJCj3km4akGztG!=9w|O(0@Ofw}mGtz& zM;pM5&LLYQo{zDLr_+GnTSVgvJQLWf5ae=LzM5!Bi8wr{;-SV9JZ_1|#=#Xpq5@TM ztv}87FBVQe%E=^>+NZk?OZRa!nbvE;JiQReAea||h8?Xkc)%8sv^YQWLaayB2NPm4 z9^VNG3mg}K)`^3u!@R-XaB_YTt%@cu&fjF{!-j;jUIC`TvV)-g@^>@J65)DM7I!an zxGE@7eY8KyvV*ddXbsSvyLb2Q9y~2+#19RB0J@CK%tFTbHednKEA)3>bPdUpAg-Pz z_Kwj!T3QD221aydv$4Zcoq*Eoqzj#eL(B#xfMG%AGBW_EZ z*xR*JWM2Bffs|*@2o~jc0`Zuq%Q@PE8%RgrBSoJOqwNmn4l74%XV9HHj*gD7_D&fm zY!f*ERPLgs1&Jg|4WHQaxVOvy;^ZuxJ3&p|Wo12kwg4OfDE1&B zLCD_{jUz}e7!%NoTYmnfQOL@IYyOM2HY-i4ZyRa5%l3zrqe-*?Vleb}=3r7#0TRv0 z<_RopY-RW}(t&xmTO?BB4Y8=B+mm|7tS5)g;)wv4An#`iG6#eb6BE;Ny>a6Po}7k& zx|NY}V3B1lsh41ZxsJUx7M`3prryfRT59(8Iv(AWotW4QUDl= zdU~Q*V$a`2X~-YTVnHXCze7aWzM~{hgUdH<*+ViYXJUrVbS5DsH5HcX3g0t~rw_pk#kgpZNT2yw4_Ev-j?cO5C|M4eUG5=-vbh&4 z@w^P8g3aTHT*LrxJ(!&@hTA0vV8-HI2x<3+UJr^`bV)G|trHcneq1wr9RG)Bb>Xv7 z_-s-Vnc4vm=}8QzVi6n))|X7}nH!q4RHf1q@n3tajRrgO_waYTZXD^Is^*EO=xR{!n?SdwSSNc8#LLBXlc2aTx z@btWu6=suFlrl%}ox{}LIdoaIeKeWn$37mn5da*Y{s+o3-i|>`KuMSD=TXq3Yc?T& zI>_d4uX+a3iGqa5vegu9Em5UHdLDg69Fh|pGARpzR|7lrJeQqmyL~jdeBmL!)NF_A zvk={dCt|e!{Arm`LrY@#i79%&^k6K*d~Rs0uz~rR{0o-&1Y+DAhqd72!&cL-*3EE1q%&!ch(nHu@AqNX+pRDm)fWPp=W{ zwa>L61P!#*CKbm%v~ zfB#MnD2MzR;7;H1HHpOf(lAR)dF+G5r3^8aH)$G`N(uLFM^;WHpx+RWk;^_nEEWl$4 z8Dj-ViI-b5^*^y$&kI-mF2Itm-=VIbI<)Bf@_V91k)%SUPj&y~k1&lDIghDyhIjos zjy!yPQtp!}41MtJd1p(0zaH^t!1Kz2qs7q9QKaDa;^HX}$H|fd7fjZFw6Ae=x)-`E zAkN$#J996*vIh*>b~2u2vJw@QZ*-G^kkg~Uw|pLSqW2*Z$@E7$>-rrn6K4$et5p1LOabDn6YK@##xuur)lan*eLXVbM85vKRn3VXguAp6knuCvz zFNJFyX`SR|enCMdvdPt^Q+K{>Cw&Vi`;_KS8q6EFwI3!H{1hhbS%8#kil*XYoSXYz3RqxWLcqk`l|8fqj=_vgcy z3HsH6E^RfD`9+|b&~~KHuk<2?E1o-|!@Ost}Ow`#VbeGeci~huvS7cO*YQ z{mUI{t`7_Q5GDM|dN<>26uADy?LlP{zDcP>{P z(8;hOp@sDjF@Wensh5l>lxYnSF?3yf^uot{d6A$_;_R!HJ~YbP6<&em3d29oEdpQx z#+Cj^9g)E2i@4R8etbCV_f|dP_%F4W>F41*2Cq?_jh8B0zxNs@m31#}Kd(B?N5w2? zI4;D+Rn$okDJ4DR11e0vYXo`GPMXEi$rnw~5}wz0hO;g3p~+nLoM}S>+S)p?)Ce0K z{W)Xe&|WQ2D!W!&iB4N0ZlKhs&JT$>)DTgpPgwf1;ASs`n60rX)pAKs5rV!X$b z3AIecKVKd);#sK3*Z*As5!3zS;M76XX%xIuSifQ%|Kf;5`$7Q%2E^sZ@?E5`Tit+c z#)v<|U-Te-#$^R0XdtdaGR4U$DVroDhF_Atx%SW{hK7L(m7L_XwzPZ%-XXYAXRCt| zq!<|*dTy1ZydT^#bJS{)b-Id6IVH>#!pR}+#3l$%SR*1@tPgeqXlMdWY3G?m6k{bO zUcmCAn(U13A)H4eWsaF?fvx~c;2V@0e7P{s{r&xQ$D3fijqgiPDi7~96Z5Vp==re1 ztfC#;h9N|4@MA<`W$rYVBnn`SVI!t-urQ5I8`Qrm?|KelBmTjbaj;&Md&)}LXv}TO z$f{o4$ycQM1?w|KRE5Q>s5O)(1im&iHpE-Nbh0Uqruo zpEJzlAG~L$VjTE$<`)WimNj<&Cg284=6hR+?f_PL(SsF~O8@c3TzC4KeuPW;MU zR8>))<^KyqC^ZhSlZqMqc;Q8k_Wtj3;llrvlhwG^4-X?!D$7j*A{iC3x&*Smub9Bn z4I)cdpR6HurXL8G6cvbF5P30-7v2;9y(2OA;zHfBk!uW&90D~O6-V6lWKdp6`07{L zsdb%v5(KIDh0Hj7#F+rgoG;Er;^fU#(v0q=M~508y3|E3t=`DiUOkWOHrA8C!iQ$F zfJ|4?=UAlK4}F^fu1K!1&N*}}J>xJQ2=hYC2yNhsiN80PU0}%8S@&BCf2Sk3fiLNE z^JQ?<8^PcMqS>_cPnerRX$RtZ_NGo@|YCX-8rsl&IrX*RF{ zUIYZl@(PH0b2n}CBhr7a8kHJ_X%^^A^O(@DWj~K5bn5+_zp+hwp!VvDSz)RQKRb>58{^2yRob^m#fs&=G~@b zm%?Zx1Bc>sTe8Pn8yEgTvtt~yI^|CvS2sVRo>MR3FjOdUF>bmc{&Yl0VeEwowstlG zg{zio>PA{axb{<*ZsJST>lcI_8m`->IoAiAV4dm>y(5^&wlHb2%+gN283HSw*vMBT zynXvU+ZI96hK(-#E(LL~rl`yxn>~{PZ^q=xQ|M|HTA!(H@7f}k*|?|B*w`xKd%Ji( z7Y5$xby=2dhwBJ$(elT;XID@oR~Z~w0BZWlP*z<3{HU##^4t`YBlEXdvx!d*y)=Va zSQ7Z8ZpFm+wM9G1_r(XErXOI+VxX9km2K6srLrS8M#HI&a10+_INh4SI}v$drex_< zdU}h(X%rm<=A3SLxC!pRb%UqcA96!FdS3HW?eWYv)@PoUZ6H=pMFqZZN(F{xEqTtb z?<#Roj#Alq3r5jbd9~Y4e?G+pFQm}{ke;{8lZwT}L9_VIAZ8IKAM51%#}D_n(KC}@ zsu7>`X^`W-pr`O$ryLXa5I)aUwEQj^8=hThIkgt2Qsx{y3jvizsx;w3XhQjf4rPGJ zNnTKzXiwcML!AX{bq;;I@<{uQqz`SuT0DEQUzY4Vj!r%<45Gn89jWEsZ0+6z%BuZv zz@JiQvJM=fFQ#q?;pWSWSTyS}DuT{ZIk%4H>V=L|l|V7+kv>?_C*iTOC>D;Pga?nv zkcz5zmyxO(l~WX}RxFj>Kw74xo+~?V72tF1(_&NyX~5=E*$!5G+{S$)ZNYZDSWjM9 z;2pd$knU@zsx2*p!5`ZtFaOHY&`YUW_Fd-bjLm=Na*5?e+-@ZrZnGA1ajRXd6n0tD zs~uw=9j`mVR#WE1bdMMv%W88clp$ zXaqq%+E7vTre~i#u3LdlF((&D68D(DqExne^*waqdO^>*7yHqLG3z(yEEr&GSLwnm zFIiU@RwyYIcH+e9UiWu4+keex;$QAo?VT;C9ie1RW_&=39)PnJ$8^8gxaVMNEfBrLKKXdF} z-A))yDKEXV-ya0_K1q^MeenRF(uP^CR<3Ldz&0;Bv)Jk5j9h^9{)jI_TtzIt82BIj zoh^6fO)kz0t5_I&ybSA(xKJmZU6=T(tlw0voPT3-hqP5huz&ye^8Gqn(-+p)&X=z2 z@ww=Li>IQU)nd4K!Tz=tn{H@TeBLB5DHI|va^3u?nbR`(hO>cQ$Q$6~g_M$-U4bOIjUCTBwcZK|iHeqc_A(;AHp-`K z41U_-En)K3Y8@$&(P!?G3J(%h)h?~XV>e?}bYzNq+ta@c?vqJ=!Qx*qw3xo5&X+8RRV1Q~mRUKqTdneujYMs=sJi?kKb zotyb$Qw}ULK%A@O?{CX?x4U}x)?RY=k7kB-!QhQfWS^P#~{LA$*>$N8$4q3a!D2L|2mcc&jNvJnse z_FP_&BGHb`euQ%Md-mw@&KLA_j9#`;$yR((%qBD~lIyV*&9v~KbmR8%yGc4)o!+x} zdV>=u{b(OP{nLmU%u(4cL!Tc>W>uoMnXOiu?Ao#rd;97w;)xFe+ZMzu#8pxkf6j8n zSccfg>n+y58>G6ue4m@!Oh82OVefK`MRExuG}F!hJgW;jM3aei3j8fg&!N(>nhZ>- zutKdihVQ_oCug4q<_QENr}$MihJfU6EXig#NM#>oPdz*8CylFS^}IIClIS;mt)saz zMi-x0l46%)^*+xz^}Qy`<}9Dgh#=L5D*q>|n)!{M?`gWL*Th%76`dloz_cmqw^PhU z%-c@^KA2^MSLP{M9cEhF$3dM3ttsZ9{h_o^*RYE#a&}b-EkyjJ%C;71!=LCrx4!|V z-mg44u_QS$O*xe}qZ!rCOwmj8DFreyIhsnJ-47|fzlHVWu=O8+7$u?Z&HA*0=UM9~ zD`sLn&I1>czoca!Su3NoOTMLTc?Rc3Y@{2}j`CFgLkW^x$UZ`RHX-35i12ioUW;MOK(yzkJcGbx^?XuFN`f ztu~4x8;+^c;H=!)uL|oZ?^Ss2<25l^x$Uv!p_Zc|6Ve`7B9w~!+jfgJ%xMuqGAh}l?%J|J}|!W*UxWy+vAf!`pW6*_xwG`5D~~db=WnRN1gGx{qg?QO9>k zYgs_oWO6936O~@KOtow=Vh#+IGS>#uFlqxA1}gp2-1nt?2!?(hXfM@Uip4#Su{-Dq zn6f)$c*NCU8IT~>CS>egTULuR0ulU=3iclh-n$>&x*Khb?Bcbe$)=c2-79_C^ZFu2 zn$kntp4k)+NcoU_`rp9BOgab?j|HpC#`i=>p~x!E(p-dI6xB^rSveIqAO$OPaY-uQ z#AdXP0&_TKyRw9b&LfVc?cXiC@?LCHio|gM*}x@N1j5B4Ck}8OD;~Iyk)M_80|=Xn zFdmSHdAR9VbI&oh&WdO;WYHCeWsN&3ey&NheAvI{hFpiH6|L97*7JMAw@HvFU@r{* z5#zJD%kCg|Ec?vd!tA@ppVS|z-KHD*VqHX#zb+HU156Y=Lruq zr~tGvPn{?$+9pR?8?m8V7nZBCO|EaN$rTvuJ~}Xt?puil+*aCBYQEC>miI(jXk}QT zzqRA_ig-`vn4IIgv9Ad2LKV&1dVA$O)NpX9fX|;qko;yl36lBibYEoGT0A+Lo*G`5 zkggLc;V8dd#MkoUO=tH>{uAn%k~a9x#$nm&5$qf^wx%#P|j|o!8rQC1Jw5E*^Mu;vA?-n1V4C;t1Kk9=VrT`31da zhrcWqKQt!lIG^em!U8@$KC$&u=8oLz8uvpK<#ct5!|h{|)sWx%n`+-#sS;_-D(UgK zfx*`YL-gJN>rVM&HE=X!ThX>-SXtnsWex;~6!OuhggI~Izu6=B1sDlfeCvlZ z1_txH+VP4^|4|#8rl|K|=zYO^Ki!Uu9s0#|#isuR=2wCHyEguP!1EShQCilSj43G$ z)C4X`-FHYN0s*!gCd$+e`{56_A~*UR$vGYW`9fVVZ>KntK?c0TvJCb&jLRa9ntCIQ z7nXSR4y08#y!u!nzr!}@dZaoYg(^~;(TI6!X@X3MPT(!>%Np)X?ts@gc)^xLnCk`q zzBMO?jNYP?Vzh1-FBjiEvkvGStReUEgCR&!*u8D9=9Aw32mAZwy}jff#KPBE694Nk z#_6~u71;!7)yJ+8IQKIQJ)^x#qabL#MO+2+pu}OiocI6RG|F9pkREBKkqgU56VFQr z(DnC3JunOnHw{29x?+{_`MM=h|RU^AaU%NrbrY3QPHaeq{DQ7TtC|vAJ2w_Kp>Nc7J2}Hb=I45S=l#Zd%OXpG})KdYC^F zNi%erpO4j^F{y!^0!59GAwx)oaOutm+i|P>AFwy6O4!Ld>4x;i@|s|=rIWFJX&ym&8qKU_cM z1-2?rok@L|aZmU2@^eVC{xwV?*1>k)Gk7cT^2hv1PSvxat8~;JkYI+&+dIv7BkO3o z^Jv&xAuE)yGUwLChy!*-$ctY#Wv;$-d!7$Q=Ke{P2rYJ&-uDXs3k& zNCD+{Fs7&H|8`P)gX`E}$9rSRwg{o^+ZFijWuj7$W+d)M?QHZ=Pt^yKq@$BAw0ChS zJdF>Dd*S_QyuT2MDtnh_HTGeJd^m@Xy080-w0lL*N40f$3&AI1#=9n)0*=41k%_SA zu{Ih*qvSMZ{36kq+rpt=_a}7m;OH2GWH<5v?WHR5OgzS>o5$Wf6aJ<8N+&Qay+Qlk z!QLk|mT{}#jz(Y$cs@UBfMM^w;9R$H`5IcW$%~UOL$_Hw;(ihb@R^cu?2Z5Lho4<+ z{1^#3sXpzGTIOyyrrphtWWG<>>Gq1ACtMz?;atB`dPy4?I{P^ZrH{)B@4}=V$->%K!i4e>(5~ zZBJwyc+B%Yf+K{HlYkTSeOS;|QB?)l5b|I& zGAF2bb~KZojuJuA(nJ4Yo=_$U_(B|JXN(oZESQ|#!3^jsj+fmgEBgmk&<=WRVUz=^ zI5@jv{LGIerg`doPw7$D^N8$oJQDrQ$!kz8{S3(`9HnUjtV5siy!tZcE8GX= zEgJ7N`v=7;5*Uim4#Y7ksdYl|QroSx9UKO6!i9<&DPs#Tle|SAUYsd9-&qP&k1rQF zvN|z4(TKwpFnbh$f(EL~^GED8A1)lcDtU}O$_vJ1q#|!rj(gzFXhL#&IslE4pVEPQ z!*>dRrTL_}P-7EPC~5ZR{InG)gO|(p zF;gI#`s7Ud3CAygxMv_7*Er)XThsoFj74D`y{R}nFKO;suW+F-)%e*3{~Huq`;Qvq zM8UsuC9^xG*3B+;_Le=k2)#~|`11fLYQs4lx~6;xb8@TVKv!H2VIWm<#yEqNxG*s` z#^Isf*f|rEP%a^85LZdYCnio3w#SvW|B zFV49KQTuZ6D0LhDq}dt3L>w6(VEYB|Ly98r6w%oQi*TdQ{sRX>Tz-X<4?yH=i69ZI z|0cSKv#y~5%4Q(TxS$dx2;Cbus^^&-89l}6DJi4}$T@C-3Mtco7Gg_Ue_yI#B`+cRGp=4*l+z30c!B_iG;#u`u&^-i<|DTwBPXzCbnor{1&*gHyx-bzsbl3hnp{49 z?5W??W+MyH^@t%l~`%~N}fktrcm;fe~}tHs!KAiDNn`X9Gn!!aY~4f??zpe zuz<`9wHT4Z=9gZZe?Y91zn^AmWMZ-tD!aqO7nAx?t`95*XhpW%&-lH}wi-R`^(Vib z9LNUnLI4@0(=0F!K)!f+a_ily?_d$5$6=TnPj2<`^}P&&AfT6qb|20QO`E2e3wSd2 zoc_I*2NeFLtYr?lt%+m& z2Lo|9P3Tb|h2I6U3j+&4)mS+n%@TD^t*p?@RvQ^oqn9R7_$ z7wCpT*xdw4=v1PfD(A9g(V(`VL`3Ay{H*ff;ctZ2N{2oiDLe_(EUF)=!_RMglekdd z*u-SqMwIcPcxF^u@KwkrqxjQLeYjADkRSB}a8apM?*wL<=tz0sp;F~E>rP`7RIg)+ zyTNzWhJsAf3qT@n0M){eZ{I$?MiW%m)~jTN?A^^m4=A`w&F#{ApYKeif99*2!g=zhlW?M_!;ll-l zDwiq&?gQB8!ruhM82AG~IzlOW2hgr}hGh{D2TTvysMQq4EC)?f0XPmgpsy2$W*~h@ zAIxcl@+NqR({NDxd3%*>HZ;lpLJdABH1MioY1W_J>u}-1FCs9yYSlCPtXD$M4LNQe zp6OqKbRwq;0el?R1BmbijLXJTBXqkkyICzTh5;@I9HjGk(8r%xpP^n2&H1jGaVz(= zLPZpkk$*6ATEH*{aWy+z=C34aMi*+hLLAg$*1U4&Dy85|_`yE*0_Qa}%0Z(6_-DQQ zk67S@C6#u%X^-h<&%SlS1IYP@Yc$*M+Go8e5Oubo1$Y6r4Xy=!&O4OXzvZm55Hl0x z4tBx5W;=0FQ4O}2xrhAOIXQU=B=OK#MvV=(D*9}{KrMaVw_E&sh9Q@Ts))(cyzM`s zXcAi@K^T+H}(V6%bC1*HMAU^nCm0L)80u;M4658wb`DNAhL z{NAgkt*m1rV;VI^d6Z`#%x?zx`6i*gUVJA7sCwncIfEhKF+dcmH;aq!A53}42Obtk zLMe|P6~IfI4Mn5S=iBMuJ~uLeN(6MDEC_&e!!lrCq5K+yN)E798C?lgObBQuaHi1J z_7GYW%ptJVhmIbN_`xE}r=!NxXy$sK%L1I`ELY5r7Z$H?Bqt|hUSL)G-bmSnB19%^ zzYwDAHpk$P{)ges4`_ep5XE(ceyf>VKwy?Y+cD*EkzXH)JF`yXu4BKStwMquC^*Lk8l&qQC+n3~dHAC?WNLm-2>!cL&n zFkN-g%hnz+HOc~776z|z1vLtQK(#rvb-2F+NghfoUfd`Afo zy)W7;L+U+DjgB4jKqVYRcl!guqq5BB0k;TV-@wq&qPSE(d0l{f-7=KPd1fr^!$jjw zxc7>jeFF8XS1`tVCe^xZ?d(9Y8Z4e3q#=@o6Fvr97>4KNgpR|-r+hDi^_9*B+RRxj zCVo#zPq*Up;*di?3(Wo`3QP8uAw&QE`iaCpn=p{W29eZz1j&i+7`?K)Q>`o$$HH><0A)pY#O=_fi|tC^wOGWqob)Y zF)`1c?LtAGoJMnDPdivLEIM*Xh$u|$@RW2NViiXiE(jXVLV*1BKCx?s@_1d98?THFgf`7|8-OKe>P(( z$Dr@9Zm#+^DLYhN5HKPHg>OqE-S;Gd60RBp2gJx@3pIz7!S-U0R9!SO7QvvYtzPO! z%v;eUH>yg2WvqI=KO;Y5Tc&W~exR;C9bl)b)&GXFEYwsPo)_M*1!yi1!qOCZ%|OyP zKxB_e;RFI%Z-!<}dmJj3DiCm9iXwDN+UI}+7`6K7c>pUSGaN&-{>jA6viz6pD?EO! z^}5_vmnf${DAoKgp!VQeb6MasW!E@?NhD(J-&N2M~~k3Iv@X|4BpvBpkr}2 z3x27Y+Z4qfr=`Bv81dE06)V8Jk~#B%|7I*`gFXyu$;4Q`-0L`$GpizbMPh_qtb z(--KNqHn}x`5W`BhV#c6myP%pMsCbiL-3F9lm2)AOMoZveDvI+ z5TI}^FvRplcwu00J2W&0EN1t^S}=6jfk9Rrm_AaU8(W90b_q#IAR|#-Y5XJD*czIe zvg0>FwK{_i8spT_(Lt9^Lri|EOJFuRH8rc)z7Y1Qt>qnRe20RNT1z^Jh!0 zeshDIgoG`&SD*rcN(E!~2EMEfju&WRy{KJ-Ab9)~tA5lJN^2y3^7rrGJ?|q(p(Mnk zU}R}M_<`ZYM$UeicN`WTMhje71hxW7o=o@^HR!+WM zn}viRYIXm<)MOJ0!+jvEye;BD^!rtm=QUuZWWu;r0{QpUqBlW_D@pO10`XZVv=Q6& z(cVv*d2UrZ8&My%3r~stiz)bv=(+dSPowltWv0+RKkft$R!3VqNC|E;=e5N+u)zpx z3E4XDK@zWYmQ$~xpgIael8i@Y8m>7)=GvNrC*E|AZX_(tGT-|2?}jan8zqKh2)BJp4F}>0DgVB0?axvZ3D9({)E4} zS560i~70wts6J`P_hYkGn32&9yoNp+ubOLAhB{>EW}LI z?EU9-np4+_Zn(VKtJoyx1?0+pb}OAR9BZd`_o47y|7)@oL_|;=tGewBtr5cvPMY8= zOqv1Se5c-^$VjL#VeLsDf8Mcsri@dWdro!xGF^cZzY1WT&35QfJGa8yw&3~@S|e0O z>`X~=6@hWB{P5vf4=sgBc*HOwmzZ)?2ac-%kpo0J zyl@6P_)`dkRIfw5fJ{S>50G@Yvw}e?Hsy~P2&2I9fR~Edi7d%KYfQ&hLd@epbNFKz z0XnlxAOp&8h(eo!C-BTedCu zIu*-Zv}oz-+Yu2&GXtxt`Q1l7hf34anI*ST~_Ai3h+@%f2^*v{bH&{?kq zwjDc7IVY6kLbA>Y6ui?B1sTe6XP+d#JbBx~)yr!J^K4;@*ZgWC*vza3yj?_bHKuL9 zQd8|up-3W})w}o7r5F9J$kbF;YIB}IFs<#rA>ou5!jbe(p~$10UGoFmsN;<%kTPq` zsm%sGqITDy;Y`@GX+7|sn^6qXm?%LCq-JD0n&$Lj(6tK zr{yWm@!+e&2u{#vA|yQ{|HiN)5$Rx|&^vv3yiLP!c`^E%GqQH^-RdWD9Cxw~Ryts5T@x zg#CcGKZmRe0^Y(;^Qzvy-QW8f3#kB83kl#Qg2e73m?vBCS|cA)so=4|URooh!FnA@ zMvv_RGR^O1hFK_ra-;M)5PrKe!i%R8=(98McaL+m>Jo4pY<;*?p+#eXdm%Fhp$)u= zBv;u=eFY?muFsK&NI}Y=po`K8`Sf-Ov?Nb_TcY=c*v3*1?Y-FgN4lN6CZ@^uM%N8|hUe&6kBrg8;JOXD8PicO`d)>%{qsAV$`AIA7G*&q{y|Y ziGwTvLZL9*mY<5?kD!}~pbvN<;D}?{|3u&h#Xx1erFtDZNox!xf+JF82NbQL;_H5> zChLV>n;l6~77-KU^Djq+7RiK5a9gDIBDRMK&j(H|p*3c-{`Et6^lHMbOgBZrU`1@{ zpzes$@L-kZaD64V?iZL`ko&<5v}-Rae0h?MlT%>#`3{Iv29Xm%E|jzb zndVP?HH99oy_`Fsp@0VJj*HEs{H+;N$8jvh&w=ta2sF?|$W!5PqWB`_3ar!v94UZ! z9_}?uQO(HXQXK(R){cWuR*{ial`}z6Y`xw+^*tmH1!n-!Jbu1|09640<1L3IvEsIE z7ohf%v3v^MzIF9d)$2%#rfq$i$Fpjcw#QSVv{^K}l(Ja_Yiy8&%q(_sWU$E|3^oYS zI|yM(DE8+C@}Xh5u9nuFFxAwbg!jwCgXc&2NxH7CF5(r4Yc&VYqt*cFN_`v^jLRnG_ViD($7p_HGIU=G7OeY?kyEy|6LiK@CJd4cqWyl6tSy>?= z4#V7w07EMGOHf!?17?5D88II&aBxL~dqMoRZ_K#gWFL)W4E$4FG&l7Ydk1WlDr0AH fG)WnJn4N!_w@GD3#y+q=DN1Xfo_dDr$t(X0p%I(? literal 36164 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 udEN;U?ja%M)v!y^Oq5 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 diff --git a/analysis/matlab/variations/naive_a2_d0_5/learning_curve_rate.png b/analysis/matlab/variations/naive_a2_d0_5/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..932726387688c0940eb4ffc1f8dc57aa4b7673a8 GIT binary patch literal 37001 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 IZ+G_p09pf~f&c&j literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_a2_d0_5/logpower_result.txt b/analysis/matlab/variations/naive_a2_d0_5/logpower_result.txt index 4f3706b..13d6a00 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/logpower_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_5/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_5 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_5 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 @@ -10,7 +10,7 @@ stim x log(day) interaction: F(1,55)=9.364 p(resid)=0.003417 p(Satt)=0.003585 honest per-animal random slope (log-day): F(1,13.5)=7.67 p=0.01548 Cohen's f (interaction, partial eta^2=0.057) = 0.245 (small-medium; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+19.33, ratSD=9.47, resSD=13.37) --- +--- power simulation (log-day ground truth: stim:logday=+19.33, ratSD=9.472, resSD=13.37) --- true stim:log(day) = +19.33 (100% of observed) N/group | per-animal power | LME power @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.057) = 0.245 (small-medium; f: .10 smal 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:log(day) = +9.67 (50% of observed) + true stim:log(day) = +9.665 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.28 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.057) = 0.245 (small-medium; f: .10 smal 16 | 0.83 | 0.84 24 | 0.95 | 0.96 -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_a2_d0_5/logpower_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_5/logpower_result_rate.txt new file mode 100644 index 0000000..c4cbf3e --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_5/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d0_5 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,53)=14.105 p(resid)=0.0004314 p(Satt)=0.0004753 (df=47) + honest per-animal random slope (log-day): F(1,11.9)=12.05 p=0.004674 +Cohen's f (interaction, partial eta^2=0.124) = 0.376 (medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.1804, ratSD=0.05407, resSD=0.09942) --- + + true stim:log(day) = +0.1804 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.53 | 0.89 <- observed + 5 | 0.92 | 0.97 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:log(day) = +0.09019 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.13 | 0.38 <- observed + 5 | 0.44 | 0.54 + 8 | 0.72 | 0.73 + 12 | 0.78 | 0.88 + 16 | 0.94 | 0.97 + 24 | 1.00 | 1.00 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d0_5/logpowersim.m b/analysis/matlab/variations/naive_a2_d0_5/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/logpowersim.m +++ b/analysis/matlab/variations/naive_a2_d0_5/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d0_5/plotcurve.m b/analysis/matlab/variations/naive_a2_d0_5/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/plotcurve.m +++ b/analysis/matlab/variations/naive_a2_d0_5/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/naive_a2_d0_5/power_result.txt b/analysis/matlab/variations/naive_a2_d0_5/power_result.txt index c57b265..949cbad 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/power_result.txt +++ b/analysis/matlab/variations/naive_a2_d0_5/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_a2_d0_5 +POWER SIMULATION -- naive_a2_d0_5 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 -ground truth: stim:day=+6.96/day, rat SD=9.64, residual SD=12.11, days=6 +ground truth: stim:day=+6.962/day, rat SD=9.643, residual SD=12.11, days=6 - true stim:day interaction = +6.96 (100% of observed) + true stim:day interaction = +6.962 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.43 | 0.85 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+6.96/day, rat SD=9.64, residual SD=12.11, days=6 16 | 1.00 | 1.00 24 | 1.00 | 1.00 - true stim:day interaction = +3.48 (50% of observed) + true stim:day interaction = +3.481 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.12 | 0.31 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+6.96/day, rat SD=9.64, residual SD=12.11, days=6 16 | 0.90 | 0.89 24 | 0.97 | 0.99 -Read the per-animal column as the honest power. At the observed N this study -is typically underpowered; per-animal power reaches ~0.8 only at larger N. +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d0_5/power_result_rate.txt b/analysis/matlab/variations/naive_a2_d0_5/power_result_rate.txt new file mode 100644 index 0000000..11627a1 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_5/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_a2_d0_5 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=7 nrep=120, alpha=0.05 +ground truth: stim:day=+0.06206/day, rat SD=0.05458, residual SD=0.09694, days=6 + + true stim:day interaction = +0.06206 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.53 | 0.90 <- observed + 5 | 0.93 | 0.98 + 8 | 1.00 | 1.00 + 12 | 1.00 | 1.00 + 16 | 1.00 | 1.00 + 24 | 1.00 | 1.00 + + true stim:day interaction = +0.03103 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.35 <- observed + 5 | 0.44 | 0.52 + 8 | 0.66 | 0.72 + 12 | 0.83 | 0.88 + 16 | 0.94 | 0.95 + 24 | 0.99 | 0.99 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d0_5/powersim.m b/analysis/matlab/variations/naive_a2_d0_5/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/powersim.m +++ b/analysis/matlab/variations/naive_a2_d0_5/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d0_5/result.txt b/analysis/matlab/variations/naive_a2_d0_5/result.txt index 9c0f388..0d48098 100644 --- a/analysis/matlab/variations/naive_a2_d0_5/result.txt +++ b/analysis/matlab/variations/naive_a2_d0_5/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_a2_d0_5 +VARIATION: naive_a2_d0_5 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(55)= 3.45 F(1)= 11.924 p=0.001073 p=0.001152 (df=49) day (learning) t(55)= 7.32 F(1)= 53.591 p=1.125e-09 p=2.092e-09 (df=49) stim (main, window start) t(55)= 0.05 F(1)= 0.002 p=0.9606 p=0.9609 (df=20) -interaction 95% CI: [+2.92, +11.00] +interaction 95% CI: [+2.922, +11] HONEST LME (per-animal random slope, day|rat): interaction F(1,9.7)=6.65, p=0.02815 (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.001073, slope diff=+6.96) -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.001073, slope diff=+6.962) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d0_5/result_rate.txt b/analysis/matlab/variations/naive_a2_d0_5/result_rate.txt new file mode 100644 index 0000000..ba01608 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d0_5/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_a2_d0_5 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A2, Naive +N = 10 rats, 57 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 57 + 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 + -81.991 -69.732 46.995 -93.991 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF + {'(Intercept)'} 0.21873 0.03639 6.0107 53 + {'day' } 0.030326 0.0094955 3.1937 53 + {'stim' } -0.053886 0.062912 -0.85653 53 + {'day:stim' } 0.062061 0.016406 3.7829 53 + + + pValue Lower Upper + 1.7409e-07 0.14574 0.29172 + 0.002365 0.01128 0.049372 + 0.39556 -0.18007 0.072299 + 0.00039586 0.029156 0.094967 + +Random effects covariance parameters (95% CIs): +Group: rat (10 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.054581 + + + Lower Upper + 0.026757 0.11134 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.096936 0.079103 0.11879 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(53)= 3.78 F(1)= 14.310 p=0.0003959 p=0.0004381 (df=47) +day (learning) t(53)= 3.19 F(1)= 10.200 p=0.002365 p=0.002483 (df=48) +stim (main, window start) t(53)= -0.86 F(1)= 0.734 p=0.3956 p=0.3992 (df=27) +interaction 95% CI: [+0.02916, +0.09497] +HONEST LME (per-animal random slope, day|rat): interaction F(1,11.5)=11.53, p=0.005637 + (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.0003959, slope diff=+0.06206) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d6_10/analyze.m b/analysis/matlab/variations/naive_a2_d6_10/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/analyze.m +++ b/analysis/matlab/variations/naive_a2_d6_10/analyze.m @@ -1,30 +1,58 @@ -% Variation analysis -- the paper's linear mixed model on the successful-reach -% COUNT, fit on this folder's curated data subset. +% Variation analysis -- the paper's linear mixed model on this folder's data, +% for BOTH metrics: +% metric = count : behavior = # successes -> result.txt +% metric = rate : behavior = success / attempts -> result_rate.txt +% (rate uses only sessions with attempts > 0) % % model: behavior ~ stim + day + stim:day + (1|rat) -% behavior = successful reaches (count per session) -% stim = 1 for the treatment group(s), 0 for the control group(s) -% day = training day within this window (0 = first analyzed day) -% rat = subject (random intercept) -% -% Self-contained: reads data.csv beside this script and writes result.txt. -% Run headless from this folder with: matlab -batch "analyze" -% (This is a copy of analysis/matlab/variation_analyze.m; see make_variations.m.) +% stim = 1 treatment / 0 control; day = training day within window (0 = +% first analyzed day); rat = subject (random intercept). +% For the interaction we report residual DF, Satterthwaite DF, and the honest +% per-animal random-slope test. Self-contained: reads data.csv beside this +% script. Run headless with: matlab -batch "analyze" +% (Copy of analysis/matlab/variation_analyze.m; see make_variations.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end -vname = regexprep(here, '.*[/\\]', ''); % folder name = variation id +vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -tbl = table(D.success, D.day - min(D.day), double(D.stim), categorical(D.subject), ... +Rc = localAnalyze(D, 'count', here, vname); +Rr = localAnalyze(D, 'rate', here, vname); + +% Machine-readable handoff for SUMMARY.csv (count drives it; rate appended). +VARRESULT = struct('name', vname, 'nRats', Rc.nRats, 'nObs', Rc.nObs, ... + 'interP', Rc.interP, 'interEst', Rc.interEst, ... + 'interPsatt', Rc.interPsatt, 'interPrs', Rc.interPrs, ... + 'stimP', Rc.stimP, 'dayP', Rc.dayP, 'covEqual', Rc.covEqual, ... + 'interPrate', Rr.interP, 'interEstRate', Rr.interEst, 'interPrsRate', Rr.interPrs); + +% ------------------------------------------------------------------ helper +function R = localAnalyze(D, metric, here, vname) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); + beh = D.success ./ D.total; + mlabel = 'success RATE (success/attempts)'; suffix = '_rate'; +else + beh = D.success; + mlabel = 'success COUNT'; suffix = ''; +end +R = struct('interP', NaN, 'interEst', NaN, 'interPsatt', NaN, 'interPrs', NaN, ... + 'stimP', NaN, 'dayP', NaN, 'nRats', numel(unique(D.subject)), ... + 'nObs', height(D), 'covEqual', false); +if numel(unique(D.stim)) < 2 || numel(unique(D.day)) < 2 + localWrite(sprintf('VARIATION: %s [metric: %s]\nInsufficient data for this metric.\n', ... + vname, mlabel), here, suffix); + return +end + +tbl = table(beh, D.day - min(D.day), double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); m = fitlme(tbl, 'behavior ~ stim + day + stim:day + (1|rat)'); C = m.Coefficients; A = anova(m); ci = coefCI(m); -As = anova(m, 'DFMethod', 'satterthwaite'); % Satterthwaite denominator DF +As = anova(m, 'DFMethod', 'satterthwaite'); -% Honest test: refit with a per-animal random SLOPE so the interaction DF -% collapses toward the animal count (guarded -- may not converge in short windows). rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; wst = warning('off', 'all'); try @@ -43,6 +71,7 @@ row = @(nm, t) sprintf('%-26s t(%d)=%6.2f F(%d)=%7.3f p=%.4g p=%.4g (df=%.0f C.DF(gi(t)), C.tStat(gi(t)), A.DF1(ga(t)), A.FStat(ga(t)), C.pValue(gi(t)), ... As.pValue(gs(t)), As.DF2(gs(t))); +ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); maxT = max(D.day(D.stim == 1)); minT = min(D.day(D.stim == 1)); maxC = max(D.day(D.stim == 0)); minC = min(D.day(D.stim == 0)); if abs(maxT - maxC) > 2 @@ -50,20 +79,14 @@ if abs(maxT - maxC) > 2 else cov = '(equal day coverage over this window)'; end - -ii = gi('day:stim'); pI = C.pValue(ii); eI = C.Estimate(ii); -if pI >= 0.05 - verdict = 'n.s. -- slopes parallel (no differential learning rate)'; -elseif eI > 0 - verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; -else - verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; -end +if pI >= 0.05; verdict = 'n.s. -- slopes parallel (no differential learning rate)'; +elseif eI > 0; verdict = 'SIGNIFICANT positive -- treatment improves FASTER (benefit accumulates)'; +else; verdict = 'SIGNIFICANT negative -- treatment improves SLOWER (groups converge)'; end bar = repmat('=', 1, 78); raw = regexprep(evalc('disp(m)'), '', ''); -s = sprintf('%s\nVARIATION: %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT)\n')]; +s = sprintf('%s\nVARIATION: %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + day + stim:day + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('day = training day within window (0 = first analyzed day)\n')]; s = [s sprintf('treatment (stim=1): %s\n', strjoin(cellstr(unique(D.group(D.stim == 1))), ', '))]; s = [s sprintf('control (stim=0): %s\n', strjoin(cellstr(unique(D.group(D.stim == 0))), ', '))]; @@ -74,7 +97,7 @@ s = [s sprintf('%-26s %-18s %-12s %s\n%s\n', 'effect', 't(df) / F(df1)', 'p (res s = [s row('stim x day (interaction)', 'day:stim')]; s = [s row('day (learning)', 'day')]; s = [s row('stim (main, window start)', 'stim')]; -s = [s sprintf('interaction 95%% CI: [%+.2f, %+.2f]\n', ci(ii, 1), ci(ii, 2))]; +s = [s sprintf('interaction 95%% CI: [%+.4g, %+.4g]\n', ci(ii, 1), ci(ii, 2))]; if rsOk s = [s sprintf('HONEST LME (per-animal random slope, day|rat): interaction F(1,%.1f)=%.2f, p=%.4g\n', rsDf, rsF, rsP)]; else @@ -82,17 +105,18 @@ else end s = [s sprintf([' (Satterthwaite DF ~= residual on this random-intercept model; the random-slope\n' ... ' model above is the honest learning-rate test -- DF collapses toward the animal count.)\n'])]; -s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.2f)\n', verdict, pI, eI)]; -s = [s sprintf('Paper (N=24): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +s = [s sprintf('INTERPRETATION: stim x day interaction %s (p=%.4g, slope diff=%+.4g)\n', verdict, pI, eI)]; +s = [s sprintf('Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.\n')]; +localWrite(s, here, suffix); + +R = struct('interP', pI, 'interEst', eI, 'interPsatt', As.pValue(gs('day:stim')), ... + 'interPrs', rsP, 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... + 'nRats', numel(unique(D.subject)), 'nObs', height(D), 'covEqual', abs(maxT - maxC) <= 2); +end + +function localWrite(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'result.txt'), 'w'); -fprintf(fid, '%s', s); -fclose(fid); - -% Machine-readable handoff for the summary table (see make_variations.m). -VARRESULT = struct('name', vname, 'nRats', numel(unique(D.subject)), ... - 'nObs', height(D), 'interP', pI, 'interEst', eI, ... - 'interPsatt', As.pValue(gs('day:stim')), 'interPrs', rsP, ... - 'stimP', C.pValue(gi('stim')), 'dayP', C.pValue(gi('day')), ... - 'covEqual', abs(maxT - maxC) <= 2); +fid = fopen(fullfile(here, ['result' suffix '.txt']), 'w'); +fprintf(fid, '%s', s); fclose(fid); +end diff --git a/analysis/matlab/variations/naive_a2_d6_10/learning_curve.png b/analysis/matlab/variations/naive_a2_d6_10/learning_curve.png index 029ba85885cf513fbe6527d3e849061b8da9ae30..a6de1519c198b5bcad5a1e6263a8c937a11dc515 100644 GIT binary patch delta 17660 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 J%0bf`{|j~QO>6)F delta 17585 zcmc(Hc{G;o+wLu;SEbU7%G=W*Au>ipWk{i93K>d<%o#J})+B`_^DGh>BJ->{37N@| zB4jQyPy4vNzwi6@Ui#DndEh7lR z>2IH8zg;v2Hlg^kIR`&^HAa3BF(H9bzV~u3613&XBfiNQ6^oJ!$F{6cRsCD$$!&(^ z%Yu)sv3}OJPk>{$ZL(k{w@}@Wfk%NVKB9^b!k+nu@x;XYw+5JbY3?-0T(kTYPqlLT za-qu`?^KQW7K%#tSlb@{mj7Aw<-oL@Z}@CU)%By-cGiY}`g~od_j9zQZI8F-+xPET zm1JdP?wwRpA|EvFT}HTvRowG96xyw=J8~(~nRUm&pSv-kDkBYB{2uH$!dm4z+3rZI zO;SrPD?9n-`$YwF_U)ZN?L+tcIW;c@?@j12iMx5JH#Ha|0-e3YA)_l&f- z#I(dZf?!K5IW9B4{bSY5+Ug;;JB;S%!%o$&UA_9#=g)eD4nx{j#ogb&rCYWabaq}U z)+I-ZC)L?=j6d&WW?Zu->s&lR#Dw*Gscz$`Xfq$9&F@MVIiT$Fqs&jw_4m7~$Rq36 zkGADlwEAqvSQY(#|LWFC zCcl>TWcKM(r(}J1N|-gKJU($(D^3=7kY-M+$$BO?lvXlhI`gMb#Io&dWI zR_gru=AO!MIp3Yv=caz2IXZp$Ymrk+6C**evd^5Tu6QPG5vjyM<1PAi)3i!G%d*{h zV(^Q~Q-zv7J827o(0@7M<9_2*eN|=UX1|b-ZFOnho}TOdyteY1DsLeO6KRuD2GwVz z^w8+2&DO2Ki0W`RLxh&}lf=Z6{sox)cFYBz;$G8Si`I$J?oWI7?oHLs75-gr+go+d z^X}cd>hW|0G5ZF$nO2Q;(AU>DHSO2XyDnt&-w_4V~ldSo%)D{1vKsivkz#nnJl+E%|^Cp;3r<`xyrb@@szAi~Z>99C9W@9F8; zvT2jx<+6vryFMf<1(EaPP2nO|N~ceA9XK%h>(^h5j4TM1^owsShYK;&OmgI3*8Zxo z6M0v=zLJZG?YZx7?)tI{_4|@@aW)GBX{84b94N1<`kHIiK~9hL$~-w8d@xD7`A2uR z#6+`!aa9DfpL(j6{cu};Ow6~t>~2%v@3L>$utC_oSwG<0)`J%kEBv@ttzK;}7O9lr z<>RB1ahdVROL{_I=&jkyo2s!n$;kt=Bc+RFyL~Sd*j?#*@8hw4?uY*wb@ra2q4`%U z*|W^Q)c)*tE?x*VCZj}=l7fSq*sO{US$~u2oFMb+lJkGQ7Q5`&u_JJd zk&&@n+nZg|ZS=>-+^^09)M~o;#v|LT$+DxQSUcD9jKp|=VW}}eggtsvG5Vy!=1uTD z7DM^a?(zOMjDEG}%=^J($Bwy74(pV-P9v{9*C{lzBOBV=C4_|?uzZt}1D?dk?>OS1 zAg${*ZFr(;i(lbzf!X)hcLa>9#IMi%!6?SX#!5eljlI;6q(({R% zwWeh~OVP?U#k@aduU<~XIGv-}RI>b3US0L>c46ht-Yc|KnaCw8`jxe%i;9YLF^$2x z&LrpV-McwBdixuaX`SD{|Gq0Zw~L!QrRQ?ajSTKw&p*TMtv?@SY|8bFkZ@7I*CH1A zJU#tvTGQu{LvKueVR;=zy1{CvU%A$M+o9Nn4pxFt{F0#;r=nP0jT>$#kPVP7D5QJ)QfTpF=g`L^oE_^jUX5R5v^ZjRuI+~i(pLk2_*Sz}p@nf;`c#_4X zLd3O2YYzUWf4IHSrzdIM_QQYEsD-0o6@B!&mZ{z$zCC;P?B0EX1+lt@3<{Ot8Jg|& z?^&~3mtHGT$dvq3Bgdtl^0OhisU_RY=b*%B+3um1>~O@%ZN`nJCF!_2Z}FenwtQQS zR4pu@&1`I~FAP4se*OCT?8JN*`(pLL_*hS+fS^-vclSL{UteESrbsb+es8SSRb#yg z1JdMQF`VOx^Y7WLQb_GwC26<$ag7E#q-m$_K#hYJ^7yR27KLfZ`LK5P_2rv3BvBzb zl-nU3;p^?~+W#zpVckyi!z$;_(P);ImPsSA5gPC7Irr{0e0P6yQgCc+>~PVTlC34m z>ip?~{D?{P4O8(Z7b+2O*UKTRAR9Sxt<77zV+5;YYW85ys2H}?t# zAD?WUy{7a8>u$r%k|%O3f4NeVu9$fFf??nQX2PmD{V@`=&`O0UaVOLj-=i}o&d$!{ z@#8m@>z^kjg^4?5C?$-IkL#e8w>x&U$I7f`mRD4~jv?vn>QYfrLAH3F<;=C1nv$Z* zGmLUi>+COIw}OzWGd_R)40j8SMmzM~l7bM=3hDTwPt_lFol5t7`|jPd9`ieeg|pr) z0#UA`@`l#-+BxP((n?B7jEp2>gX5h+lnPvLq-1t@aB%SU?d66BVU4NUTQ_YA2ntFn zIeqo&i&5PkSB`xJ(gAl?&=Kh?8#s~z4OTxjB^+e-n(CFfYD(X{bxX07A7zp+uK;my z@1(T!?V8~MS}m$tVqzjnS%0flsakAKbhMtO3b2H<5#EN zico<{7DmE-bMu)ePp>Rb-;C<*<>eLF!?ZC#XOEeK!|M`E$sPrlv`r zbH9B_)hcNj8Ki$vjL-CFcSG=sO@7F^pI*Is_2EMTz#h~5Fe>O@Tz}j`Ha=4fk*KPx zNURL|;?DF;dguc?DZXphXvccIz9_d3c_i87*a`}Xb9dw6(;;)8XQ5)-W*9HIoT)Q(t< z{1C+Y3>7dQZplstuEGi9imO+z)=Yc`mhslipFF|cBwB3$ zq9buduY&JAw%(5c!ulr;C>J75NEBYO^B%{2FE0!_a@pLu@j#1~EX`84>y=T1+Lrl- zNIrE>6^}R$x8YH-b$=8Hr9Ar`OWTyD7&)DV77B741$;k)zJUyE;jX!4?esUQ3 zdVPMzJ}&v-!Gmw^uJiTs8feSU?EhqN=~4+E4omhYVtBqUA-XDBvZKI$z}?+_VSZL} z=4Tx6q-3&Tvu0@?{?91s;WP}e`jW9K6LT*?U0a=@Wr)sMCJYYNw@Q7?Lr2E znhN(A25GD#+puOcLn{~tZ#ma*Vb;^@h(8@%GSOnj!omU|kdK`1nT0n3EdKueyZv+f zp`jrPD{5vMg=)$vD6DzKN}T0Y4@u1NKWU+57h;A#<5nG(r&ol9YsKZfMs+=K;69JO zzGiR`kHGd|j=d}oK5f{@6xKO6sr>h4p`&B?-ZePh%Yn4ZEo+$n4lHDw?m6 zrduA>FGU}~u{UtpgZfV6$$gy9~ zy7cb8Zn1N!PGRHE+TFh5wJ7t56{QfqV_l=b*UHBoDpz#L@*GaE&$JppN%B+{PSQ)& zJ>8kzajnb8exUJQSz75rlGwNMK(4f+(Q+gTfY5}C_5@+U-D>yoZBhkb1^#Gnoo#nL z9*>i4pKi!TH3*0p>gp0Osg4Pw-@<)9{Yu@_h=>Rwv&J>s5A*T!pBv+^$+}h*rO1xh z11jkmbmKRDl}{FZt{34~DNcCWy8r#0mA6qWt5jUfhHPN&{j~N%$By)iC&Gm-OxK2p zJB^|nV88yS=Fgu$$dR$a{htEmcG87w8GSu?tNdhKF~gMv24W0L5V7NR^1_7(z~a2Z zLSTiij~vme=-F7kob9i2x7*1(ovK|mRDXPAB^ego;x?kzcuM2J^qov)WR757y)EcT z^y|{rFftxm!$1gbksnv6IMp#xS+skoUdqCBc5lv1M`1|CC{LQ>3rn4J;M$@7eys}^ zT)W;g)upKlYdP9?f7nY1?mN|VSN7*T+9-fRsd#r`2Ygks3Y+ z=!s??nh+6kVz22sR>A#TTxK61?ZvyVTXl|{nDgQ-xrXX1^CQY-xF$!6a8G^bGqwo< z!(>w6E-?s%?>6`Q!^RC8R;^m)fyU1I+sh*(MVWxKD9+BsC3$&M_0Lo~T*nlhoeMm# zUAv|bak!>m2!nA@tRkD#EpEEnCGN9j7o9$5&Bf=^Lr*EhZ`I+3mh_DHZ|SR7e+TQi zO?LcLpa3qw8Fmd0KWW1Y3LlZLg?bf=2yuA9N z{?5)({2k?2gho3~#a~dCd0jj(VW{L$kE7;99?96xmg(i0mNrrwe_GFFC>t;UaPva3 zvzl}ZQVHmJ!Bwd9471s_cHM&mUzDT^RRaNahWW3Q>M9d&@nNJbSMN*ukhI zFC$|Vr3MK*%S4_aJ|$Z4x27kS{gWp+3FC(<{uo+Jd{@(Zw%)4^ui^5xtbLu)SH z!7um&6X$!vt;j~MlAUOz!$?o&41qK(ByBPF9a zM*X;BFBcHt%5k!xZi*K!v;igPUHg6q-3rfzytCo231VEf%2K`AWPLixWd1jckZJvw zOk*Sxuo9x?&3vC4mlKJ+4G(v09De_ngJ?cWzH!MmFfhOo^S?i^Z_K`7l<4f99QCXD zLiN6o3I<}f{#PPW9uEz@Z|;Rd1glT~qK!_m)e*6Zz-z{e3P$wq5@y%x5ANT;-Y+(m z_GvRck+^bSCf&;_A#qc3^dkoi3Frv*HQ(t-mpX!=0(PO(i&vp221qfTO#fB=_{7S! z+t>SnTuD8J(=YO~5v;2*JQV_;LuM~=Byg%cJ)gCckVr{@Bi7BKlZaGZlqw~ z;1Jhx_a4vUD?|+AS>G0yiNSkbUbYSn&v#}6j%S;H;qN{yA#r`=YcZ;DsF;0{P&tmj zO+6s1R=s#&c=!>VbN~K*RFuGg0CGP^W@ct!#L(biTb!J)utke!ndHK6Ur;kzU|>vI zP%nR=JwPm(u;K+hnAo1{m3~E$q9WC@T}w3d;lri=;%lMf2)eor8#kiGOKlnuv1qy6 z;7k|Omt?_zWF+%%8(~6F_JHycQBh54Jek4ysuAFNau!8j=5puTdvtVkw9et-qh^iV z%<}T`FLYmk2-#~GBstgVgb9tgr`*?Y)Nwe%Q(8`rt?II&A=*ey>EXhWqi;SQ8O}Q) zjhdY1?HsliYx29~EdT)Fbh6Ak|>>wTP@@>J7z{P^)T9PRDxOt^a!a%clGkE4=ORmb9jBT73kYw=X4 z7ix?3)vGN0mrssgB-unPH~FQf^Kq%IA{3V)LZ!wYZ^&kM`r${;59px*VG}fY`2EM! z?=A^(@qjMi-R@7pBQ4pdr2%>_Mjoe&VT=)ABf>TZGCcbA>la$ukAR8R`}p~7sv<-^ zczxL=OPt1xm|6Jr-D^}u2&v7~Jp`VV9Gd;{(SL*l=AWOP+`4ruh^ocDGo+2p%;N5m zysow2WRMCsxRBxG^eP)`IJL>W6Vq!XlLtNT^L_BJ!N@8!39@Y&s(Qq7^IQev?dOB7)vt7A9W0 zQ-6E)RgfTdgFZ?pFz192b2i<#r->fsyNu}x&lbX3fXWFWF(u6%AOirjQZK9`1ZgPe z>q@UhMKBS3$0STg+6yNeH1veT@_{CR0psSy!2?E6ckY;#(w%7~PHl9l!6&Q{&#Y%`6^moKA6DkZ4A&&$j6EJGS-EyiMMFDxv`*iG+l zbOWoNV2aCVjxH=L3=R(VOj+ul7p8l$bf3n@5B+mTa<;WY`t7S%kHN~6-<}LPWRP+} zkT}nT8FXhzcCjyiT}BXp6Y|o>RCUN9CG_U~^;dpYKW=)iGyCh!I#8?$dqz+PDIg7? zpU4y=e+iTIQZZ?Ai!j<0eBxw%Hu#|w8ygy4IlGx?-bP(JeA1=<0Xhtv>goB{nl*xp z?*ODFTqf$D@)7AiV1+OVEUBS9R1nP1@60Zp>Lk5D_;{Y2oftytKB!x?p9cIhT>bbK zPcl6*a0#hc|5&NqP*zq}MMVWTt)oIh<6y+{T&FXZ$eGWd(|SoYRn_J!Rie7_4R4h3 zzfQ4`ll!n!0u)h=0XhR3Ke;dm3iHQ{4?B~VhCGRqTl#u>_R-M0CV8r=tE1G;Vdb-vb5~I)QLF=Rw?9=3NAiioERFSk&NX^R z=xYl45QN~l$yIyMU|(GNB%Fz^DlZpv{zG;Ava+&9Mn?FHjSast8!5GW>1K)zE-y-v zeg9xk(cqN_gAI9MCr{`zVf7GMfXBuaA-~^lJhLtG&#zx72bndL5MXw0D`Db6g+=4z zo!PCqR(b*_K1YD6sR(TeUQVzs4WQ7t<==GfviGUO)Me`#s=4_>EiQ*@t@f#jCx2Rt z>|D3PJ^UEH|MNmbQ4xztXi;I4M~D0+{!f~k+X+hsWi~05_tYBo&}s%TTfGX^Okcag zl-}fKbNExGIc0S0>$B+ug%pg!ccU<4C2Q@*Z^fvBsjq>B8}=8qoF_aGOEm`6!oN<# z@7qEuNCtq`d%TYsOl>f$=3e=UWJ*k_r zQUk=gHCEU>W@h>2aid4uW-^smPdueVxskSLmKxvj*eB@3KH<5WZjFYNo&`+Q;i=YEikHcM`Mmj=~9tU2hut4?YtaN)i;@2XTG87pzTZlm_ zPZMD~V}*%U1L}x9$WzT5mcHb}m*GpNWl>)eOJCCCOS7dT74XRC*DZay8DDadONX|l z-(e!m{zj4u+hvqZ*A@W!G>+Gw|5LJ+*c-&6yO9@0?#3hjPyYPn-k0ny$!cDb4c#R# zK;hmhj4x|!PO9;yQ{U8!rK|87?0AjwAP|N$<0g-XIL7iC_XeqAp53^EJ_GJhf99N# zlSSpOB=RpTTq7?{9Ph6hjSMPfiwHR@DVsd2=_(E~6O#{#qk8$je)!5P;|tC(RxFOX zw~0CD_Hsf{8~3tTQJ*w>sntT;uw&S$&j#GYc082Ap<=Gfk(XY#hcw`ssN?!A`7d*w z$EB(xFgSC*VlJdi0M8Y?mmJSw;~8~y0-?1y))>c@3P||u5UEm0syrumH{VicFxR|p zZ$rYKuJ=x|bz;j1lL_3Sf9;o~d{MCq`%eQp-cNH4Ubh=jW8#j;xY1Klq03w+a&N7z z52K?%g$1ti2s3z=`c>Hyt1PToPo~iGr%S@oHmbQqw zr=8PxjvA}NXLVd)6dmw;f0;DsKshq?3}LL!G6a#n5eN41wR6#K;}R*DD!~H zh-Q~=<->|EE~b!&`RroGN1=Vy^Bo zr5BbxA&d#!jB}ZmjvK{s**vXwoSd2BhvF2*4;0e~k`QE(ws`6Mb2A+gqlvS^;xv{M z?mc)?lQO$B&-EE}gh?$<+(#Wj;Lu0^MB&o^9>Lp1M-6=wbCt=eg(aW9etF3a65l)0O)l?f#8-tXCx9{+zz zAWz2*QI8e#;&0P8!lv58&hHaW354;85>Guea#lkfmg z9~ep_s8Fuprx0S@`IhlbXdQ~%(d*8if_T`3%^`(7J9-U@ z4N$G1tLFLhiFJK;VmjvLgOB!}2AwE)U_+zE^(&GB%$Q86-3`aR$Z&NvHN{Z=Zg6|x z&;}Y)Kb4gob{IVG>RJ>X-2reGeSP8!`2R}2!@G7J`}n2ngD=$HMaZjmV(k!M{y5L0 z4x(tL$=osF4!E;uuCoH-?+KF)*}0bOVNp?EK|oXD<*#qAhKGkCzyR(pQUrnhz?N;> z$ZHF8PKK9dWZpqum%a?R;I)NkbaK+s&hF3nc%&q`;D6>QCoNe$^#CVlP3%cTg_KH| z^w8AQHD;%oz676^4EkluCV<*qZ1QrnV2^F-CDU$tLS9&DZ9Mz zr(IZrgLk{*CMd4^?Wa%4;9fbDBCh>@w-wlEfs)HALJo}-jXh8nDTB%+^8^quDfe7d zl-Wnv&Xe&Ule5gXzuWNw=9k4(8wE?{|@*yyOVwEeUsb6@>4|BGwFyuWmbSAO9+cU}_pLC_{Bx&f+Qh9?O6-$1k5 z#O!`zOwfEpJ$f{X7OyZb??-Ph^u#($l?DTsf19Oczv8lT(n)~b>%xmmGEzM1Dd#VS zjxcS>uz#T!Y0&xJi9enRTC>n6xuJ{$06 zG8rLET7=cagC~Z@f3FN&ZlC~Z7A8zVG67@Z zbd%Oq3M>QD3 zo$tIFcr7|gbov-s#OxAn_8mBo1PPv&;W}*-H(LY-e(l<|M~@x_VV8N$4;OH6L}bhS znC^|Xg2O^txduY`BY*$oq@+`)P90sC>H?>GANtT+iODuH&fCt$CQQUC%5xBMBU)B` zK&j>DV=SxM^KBD6F>W8;y_4~xA@~VJO}7;rnEOD7fNF_y>IrRYYlAGWQECT{vJ{;u zp2b4|tLd=Q=nsgx@D5OdK>sZ&O~Dwzb6{xqjEI<< zpC3Wv1r?>JN9+qFW7O3A{{36-!FJ9iwcpdzGlcKraRmi$*>38AwCWC+dO_s;{QA!7 zz^8s<@7}&$pMqah2bfSDFGd4s81ZuRzyCr0@4r0$#vXw7;wNF9a}v=&Z+V+`prRWU z8N$v|xe_S+1T+H52J`LCbz-kMZxiy)?Nr3jem-TVVbF=Un{9 zQz+#eBr0pb8L#<(X3V1tl**gbkMGw#)AHV3+@-OSyyI5R}+x!2R z;EjS0Uosf^jy+jNfiMP_y2d^9`FBey*)wxdv6~` z{u}3>ntJm89eUOo_H^zk=U*Hb4H30{YQc5v&66ij_Hb}`om5q=k97QcWx%F-y{o4p zA$gkZ$O5ady!!nXO-;>p;=iQS)Eem5iKn|xkA~5g0O3}KizLLyqr5m>yLS8bZSNgN zNC&WRjhyRp45vEiB`>h@cArp?m!F>M^0m-e%}Ns${qjr1uhhe5ljP}e!YxQxqS3Pj zg%s8N8OpWAOJse}xh7K?umvRm>=raPH}5?ibolV$^N%U8_%b7GU-6&dQ{x0U zcLThX`+J$>MCbyrYUwE}AA-i;@+ixbgz0U`Bh=pjB9i4j4kUcM)V=1Rv&ubt_6&Fh z;=jNl1*ac1m6eL)Nj6_AKG2}{t~q@_)=%rjr4?qcgiRZojAXmur?_uu zni|ks?Emp23$V)YeT$%^WGS%C>a7P8b>Xep>IWS?Ebk5CU0#kACk{Tm6E^_?C0Rj6 z^4ClHB>JPk)-dd;N~6gGHwp8O9aPb66W2q5#mlZ1tF_AksJ zN?a&$&G-B{J_FgQe|!dD8O^F2)dwUfVKkqou9j{;I`!=qv`7}=^LcLb&JNUP0*4D* zeH|PcvS=MWt8$6F)Csy6p1ZTXWq{?DZFx1n3@=`MtVAWV7cX9%4&uIQZC#zA5OV3C zr*M%CxWQ!CU*9*|QW-6&Ck?y|dy}~ir|CFE7f#XH$9H$mz^@9xk5&3$yC`g$CXi2H z#MocQmu`$yb8RTQ>5ubuGytUwfLwlcB~@FYIqju_H~xEbR8f zPY%fZ?i!X$&ekx?J<5a<3<6*Q?}>B^Z5CrN)S8P4`g&mRn~+fUOT|acnvY26pMjjv zTJ2;I5p9C4c7sP4HFhH->?|x!|17TQS?YtL(y-kLMkQ#-xSi8j4~vf0 zQkEtm-(cCNo)cQQ8_FI#9W6A-p4pPlOIf?oT$q#Q=Blazsb)7gmu$aq+a3`UQ-OEkcivV)O%V!Rg;nadRgQ9sSM&KwRnf-qJ_bJan1%mq{eAN!`yJKzxu>e<&e{C#lrdAgEq2YtC48E@3)Lk)NH10zM%K4{ z4C+SzgyyVVy+?5~q@8;kIm8@?#jkcsYd762kU+&vDxNj|4JWaUEL_vSx+BC{YO3qcOZats^~Ad zVlKb;W`W3+b8w}-S$n~F>B4xLy#K!Lo*o#U9>diD1!|jskplE0c*;vq3($?W6v&2P z@51Ko+qr4f&Iw%^8JY3ZD8n!p`Pp31)wR6UX>A)&bx=e^q#?Q7sbQFx*n)S{nL>sK z4+A0ll7Rv6NkyQ)zb*WT@dB-%sL$!NCJ4Fgpb#Kav6T7d%#cQ%w+OS|^?H_E=XS`REai_W1E*S?x`amH%3` zY6Ek(-fFXRJL93BW|=BV*&^xt=;T>{M_r~=WnMg@Elf#DqI}$p8j-s^xfbs;6$SQV5@8|(oLYA`&}kBBd-GMOolbv{-zm!j;gGz6elz`KRO_f1V65~#u z*U}2JIooQvI{k!W+ts@n`?@GuQ5S=kW>cMMd?q>QjHnNQeOCJMH==TWb`n+PS*wr zyK$ewdOw&yi)Z@DWDlm@r%#_oJ)6cBpL=D9+`!7#i@7_YvNBJ@Y6*pPf&w-$9XL5T z0S_shJh|QvhNY-8)!5i$(>+S+z^x^!dEvr^u_yl*!1zym@jOGY8l|rJ)ysVqbL%S? zQ!XxUR~R8HSDR2)p0=zj{<*oiwQTp_cftxy?J$axa0#GrFf6AO4`;rw4P^&qEIlk_ z-es&(q$x!+Zaa4PywR=p->2vdi<*VTR#h;_Cp5*M2m^X7k>L3lEBI2IwhP0MnwNL@ zQ`1U;km+5GlbIe81}ip@%^?{EEQ-ZG4>B{yKtZqFewZ@YL+?f!XT~yQT)o=m+l`f! z&*g;4Es5|Wj+P1v3ZU#!%poqrn+T`B(8brw3s#4@!#3~}ICpAlx7>qGOI?n%w6sD9 z->!Z8-Zx?{{(^W3?6dDD1UX#0vVf+RfO*Tx^aWVDm`hA3O!vx)2`-AsEPLSO!0+!4i>5Ul=4u82JG@p_e(;yZwB zSTQm`9zdNBo!u|O$i$Sbph>vT*kX4=&T~3~^)BLda+qwN4brxhS5nHc=TR)jM8O=z zNyGM^DRg!gI%|pZYhcgPe~tldE?5rg7?KxZ8=sKS`XB%2UcjSUbolST^#M|8RGl)+ z_eM6{uK^p~#`Wv@P=%PmwSI=#1Cj$0SXRH|;j5i*^%h2hXNSo`UUBg`#P&!{+y|;x zMYv$*<0jAP+_;QgE^tNNxN(Da4%;l)*(up#0t*DBKKe(!bp2zfOf}a{pG(!chwm?e zwFs3DTEvmVhp)YKr-Oa=KEDmNo8TgoZMMFlq&LWS5}OGrs1CDGdU`sERJJ%jLY9KO zzZbk|%a-ToU(kewb5Oc)UnC|N*|pO3U*W<@>%u{NN=ZpUSHZ%Ib&f775(nCGcPHZS z>>yHZeW20BSYmnW>QWUA6>>c@FE1~1AKV-^+3;A=Y>*X^#ucNFwxb~b>;^z4U+FE* zH1!*!AOqpxg8>S7`0#A+8?PlI9t8`41TG$UjmoS!d3mj{wIrHcmQY5o50Iap`b;>OrP1(%9A>=!~-*)Efo-L{8{mJ=!N zP|XutK~H0I25N)M4=R!rsgIAZuf}sRQPF#4;{#1dZGC-x)2Q8x-Ml0VXmy)$(95bp zUTBiYF_6>%${CrNrPDp(RHy#&V;^?A2^du*rlbh!NO^53UCcwvuZ#)_M>Gm7axa|f zsYNw`TpB^VdX~S#2ix*hK7Ij;!9bwSi=!I>J>J&d9_=zLYIwZGTDvZYTQl~@Aa=O9 zV*462BZQzdG&V9kycHdp=>uL)&QR!h*y`cs^$9-wl)66Znb6vy_`$6L@9@F%>EH0S z<==pz@Xh@)43%2PeCFq)8~qOI6u_4kuEIl{UydYWof(kg)KkHNt_-QW-b8&W&iClK z9u0E2^jc>I%Gl){hx98KomL*RPClQ*X6 zEq;((sQFo|oZxN;y`#k0pu!Ti!@UDCu>_<0aKr|o3?JH{Q5w6Tb#DWUwthma;Sm@2~W#j3TE62 z?-uMrEx!>Su3edoOeb^(tv5I?Tj*RpBc^i+lJn0{vasU66xhQsz@^fHI7S9Z44tGS zPQzZ|Zg^NsEGded_+pIho1TBjp;pJ*C-QIz!h&|Hnc7>T8vR$+Mx>*sE9)nCnl6hS zOfIRxY7USgkh*3DGe1wD{lQ&4&VGfc6?Xa&v{h^=F9B`WaeYz;C4v7IeDn}C!}9m< zBF?WbZXseGS5zqMHJ%)3;yrrQ?c2*6U%!6!kT;AAA}_fZgxomD%d4^DY^&QLq5Oh^ z11lQ}lbHf6ANC*M;sVIoO+!LQ$?@^=8G=cE{NqT=!p{KX{X4dA54ar}73GGFN*6^f z2w|!;GVKtxkrv%1>E>EFo)9=LG1$nH+ZMYW+HX@)Sa7goU+rE2tA>1A<8CR&5?Qwy zvX3K90FqyMT_|=0m#&iyOelk(BtQ}yaWb&&LgwXUu}g+UOr;-OU5w!rB& z){l)LsoF~OP+&P%qGB6VCZl>ET2!Y*&R6Rs=gyAxV{#1a-v8=V7cllJ1C&%K3g&+S zM0dTvp3^Y2^bl$AK1A;T1__EtMZEa9$+g#?w|m_C-p?h)g$-#t-lRAb4_^_2y@~@K4R(&HtwO$1{!T>a0tMP zKBKwn7q&2f<%9DVjP0Vi+cP*DrJ?`u1=p^?F5@li>?9f`?7tHeQ61?hEk%Ct#D>-b zLPBb3O#|aI_zhqLuV%&%D{?lxcHMQfAuThHEy`ZKx(NF;jUvg=dUCQIM5?CtOQLEG zfUvswynwQJo(ozIx-Ar|4dCV)js=niBqt4#Yk^D;Ia}6#_#l@*4b%&cgW5^5q`1S< zFpj-poV?6__(uiad>v#!SyuhZg{P9nHq4ZnGph*w6#!y@8(cQ#Qsj?l z{rlEd7iwevx%21Y>1h6^D}=FN1iK8t^x-ISq$w@hbGxKl5f(6&fg3xHUssG0*Zgv5 zfzn`6$#31db>hSc4#hC=2iZ2=r^Yn?X7&SDweWo%xt?M%?(TF>#MxL9k3#)Sl+ObN4Rxu4S9l#F~*!&p~K* zKu0KFr;u>Yz)u%qT;`zxRm5FE7``ybE)DpZ>}-(e{1qAL^-6enb+7Hnbw z%LerHXQYEFDzNw4!(@(tg!&FQMl~+;@}*SVx>(8;%>EP^c5z{zhn(hEMvQ;gUuXn+ zR|PyQ#ddWJk|pB0F?-Gzg#!IxE?`uCZnmf9| z77C{j^n@_ght&7qSh>^M+Bz{Q$r%y=nsXPt4YdJSa&h`Iya<7ZThW$wGs=W>adUI; z-`@;WZQv{6fQ@@+&V0raX)V}KRPI31BUE4($%imuxUBW0we>Ij3lhCuT?X?>-m3VJ ziCO3vNVHhkE1hvsp7R|n)e^=6$Ul!?A^XOy~!4~*%a(WYVtpQllNr`2JMzXJXbDOOk1#FFIu}KB95o3;<+@FC-wwl6N dyxh1|oaul>uYmejj5Q%Iqa^+O_%i*Q{|lY(A(#LF diff --git a/analysis/matlab/variations/naive_a2_d6_10/learning_curve_rate.png b/analysis/matlab/variations/naive_a2_d6_10/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4757078ab6b855b716d5cf9a79ead914b97258 GIT binary patch literal 36012 zcmd43cTiQ`_APk)Oc)SQK?DIwiYP%ONJb=s8)+k-?>RfHz4lyljydL->z1avBIS05?IaS3 zQdvn(n?%}Ji~l)O{DW_X5B)lTKijS-899+i`*sum+hCp0fTKuTot4kXZynxBznN>p zm3{V8_=>|>-q2ac;i9wKIY%qfnNzxIr(};E)U~lXc;=k5je&!sozt;{%9ky9B@Dai zaXcGw{Aow4bI!I7mk;XN+FOwX1bI|kF7XKP3kVe^pBIafjZ*MXe0UwOXP$Zajr7Kl>OnNE3mf%_5TmWvz_k6zLpI9??G zmHn4?VziI^SDv$^5`RIN(CbGsZrQN$KVMsYp)u#ca5K)!;`_{UpTx!Sr5G=%#E(5r zUk59A^|Z9YFhr7OH$#*22K+;&Tdrw~|MRcW$KTC3#ELlN4ml1d-eVH4sr}9X(~W^U_Ko+Ho9ODM=x2+&3=7(POQc~}Ff=x9 zx#V&6>eXJqH6Lf^=^T@i?c2AE(r~$;M}vAAM(< z4eVNTXQrpasd`>{Of5}Riul@N3h_))%=>6*&qVXHo;*39omb)L}Fo`inG3A=idi^jTP~m>vqelSj_Ui^5HhEaZWL} z-i8du-_2Vr-v0B?KP|bYMxDdvF|9f^;w)g zvf9zr)s>&0kB1aJe*AB3oVaW--j>ut|HJtBc)XwnMhVNRyDLj`s-gRM&z`hxNQsV) z)=E}TR=j=twt9lp*!S<6Djt_FUlw;Ay{|DaI0*Y$dVOuVtRA{reQ&II+_$$d@fBRfmd?8w{q<>U*)lYD~^tiSFe8h@};n#Ap5Mck&%&XutEsK z*92+5(Y9xpph}Oai%0tACVCUX!dNAJXWOkeZrqsqaeRCnFBk)ROwGo_GZtm;yI0Cc85tL@DkvyuYc~XJ+tdFzJSxg=t9+lp?`x-?P6k(aKECddH>~0k0TCPbsA+aUYxD;HKll>ownuYjOT78b> zt6XmA?lu)O)71@6Na%fLsW>$B;%c9>`M~%%ui{vl+k}2WnN!qnhM)nc|m-sO(M zq4Wgbj#nN9j~*GBnZ@_03J3^b*&UKBE-7iHT#Ss2lwMnQ(i;xT)XfTGS6p0JXz%Qd zvVL{;0X6KBrZoK~6$`JtJ?neCwObt|n}ZuH-a1Epc;UCU`qZf4cAa9DZq|o8`&1tp zVlI+n3!2GAK|zWz8%E*f-qClfD@y~JHQKKxYmQF#-PlSs9Ct=ty~2Cp`E*-Xm-p{) zPa6909$w9M*g4i-ZcO_cOv4V};&AR9YqPL*?PFM{KyUfpCr_S~iY~z$F$mh+FDNLO zo_=#-~o?RakWnQ(26zb>)9pQv2pmG+(dbl62>C|7bf3yV3= zzy^L>IeXHfFYtZ72X^m%5FLFIBZD!lOn&Bbc=h+DH#Z-jhDiTddx2tY`>tKP6z?5a z_!a8_NA~<`pMu91ztyP(ESrX2Q#XaF_qXfU>q ztPmo0<-3f9#dj>(w{PEGvbPVU-n@D9>gwvi!e7$KziyiFM~tyY@RdZh0NGk6K7{&I+rPH8_hVfY19avqWo94zkTkGq!I~J(HV*p zbBPhKx*e{#XU`tX^XFCk<{n(QcyYM+`CVp7V_$I%jXD^BszzPBq{*U7q4C)CP$NF6 z>G$s4V^_TQR8I0ivSO%|`yZLy{@%4!x5l(Hsp)Wn&z?QQ2#&6DcTaFVFDTeb#eB?9 z<j518;&Ye4M z-yzt|e){Ilu;k(c^#Rlyx9p_nxA1>+=j6$g)n(T|A1T<&u5kB$QZcnGc`}l@_r+Cq zVPXB!ggo2Ev`Ozjn1RWusnn157);lTXXDMz2F)iuCNB&m701PyD&G+sarF;hZR{@h zavN^SoSgKdWE9@Hb7x_3aju-??w2==DE@vqQTO`{hnJ@(!`+Vd_V&p>c!%fiCrYS) z&h`4u{r$Ub*REV=d)g$CTfBbS4}RNEKa7ZwZ`v{}nk4Km_O`iMFP*wVd!UHU-_$7{h^J`CMXABjz%E;g4RaAKAmhqr22)>H7^TG1pP|zN(PsY=epJG6OM}pYLz! zq^lD^gPS(;;qpiF{T_#+QyWVKuPxropiI1nK+qt5-pb1AO8;1A$;VKZyjahpIdGVW zWZDK*^Doka{A5Z>4W?}>oke>Yn{yEV_; zeCBK2K=a=K>QITv;2tAYRaJ5EvY#gXztwk(T<)63B8iYXBe^=?2R{vzF_{yj7|JZ9 z-qd0`tw0eL8=LJ_kk<36tjB^hLrs{B*6P3!Z*TAZ$K6TtcVGiWm%ELJ@6F?3om;;j z4Fwvjru>H0Io@6{i1GHbBc>0vR3xaS`z$}=m^x^ivJ^5Vso3@!GT6U*?b4PT$`?$+4r>gu|k=g~i}0}v3K`0#*^ z8(~OrT-9gq zP8+3~C6}BY$)|*P_0&DI zU%z~z<1<^XS7gyMsHIyQjpZ}DIbQsy)OpQ$_ntj77b{%$b$dUQ7VS}ZJh=@lYy>ckC zWdCwZd^|HPZK{_r8{7H%Bzd6Kh1I2ryt6O0Yu#FP8mOWXIRO=33Eidsi71ueyO_D` z3={~+=sD0+&QWSozPvb+mzkMaYE8*2%@**xDf6NC;O`Jd5!bN}&V&YXQK`mE@dK@< z#8Wr=KjPI#O7qd~-8@bUzH$4pvYtDN&*igh#gP2E;aF~+y zXTRQ*prD|foSeeIudU{OJae+Y&)Du@9UU7BqGX)y3zb&USXo&?BslhU-mKiSxwqHc zZ0@v~Z`p3?#8)0Qc*$vMkIrAb82Rww3BT3lrY7Bmt*>C3`q@Rr#k^cx^MBq^4I~&Z zuKZ3jH07(9Pr7X9xIjtI|GJ?;dy(T|Lc&_D_{39_lG>i03S=#WvtG`}k~ht_xHjF^ z+q;I~hE-AFG4-p|Wu!mun2Si?(@o{S_H^elOioTZ*Qu1)&W?ANA-QPa6XoT-JUiNs zC;+_L^~^G8IZheIAjohgRrOyGuZa(i#;!go@NvVdSFZp#fDf<2&tfTU*|e#8rE#Ps zr_6b%0ny1EOR6Ey*4}>Q?G8Sr6ETw!Jjagh{8b4fethz(tZ~a?sProR$txC7yr%G& zeSLicuaIHscJl^q_xSr^A5t4u$$PhM0by2S9(^(K06aSnoXm$6YsX>n91tRhXJ?NT z+BQ1JlC^bo2EWD{G<@jp>f+v41otF?i@j7FfbT=ZwMDuWhx74b;g1nRJvQ&|RtWQ3 z88P>o9ldq$9-VCez`*7$TZUZ|RDadRjR4Qz%Hr6#byv9bkKf3_fQ@vyhq7bZ9}RU?mum7T;4?_v^j#_f0PxI=qX ze;v&+)WKgb&5j+lW>@@MB$whMeLK|o%9XZady{PaoRoAR7o-A69HN|N8695z7#uXX z#d1dA;urdEs|h4NuN-U$l#8s)352VP6OYV*jO)k z99XoNsA!JiGub(}RPnH<+LRp`G*%LEv@;Q4lh361%lBD9Iy$-p zpV>!dQ4;>1cZ}>wGqp%5fG}#2e8o$8&BDj1^JZ3_#72?&+QL3$HUZB$hJ$SmpkYISi$?^Rqa z5be~juZ+T%+6t^S937uWMCio|+nf2!G$V5~HZg%O#4Qmb@;`$r%GM#EU5Onj6PZ zF?mEDk0?hx2md))<<4HNG4r)W12`RFhaT^r@3-0h2tyJzJJIWh5DI*k8}@+IB+Jb? z?zffT7AOlkV77}G01`C3O#7opj~W=XB9~E*5&ZOB#BPgiQ3oIj)5$B}e}1?Flp!oE zj0o%ZBXD0;2&1*NwZY7Gf}H5f9)3CtVA|uiw(?W;yvu0YRhY&Hw_YAzAt9Hy0oxjk zi}m&OG3U0nwy^oVvM0sFF1J5V#e&t#q$a5~-KIS%Y~P{#BE(Nc7eKGA~+L zNdnMg?HpU#4hzYHy#m-@c5tZlUYOjlaf{MNb~ZLdfvEWS9t_%NY4$3Mh`;A=Xx8Z+A#216kKy*1iM78USyG!7IFbB4 zpi}Co@bMa&>w5qG{apqj6$+ZYds9jtw`fSO^pB141Q1IDA(z{fgP41E?#ecE1%)c0 zHnxC2lamc!+hr-Js6z3ADOlmYbQb0NedywSW{t{qy35?6n3r*@2wretq>LjGp&j-0 z^$pzlD~mHnef5ncX4;-vrkcyG{!&No6ZfE1PcOUqe>%7!@&mc31I~569m&vkR&8zV z+txOw@PZGEdD_a{@_I7iPqwp;j*j*Z+2a1k=(S&a*A&i#3soSaN8o2ngA z*qM`ZwXcfB`_DD%^Iv0xu+&SDpR22@lgYy{3F)QL0wkbwJzfOR{jU+28<=!_{oK;h z^4-YJ&aV4h>YwRp-Rx#WLZfn^l;-S#K1t8%Xkq&pB#%RUNd9$^xeQt2H>)p9^%xLI zDdC>5RLrhGJ zi!0*`8L2CY#Q(fTe-aUM2nj6BSfbBE%6PU;_ltMF+q{{@8?^7 z+~wu91Y#z1{|SW(X=2{_StAmfBWKyUGNt?BK}z4L;BZIq0Yu!`x^-lH`_QjnvmmV` z=enG>ZQJ(d%^O6rqXqHWrE-RmjJQIT!9vE^&!21o_Zg&bmw8M9l%#3{xkNaIft1<7 zTIx1o<~=u~$l_CIkY@&?x*Z(MrO^aXm|i$Qi3?~l>Q-D!fyK%O!zrp{8rLD$52OZI zJd*jy#1TuFRZiLNuAps$+;Vx-Hk@H$%*|4S;9z_CGViJx$;9B?xgSXM*E1Hb6*dCi zQvd8IvfEMzswyGrDcxS2l<1n}-Besu#3Xzvn)*D94BSd-y6^mtt+t|L2wV}qG`7;S z0RaK?^X}z3Skvhm33Rd&Q(sQ}*DDY0kPU_#H#9O@f#HIMJLxul7ItE6+#%BI4RYgH*MjKG_m^VX=J_pE)lJoZ0o99D6OTdcbTS%x_W>+mQREOQS$mPL7UW zzJ5Kd5q~xU#3IR`L2IFtEsz?%4Y-8J5G*Y%fy8sXvf#k)(D5`d@^KEmeJi`5RB-WY z1swJM6BohB_%x&_gL>pKE>u!g^_u_lg!*k&)kU}&!bz$S%&SaDhISL3th>8=Kv0lF zTRtlr+fO(Mm<>W9y{Kb92CvJl=aKt;eBAfX_cu6EK~C=MOGi#l&JVS>;MKC5w#fA~md(E3S=f;8h25WOXj}!Oh(MmNVmLQ3f zmAnyuZXf*r;g5}Bh?2){lSEwHYO2k3G~=)%H7dX$Bflxw8|UaLB|qbf1v zc7s=z+a?94{^~HSlxB+!=H7olz(InLFwoU)0tSFXKg_}L6ea@-3i({do3|KP5uRQZ zPtQ#6-rcC<#uqzUT|E*Xe1de>IWVQIi|Fl94#Jxog=brCH`;H7S>RcGaEv4!?($Vv$?>$Bu)VPO%n7uZ;u zf)&K&3_!k!&7aD(IhXOSg*dk!8rfxVOhVeUm~)CdD@WuRY4xt_(Ro!mF6YYk#+1 zpAtCf(tQ$u>?OUvUW?O102PLYhA&>cz^Q+5nI=YpB+|v%T_7`YN6;2hTKa+!$eYaS3=7hyi{DK?T>StFAr?qp(i! zp`)RB<}#uWtYjM<7#K*+hQh(YgWo^wGk<*CvI?FQ1&5bl=-{C8^Z6I9gFgg$9N%Q$ zm1kaw7*}0g4I{W280Z6d0iV>6fA{X)`ea4$R4@j2tY#1um@LNQ=ilFFJw46c1!wzM z)CnYcM~TB)la9tffB*ZcDj*mu5ZCz8)!F%JWbbKQ3y2RaHF9sVpWhnp?m>R}7zicT ztlW4p`ulf_ArYg;&UP37_EoMfW>f#XbvQml6YD-P62>R%_AW*sb?c_K-ghkpu)RlEgWZtj>9*0u0b13QSi5dMJ-X$g189x%`{G~@~(Ah_S+Q2Nwh zodZD^r6|*uzICWvi3B&a7>(OcniDJ_2L}P=fX;DT-hUo@M0LMp>GF}6rDx}+pDxNb zRa9)T{)lM=u;_UF_<*SO4pxNqEtCv}aFQ5CwU$Xkp1CyfJr*7;_Q1Y&2D8vKaT+;y0bBz|Zwu+E;nQ*Ui+`_iU9>DHdZNDzVJGXT2>{Ol1OikcFe$>yFz zoH_bSs7nFnOCb99^zAfqu))+0xbaB*?5u_d`*;^`UF^o}$j|B6&JL*-)G=Wqfu@(~jxC}8s_{^AK$ zw%&0w{`|G;Io1r8GNL1rTL&fuC0w+Gg$U1N#*Uf(g>giJOO=P>Ns%QILCJ+rv$6i!QQ?bbO>BPVq&7> zYBcS@_wW30bX3yIf8YQcYy`LX9Y{4YF)2eBg2#eiB>XpsdsIAnGIb938K49mF4NSK zKKnOw(eq&YfXR@?#lCT~84;eLsv5twrC!_?NqKvr?Za1X!PH3&lHUMvU%q^a^4gswW8{v$#36s2a>lPvp5l4r2CKXo<8*k$%XS>lXB~_Cn z!^Xn_?{%^ph0gg2zcrJWI}jU(;n+_^pG@s}@R8X|jiUaQhttq^*a1?Ur{c#%MPIrH zzPm};h~y*qa}=LJ?psIgOkJe?9s>~u!nm6E{GSK;vo zuZ+FA4T7c-2oSc5>G|AvdN(t3ye?h&EIsVJ9c&irmx#i=j@2!Y{@l1!Y#b%a_OB2JS#Q>cZEC+6U`<1e1ZW z-7FIB{B|wJY+aW@O%Mbn?H)ufFb!BYy3^_RJ-occ#l*ngf3Gl1S1~&5WR@`OIk8!YX)p=nU#qc{}OY$K(jirn2UXnwIqHyd|rgr)OZPFSq6N?|K-u zUZyUK-}2uRbrL6FZXgqP0k<4FR8?CG>M$c^|5ao$xADx+TWrqCp0@Amri|BHS}YB? z$t{`66Y#q+y>6emcRe69APKxA!lNHz5HVwjNCe{yY{ewyeUgVKN4E9A@$+(qhHWSy zdt*tlAgB3VpUlh43x>c~NvWDWRDzAl>B<#QJ%6XC3!gm`bsaUt+JxV7o#^S#(mTo; zAYot+E&+CgSw-!Emw7K}&=$ycD>yO$$p>);siF>M^6PXn^;rqVWc zkQ@3my2uWn&CN}Q!xS>5fK^EIXWQ>=VF(%TDlSquU7M?bD5D{@aN&#rFlb_E24y21 z6O#|{+26j8tWHXT>NqGGagVNsjQbPFW%ziDC zQ?|7_+o3ZtO~CW&ablDQPF?|BiF{bW-5f@%CTDLYZ~AS^ zWsSMBS4@#mR8O_X@5l|E)yV9;wgeE2LI*sakZHB_0a3>bfRaKcr!_Ud!OMlRNcVu1 z1U;3OnraWY*OZ}!5c;&8NK|Inkfv>K-@tjPj(798*yCb9z^@qIQ|2(f0BRUM*xaX? z44{(Wt*2qrh=QY?B@;m`z9+B#3@9t}Qc+Qnk&!v0hnJ2Jr>}xJR%SJc8oWNDz?G)( z{=jZv_TR~u8wE=zuP?^7S*K+s*kBii46h$mdD@YgM21LkS z4WI?4zKMy6;bDdY2fU#qfGlKos4*P^3k}JcCM3{cT~dw%(_{8%XlP`EK}aDq?#!cqiqq}(_DDMdE>=`jfK_CIyG2z3s0x0M zU>;{$&8g`5Wf+`rX{1STM0NG`SCL;{ym%4RHleYC-ytFl{FALAqHZ8H-Y8yt%AGr( zp$kCq8EKLufE)5$EWU5)GQl}oU?qoK^664 zg7yH#(+yKVl!t)gu(-Gv_#QAh4{j(NU5}pjEoc_`KFTv!H|}c^3=F!7_*BPX9v9v{5V`- z-{|PsC+7)ZpxD$R(jlF?yr-d=)56QsgP}}yP+Z^sN+rmGlEMCdApB}k6N(=L14V8V zJx`xL?e$&y+TFc^pn1OP%A=2%N7t2^DDUER>&h{E8W!|FRJDCh-kG%=Z<*E$d}vR)Mx zCYggXgTN@~=~M9Bj~_lHRA)gqZ>}y+)peFQOu#<$a;ZopGOcIPNCmjh?W_b;a9jS! z;wRz!`+iwj8TC)#0NG%aJ|Gnsx@X&#|77|tV)8JvAH*&>Icvu$^9cC0fB$}~7Rz(z z0AHxO*=c>|vPKYHL3Jb5#``*3ZonH?IQa?400@qOhURa=+OjoV0}9u!PEMbztN+Z- z@>(enA?!esYj@Ox2W*5&i`(i8@@>@8C1(x)>NM<_iS!0x`?81MwyIP@`5AJlhVLqs zUPXk)4=(KA83eh~T{%V63lt|38_1%a5$% z>z6n|b`+AERVcJPx9&o0;F%_m>@d=%EJ=gs*0*^x`Yn~Wrkl>z&Ta|w&|r`s$@U$I z!kq;86B=2>crINt%8Dfv;$6qP_Cq?hcQ2S}gLu7D|1*fsod3A(R(N`9*@+nlM8Fct z-=c!6OiTke^knG#n7F=atvFLRt=Ujrd%LKlq$#=KTg1bM52K>2u~Z?4%JDhJFQ>xi zeD$hU;adg|w+NM@3!ff9y=VmwjPdZ<21=R2%~<8ioaa|o#R@zW@WOFG<*yEw)^6E0 zh`Njrg!yR&?{j_le*U1|0V7d{5Cw{>f4-k8?}N1xP(ev4cz!AE6Wq_xm|=Wu>`|W0 zJl&E;+fw`0A308#r6I(fiI;epnD`n6;0Xnd8*ksedsw5blBW*q=HcOiRHyE-XtI|C zE9)ua+$GF!=42g+L-Gy~gR)VPlKV!)^>coQ7gL|_dT|vr05}%tZ611G0RpOATP=%- zXuiW&!4>cuc8!uP1Ul02+1IcCW2*+*8q7~*eEj(6=rU@ty3;l~&+^yEnJ& z-fUZH7{u$cttT3oiXp9lI1%iBYmSM5_SDrQ@!pf4Qc_ZoP6P%8iIAIYz>;x> zJgq4sas&YZZHnU{cW&!*Ju50&LFNa!OhaRKX`zS5ml&ZDyIM~_Yl7B)~ zF!|>X1tp~qQoR1-2s9`=B|vJWl1hYhLqjnBsEL3G8EZ&YE>{|>8CjUa&TS3ZCQ-~3ce{LMAF$#dsxRbsg&w4{$j9d>%lk|8B!;a;L6wUOKnO<)-A$yT(9o`+oKCg#edFqWu+xka#K|pU zB@$^{w+zqPXZv`QGq^BGWQG5pQvEx#`akba@J%6PRS(10r-U)2$~gJBEEw%3^=9fK zNL#0&!-cwFa(1i}!5KamKt4{;_Ca8v{G+^?si`ICJylqy0A?JZgdBGHCqvN>Izd&lzlhy2cxtbZeSy|?A2Z=2W3i3me%?k2=KUgqn zre?(5zyE!3Fe)Ko0#(1k!B!A%P|1SxLvdd4`0@IWAJf0I|E7|fw*a8tq9N%$f8|T` zaS%yR%3aaBjZ0<}6>4dh>%%haQCQ|PuQ(Qet-%Qk^w!5w9{g*+oe z!})OQkg_r+3pyII*f}|E7hXWdvykTjN*hy) zH!F~eB|pramN61qQ%6<}Y2us-l7PmD+8fb+l~+K6(8_YCStjpYk7*lKCTPQ4uW(#Q zc3uy@Yk9jrTW$tIgCMEsnZ0Nv;p@-HQPl7uxj!&_{k$=vE-^T2-Y#oN<^q z^tJnM+EeAS#Fw`%JuWqA5GN%b#Q1#HkGzeWu0PZ8`^h%{^#{$`YLdCpbNxP9csl;| zA#vXtcy_IUcn+DstDo65nb&W=Vfr>{K#{n(6)v8*d;KIqd>OHR@h$lgVwx_*k$k-5T(BG=!qjH&^mwvcsZi|0pJ8-kW^TwO z?k;w-u)h&DGI`(JNf`%-*$``He46U@eRa+-8H=>$taK@dE29Xf$ee`+m@K-atnm@`g!LD+&ht+C8hB zDn;T=$3ema7Q}S4Mp0{u8xf^4^FBYJYh>%MJfSX3c#iNSXBH*B+>1H&F9L1?5;7c9 z8yoqYw6*Af`5DssGHFg!Sd_`CHcq~}Yg-t1E2Vw23kyehmBAjFF<77f_Uzff*}K$F zRoQ&}au|!0FQ#43JLKO%yi}`PBIQK|Oq4FkzS7V|%Rr=#E-Gkg#6eeCaz8%RwjF;x#0Sty_sW5bub$9nf0 z_-2LN))tI!Ne!GOkz5$j^}tEnyC_Eywr-$CA$B44TmL~M$J|9A#Gq&7oA&qI_h~ma z*^y*Su_`ssb)0|LzQuHI`cguSagDr9{uWY`Jr1Xh#Nn%9h#zlcy+G{WLes~2?(m4l zjsMh~SThw{lp&E0-6p<#zV@I?sb-mIOxyd)qYzIMBmM!WImB<8tZz4v$Vc zZKEt7A2M2`FUsT7=^*(p!m+^2q)d7C8dh}RHEyFsz9eWE52F}ZMs<sT62_gvfw+RpPAx{E)3;xK5SgnOAIg0H_RFDXM|Q&9TN0TIBJGFM#mB@2 z1jGdzI0XwE7Mh(!)=%4}#aNXlB>2d*>tBv%;AKpPQ!MHi{-yBtma0@ckF6;o9U7-u zzs;e549euJZ||KvW&E9^I2xOYuufBSPPbibBqZF<`@)3*Sz+Sa#46(3j_nF#j^~Ld zX_A$*kEUP0M%wj^kPh{+k)v&U;fA9TmG0IUCueF-6rob;Ktrg|bm|k+cF3%p*Lh<* zbo(A;&>3i(=I6ExQ6N(sq3YHH@*=5WZmRTGZ&Dj8VzkOf#mUweFGB6L7IN#>aao~^ z!ze?3K9Een7?@6U;ckaJC>3`-w^9Ye4~9II9Tl~P8`rO22Xk3D(*la2SWqD(!wEt= ztbYXQ8zo9vK0ZbtK-)HLxS8yVG6F>MS63EYZdd~^gQ7pczyK1j1-$qXBj({_|A8N= zj4%F`b_Afrr71#ha}YFim=n>2lCJhBN#x*(6OAn`!r;+SE(hm*Lg7(H^3ywC%^pIb zClhz>AbFzgS>NK!2$bAF9E-qR=X?Vu@9Bd(Ag*(m9)*|50BY{Rjbaoy+nhk9aLx}~>do4)c z#`7G=aKnZTcvN*YwZ}qsk>1OYYJFo$)6PUcHeS!(ygl}hK&AX^UjQ1M$A4fh8#EM;H)`kiu;3aN z-|!1k7%;aiP@kb&9MV7v3|;RC-w6>BH%CW8DgdEEh}I$EaPsQDBGk1}M}VwNlQkea zJG;Dm1$92VLL^S4*M<8H4VEzF?r2j9F(>wi(2RmLVmAXFQS)W!3S5VqY*B1&HYQfJ z=008DXO$?=%+Jpw@zl2z!k02}T0g5s7Zw&^Ko#zP(VukjuL;KqG(fXR$FDQ%Pp$;w zIDch<14ZcEvHlw4f|{9t`5JmFb)DqbFJWLVCk5TW69K}@ zkvf+m5Y!OtE_83lk6#6KytXpoXYkbU&FcE#ly}OF zp}R<);y7gRsEVp8uGjP+E1;D{s4Cln7mRyL zOI+;GCz&P`vFKzkT)0rJi1`bk#$s({Y5_rl!U%s$gvtnV8&q`OgN27AFI?Tb=kU+Im*XJRg-s1Wb!;duxf zDE<-}ubVgTL6V9JYeN{(j|ST>wFF}W;-T#Wu_XAbUq3BQ0SS(^7?mIl!X9}y_Dq<^ zSkZwV3k6S!gZb92Ta)(^!iVVi-O0tLAaWx5BV|+Z4awye+>d3|PS*EWjG(J8PJ7~8 zwBE`zp-J!xd>-7uU2|kOz$&op9OI%=^rwJ63L(CfS)uvwatIZE>LU0CtQjT-1~K1d zci2^5E8eyyi=62>lQdTvHg5bZVU=7Dp;}cI1!?%;J1ubuiLTbxRtS+r z$azKuhyG0X`Stz$3C?8>JD*gn%yw3B?ICIA5D9l!*cJ_FbeA3OmX!gU(cJmRzZ8#z zP&NDaFFMJ2xVWmX{Cie!|X zk}#;rtH0znkY*lV%V1(+;t6oab|P_)AE&Tm#jQthHFR{L>6_rqAerrg2q;0!r6#!f zA5vCO$H$x@D9NgS06z3cqdZC51tpuoxP`YN8@{Wd1@5NQi zp=#VbkQzn)2Bul)A+`}>h6ujhGCBV~K0h#o=r{TapZ72x@)u>wb`X<|Op)Q?a3v@l z{}lRXEw5ZWH2e9NHR)B+nq4&q$=hT6*&n=#ezb#&=eC&bowB4%%Sf@@TM;IYc!qV^ zQ^$BYo8&m3yzFE@AwriEe(;n|VVjElp8M>vgL5Axd#A)V2KD`TZR8=zGWGFCMc$HB z0y}$o`FvOFW-OJUX}K{}niS=TVj85&=H;F)P?$wTL_j!3Y^%aF`{{5(u#$~UhSheQ zKpMRhzvTe{g)fTy(&$CQ4huzF535Cg9~;YgRRJdfu=mVqP@TqO{znjx4rYmDVLttZ z4CF=h4sl1Qc%?v>RVOiZclI*`>vd8~YI5UH?J?*O%a62oQRHF*R36aFR05VkM|}T2 zgz7g>imt4M5wRPJ68OHTV@64_)r9A>84B%SYaqHz;>1TJp~23E-p#BmtpCvoYpLZw z??8xQ`;q!}>$QPqMJG)S-J8cN?xFV+Ar%G0cxgW~IrIsMT>1VQ!kQ9zOeq$ki!h(o zMZtb!6S+v(`YJdU{$v$JhsT;SSd@G#lW$HW)s_Rn6zmW$-49 zgMI&yzH{9^Z&{SreB?++tJSAZ9XiaT!kY~v;xn*riN5q(N{DR!SAdKMy;Xg8{|R!T)z;0MA*@M1 z#R74|$5eIYBdY2xURfwVuid*9{5#+3&gMJ+{E>!%BS#5Vl9PK6h+ecKl#r*eHK1=5 zdlJ=P&lx$W+?=O>Yh@PQNnsNZn1r4L&`n@@7J&m&ptp-%n8+(9J(Ff3S>j^D{MP>( zh4Bzl38L{ixBn8&w(Z-+Jf|~&7@!dyi-jmHSP2l)IH$!-JNEgC7c8Z-$j%K<0h7ZV z!mJ@Z>h@b(0U_HU)f>lzvp&zxYm!T1bZU)kZB?oAUJ>F`ILfb&-jEMFJqQZeToE2$c`CYXlhi*z; zdR;Yis{`+v?dOjlPb4u4Ha2X^Q##fJqtkY4YN@?|J(w8Wmk=<6s{w|w%mmOh0x&`J z?O=_-!Fpq(D3lg1eu*a5xn<;U1R|3%*PI?5xNi9QlO)pYhd4#%4YBEm$zGnGQ1hE1 z_#(Tip-CMmg-#yrg(@m?a&G&SO*^hURSRmB|1<(;jsWWgg?so7^!ztP&kqI0^#HT2?0MrSIWEdTvcmOg$9K|H*=?r-p+XHwm?1;pMd8{1IM_J>J zdP?r8*nBk8?tJA_aBPIHr0s81F@7)_s*)Tyuzjl$nIj3C6dU&E{XXveJT?eD~Hv%&x z|I-b7iqQPG40n6B%+(%ftK$Y#f#HB;ldzk{9dySaiUq`Vu^&JQfs2hhqNcaE_jRXT zY$Y-b^m~}~joO!VA6lDR9^fJRBv9|Gx=Uc@V={GBqj=cP{Bt*iH)ZQ)K?be%_@tJ2 zVqu}6xVVYO!RIet7%DdlaY-JAIowRJX;Qyv{^H7$S)+kkBEcUoz*R`Xa%-nU&=nwx ztOf}OyatpU9aiZnm719W786$zsc{+0KXcm6n;X{>6?gE5*H+y@!yM2%@5FQUifMN(kYU~g^ zX?W~!-d~g?o4r4tjJwE>(F1`A?v|wFsKOAjU^;>P#Q^+?)CcVwDAT}jh)!_13y^KV z_?ma|^6^cqw=%{Nu4<^~!kg=xfpfu4+_`s8{mhx1++1EB9%5%KqR*2JA;A0lwXF;& ze!>aUy3~^IR3m7j5!7|E{}b2~EWOduOJkWha3}OD2M=1naUh0CB8s5>(m8JoTY*6^ zWY~98#mg<^@R60}WugTgK@H)mLV;Zc@eT@{bnQ&FCGaIAe_F)B)YMcoIJ6hpMfDUQ zGlZLWg+>aZ&;zuzML_&0L1NdfKhXD}VuC&+{e;kdYA~cOG(n?x<@Az+gTe>0y}xq&_hCN1Oh}hM=&zzh?_(pqT0C= zP?PvmYgE6jXTHfBZjdXfQYvhoIBx2bBHEe((hXxkSn3}*3s2f z*xO1^FG3~N(NUoA>_Pna?E<_d)=l=)rxH%T?*2HcqpdBMQWZaj-$;8slU$MJ$n^uM zh+Juh{?s7Hm~(xJ>saA;f73=RX!XZjYy@ZW%Ka}=6!K#pUS6;+-oQqP(yAz-d#}}p%%$a!SYy^v zSw+_kHeZ2*`tacc^0T?wS)yYX_ye8B-RSq&(F%UzyM?wu^O5~lcDrvoQysDn=d=!& z5Ab*|w{$b8)FfM2@bQz>MMwf6h?e$S^}a($;_vQVs{Emr_lKYAdJNBka_Uu`rb@P&Br-?e zST(b!(aLTHGQsW>89rqA82p2aheycz9A@F(m*`&ACO3{tA*&fH=zPFp>PK4~YQRck z1yHO18{rVW)n}nw@!u%$D{8kf9>iUxL4C;f;1M1kU>EYKQ`ds`?%UVO{JpQwX`m(o z$uf{2wrFaFB!1KimG`yOrPq%yU%rzl-N~FnA6HP+w@}={E~!NntjGs=X$J{;ORq#jl!w`82jMW0F+9)nbLuOx!Jc_^=V4;9~9LOeRp$q{J<-W4s$S0l43H22$vKWRopJV(A}te$Q?E zx6C4H>76V*8UuhnJWQssZO)4LaWrBBBH}MDaFVajaj6E=7ZjSC+B6mGcqSExhSm{$ z*V32>HsRZ7u!@FUwx1)aA}~prGoB^a1dZII6_dNR(xn|H&%wO|HsUp)#_VFMuch@2 znuS(=I{+VcFu)=| z0Trm+G_Mw1!Z&BGJ#7lS5jp+8{_uzX(R5o=tfhDIiwu8e4!{L=NCbT|@c3hJQy@Oj z)s8~?+~i~y{4FnU?bok485x=i*n&_(K%n9IW{jjQ!1Ig+-`&{=<0qn5^*+Ls96VTc zI%ZWhn&`q>&Ah(0wh~*Wv0kDM}bUelvdWJE{mu`L9)8@G~AgJ_k?y#Yy zk#kO9eZ`jCK+|t5MZm65CkS8t`5qfvOdP@**XC{{LlnQWeE6Sq|CQ@3EGV;*Lv`Srwy zy*o$dT)<_CC5L`q!XimNL@OV5mJK8%SWNPJ?y(!|7r zQc}J^Rlo8;jJ$S!Z)X??r|r-yMT2lvi}{^4@9P%?V8pV*IS2_v$&Pes&o;)E)WhTi zaW{3jo4c6E^ELmYyE6~Vac%$o-7*g$8B&V%NQPP!%2bG+5;7!Gh%%Lil~APOVWEL) zWsDGIh*F^p&89?#kjg{mtfj$Rh79|2wcdBXzu(@+{$v09bF6i^)$`oLb)VNce$Veo zzts}<4*F=3NTcWLnm=#(;6NV_T2waKz{t^d?$Nf1$;l>T!4F7v7n%thXVdcJymR`rX~__|%2$2-+qFQv zc@NiLwCcx9F43X+0lSH%c5rqcfwOP+`mE(AFZ^Q)8Gwa$?b~N4TeY(<@7R4d=hore zBqSb#pr)1Kv=CA=|8!uX_+~{#Ntv0MXU`7B?}?8e(`^{CTv%vR)P?=Ly8|zw?Bkm* zUuZD-^7SixmgD5O#RPqxQM(9$v31vHX>*lTG5H%W{(s7!!gBsET9ISdlsGhP+SFk7 z+2VO5?i6~7xvgSbd6lbK3LHUx_n3TZb$DPUsmquP*7gZ~JVa|w;U=F)*$`^}AR;yO z7{}*)``#MbG4-|yPs-Ds3et9;8ou0r?9?L%-RJJ?-N$os!1|D^kdRrK10{=IEMtcp zy9c*!rKa4jtgM9T%+1d)Bb0Wy1X4h+Uz_h#tg=6Ha9i&_)gz{-FS@bjid??D{N&|z zRw|NaxYbvMCIK4+R~l#c(xt$Y@S<7nWVneOYk?&61tumkP2q#8BO zl@pU&K9@!w`2xaXxp&D{o*qDA__1w z6H2+6%^hQ>Ea=%AD~d_(jmGNbt)8kffk?t~%$T;b$yIWC=q5hqH))S$Trb!+42*i) zd)v;|$uSwSCNS;KG!^~Z>Y@R}`^#`dFCtmv6f`wmOT&NJtGfKliegFX#A;o{CE_JSX)yS$-p`wC8a>E^!HQRnG-gB`($J7RQpHW z1zE7-^50QPQWa6u!!V6_r}Zv#<~*XU6nRStx=&R@)BxBp9kH~Uvzl~GRk)hoSrVRm zv{D&%|MNKyb>p?Fj{Ei{I!~W&3QvMa@En>-7>k|=v$3+e3}5ZdxKXLvVCa8Dt@$<| zw;X-9BdM!YtYJGV`@+*#d&lHf8lQUk+*(cT<%xw0TX@b;F|oqJu+MQp1J$~XS{;O( zcFf58{H#rHwq3f4R-37mx5L7tkYycF>?4*^uc6~5yzt<-t?4Z&J*IP_nU0X@+CUrBj z=S>`AR~z!z=CHyS^PMx*oT^&pKK*HSIK?%5Rj_*9qwb1@sBKbhoud^BsWzHWPtES= zG+HN>e;~}V_o(jOS#q}Q9kXR#`F|fex9HfV0xON3!51S!Z$}uKmjt_}r$#s2mZ#lm z=`zC4u)d5A>)PsV+d8R<#8oLZ;o9@U(IDM)cvw*r$>e176m_=-uVJzw@fryUgC|5v z4hKmA1O~z$EvRzPjME~C{^rUdrb{)eA<&ZDiMMJa9%)HXf&9fPKc}JDm!@m`d@&2z zV4!R%QbrZ{&9E$>TX9)u$l=19HDyXq8LhM>+WvnR|Eh)!+bUv(@~RalUZ$88$&A~Z9L(j zzkeDm<=1Zr$t`hc{R&7_$2n1|i#mBRvE(|v5yea0Ui-aEne z)3j&DA}P(gcUq;hsi`zHCUfcOP#mQ)_d-3lCKmI7Unu?<^e46WMc}ujvDP3<^g+-l zF3Q}RDE!_z>PkcPmJW7lm{;u>G^n@z@e!AoTKGrc2($~`qguXUn{CFUW<$t|q+jVZ z@ZKy3|1>XWcN6kFOHAhPsJ!<%YRE7xDR~_#Y)Ri2UQ(Ji4ZVuziF;4ok7}N_aKP={ zZ>oM?;^Q4&c;&z5#y;#UIUyPvA{Bd7rNNljK;<8g5HHf1%;;1W(<&v3w;9b9^gQao-FSEb&!>8n~zWMb( ztc*3CYxmq(^rz%3i6bYDB!t90h&xfF&C-=jG6xjB-!kah@+jSu zs>0?t#2UpQ;F7TbT^{bq$$k$*h!f8!V@Ge{gc;)0tIL;bOD?*s)_xsU zOL{KMg(LT9ks}~>Lf|ce`Pq|F@mqC%_N0qAx+{L$L0o5nL46C!Z|Rdg+6{Se6W$#C zCz_fty(!y^3x6H9T#=>LyB^sqCu>I^T{Krma&O5cE!tnX$+?PL9JC}4%~J-c z1)F`?>*+)%Rh#(k&xEiSHAv}|hAEPZC-3p?Pt)i`l{JghZ+{QrB zKQr#?v@3d@Sbiyj@9#f4;p()gIlGerb!BXo*Nnp$3k#=Sgjkdwu+1LcB#uC(DfGg{ z(GUdL#42ORAM8>|6Xc-9){BQJsTR=0Dr#ff{jZA+)a^4hiWl|{tllq2{M=nS;S;fL$EN1!M=2o?! zC&(1cm_EJkbwwbd79pB_(mfK2qS20s1r~E6mgPmUWUeR5_fb%!^j>}RR#=N6Dq_X_ zkB%M`^Br; zJMjC7LW=fpavLVeL8(x4A@EP6Up%~!&#FE?NK^c=W8>wRV%wCaiYDUi*X(>{XGXOk zGjnERg;D87&fe+;{l*)8;+IE-h7NG9AU!BvK+3L17E9}EoYdac)iL7aP>?~LOJ#_J4~ZiI{J~?Rr_na0gTlG-s(ZQWs8Mr8Me)d| zWY`u$>D?jaix*kur(T;}PsUWgfB$V|6aguN;hs+;7cqPGL%NB6Um7jdl*B9yxY})D z=Gcxi{MxoZ{^4;gS&g1|wQR;um|%73?p^ygPPMkD2PPXToodNkWW%HeQjUBt^yWXw zsmfnadZu=lIe4AcY06CdhZE|Se!kT#zeBc{*cdwmSjwhs6YF3e|HUyvkR_v zjIjOypMrazLMBOc{cUCm4L|f?!VRX^uis)yN_u6j@^i)8Y9+Q)g@`)mgD@ z*`Os`1qaTnJ63Ow!VVw^8v#WTlYuG?6Z)=u7%^0U%ZZd9e{R{*vBFi4VI}xEByVn9 zy*gmgH=5l^rT8cVRnnS?m;J|p5gsdOxRI~^`F%x>8{`32BrLx)G{k=EGTs(ek&RbZ zD7?eJKVI1TW9#-Gdd@f1{>QHSMakC({96YX_qB~uQqz>dJ-eNu1Bgl4&{$C$qQv26 zx=ic2a6c~?Zi(#E+unKp`;(_bZB54|{d33LU+Moz&E?Ad`%ZEwTc$iOAvv1&y?&Nj zH)9vY(^ydn{f81RWAbzd2a*Q1@-dc{6Ae2mB7_ihk9lSH;O^aJ)FNaj!N^cgsNVPW zzm_U|aC|p$TXcxT4fTyLI7-FpCuwRK?Ostavvs9e!hsq(nAa{}K%Xj`?K=P+5I+#u zoGdObW;d{BQ=Cp&%L^j4@e*g$KA|c}emJaf>*SH=K!sI4;Tb4@q|D8Ou>brMW>FoGyA_v6O-$p zgdoS7JYWuiaUlznF_!GFfN}{23~E;peCsXxLL(=6BCb3HcXnJ67DnXI#iV@olla0&w}C%+@oo> zhBP=5E$TizW>9mNVZyF%#WcA5Dvs=F<#1^wj?`%yb@3NRcg4}1#?Rr_x>z@UjvfFP z!^Y2*wXF7N;(m?%xM{BK)oCFinNdzVj%2k@48@&Dtmxf|N5w(Nmm{IuHlNh|P|D6W z?bzsgxvvwBo?X_kOA}^h!7t6GNb(PtK8_AqdctK>g7Lnqa(*8s%tAZi? zyZF+Hl)+L$iRZ80&dGSk?kBm4-_O7J^LWelAKWj^BbD2WbAIi&$!&=4f=$@47Nj^`yckymH)w#=mx71Ouec--OMRM`s+duMVZS?Y9-md)zjU1D*w-x36J8~I}+r!Km z@*xZK|B1+wJx6aLnff$6lH`|p{NUn)-P+wBpK9Ygu_y9@zi)GOTJQi)8|Fr+a@}_d@bQsyu1;xn5)J z$g`xV-ivtCnKV!xuebaC-vX^1`%q8%fZrGywvlrr<8}`1qPy)33Xp_=s!DQJ_ z;8A6bO>HSjr@`Wv>#wq6MSS_d50eE${75Jc;CNs0pWLA~=c->T&Q$}dI&HDZf+mtn zUZ_$L5kG@V1=6zM)h_F36X^*UIK^?E@5q8}xAiF|TqN`;9cxMQz8x2FR9EGV4>bl^ zuWj(C1;55s?P4YFVPXqT+`-?zh1BTrE^7SFM0GnY<6h#<-LHizEuJTcb!f>l%%&qp zk|6Le9$G$;)M1H5NpsEh6(zut!h`WwK zS~W;3ZQF8m(#^hi19!{;Cg(yURdJMf(qapiUQb-xB7ukaX(b-QeYV_N(fGM8a&MEx zHHQIYTn|Z%I2e4HEP<6RhF_WN;aCZf9wa|QyLMa zuqpixEf9+*)zjHiov1$qH&jdQrJ8zelGfS9LS*W3j`fWns%+U~w}b!A9-F^1(M-IK z{MA757x&xc(d3nr=f^vFv6@#bnzTyp zXI_$Hokl26E}$_fEM4c}xXGAiB3mpOx52mN0=(jX-8p|LoY*e>eF|CNFQIDq>wnA_ z_au{!%_3QH@Y70ixPkr6ulF)9sSvqpmsvu26X>%`l7h{N8v@N`_Bo^$i%OeG3e^K^ z*-ZagG-6(3E8BFV;BraQ5auJCT9;VRjsI{i{LfzG3s;rR_V)`XCzm_v>NL-}B&-)t z-Vj3FAX8KgBt-!mr!&TlUHft0%nxh8-88Ocn=W7uiwnt<{8zD3)lFMRJo+__O@^+# z*cuBXXwdVY{vV5}Y2y-%KQVpI^|(=wGq>lPP!XowExQB84{V!bR`-~7KJiVSxE;-T zo_fI2V|}7vk^6rKR<>DBfvf<>z735tF3HD;A&=ZwZbH(?-wgaD{x?^RP=cDFVt+I_d0H+}mF;Blht>_xF=N)9IkO_z$B`gQ zVDx9q7?Rf5Es&{MlC*dG_KcP9o)N48h5?GW(9I2}aUL0B=xxBL(VwjM@B<)9;yDmP zs-lNUO3Ng2gDmFQv13o3JfTk{>vd)kq1}TAfl$dQ*Jc8WmkGq^_0j(laz*4l#q$FWe;?je&<9NYQNFmqH>FuFt4ct` zOdoy>X5vTx3Azd%i|HpsrI7w`Fz8%=KAdkIqmw~lSziYC*ebXE)Gg$?3>`b}ptbA_ z1XNHF4>vQ*gWi{`4f)SkAf&W92!dtRt^eTR&Q=}=RKhd|YW6fd99q6l+)n+?kC%V^ zCvt)kv%+=bcd)C1{?Nvz5Gp#`ls>=xHZkj9-x}VVr&F8KlvgP?+BU=ohwqI$)J_q1 zs6LXvEwZw6U?RxQo-MCZ9d5^jOV_rVW>e+*WxT z*CO!BT+0^u;`mgFN?*GNADeevcrQA0OM3lTfaOmcC`f$-tRz^9K-pfsEN=RA!AB== zBO{}uS)+g^%U3u$Gr0%w6KFRRAQpG8K_is9SP;obFZZh^9v)ju{VTkX!br*|7|;$7 za`s=d=4a+>LD~mc9vZk;$ZFz=foI+UCbJx?$v3_JBvJ*%BL^Hm6?d9|Pt%Pa61lFi zaaziv-_?e#e7k?(m+yZkL{(|Or5wm}&X6%WPS8+poxskN3~qf)tT-~c2e@v8lOWzU z#(4Cn{}wE*HG`~dRbU|HK1ed0oL)V97N5LeUe8ovFiwv;`f{X9lm9n?jcU_lAvEE3U#0}V*xgT__(sUTSDM5aK|8U=0&`_ z*7hr6r}h3YA6GcLPXR%|7NBneEZ{rx0ARf!2dh?QRKs{k2{LKwQO!egac&*c#2LbB zS~#I&G(?ZNd3?=@m&B==jNr{b~iUSC;361fk_LG2)t-% z@hod;8Q!>uvw#uBjR+h(YE&KyDm(ijNsYUA2lec^AN5G&$rFEfGA?`6xog*3yGk;v0hAN0Th|+p5*# zvXs3HnL3#<8|@CK2nJv|$)ts0>rjjkJKC3~XzIy49+0&+7#pS}x)sQ9@NACG&RjGL z+FWSq%!b`ATF~NA;F}!5qzFpo%lk@D3kF6;qX4FRrskBAH2H@D5yq`PG}TOPK9>n^ zFj`>(AV_yicaQed4=JSwVS8sn>-c>z2|jt^qK38k#sz7D8O9*Kh4a^=Sc90S2Bsqy zauLW~SdCo_!=a~dH{9OV2?Ab6n(fiyiLsg101khkJj&Uc)(PWmY=rLVT`i~L^Y14j zbrB3Yg9MpFvZL>}&%SD}iVs{QF(y!C6!?T7T1R#V+jteg_}>WgT^&YMEm`P&o}#j}in2e*1P4%EE_V2ZzD_hX*DYSg?n|)l49@v;eq)PG>0Ll*rj`tBL+^JIsvI5*VZOjH^hj{3Z zB|laN0;BTf%kWTWQ2{_UZ?6NH{wVCSXP5Bd-)eo*3eusiuq9bMKxhU6u8{ zNfa*g_fMhq&1EF-hIy0k(V-rn*3Zsfd4etiau)!mlz)f>2ALRa8`%!;`{V77AX;Sq zfL~s^b?a8lJL=fbOOnnR>0c9b&hw7}wyURwC3;7FK0YEDMnhMIF^&T@NUG)ogRUC? zkUeESf*@30x9-RLoq0e`=JCnWluj}kwf5AU_|W%7)szUUat?yIFI`JzNGJ_> z=jxC0i&ZOEG9zmICzk~a4q7MJ{TR_!%ePi(s&=mS^n=aaQ_T$y%x;!{fgofcJTAyo z6hx*_QBJh6fjWB$Rd)d}1bV&rN{0;Z^*eW#34mjFgT8$`M34IM*)rjFiMvg)yNT%M z<4@)IOUKVmh zd0x32&j+bQ`&H{OlcZxb&II=#JnMCQHBZ=KIJHr!(C=#{`Q(VdSWPib8*QcxJcJ0YTmT>C=DkthN@4rMLeK zc>Kf`z~uyCe#YPKb1F#wO*Xc+*Rj>!;?#{;8eY`NH|Pj=Ba%>gPwN8F^%^LW(j2 zW}d*@P!?cahMAd(+#VP*kpOjY*kPUU?%lilm>BHlaXX`rkR&k>bSMbfP`VqwfsgJS z4V2j#DoDAK)LY=E-z$CG=goU|>efhonZTi+a%*4PV(>!l_*%hQ&4|Nv{Nl^OF_eR( zY~5-=quWq9RXJhpB_K{vHIcsF$qzlg6ZosVbzLemd4E z=>&EV#ONY*nO3JBJ$@qYfrol6I#D&Is7xjY__6%(tVWD?Sn>Jj?V~o1wML}me!`w2G6k(1c zTpjB$d-k{T`NBlcFEwoH9^OcX7d@a)Ye%(4#MsiRtUnny5w@%UT9P`P!oZC}Q>mfK z4ncyGzt6Z&>vA;_)z+^cW*7LW*s^^sh}Gi#qe<`&Srp{!D?Ekk&YiDAh(Ib~n3!KC zqAe2Jqqrve@=W(NjEZYBt=S-wYm&?47_donAOw;7#z36KQX(kb9&OjIkE{UKoYsec zMsS@;p@18i#xM zDBv$`HL3&gCubL+*pl}MZ3#0s_EWw9nGvfAeo6#Tfgv=s;(t)@9hNx=6f)_aS z2&?DABlWFy^&ZOK@zy8r8dyoWkS@A&xPSoX4r~UV!%2z(Pr1D4F&{I7Bd4?K?*p*m zQT4$6CJwpx_V8UXgb05H$2$;D8rwtV<6kW0l)_522ea>(k3or0kZHXUff|J^tmU>Y z{!&_7Ff58$A3lEcV(ui+pZ@y#R>Dro?!bdzDX30E36h_4c6bs}athyx*aLucwGJai zu7a%v#|ft_B=?mUH^KZTo67c^IdeE&eN->p#en%W0A)o_1ygkL^426gUO-s{#i=yH zhBMbFj|l?Eej4Fj;DcG2tG|B*=tYa~(V$l~HG&HHe2X4lk8{8O(SBrc;5c}a@gTOZ zup==bQ1;Z!fbQdSX)<47X%P2{SBanZ5V#s4!JGyM)@Ew1k#d5R{|nn#F)NmDAz{dP zZyAClFxvbRt+4GB%>uHic6RSdXZe6cy%{s$Iemf}3`kolYL(ZP-UctmsD(*0XU?Qg z7ZXTRjyX;N?l}W9&Kx^-ZHdZ_-QPc5snbu*-m-6B?!3$4BH%C&Sc)WF({iRER%A*( z#&S)|tM@6uu@HhnmAP!fcci}&Pr0A^9pwYfdQ7VRut1as#hzOF9N{F;?%I`+z$d8T zD4(P3Fqh6#r*iA>={cs4YpA|{HHx0Kr+j<-*s+;ZBQd1gu($2&>*_j3U%DjEd4p@_ zFRZ)e%9Upa-225MLEs%U$6wtoP*IPvzaUrB=R15J_47;Az&J6X2lumo3uL&4tA6?=d*PF`*52=L%.{bc-Sx5Ah_&olO-=V6 zJyL@VSu^hGFOzf?NFE zo1aE>2EZcJnChW}f{TN8yyO0D#^Q~T9yo_?q8U7^;Aq3^tjPiIXr$2iG6z8}v0ku& z2DE|pf#jN4aO>=G$b!HB>Cm=J>n!-I3K`1j(v<*3F>u)^*9%R1yLo0TzNF#EJ+frfI{ z;=k(rP^_u-qcN`N47RHGCB-L{`xb>#84Y-t?H+f zAbyB?CC!OwGUp>~NHKvP82dM5Rg7N&>=^2Asrx_`*oHyh5gmUIT{;L+R|#=xT}~|m`_UjzKJ)P|4kdzj4mp$yvGc3n?zAJI4CInKsLFEjGekGe0{soYK9vY zsWW1CTwLn){rYyyCVXmbIKHJ65ekaNI03Gj-fmEIjKXfflR=sK_N4x0?)^@iD!aL7 z%sjrr!nxsc$;;QTQ?iR|Q%a|1j$V%cB785|9kd=LdB!h+2pzrReOAh-;g#LS)61n> zgA)t!fa@@C$w3&zL4p@(dsi446LWr~pUe%p;X#|q`*=)6y&&ggAY(5dwD*zhDeHVx zNpd9l>XHEn7%po089g=;-y~M66a(haFN)K*o8>ggOjq|{LAbu;A{c;;6X*`F+z=Ht zx%L!Z`mTjVN8<>=D=*Xi=Ml%y`!ny(v~JbPZVtH5_8GTU6VjPRy8nFW@t2nxp|$bb zIoB@vqh#shh&T9vybXOmp_#&3a2U_;H+h6d+}lAL{pUHZXy$&Ijc{b|y_B*Mzv+?0 zJGur{Yr3Ns_cuk;eDiV~K>b>!XaSCR6h+p6;IdR>%>(Z<{fs;&f9ql9?*-a){GhN$ z{@VyJ`cF_93Dz0Qz0}t?fT>%Xjs7Kcn-47?y>0t;{0(R+nLk^x)Uu8ZMRrLofaXqu z!o#=S89+^L4_!hUPRxfp)Z;69*00WTR`mEoyCL8f%~eD-)9)`ifg&X%#B7i=75=gQ zDPMO8oQy#$Qapor=M@YOIhBJL+1UD84O9$ zep6Eexr>-L!plL8qqFGZ_7mMCxJuidS2FugXXTT%s4&f~uaVf|+(kl+8->Bj+B%m} z6J#&3-t6ESI@fY=IKkHN4RKmIE@?|!mdqkh6Sb`UNs`d+nH zJaqlh-i{q-C_Fh*ZLIuD=9Z8YS11%j7f@;?5X+4pIC$WahR>hzmi*{^<+%YZ^9Q$^ z#1olg;o@KbtzH1>Qoh4TO|-Q|sVu=mfhUP)m-Xr;W-ak5@-JT&Zx#t4g|(FQDGwXr zBS(CN^8CU+L+3-SpZs9lFA~(85Z*1uf8t4?bD2_` zo`bz&QkM)%lQw3dU(xmJ(;UVMo9W+7LrQCn>%4!GAOabGh^DjEH7Blsv|ffeBzyLQ z2$3h8`mDxzMa3cW1MYrEQ||ItQwetQ=6HWJiUW>IcJ8D&9Ep}w{OXfa=iud)JaDbE zCB+9cq8RA*<(LO)>$2d)lA>2-h<>^& zkYZRz=`c~$qqa&e=Tb~8U<;EzjtdP9C01_Qy!p(mzJha)^z+Nnf;pb*?a%fhhBNYC Tga*ClpVBz1N%E92F6;gmEs+DE literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_a2_d6_10/logpower_result.txt b/analysis/matlab/variations/naive_a2_d6_10/logpower_result.txt index e2d0afe..f8495b1 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/logpower_result.txt +++ b/analysis/matlab/variations/naive_a2_d6_10/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d6_10 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT) +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = # successes (count)) log(day) uses 1-indexed training day (our day 0 = paper "Day 1") observed groups: stim n=3, control n=6 nrep=120, alpha=0.05 @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.006) = 0.076 (small; f: .10 small, .25 16 | 0.34 | 0.36 24 | 0.51 | 0.53 - true stim:log(day) = -8.46 (50% of observed) + true stim:log(day) = -8.464 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.03 | 0.07 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.006) = 0.076 (small; f: .10 small, .25 16 | 0.11 | 0.12 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_a2_d6_10/logpower_result_rate.txt b/analysis/matlab/variations/naive_a2_d6_10/logpower_result_rate.txt new file mode 100644 index 0000000..13d169b --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_10/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = success RATE) +log(day) uses 1-indexed training day (our day 0 = paper "Day 1") +observed groups: stim n=3, control n=6 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,41)=2.375 p(resid)=0.131 p(Satt)=0.1321 (df=36) + honest per-animal random slope (log-day): F(1,9.0)=1.58 p=0.2398 +Cohen's f (interaction, partial eta^2=0.023) = 0.153 (small-medium; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=-0.2002, ratSD=0.06161, resSD=0.06563) --- + + true stim:log(day) = -0.2002 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.12 | 0.26 <- observed + 5 | 0.27 | 0.39 + 8 | 0.50 | 0.57 + 12 | 0.78 | 0.82 + 16 | 0.88 | 0.91 + 24 | 0.97 | 0.97 + + true stim:log(day) = -0.1001 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.10 <- observed + 5 | 0.07 | 0.12 + 8 | 0.17 | 0.22 + 12 | 0.17 | 0.19 + 16 | 0.33 | 0.39 + 24 | 0.36 | 0.39 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d6_10/logpowersim.m b/analysis/matlab/variations/naive_a2_d6_10/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/logpowersim.m +++ b/analysis/matlab/variations/naive_a2_d6_10/logpowersim.m @@ -1,50 +1,52 @@ -% Variation log-day analysis + Cohen's f + power simulation. +% Variation log-day analysis + Cohen's f + power simulation, for BOTH metrics: +% metric = count : behavior = # successes -> logpower_result.txt +% metric = rate : behavior = success / attempts -> logpower_result_rate.txt % -% The paper's power code models behavior against LOG training day, not raw day: +% The paper's power code models behavior against LOG training day: % behavior ~ stim + log(day) + stim:log(day) + (1|rat). -% Their day is 1-indexed (1..10); our data.csv day is 0-indexed (day 0 = paper -% "Day 1"), so log(day + 1) reproduces their transform exactly. -% -% This script (a) refits that log-day model on data.csv, (b) reports the -% interaction (residual DF, Satterthwaite DF, and the honest per-animal -% random-slope test) and Cohen's f -- the partial-eta^2 effect size of the -% interaction, var(fitted_full) - var(fitted_no_interaction) over var(behavior) -% -- and (c) runs the Monte-Carlo power simulation on the log-day model, -% scoring per-animal (cluster-honest) and LME power across N. -% Writes logpower_result.txt. Run: matlab -batch "logpowersim" +% Their day is 1-indexed; our data.csv day is 0-indexed, so log(day + 1) +% reproduces their transform (our day 0 = paper "Day 1"). For each metric this +% refits that model, reports the interaction (residual / Satterthwaite / honest +% per-animal random-slope DF) and Cohen's f (partial-eta^2 effect size), then +% runs the Monte-Carlo power sim (per-animal cluster-honest + LME power). +% Run: matlab -batch "logpowersim" % (Copy of analysis/matlab/variation_logpower.m; see make_variation_logpower.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' column = log(day+1) -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; -warnState = warning('off', 'all'); -rng(1); +localLogPower(D, 'count', here, vname); +localLogPower(D, 'rate', here, vname); -logday = log(D.day + 1); % 0-indexed day -> their log(1-indexed day) -tbl0 = table(D.success, logday, double(D.stim), categorical(D.subject), ... +% ---------------------------------------------------------------- per metric +function localLogPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; +FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; % 'day' = log(day+1) +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); +logday = log(D.day + 1); +tbl0 = table(beh, logday, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (success COUNT)\n')]; +s = sprintf('%s\nLOG-DAY MODEL + COHEN''S f + POWER -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: behavior ~ stim + log(day) + stim:log(day) + (1|rat) (behavior = %s)\n', mlabel)]; s = [s sprintf('log(day) uses 1-indexed training day (our day 0 = paper "Day 1")\n')]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for this analysis (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for this analysis.\n')]; + localFinish(s, here, suffix); warning(warnState); return end -% ---- fitted model on the real data ---- full = fitlme(tbl0, FORMULA); An = anova(full); Asatt = anova(full, 'DFMethod', 'satterthwaite'); ii = strcmp(An.Term, 'day:stim'); is = strcmp(Asatt.Term, 'day:stim'); @@ -52,7 +54,6 @@ reduced = fitlme(tbl0, 'behavior ~ stim + day + (1|rat)'); eta2part = max((var(fitted(full)) - var(fitted(reduced))) / var(tbl0.behavior), 0); cohenf = sqrt(eta2part / (1 - eta2part)); -% honest per-animal random-slope interaction rsP = NaN; rsDf = NaN; rsF = NaN; rsOk = false; try mr = fitlme(tbl0, 'behavior ~ stim + day + stim:day + (day|rat)'); @@ -76,19 +77,18 @@ end s = [s sprintf('Cohen''s f (interaction, partial eta^2=%.3f) = %.3f (%s; f: .10 small, .25 medium, .40 large)\n', ... eta2part, cohenf, mag)]; -% ---- power simulation on the log-day ground truth ---- cn = full.CoefficientNames; be = full.fixedEffects; b0 = be(strcmp(cn, '(Intercept)')); bStim = be(strcmp(cn, 'stim')); bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(full); sRat = sqrt(psi{1}); sRes = sqrt(full.MSE); -days = unique(tbl0.day); % the log(day) grid +days = unique(tbl0.day); -s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.2f, ratSD=%.2f, resSD=%.2f) ---\n', ... +s = [s sprintf('\n--- power simulation (log-day ground truth: stim:logday=%+.4g, ratSD=%.4g, resSD=%.4g) ---\n', ... bInt, sRat, sRes)]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:log(day) = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:log(day) = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -102,19 +102,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end -s = [s sprintf(['\nRead the per-animal column as the honest power; the LME column matches the\n' ... - 'paper''s power code (anova interaction p, observation-level DF) and is optimistic.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead per-animal as the honest power; LME matches the paper''s power code (optimistic).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'logpower_result.txt'), 'w'); +fid = fopen(fullfile(here, ['logpower_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d6_10/plotcurve.m b/analysis/matlab/variations/naive_a2_d6_10/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/plotcurve.m +++ b/analysis/matlab/variations/naive_a2_d6_10/plotcurve.m @@ -1,11 +1,12 @@ -% Variation learning-curve plot, in the style of the paper: +% Variation learning-curve plots, in the style of the paper: % "Lines indicate mean (and SEM) across animals in the anodal (red) and % control (blue) groups." -% Plots mean +/- SEM successful reaches per training day for the treatment / -% anodal group (stim = 1, red) and the control group (stim = 0, blue), reading -% this folder's data.csv and saving learning_curve.png. The per-group N is read -% from the data (each variation pools different groups), so the legend shows the -% actual counts. Training day is 1-indexed (our day 0 = the paper's "Day 1"). +% Produces TWO figures from this folder's data.csv: +% learning_curve.png # successes (count) per training day +% learning_curve_rate.png success rate (success/attempts) per training day +% anodal / treatment = stim 1 (red); control = stim 0 (blue). Per-group N is +% read from the data. Training day is 1-indexed (our day 0 = paper "Day 1") and +% the x-axis tick labels are drawn vertically. % Run: matlab -batch "plotcurve" % (Copy of analysis/matlab/variation_plot.m; see make_variation_plot.m.) @@ -14,15 +15,20 @@ if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); -days = unique(D.day); % 0-indexed -xd = days + 1; % plot as 1-indexed training day (paper axis) - +days = unique(D.day); +xd = days + 1; % plot as 1-indexed training day (paper axis) red = [0.85 0.10 0.10]; blue = [0.10 0.30 0.85]; -[Ma, Sa, na] = localCurve(D, 1, days); % anodal / treatment (stim = 1) -[Mc, Sc, nc] = localCurve(D, 0, days); % control (stim = 0) +localPlot(D, days, xd, 'count', '# successes', ... + fullfile(here, 'learning_curve.png'), vname, red, blue); +localPlot(D, days, xd, 'rate', 'success rate', ... + fullfile(here, 'learning_curve_rate.png'), vname, red, blue); +% ------------------------------------------------------------------ helpers +function localPlot(D, days, xd, metric, ylab, outFile, vname, red, blue) +[Ma, Sa, na] = localCurve(D, 1, days, metric); % anodal / treatment +[Mc, Sc, nc] = localCurve(D, 0, days, metric); % control fig = figure('Visible', 'off', 'Color', 'w', 'Position', [100 100 560 460]); hold on e1 = errorbar(xd, Ma, Sa, '-o', 'Color', red, 'MarkerFaceColor', red, 'LineWidth', 2); @@ -30,26 +36,30 @@ e2 = errorbar(xd, Mc, Sc, '-o', 'Color', blue, 'MarkerFaceColor', blue, 'LineWid hold off legend([e1 e2], {sprintf('anodal, N = %d', na), sprintf('control, N = %d', nc)}, ... 'Location', 'northwest', 'Box', 'off'); -xlabel('training day'); -ylabel('# successes'); +xlabel('training day'); ylabel(ylab); title(vname, 'Interpreter', 'none'); set(gca, 'XTick', xd, 'FontName', 'Arial', 'FontSize', 13, 'LineWidth', 1.5, 'Box', 'off'); - -outFile = fullfile(here, 'learning_curve.png'); +xtickangle(90); % vertical x-axis tick labels exportgraphics(fig, outFile, 'Resolution', 150); close(fig); -fprintf('%s: wrote learning_curve.png (anodal N=%d, control N=%d)\n', vname, na, nc); +fprintf('%s: wrote %s (anodal N=%d, control N=%d)\n', vname, outFile, na, nc); +end -% ------------------------------------------------------------------ helper -function [M, S, n] = localCurve(D, stimVal, days) -%LOCALCURVE Per-day mean and SEM of successes across the animals in a group. +function [M, S, n] = localCurve(D, stimVal, days, metric) +%LOCALCURVE Per-day mean and SEM across the animals in a group, for a metric. subs = unique(D.subject(D.stim == stimVal)); n = numel(subs); X = nan(numel(days), n); for j = 1:n for i = 1:numel(days) r = D.subject == subs(j) & D.day == days(i); - if any(r); X(i, j) = mean(D.success(r)); end + if ~any(r); continue; end + if strcmp(metric, 'rate') + tot = sum(D.total(r)); + if tot > 0; X(i, j) = sum(D.success(r)) / tot; end + else + X(i, j) = mean(D.success(r)); + end end end M = mean(X, 2, 'omitnan'); diff --git a/analysis/matlab/variations/naive_a2_d6_10/power_result.txt b/analysis/matlab/variations/naive_a2_d6_10/power_result.txt index ae734b8..cea797f 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/power_result.txt +++ b/analysis/matlab/variations/naive_a2_d6_10/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_a2_d6_10 +POWER SIMULATION -- naive_a2_d6_10 [metric: # successes (count)] ============================================================================== -model: behavior ~ stim + day + stim:day + (1|rat) (success COUNT; day within-window) +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = # successes (count); day within-window) observed groups: stim n=3, control n=6 nrep=120, alpha=0.05 -ground truth: stim:day=-1.80/day, rat SD=10.99, residual SD=10.55, days=5 +ground truth: stim:day=-1.8/day, rat SD=10.99, residual SD=10.55, days=5 - true stim:day interaction = -1.80 (100% of observed) + true stim:day interaction = -1.8 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.06 | 0.09 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=-1.80/day, rat SD=10.99, residual SD=10.55, days=5 16 | 0.33 | 0.34 24 | 0.45 | 0.49 - true stim:day interaction = -0.90 (50% of observed) + true stim:day interaction = -0.9 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.03 | 0.07 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=-1.80/day, rat SD=10.99, residual SD=10.55, days=5 16 | 0.11 | 0.11 24 | 0.13 | 0.14 -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_a2_d6_10/power_result_rate.txt b/analysis/matlab/variations/naive_a2_d6_10/power_result_rate.txt new file mode 100644 index 0000000..2125f2e --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_10/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_a2_d6_10 [metric: success RATE] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE; day within-window) +observed groups: stim n=3, control n=6 nrep=120, alpha=0.05 +ground truth: stim:day=-0.02201/day, rat SD=0.06153, residual SD=0.06598, days=5 + + true stim:day interaction = -0.02201 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.10 | 0.23 <- observed + 5 | 0.23 | 0.37 + 8 | 0.47 | 0.55 + 12 | 0.75 | 0.78 + 16 | 0.88 | 0.88 + 24 | 0.95 | 0.96 + + true stim:day interaction = -0.01101 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.03 | 0.10 <- observed + 5 | 0.07 | 0.11 + 8 | 0.17 | 0.21 + 12 | 0.15 | 0.18 + 16 | 0.33 | 0.38 + 24 | 0.34 | 0.37 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d6_10/powersim.m b/analysis/matlab/variations/naive_a2_d6_10/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/powersim.m +++ b/analysis/matlab/variations/naive_a2_d6_10/powersim.m @@ -1,45 +1,49 @@ % Variation power simulation -- Monte-Carlo power for the paper's stim x day -% interaction, using THIS folder's data as the ground truth. +% interaction, using THIS folder's data as the ground truth, for BOTH metrics: +% metric = count : behavior = # successes -> power_result.txt +% metric = rate : behavior = success / attempts -> power_result_rate.txt % % Ground truth: fitlme(behavior ~ stim + day + stim:day + (1|rat)) on data.csv -% (success COUNT; day within-window). Its fixed effects, per-rat intercept SD, -% and residual SD generate NREP synthetic datasets at each rats-per-group N and -% each true-effect multiplier (1 = observed slope, 0.5 = half). Each dataset is -% scored at alpha = 0.05 two ways: -% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest -- the -% honest power, matching the random-slope / per-animal inference) +% (day within-window). Its fixed effects, per-rat intercept SD, and residual SD +% generate NREP synthetic datasets at each rats-per-group N and each true-effect +% multiplier (1 = observed, 0.5 = half). Each is scored at alpha=0.05 by: +% per-animal : Welch t on per-rat behavior~day slopes (cluster-honest power) % LME : the fitlme stim:day p (observation-level DF -- optimistic) -% Writes power_result.txt beside this script. Run: matlab -batch "powersim" +% Writes power_result[_rate].txt. Run: matlab -batch "powersim" % (Copy of analysis/matlab/variation_power.m; see make_variation_power.m.) here = fileparts(mfilename('fullpath')); if isempty(here); here = pwd; end vname = regexprep(here, '.*[/\\]', ''); - D = readtable(fullfile(here, 'data.csv'), 'TextType', 'string'); + +localPower(D, 'count', here, vname); +localPower(D, 'rate', here, vname); + +% ---------------------------------------------------------------- per metric +function localPower(D, metric, here, vname) +NS = [3 5 8 12 16 24]; EFFMULS = [1 0.5]; NREP = 120; FORMULA = 'behavior ~ stim + day + stim:day + (1|rat)'; -NS = [3 5 8 12 16 24]; -EFFMULS = [1 0.5]; -NREP = 120; - -warnState = warning('off', 'all'); -rng(1); - +if strcmp(metric, 'rate') + D = D(D.total > 0, :); beh = D.success ./ D.total; mlabel = 'success RATE'; suffix = '_rate'; +else + beh = D.success; mlabel = '# successes (count)'; suffix = ''; +end +warnState = warning('off', 'all'); rng(1); day0 = min(D.day); -tbl0 = table(D.success, D.day - day0, double(D.stim), categorical(D.subject), ... +tbl0 = table(beh, D.day - day0, double(D.stim), categorical(D.subject), ... 'VariableNames', {'behavior', 'day', 'stim', 'rat'}); - nStim = numel(unique(D.subject(D.stim == 1))); nCtrl = numel(unique(D.subject(D.stim == 0))); bar = repmat('=', 1, 78); -s = sprintf('%s\nPOWER SIMULATION -- %s\n%s\n', bar, vname, bar); -s = [s sprintf('model: %s (success COUNT; day within-window)\n', FORMULA)]; +s = sprintf('%s\nPOWER SIMULATION -- %s [metric: %s]\n%s\n', bar, vname, mlabel, bar); +s = [s sprintf('model: %s (behavior = %s; day within-window)\n', FORMULA, mlabel)]; s = [s sprintf('observed groups: stim n=%d, control n=%d nrep=%d, alpha=0.05\n', nStim, nCtrl, NREP)]; if nStim < 2 || nCtrl < 2 || numel(unique(tbl0.day)) < 2 - s = [s sprintf('\nInsufficient data for a power simulation (need >=2 animals/group and >=2 days).\n')]; - localFinish(s, here); warning(warnState); return + s = [s sprintf('\nInsufficient data for a power simulation.\n')]; + localFinish(s, here, suffix); warning(warnState); return end lme = fitlme(tbl0, FORMULA); @@ -49,14 +53,13 @@ bDay = be(strcmp(cn, 'day')); bInt = be(strcmp(cn, 'day:stim')); psi = covarianceParameters(lme); sRat = sqrt(psi{1}); sRes = sqrt(lme.MSE); days = (0:max(tbl0.day))'; -s = [s sprintf('ground truth: stim:day=%+.2f/day, rat SD=%.2f, residual SD=%.2f, days=%d\n', ... +s = [s sprintf('ground truth: stim:day=%+.4g/day, rat SD=%.4g, residual SD=%.4g, days=%d\n', ... bInt, sRat, sRes, numel(days))]; for eMul = EFFMULS bI = bInt * eMul; - s = [s sprintf('\n true stim:day interaction = %+.2f (%.0f%% of observed)\n', bI, eMul * 100)]; %#ok - s = [s sprintf(' %-8s | per-animal power | LME power\n', 'N/group')]; %#ok - s = [s sprintf(' %s\n', repmat('-', 1, 42))]; %#ok + s = [s sprintf('\n true stim:day interaction = %+.4g (%.0f%% of observed)\n', bI, eMul * 100)]; + s = [s sprintf(' %-8s | per-animal power | LME power\n %s\n', 'N/group', repmat('-', 1, 42))]; for N = NS sigPA = 0; sigL = 0; for r = 1:NREP @@ -70,20 +73,18 @@ for eMul = EFFMULS end star = ''; if N == nStim || N == nCtrl; star = ' <- observed'; end - s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; %#ok + s = [s sprintf(' %-8d | %5.2f | %5.2f%s\n', N, sigPA / NREP, sigL / NREP, star)]; end end - -s = [s sprintf(['\nRead the per-animal column as the honest power. At the observed N this study\n' ... - 'is typically underpowered; per-animal power reaches ~0.8 only at larger N.\n'])]; - -localFinish(s, here); +s = [s sprintf('\nRead the per-animal column as the honest power; LME is optimistic (obs-level DF).\n')]; +localFinish(s, here, suffix); warning(warnState); +end % ---------------------------------------------------------------- helpers -function localFinish(s, here) +function localFinish(s, here, suffix) fprintf('%s', s); -fid = fopen(fullfile(here, 'power_result.txt'), 'w'); +fid = fopen(fullfile(here, ['power_result' suffix '.txt']), 'w'); fprintf(fid, '%s', s); fclose(fid); end diff --git a/analysis/matlab/variations/naive_a2_d6_10/result.txt b/analysis/matlab/variations/naive_a2_d6_10/result.txt index 8846366..2bdf8a6 100644 --- a/analysis/matlab/variations/naive_a2_d6_10/result.txt +++ b/analysis/matlab/variations/naive_a2_d6_10/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_a2_d6_10 +VARIATION: naive_a2_d6_10 [metric: success COUNT] ============================================================================== model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success COUNT) day = training day within window (0 = first analyzed day) @@ -60,9 +60,9 @@ effect t(df) / F(df1) p (resid) Satterthwaite: p (df) stim x day (interaction) t(41)= -0.76 F(1)= 0.582 p=0.4499 p=0.4505 (df=36) day (learning) t(41)= 4.38 F(1)= 19.183 p=8.027e-05 p=9.813e-05 (df=36) stim (main, window start) t(41)= 2.73 F(1)= 7.453 p=0.00929 p=0.01541 (df=15) -interaction 95% CI: [-6.57, +2.97] +interaction 95% CI: [-6.565, +2.965] HONEST LME (per-animal random slope, day|rat): interaction F(1,9.0)=0.44, p=0.5223 (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.4499, slope diff=-1.80) -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.4499, slope diff=-1.8) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d6_10/result_rate.txt b/analysis/matlab/variations/naive_a2_d6_10/result_rate.txt new file mode 100644 index 0000000..69f1ea9 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_10/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_a2_d6_10 [metric: success RATE (success/attempts)] +============================================================================== +model: behavior ~ stim + day + stim:day + (1|rat) (behavior = success RATE (success/attempts)) +day = training day within window (0 = first analyzed day) +treatment (stim=1): Electrode-Box-B2 +control (stim=0): Electrode-Box-A2, Naive +N = 9 rats, 45 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 45 + Fixed effects coefficients 4 + Random effects coefficients 9 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -89.86 -79.02 50.93 -101.86 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.46152 0.032656 14.133 41 2.355e-17 + {'day' } 0.034211 0.008518 4.0163 41 0.00024603 + {'stim' } 0.18209 0.056562 3.2193 41 0.0025147 + {'day:stim' } -0.022011 0.014754 -1.4919 41 0.14338 + + + Lower Upper + 0.39557 0.52747 + 0.017008 0.051413 + 0.067859 0.29632 + -0.051806 0.0077844 + +Random effects covariance parameters (95% CIs): +Group: rat (9 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.061534 + + + Lower Upper + 0.034776 0.10888 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.06598 0.052372 0.083124 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(41)= -1.49 F(1)= 2.226 p=0.1434 p=0.1444 (df=36) +day (learning) t(41)= 4.02 F(1)= 16.131 p=0.000246 p=0.0002875 (df=36) +stim (main, window start) t(41)= 3.22 F(1)= 10.364 p=0.002515 p=0.005217 (df=16) +interaction 95% CI: [-0.05181, +0.007784] +HONEST LME (per-animal random slope, day|rat): interaction F(1,9.0)=1.61, p=0.2369 + (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.1434, slope diff=-0.02201) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d6_13/analyze.m b/analysis/matlab/variations/naive_a2_d6_13/analyze.m index 82da5ed..0d40402 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/analyze.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d6_13/learning_curve.png b/analysis/matlab/variations/naive_a2_d6_13/learning_curve.png index eb6784c2aa9c63cf7a67c1f2cb96424deab9b613..8aa97fb15bed70ced9dff0bb6fae5af96ae19eb5 100644 GIT binary patch literal 40462 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 literal 40520 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 X=c_@p9 diff --git a/analysis/matlab/variations/naive_a2_d6_13/learning_curve_rate.png b/analysis/matlab/variations/naive_a2_d6_13/learning_curve_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..43a8c0fe23bd5aa454ceb1b5117dfb0dedae3cc2 GIT binary patch literal 40074 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 N<4PwLQ{_!={2y_Y=RN=c literal 0 HcmV?d00001 diff --git a/analysis/matlab/variations/naive_a2_d6_13/logpower_result.txt b/analysis/matlab/variations/naive_a2_d6_13/logpower_result.txt index fee1b05..ab30786 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/logpower_result.txt +++ b/analysis/matlab/variations/naive_a2_d6_13/logpower_result.txt @@ -1,7 +1,7 @@ ============================================================================== -LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_d6_13 +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_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=6 nrep=120, alpha=0.05 @@ -10,9 +10,9 @@ stim x log(day) interaction: F(1,61)=0.405 p(resid)=0.5267 p(Satt)=0.5268 (df= honest per-animal random slope (log-day): F(1,8.2)=0.20 p=0.663 Cohen's f (interaction, partial eta^2=0.002) = 0.047 (small; f: .10 small, .25 medium, .40 large) ---- power simulation (log-day ground truth: stim:logday=+9.35, ratSD=9.78, resSD=11.90) --- +--- power simulation (log-day ground truth: stim:logday=+9.352, ratSD=9.782, resSD=11.9) --- - true stim:log(day) = +9.35 (100% of observed) + true stim:log(day) = +9.352 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.07 | 0.10 <- observed @@ -22,7 +22,7 @@ Cohen's f (interaction, partial eta^2=0.002) = 0.047 (small; f: .10 small, .25 16 | 0.30 | 0.32 24 | 0.42 | 0.42 - true stim:log(day) = +4.68 (50% of observed) + true stim:log(day) = +4.676 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.05 | 0.09 <- observed @@ -32,5 +32,4 @@ Cohen's f (interaction, partial eta^2=0.002) = 0.047 (small; f: .10 small, .25 16 | 0.07 | 0.07 24 | 0.17 | 0.17 -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_a2_d6_13/logpower_result_rate.txt b/analysis/matlab/variations/naive_a2_d6_13/logpower_result_rate.txt new file mode 100644 index 0000000..1560ba6 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_13/logpower_result_rate.txt @@ -0,0 +1,35 @@ +============================================================================== +LOG-DAY MODEL + COHEN'S f + POWER -- naive_a2_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=6 nrep=120, alpha=0.05 + +--- fitted on real data --- +stim x log(day) interaction: F(1,61)=0.040 p(resid)=0.843 p(Satt)=0.843 (df=58) + honest per-animal random slope (log-day): F(1,7.8)=0.00 p=0.9656 +Cohen's f (interaction, partial eta^2=0.000) = 0.010 (small; f: .10 small, .25 medium, .40 large) + +--- power simulation (log-day ground truth: stim:logday=+0.01851, ratSD=0.05356, resSD=0.07547) --- + + true stim:log(day) = +0.01851 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.05 <- observed + 5 | 0.09 | 0.08 + 8 | 0.05 | 0.03 + 12 | 0.04 | 0.06 + 16 | 0.07 | 0.08 + 24 | 0.03 | 0.07 + + true stim:log(day) = +0.009253 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.07 <- observed + 5 | 0.05 | 0.06 + 8 | 0.07 | 0.04 + 12 | 0.04 | 0.05 + 16 | 0.04 | 0.05 + 24 | 0.07 | 0.07 + +Read per-animal as the honest power; LME matches the paper's power code (optimistic). diff --git a/analysis/matlab/variations/naive_a2_d6_13/logpowersim.m b/analysis/matlab/variations/naive_a2_d6_13/logpowersim.m index e0686ee..5e38720 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/logpowersim.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d6_13/plotcurve.m b/analysis/matlab/variations/naive_a2_d6_13/plotcurve.m index bfc1386..193a44b 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/plotcurve.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d6_13/power_result.txt b/analysis/matlab/variations/naive_a2_d6_13/power_result.txt index 7b2e583..b02b282 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/power_result.txt +++ b/analysis/matlab/variations/naive_a2_d6_13/power_result.txt @@ -1,11 +1,11 @@ ============================================================================== -POWER SIMULATION -- naive_a2_d6_13 +POWER SIMULATION -- naive_a2_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=6 nrep=120, alpha=0.05 -ground truth: stim:day=+1.16/day, rat SD=9.76, residual SD=12.03, days=8 +ground truth: stim:day=+1.155/day, rat SD=9.759, residual SD=12.03, days=8 - true stim:day interaction = +1.16 (100% of observed) + true stim:day interaction = +1.155 (100% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.08 | 0.15 <- observed @@ -15,7 +15,7 @@ ground truth: stim:day=+1.16/day, rat SD=9.76, residual SD=12.03, days=8 16 | 0.42 | 0.47 24 | 0.58 | 0.59 - true stim:day interaction = +0.58 (50% of observed) + true stim:day interaction = +0.5776 (50% of observed) N/group | per-animal power | LME power ------------------------------------------ 3 | 0.06 | 0.09 <- observed @@ -25,5 +25,4 @@ ground truth: stim:day=+1.16/day, rat SD=9.76, residual SD=12.03, days=8 16 | 0.12 | 0.12 24 | 0.21 | 0.23 -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_a2_d6_13/power_result_rate.txt b/analysis/matlab/variations/naive_a2_d6_13/power_result_rate.txt new file mode 100644 index 0000000..d96945e --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_13/power_result_rate.txt @@ -0,0 +1,28 @@ +============================================================================== +POWER SIMULATION -- naive_a2_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=6 nrep=120, alpha=0.05 +ground truth: stim:day=+0.003468/day, rat SD=0.05337, residual SD=0.07609, days=8 + + true stim:day interaction = +0.003468 (100% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.05 <- observed + 5 | 0.12 | 0.13 + 8 | 0.09 | 0.11 + 12 | 0.09 | 0.08 + 16 | 0.15 | 0.17 + 24 | 0.14 | 0.15 + + true stim:day interaction = +0.001734 (50% of observed) + N/group | per-animal power | LME power + ------------------------------------------ + 3 | 0.05 | 0.07 <- observed + 5 | 0.04 | 0.07 + 8 | 0.07 | 0.07 + 12 | 0.05 | 0.05 + 16 | 0.06 | 0.07 + 24 | 0.08 | 0.08 + +Read the per-animal column as the honest power; LME is optimistic (obs-level DF). diff --git a/analysis/matlab/variations/naive_a2_d6_13/powersim.m b/analysis/matlab/variations/naive_a2_d6_13/powersim.m index 554d032..ecd9c6c 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/powersim.m +++ b/analysis/matlab/variations/naive_a2_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_a2_d6_13/result.txt b/analysis/matlab/variations/naive_a2_d6_13/result.txt index 2368021..81643c9 100644 --- a/analysis/matlab/variations/naive_a2_d6_13/result.txt +++ b/analysis/matlab/variations/naive_a2_d6_13/result.txt @@ -1,5 +1,5 @@ ============================================================================== -VARIATION: naive_a2_d6_13 +VARIATION: naive_a2_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(61)= 0.78 F(1)= 0.605 p=0.4398 p=0.4399 (df=58) day (learning) t(61)= 3.39 F(1)= 11.485 p=0.001235 p=0.001274 (df=57) stim (main, window start) t(61)= 2.46 F(1)= 6.072 p=0.01657 p=0.02473 (df=17) -interaction 95% CI: [-1.82, +4.13] +interaction 95% CI: [-1.815, +4.126] HONEST LME (per-animal random slope, day|rat): interaction F(1,7.7)=0.36, p=0.5635 (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.4398, slope diff=+1.16) -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.4398, slope diff=+1.155) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008. diff --git a/analysis/matlab/variations/naive_a2_d6_13/result_rate.txt b/analysis/matlab/variations/naive_a2_d6_13/result_rate.txt new file mode 100644 index 0000000..1c1d330 --- /dev/null +++ b/analysis/matlab/variations/naive_a2_d6_13/result_rate.txt @@ -0,0 +1,68 @@ +============================================================================== +VARIATION: naive_a2_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-A2, Naive +N = 9 rats, 65 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 65 + Fixed effects coefficients 4 + Random effects coefficients 9 + Covariance parameters 2 + +Formula: + behavior ~ 1 + day*stim + (1 | rat) + +Model fit statistics: + AIC BIC LogLikelihood Deviance + -124.85 -111.8 68.424 -136.85 + +Fixed effects coefficients (95% CIs): + Name Estimate SE tStat DF pValue + {'(Intercept)'} 0.49381 0.029854 16.541 61 3.1921e-24 + {'day' } 0.012224 0.0052666 2.321 61 0.023647 + {'stim' } 0.14414 0.051782 2.7835 61 0.007149 + {'day:stim' } 0.0034682 0.0093748 0.36995 61 0.7127 + + + Lower Upper + 0.43411 0.5535 + 0.0016924 0.022755 + 0.040593 0.24768 + -0.015278 0.022214 + +Random effects covariance parameters (95% CIs): +Group: rat (9 Levels) + Name1 Name2 Type Estimate + {'(Intercept)'} {'(Intercept)'} {'std'} 0.053368 + + + Lower Upper + 0.029753 0.095724 + +Group: Error + Name Estimate Lower Upper + {'Res Std'} 0.076088 0.063265 0.091511 + + +effect t(df) / F(df1) p (resid) Satterthwaite: p (df) +---------------------------------------------------------------------------- +stim x day (interaction) t(61)= 0.37 F(1)= 0.137 p=0.7127 p=0.7128 (df=58) +day (learning) t(61)= 2.32 F(1)= 5.387 p=0.02365 p=0.02384 (df=58) +stim (main, window start) t(61)= 2.78 F(1)= 7.748 p=0.007149 p=0.01177 (df=19) +interaction 95% CI: [-0.01528, +0.02221] +HONEST LME (per-animal random slope, day|rat): interaction F(1,7.4)=0.04, p=0.8393 + (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.7127, slope diff=+0.003468) +Paper (N=24, count): interaction t(227)=2.68, F(1)=7.12, p=0.008.