Hi All,
I am a research assistant charged with incorporating ICA-AROMA outputs into our analysis pipeline. We’ve just completed running fmirprep with version 20.
I’ve been looking over threads in NeuroStars such as @rastko’s comments here and here (since he is apparently a leader in denoising), other threads here and here, and some linked notebooks and github issues, but I’m still struggling to wrap my head around what to do. Our original pipeline uses the original preprocessed outputs (e.g. sub-s001_ses-1_task-stop_run-1_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
, and to add in confounds following this function:
def process_confounds(confounds_file, a_comp_cor=True):
"""
scrubbing for TASK
remove TRs where FD>.5, stdDVARS (that relates to DVARS>.5)
regressors to use
['X','Y','Z','RotX','RotY','RotY','<-firsttemporalderivative','stdDVARs','FD']
junk regressor: errors, ommissions, maybe very fast RTs (less than 50 ms)
"""
confounds_df = pd.read_csv(confounds_file, sep = '\t',
na_values=['n/a']).fillna(0)
excessive_movement = (confounds_df.framewise_displacement>.5) & \
(confounds_df.std_dvars>1.2)
excessive_movement_TRs = excessive_movement[excessive_movement].index
excessive_movement_regressors = np.zeros([confounds_df.shape[0],
np.sum(excessive_movement)])
for i,TR in enumerate(excessive_movement_TRs):
excessive_movement_regressors[TR,i] = 1
excessive_movement_regressor_names = ['rejectTR_%d' % TR for TR in
excessive_movement_TRs]
# get movement regressors
movement_regressor_names = ['trans_x','trans_y','trans_z','rot_x','rot_y','rot_z']
movement_regressors = confounds_df.loc[:,movement_regressor_names]
movement_regressor_names += [i+'td' for i in movement_regressor_names]
movement_regressors = np.hstack((movement_regressors, np.gradient(movement_regressors,axis=0)))
# add square
movement_regressor_names += [i+'_sq' for i in movement_regressor_names]
movement_regressors = np.hstack((movement_regressors, movement_regressors**2))
# add additional relevant regressors
add_regressor_names = ['framewise_displacement']
if a_comp_cor:
add_regressor_names += [i for i in confounds_df.columns if 'a_comp_cor' in i][:8]
additional_regressors = confounds_df.loc[:,add_regressor_names].values
regressors = np.hstack((movement_regressors,
additional_regressors,
excessive_movement_regressors))
# concatenate regressor names
regressor_names = movement_regressor_names + add_regressor_names + \
excessive_movement_regressor_names
return regressors, regressor_names
As I understand it, there are two main options for incorporating ICA aroma outputs.
- sub out
sub-s001_ses-1_task-stop_run-1_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
forsub-s001_ses-1_task-stop_run-1_space-MNI152NLin6Asym_desc-smoothAROMAnonaggr_bold.nii.gz
- add the first n components of
sub-s001_ses-1_task-stop_run-1_AROMAnoiseICs.csv
to our confounds matrix (guidance welcome on the number of components, preliminary skimmings suggest 100-150)
It seems like in both cases, dropping the realignment parameters is recommended.Are these two options correct interpretations of the forums? One thing that has made me nervous is Alex Fornito’s comment that AROMA doesn’t jive with multiband sequences, which we did use to collect the data.
Any guidance would be incredibly appreciated. Thanks in advance for your time and your patience.
Sincerely
Henry