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?
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.
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.