9af33e747e
Add make_matched_effort.m: pick the current-study day cutoff whose per-animal cumulative attempts best match the previous (_f) study's full-span total (~405 attempts/animal -> current days 0-3), then fit the paper LME on both. Two variation folders (data.csv + analyze.m + result.txt): variations/prev_f_full/ b2_f vs a2_f, days 0-9 (24 rats) variations/matched_current_d0_3/ Box-B2 vs Box-A2, 0-3 (6 rats) At matched cumulative effort both show a significant positive stim x day interaction (prev p=0.008 +0.56/day; current-0-3 p=0.004 +10.2/day) -- the tDCS acceleration replicates at equal practice, though the count slopes are not directly comparable across datasets given differing attempts/session. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
100 lines
4.0 KiB
Matlab
100 lines
4.0 KiB
Matlab
function make_matched_effort()
|
|
%MAKE_MATCHED_EFFORT Compare the previous (_f) study to the current study at
|
|
% EQUAL cumulative effort (total attempts), not equal calendar days.
|
|
%
|
|
% The current animals attempt far more reaches per session than the previous
|
|
% (Forouzan) animals, so at equal day counts they have far more practice. This
|
|
% picks the current-study day cutoff 0..D whose per-animal cumulative attempts
|
|
% best matches the previous study's FULL (days 0-9) per-animal attempts, then
|
|
% builds two variation subfolders under variations/ and fits the paper's LME
|
|
% (behavior ~ stim + day + stim:day + (1|rat), on the success COUNT) in each:
|
|
%
|
|
% variations/prev_f_full/ previous study, b2_f vs a2_f, days 0-9
|
|
% variations/matched_current_d0_<D>/ current anchors Box-B2 vs Box-A2, 0..D
|
|
%
|
|
% Each folder holds the usual three files (data.csv, analyze.m, result.txt).
|
|
% A comparison of the two interaction estimates is printed at the end.
|
|
|
|
thisDir = fileparts(mfilename('fullpath'));
|
|
template = fullfile(thisDir, 'variation_analyze.m');
|
|
root = fullfile(thisDir, 'variations');
|
|
if ~exist(root, 'dir'); mkdir(root); end
|
|
|
|
Tf = forouzan_load_data();
|
|
Tc = tdcs_load_data();
|
|
B2 = 'Electrode-Box-B2'; A2 = 'Electrode-Box-A2';
|
|
|
|
% Target: previous study's per-animal cumulative attempts over its full span.
|
|
target = localPerAnimalMeanTotal(Tf, 0, 9);
|
|
fprintf('Previous (_f) full 0-9: %.0f attempts/animal\n', target);
|
|
|
|
% Choose the current-study cutoff whose cumulative attempts best matches it.
|
|
anc = Tc(ismember(cellstr(Tc.group), {A2, B2}), :);
|
|
bestD = NaN; bestDiff = inf; bestVal = NaN;
|
|
for d = 2:9
|
|
v = localPerAnimalMeanTotal(anc, 0, d);
|
|
fprintf(' current anchors 0-%d: %.0f attempts/animal\n', d, v);
|
|
if abs(v - target) < bestDiff
|
|
bestDiff = abs(v - target); bestD = d; bestVal = v;
|
|
end
|
|
end
|
|
fprintf('=> matched-effort window: current days 0-%d (%.0f vs %.0f attempts/animal)\n\n', ...
|
|
bestD, bestVal, target);
|
|
|
|
% Build the two comparison folders and fit the paper LME in each.
|
|
prevName = 'prev_f_full';
|
|
currName = sprintf('matched_current_d0_%d', bestD);
|
|
rPrev = localBuildAndRun(root, prevName, ...
|
|
localStimTable(Tf, 'b2_f'), template);
|
|
rCurr = localBuildAndRun(root, currName, ...
|
|
localStimTable(anc(anc.day >= 0 & anc.day <= bestD, :), B2), template);
|
|
|
|
fprintf('\n=== PAPER LME interaction (stim x day) at matched effort ===\n');
|
|
fprintf('%-26s %5s %5s %-22s %-14s\n', 'dataset', 'nRat', 'nObs', 'interaction', 'stim(Day1)');
|
|
localCmpRow(prevName, rPrev);
|
|
localCmpRow(currName, rCurr);
|
|
fprintf(['\n(Both now represent ~%.0f attempts/animal of practice. The previous\n' ...
|
|
'study spreads that over 10 sessions; the current study reaches it in %d days.)\n'], ...
|
|
target, bestD);
|
|
|
|
end
|
|
|
|
% ---- per-animal mean cumulative attempts over a day window --------------
|
|
function m = localPerAnimalMeanTotal(T, lo, hi)
|
|
T = T(T.day >= lo & T.day <= hi, :);
|
|
subj = unique(T.subject);
|
|
tot = zeros(numel(subj), 1);
|
|
for i = 1:numel(subj)
|
|
tot(i) = sum(T.total(T.subject == subj(i)));
|
|
end
|
|
m = mean(tot);
|
|
end
|
|
|
|
% ---- add a stim column (1 for treatGroup, 0 otherwise) -----------------
|
|
function D = localStimTable(T, treatGroup)
|
|
stim = double(strcmp(cellstr(T.group), treatGroup));
|
|
D = table(string(T.subject), string(T.group), T.day, T.success, T.total, stim, ...
|
|
'VariableNames', {'subject', 'group', 'day', 'success', 'total', 'stim'});
|
|
end
|
|
|
|
% ---- write data.csv + analyze.m, run it (isolated), return VARRESULT ----
|
|
function r = localBuildAndRun(root, name, D, template)
|
|
folder = fullfile(root, name);
|
|
if ~exist(folder, 'dir'); mkdir(folder); end
|
|
writetable(D, fullfile(folder, 'data.csv'));
|
|
copyfile(template, fullfile(folder, 'analyze.m'));
|
|
r = localRun(fullfile(folder, 'analyze.m'));
|
|
end
|
|
|
|
function r = localRun(scriptPath)
|
|
run(scriptPath);
|
|
r = VARRESULT; %#ok<NODEF>
|
|
end
|
|
|
|
function localCmpRow(name, r)
|
|
sig = 'n.s.';
|
|
if r.interP < 0.05; sig = 'SIG'; end
|
|
fprintf('%-26s %5d %5d %+6.2f/day p=%.3f %-4s p=%.3f\n', ...
|
|
name, r.nRats, r.nObs, r.interEst, r.interP, sig, r.stimP);
|
|
end
|