canlab / MediationToolbox

Single-level and multi-level mediation analyses for any kind of data, with bootstrap-based significance testing. Neuroimaging-oriented functions allow for mediation effect parametric mapping (mapping of mediation effects across the brain) and multivariate mediation.
https://canlabweb.colorado.edu/wiki/doku.php/help/mediation/m3_mediation_fmri_toolbox
83 stars 29 forks source link

Confidence Interval for the negative effect #33

Open sclab-shuo opened 3 months ago

sclab-shuo commented 3 months ago

I suspect this error from the observation of a counterintuitive output for a simple mediation analysis with these 3 vectors as X, M, and Y variables. There is a significant negative effect after BCa correction of path c; however, the CI output always spans from negative to slightly positive number (e.g. -0.0213 to 0.0034). Please see the attached output saved from the "stats" variable.

I narrow this issue to the code from this script “bootbca_ci.m”. I understand this script works well for the positive effect, but maybe with a negative effect, the ci_upper and ci_lower should switched to obtain the asymmetric confidence interval before BCa manipulation.

a1 = z_0 + ( (z_0 + zalpha1) ./ (1 - a .* (z_0 + zalpha1)) ); p1 = normcdf(a1);

a2 = z_0 + ( (z_0 + zalpha2) ./ (1 - a .* (z_0 + zalpha2)) ); p2 = normcdf(a2);

ci_lower = prctile(bstat, 100 . p1); ci_upper = prctile(bstat, 100 . p2);

% SC added: ------ ci_lower_n = prctile(bstat, 100 . (1.-p2)); ci_upper_n = prctile(bstat, 100 . (1.-p1));

testvalue = 0; % prctile of the distribution below nullvalue (2-tailed) % pct = min( [sum(bstat < testvalue); sum(bstat > testvalue)] ) ./ B; pct_lowertail = sum(bstat < testvalue) ./ B; pct_uppertail = sum(bstat > testvalue) ./ B;

% lower tail is smaller for positive effect. is_lowertail == 1 effects % should be positive. is_lowertail = pct_lowertail < pct_uppertail;

ci = [ci_lower ci_upper];

clear ci for i=1:size(ci_lower, 1) if is_lowertail(i) == 1 ci(i,1) = ci_lower(i,i); ci(i,2) = ci_upper(i,i); else ci(i,1) = ci_lower_n(i,i); ci(i,2) = ci_upper_n(i,i); end end

example data input and output file https://drive.google.com/file/d/1X2iIecCE2WjQpyh2bqz3QmlmjsnT3i-0/view?usp=sharing