NiMARE ALE FWECorrector voxel threshold

I’m using NiMARE version 0.0.12 to perform an ALE meta-analysis on the NeuroSynth database, with the following code:

# Select appropriate NeuroSynth dataset
neurosynth_dset = nimare.dataset.Dataset.load("neurosynth_dataset_vocab-LDA200_with_abstracts.pkl.gz".format(style))

# Select NeuroSynth dataset study IDs with relevant feature information
meta_ids = neurosynth_dset.get_studies_by_label(labels=feature,label_threshold=0.001)

# Compile study IDs with feature into dataset for meta-analysis
meta_ids = sorted(meta_ids)
meta_neurosynth_dset = neurosynth_dset.slice(meta_ids)

# Construct ALE meta-analysis model
# Set sample size for each study in dataset to 20. NiMARE doesn't have this information, so make educated guess
meta_estimator = nimare.meta.cbma.ale.ALE(null_method="approximate", kernel__sample_size=20)
meta_results = meta_estimator.fit(meta_neurosynth_dset)

# Perform multiple comparisions correction
mc_corrector = nimare.correct.FWECorrector(method="montecarlo", voxel_thresh=0.00005, n_iters=1000, n_cores=4)
mc_results = mc_corrector.transform(meta_results)

# Save statistical maps
mc_results.save_maps(output_dir="{}/{}/{}".format(output_dir, analysis, style), prefix="term-threat_LDA200_mc")

# Get FWE-corrected z-statistics
z_corr_img = mc_results.get_map("z_desc-size_level-cluster_corr-FWE_method-montecarlo")

# Report standard cluster table for the meta-analysis map, using a threshold of p<0.05
cluster_table = nilearn.reporting.get_clusters_table(z_corr_img, stat_threshold=1.65, cluster_threshold=10)

My question pertains to the voxel_thresh parameter in the FWECorrector class. I’ve set a stringent threshold equivalent to a z-score of ~ 4 (two-tailed). However, when I visualize the results in some viewer (e.g., FSLeyes) the z-threshold is 3.1. I was expecting a z-threshold of ~4, so I was wondering if there’s an error in my code that’s causing this?

Thanks for the assistance.

Your code looks fine at a glance (although that threshold is really stringent, and I’d recommend >=10k iterations for a pub-quality meta-analysis, rather than 1k). The thing I’m confused about is this:

I’m not sure what you mean by this. I don’t use FSLeyes much, so I’m not sure what the z-threshold you’re talking about is. Is it something you set, or does FSLeyes infer it from the thresholded map somehow?

I should have clarified, this is threshold I can adjust in FSLeyes. I wanted to be additionally stringent with my FWER, hence why I choose such a small voxel_thresh. The issue might be better explained when I plot it (in nilearn, image attached). My expectation was that the colorbar scale would increase to 4, given the threshold I set, but this doesn’t seem to be the case.
NiMARE_ALE

Thanks for this recommendation!

Ah, I see. The cluster-level corrected maps have a single FWE-corrected p-value associated with each cluster that survives the cluster-defining threshold. In a sense, that map is unthresholded, so what you need to do when visualizing or interpreting it is threshold it at your desired cluster-level p-value (e.g., p < 0.05), rather than your cluster-defining threshold (p < 0.000005).

By this are you referring to the threshold set when plotting it (in this case, with nilearn.plotting.plot_stat_map), or the voxel_thresh parameter in FWECorrector? The image I use for visualization is the z_desc-size_level-cluster_corr-FWE_method-montecarlo.nii.gz output from the transform step.

I’m referring to the threshold you should use in plot_stat_map. The values in z_desc-size_level-cluster_corr-FWE_method-montecarlo reflect the cluster-level FWE-corrected statistical significance, and that map is unthresholded (meaning that there will likely be clusters that are non-significant), so you need to use your desired FWE-corrected threshold when visualizing the map.

That makes sense now, thanks for the clarification.

1 Like