Questions about cluster-level FWE results and Jackknife outputs in NiMARE 0.2.0 ALE meta-analysis

Hi Professor,

I am using NiMARE 0.2.0 to perform an ALE meta-analysis, and I have a few questions about the outputs after cluster-level FWE correction and the subsequent Jackknife analysis.

My workflow is:

my_ale = ALE(
    kernel_transformer=ALEKernel,
    null_method="approximate",
    n_iters=5000,
    n_cores=4,
)

my_results_ale = my_ale.fit(my_dset)

my_corrector = FWECorrector(
    method="montecarlo",
    voxel_thresh=0.001,
    n_iters=5000,
    n_cores=4,
)

my_results_fwe = my_corrector.transform(my_results_ale)

my_jackknife = Jackknife(
    target_image="z_desc-size_level-cluster_corr-FWE_method-montecarlo",
    n_cores=4,
)

my_results_jk = my_jackknife.transform(copy.deepcopy(my_results_fwe))

The corrected maps are successfully generated:

my_results_fwe.maps.keys()

returns

dict_keys([
    'stat',
    'p',
    'z',
    'logp_level-voxel_corr-FWE_method-montecarlo',
    'z_level-voxel_corr-FWE_method-montecarlo',
    'logp_desc-size_level-cluster_corr-FWE_method-montecarlo',
    'z_desc-size_level-cluster_corr-FWE_method-montecarlo',
    'logp_desc-mass_level-cluster_corr-FWE_method-montecarlo',
    'z_desc-mass_level-cluster_corr-FWE_method-montecarlo'
])

However,

my_results_fwe.tables.keys()

returns

dict_keys([])

while the Jackknife results do contain tables (e.g., ..._tab-clust and ..._diag-Jackknife_tab-counts_tail-positive).

I have three questions.

1. Where is the cluster-level FWE threshold (e.g., α = 0.05) specified?

In my code I explicitly set

voxel_thresh = 0.001

which I understand is the cluster-forming threshold.

However, I cannot find where the cluster-level FWE significance threshold (typically p < 0.05) is specified or stored in NiMARE 0.2.0. Is it fixed internally by FWECorrector(method="montecarlo"), or is there another parameter or output that records it?


2. Why does FWECorrector produce corrected maps but no cluster table?

After FWE correction I obtain the corrected statistical maps, but no cluster summary table.

In GingerALE, after cluster-level FWE correction I would normally obtain a table containing information such as:

  • Cluster ID

  • Peak coordinates

  • Peak ALE value

  • Peak Z statistic

  • Cluster size

In NiMARE 0.2.0, my_results_fwe.tables is empty.

Is this expected behavior?

If so, what is the recommended way to obtain the “main” cluster table corresponding to the FWE-corrected ALE results? Is using nilearn.reporting.get_clusters_table()?(I saw this in another question post) or is there another NiMARE function that should be used?


3. What is the relationship between the FWE-corrected results and the Jackknife results?

According to the tutorial, after running Jackknife I obtain:

  • a cluster table (..._tab-clust)

  • a study-contribution table (..._diag-Jackknife_tab-counts_tail-positive)

I am trying to understand how these relate to the original FWE-corrected ALE table results (if I can get cluster table in the second question)

Specifically:

  • Does the Jackknife cluster table represent the same clusters as the FWE-corrected ALE analysis, or are they different objects?

  • If I am writing a manuscript, which table should be reported as the main ALE results?

Any clarification about the intended workflow for NiMARE 0.2.0 would be greatly appreciated.

Thank you very much for your help!

The maps produced by the FWECorrector are not cluster-extent thresholded. The level-cluster maps have been thresholded with the cluster-defining threshold, but every cluster that survives that initial threshold is retained with its corresponding statistic in the output map.

It is up to you to threshold the corrected results with a cluster-level threshold of your choice, after running the FWECorrector.

You can use nilearn.reporting.get_clusters_table for that.

This is determined by which map you specify (target_image) in the Jackknife. In your case, you passed in the cluster-level FWE-corrected map, so the cluster table will describe clusters from that map.

I would report the cluster table as the main ALE results, though you should filter it for cluster-level significance (p < 0.05 in your post).

Thank you very much for your explanation. I have tried using nilearn.reporting.get_clusters_table() to extract the cluster information after cluster-level FWE correction.

However, I noticed a potential issue when interpreting the reported coordinates. According to the documentation of get_clusters_table(), it states:

“For binary clusters (clusters comprised of only one value), the table reports the center of mass of the cluster, rather than any peaks/subpeaks.”

This seems to apply to my case because the thresholded cluster-level FWE map contains clusters with identical voxel values. I further verified this by checking the corresponding coordinates in the original ALE stat map. The ALE values at the reported coordinates are not the maximum ALE values within the corresponding clusters, possibly suggesting that these coordinates represent the cluster center of mass rather than the actual peak coordinates.(I am not very sure and please correct my guess if I am wrong)

Therefore, I would like to ask:

How can I obtain the true peak/subpeak coordinates from the maps generated by FWECorrector in NiMARE, rather than the center of mass of the significant clusters?

More specifically, is there a recommended workflow or function to extract peak/subpeak information (e.g., peak MNI coordinates and corresponding statistics) directly from the FWE-corrected maps, such as:

  • peak/subpeak MNI coordinates,

  • corresponding ALE values from the original ALE stat map,

  • corresponding z values,

  • and FWE-corrected p values?

I would like to generate a cluster table similar to GingerALE output, where each significant cluster is represented by its peak/subpeak locations rather than the cluster center of mass.

I prefer Nimare~, because it is very fast and provides Jackknife analysis which is not available in GingerALE GUI

How can I obtain the true peak/subpeak coordinates from the maps generated by FWECorrector in NiMARE, rather than the center of mass of the significant clusters?

To do this you would binarize the cluster corrected map at the threshold you desire and multiply it with the z map, I’ll open an issue on NiMARE so that tables are generated this way by default.

Best,

James

EDIT: pull request opened: [FIX] table generation with cluster corrected images in Jackknife and focuscounter by jdkent · Pull Request #1087 · neurostuff/NiMARE · GitHub

Since the cluser-extent thresholding uses clusters as the level of inference, I think it would be inappropriate to report peak values/coordinates within the cluster.

Thank you very much for your suggestions. I really appreciate your help.

I will try what you described.

If I run into any further questions while working through it, would it be okay if I asked you for more guidance here?

Thanks again!

Thank you very much!

you’re right Taylor, using the table as a method of inference is invalid, I was thinking purely from a descriptive perspective, but that would be difficult for to differentiate what was inferentially valid versus what is descriptive, and how to properly frame that in a discussion.

@ranwei0924blcu If you want to stick with what’s inferentially valid, you have two options:

  1. use the cluster level corrected maps and report only the center of mass.

  2. use the voxel level corrected maps and report the center of mass/and significant peaks (the drawback being that this map is a rather stringent correction)

I see with how the GingerALE cli is designed (https://www.brainmap.org/ale/cli.html), it does not appear that the getclusterstats differentiates whether the results were obtained from voxel level corrected statistics versus cluster level corrected statistics. This could lead to confusion since the voxel level correction, one can report the “significant peaks” from the cluster analysis as valid inferential outputs, but the cluster-level correction, any significant peaks would need to be interpreted as descriptive, not inferential.

I personally want to be able to be able to support descriptive statistics (I should write more about why I support this), but I do want to do it in a clear, unambiguous way that is easily reportable.

Best,

James