3dClustSim for small ROI masks


I’ve read in the 3dclustSim help output the issue that can arise from trying to find a cluster size for a given with small ROI masks, p, alpha combination. I’m wondering though, what AFNI users do to circumvent this issue? In SPM I know pit is typical to apply RFT with a certain z score cut off. But I haven’t been able to find how one might go about that in AFNI. The context of my particular issue is explained below.

I’m using 3dClustSim to ascertain a cluster size threshold when using an ROI mask of 12 ROIs in my resting state connectivity analysis. These are bilateral, and given the homotopic nature of the regions, I treated the bilateral seeds as combined in terms of multiple comparison (thus having 6 total comparisons). A straight Bonferroni correction (with 6 comparisons) would say that anything which passes a p threshold of < 0.008 would be significant. And indeed, if I just 3dmaskave the values from the z transformed connectivity maps and run a simple one sample t test I can find which seeds pass this threshold. But that is ignoring the issue of correlation among regions, which violates an assumption of independence for Bonferroni.

Thanks in advance for the help!

Sam DeWitt

Could you clarify your connectivity analysis a little bit? 1) The correlation is calculated only among those 12 ROIs? Or you perform a seed-based correlation analysis for the whole brain for each seed separately? 2) For each correlation, is it calculated at the voxel level or the ROI level?

Hi Gang, thank you for the response. I calculated the voxel-wise connectivity between a seed region and those 12 ROIs. Voxel-wise based on my understanding of 3dfim+. And Each ROI had 33 voxels, so my 3dclustSim was run on 396 voxels total (12 x 33). The commands I ran are below (in this code, Striatal_Seed_Mask contains the 12 ROIs, left sgACC is the seed).

The 3dClustSim with my ROI mask (396 voxels) generated useful simulations, at the pthr of .005, alpha = 0.05, with a cluster size threshold of 6.4 voxels. However I’ve that more recent 3dClustSim recommendations have been to go with pthr of .001 or lower, and this pthr generated the warning that the simulation was not effective.

Connectivity analysis
3dfim+ input Rest_MNI+tlrc -ort_file WM.1D -ort_file CSF.1D -ideal_file Left_sgACC.1D -out Correllation -mask Striatal_Seed_Mask -bucket Rmap
3dcalc -a Rmap+tlrc -expr ‘log((1+a)/(1-a))/2’ -fscale -prefix “$s”_Zmap

3dClustSim -mask Striatal_Seed_Mask+tlrc -fwhmxyz 6 6 6.

I suppose I can go with the simulation results for pthr of .005, though a cluster threshold of 6.4 seems rather small. Though I suppose when only a total of 396 voxels are being interrogated, it could be deemed reasonable. Thank you for the help!

As a follow up/adjoining question: I was a little perplexed as to the small number of overall voxels being interrogated in my 3dClustSim across all my ROIs. To generate my ROIs I used the draw dataset function in the AFNI gui. I generated a 3D sphere, with a radius of 4mm, linear fill in: A-P, gap: 2mm (my voxel size). However, when I do 3dROIstats, or 3dMaskave even, the number of voxels in each ROI is only 33. By my volume calculations it should be on the level of 267. Is there some internal thresholding that occurs about which I’m forgetting? Thank you!

Maybe you wanted to use the linear fill-in with circles instead of spheres? The linear fill-in assumes an intersection mask. Are you trying to create a cylinder?

Hi, thank you for the response. No I’m attempting a 3D sphere with a radius of 4mm. Trying the 2D circle option with linear fill-in with circles instead of spheres reduced the number of surviving voxels further actually (to 13). The way I’ve drawn this ROI is by taking anatomical mask that has been resampled to the grid/voxel size of my functional images, I’m wondering if there is something off there? I’ve tried using 3dresample and 3dFractionize options with both resulting in that same #voxels surviving, 33. Oddly, even when I change the clip level in 3dfractionize, from very high to very low( 0.08 to 0.2) the number of voxels which survive is the same.

I also tried just going back and having the ROI mask in the same orientation has my functional, but at the higher. original anatomical voxel resolution (which I know is incorrect), just to check if there was something that when awry there, but doing so still gives me the same surviving 33 voxels. Finally tried bypassing that process altogether and using the 3dcalc function with an anatomical mask resampled to match my functional data (as shown below) to generate a 3D sphere ROI (with Radius 4mm at coordinates 8 8 8) and still only had 36 voxels survive. This is across several participants. I appreciate the help!

3dcalc -a anat+tlrc. -expr 'step(16-(x-8)(x-8)-(y-8)(y-8)-(z-8)*(z-8)) -prefix ball

You don’t need a linear fill-in to put spheres in a dataset. The 3dcalc command should work too. Another way is to use 3dUndump with the -srad option. See slide 30 from the class ROI handout.


The number of voxels you get depends on the size of the voxels, of course. So a coarser grid with larger voxels will have fewer voxels. All these sphere making solutions all rely on the center of the voxel to determine whether that voxel should be included.

Thank you for the responses! My confusion ended up being related to the coarseness of my grid. I did have a follow up related questions however.

  1. What exactly dictates the percentage of voxels from a mask out of total voxels which are used for the simulation in 3dClustSim? I ask because typically I use an mean anatomical mask, the same used in 3dfim+ when generating my zmasks, which has been resampled to the grid of my functional data (anatomical and functional are co-registered, and 3dfim+ to generate zmaps is done post-normalization to MNI space). the smoothness entered into 3dClustSim here is an average across all participants, extracted from their residual images. Vastly different percentages of voxels are entered into the simulation based on if I use 1. the mean anatomical mask resampled (roughly 20% of total) 2. an automask from the functional image generated from 3dAutomask (roughly 50%) or 3. if I were to run the functional image itself through the simulation (roughly 85%). The results cluster threshold results do not differ greatly however (no more than 7 voxels of difference). I assume this is related to the fact that the simulation is run based on simulation of noise, but If someone could explain to me a bit about what determines the number of voxels included, even from masks which are of the same grid, I would appreciate it!