Create null models for volumetric, parcellated, subcortical/cortical statistical image

I would like to create surrogate maps for my statistical image. The image is volumetric, parcellated, and contains both cortical and subcortical structures. Can anyone recommend toolboxes that can handle these specific properties?

Hi @JohannesWiesner,

I am not sure what you mean by surrogate maps, but recently spin tests have been proposed for null models of brain maps. https://www.sciencedirect.com/science/article/pii/S1053811918304968?casa_token=MZZE5O6D60EAAAAA:PF8hmNzvXOqOb7yS4Htu5COO2qxxwqiQZaGYJ2Shf6qHt87WVAoEZl2ZQv4aAvyyZmHLYQtwYIiK and see this toolbox: GitHub - netneurolab/neuromaps: A toolbox for comparing brain maps

Best,
Steven

1 Like

@Steven: Thanks for the hint! I was able to use neuromaps.nulls.burt2020 to generate null-models based on my statistical image. This is one of the available functions when dealing with volumetric (and parcellated) data (not sure if it can handle subcortical data, but I don’t see why this should be a problem, since we are in volumetric space anyways?). This function is supposed to return a:

Generated null distribution, where each column represents a unique null map

The function does return a matrix (takes very long, as described in the docs) but my intuitive expectation was that each column would have the same values as my input array just in different order? That would be my naive idea of what spatial permutation means? We “shuffle” the data but keep the spatial autocorrelation?

Maybe @rmarkello has an answer?

Here’s code to reproduce the analysis:

from neuromaps.nulls import burt2020
import numpy as np
from nilearn.image import load_img
from nilearn.plotting import plot_stat_map,plot_roi

# load the values from our statistical image. This is a vector with T-values
# for our 376 regions (360 cortical, 16 subcortical). Note, this image is
# also available as nifti-file (t_stat_img.nii) but burt202 wants to have an array as soon
# as you provide an atlas image
t_stats = np.load('t_stats.npy')

# load the corresponding atlas image. This image has 376 unique values (0
# represents background). Corresponding contral-lateral parcels (e.g. left V1,
# right V2, have different values)
atlas_img = load_img('glasser_tian.nii.gz')

# we can plot our atlas and our statistical image
t_stats_img = load_img('t_stats_img.nii')
plot_stat_map(t_stats_img,cut_coords=(0,0,0),draw_cross=False)
plot_roi(atlas_img,cut_coords=(0,0,0),draw_cross=False)

# and we can check that resolution is right
print(t_stats_img.header.get_zooms())
print(atlas_img.header.get_zooms())

# generate surrogate maps (just 2 for as a test). This can take very long!
# Would recommend to let this run overnight
nulls = burt2020(data=t_stats,atlas='mni152',density='1mm',parcellation=atlas_img,n_perm=2,n_proc=20)

# Expectation would be that each column of nulls contains the same values
# as t_stats, just in different order? 

and here’s the input data:

https://drive.google.com/drive/folders/1A-eQY8KTARSeq3DgavB7PrI1V9yXHoa5?usp=sharing