Sanity check NiMARE analysis ALE

Hi Ray,

The ALESubtraction should return a p_desc-group1MinusGroup2 map along with the z-statistic map. However, those p- and z-values are not corrected for multiple comparisons. I assume that is your concern?

Unfortunately, there’s no solid multiple comparisons correction approach for the ALE subtraction analysis, at the moment. Although, to be fair, the standard ALE subtraction analysis doesn’t include multiple comparisons correction either, but it does take steps that help reduce likely false positives.

In the standard ALE subtraction analysis, they limit the analysis to voxels that are significant in the main effects analyses. I.e., for the contrast of Dataset A > Dataset B, only look at voxels that are significant in a standard ALE meta-analysis of Dataset A, and vice versa. Other than that difference, NiMARE’s approach and the standard approach should be equivalent.

If you want to replicate that approach, you can run an ALE + multiple comparisons correction on each of the individual Datasets, and then mask the subtraction results with those. Below is some (untested) code that should roughly accomplish that.

# First, run the subtraction
sub = nimare.meta.cbma.ale.ALESubtraction(n_iters=10000)
res_sub = sub.fit(dset1, dset2)

# Next, run ALEs on the two different Datasets
ale = nimare.meta.cbma.ale.ALE(null_method="approximate")
res1 = ale.fit(dset1)
res2 = ale.fit(dset2)

# Apply multiple comparisons correction to the ALEs
corr = FWECorrector(method="montecarlo", voxel_thresh=0.001, n_iters=10000)
cres1 = corr.transform(res1)
cres2 = corr.transform(res2)

# Get the maps you need
img_sub = res_sub.get_map("z_desc-group1MinusGroup2")
img1 = cres1.get_map("z_level-cluster_corr-FWE_method-montecarlo")
img2 = cres2.get_map("z_level-cluster_corr-FWE_method-montecarlo")

# Threshold and binarize the ALE maps
from nilearn import image
img1_bin = image.math_img("img > 1.65", img=img1)
img2_bin = image.math_img("img > 1.65", img=img2)

# Limit subtraction to significant voxels from original meta-analyses
# NOTE: This is a simplification by combining the two comparisons, but I think it's fine.

# Create combined ALE mask
import numpy as np
ale_mask = image.math_img("np.maximum(img1, img2)", img1=img1_bin, img2=img2_bin)

# Now limit those voxels
img_sub = image.math_img("subtraction * mask", subtraction=img_sub, mask=ale_mask)

I hope that helps.

Best,
Taylor