Detrending FreeSurfer Data: Difference between revisions
(Created page with "Over the course of a run, there can be a linear drift in the signal in different regions of the brain. There are many possible causes for this that have nothing to do with any...") |
No edit summary |
||
Line 1: | Line 1: | ||
Over the course of a run, there can be a linear drift in the signal in different regions of the brain. There are many possible causes for this that have nothing to do with any interesting aspect of your data -- in other words, this linear drift is a nuisance artifact. The second step is to remove this signal drift from the data because it can introduce spurious correlations between two unrelated time series. You can see this for yourself in a quick experiment you could whip up in Excel: take two vectors of 100 randomly generated numbers (e.g., randbetween(1,99)). They should be uncorrelated. Now add 1, 2, 3, ... , 99, 100 to the values in each vector. This simulates a linear trend in the data. You shouldn't be surprised to find that the two vectors are now highly and positively correlated! | Over the course of a run, there can be a linear drift in the signal in different regions of the brain. There are many possible causes for this that have nothing to do with any interesting aspect of your data -- in other words, this linear drift is a nuisance artifact. The second step is to remove this signal drift from the data because it can introduce spurious correlations between two unrelated time series. You can see this for yourself in a quick experiment you could whip up in Excel: take two vectors of 100 randomly generated numbers (e.g., randbetween(1,99)). They should be uncorrelated. Now add 1, 2, 3, ... , 99, 100 to the values in each vector. This simulates a linear trend in the data. You shouldn't be surprised to find that the two vectors are now highly and positively correlated! | ||
A script has been written called detrend.sh that removes the linear trend in your BOLD data: | |||
==== detrend.sh ==== | |||
#!/bin/bash | |||
USAGE="Usage: detrend.sh filepattern sub1 ... subN" | |||
if [ "$#" == "0" ]; then | |||
echo "$USAGE" | |||
exit 1 | |||
fi | |||
#first parameter is the filepattern for the .nii.gz time series to be detrended, up to the hemisphere indicator | |||
#e.g., fmcpr.sm6.self.?h.nii.gz would use fmcpr.sm6.self as the filepattern | |||
filepat="$1" | |||
shift | |||
#after the shift command, all the arguments are shifted down one place and the first argument (the filepattern) | |||
#falls off the list. The remaining arguments should be subject_ids | |||
subs=( "$@" ); | |||
hemis=( "lh" "rh" ); | |||
for sub in "${subs[@]}"; do | |||
source_dir=${SUBJECTS_DIR}/${sub}/bold | |||
if [ ! -d ${source_dir} ]; then | |||
#The subject_id does not exist | |||
echo "${source_dir} does not exist!" | |||
else | |||
cd ${source_dir} | |||
readarray -t runs < runs | |||
for r in "${runs[@]}"; do | |||
for hemi in "${hemis[@]}"; do | |||
cd ${source_dir}/${r} | |||
pwd | |||
#subject_id does exist. Detrend | |||
mri_glmfit --y ${source_dir}/${r}/${filepat}.${hemi}.nii.gz \ | |||
--glmdir ${source_dir}/${r}/${hemi}.detrend --qa \ | |||
--save-yhat --eres-save --surf ${sub} ${hemi} | |||
mv ${source_dir}/${r}/${hemi}.detrend/eres.mgh \ | |||
${source_dir}/${r}/${filepat}.${hemi}.mgh | |||
done | |||
done | |||
fi | |||
done | |||
Before running this script, you will need to create a text file called 'runs' in the bold/ directory for each subject's dataset, e.g., | |||
*FS_T1_501/ | |||
**bold/ | |||
***runs | |||
***003/ | |||
***004/ | |||
The <code>runs</code> file simply lists each run folder on its own line: | |||
003 | |||
004 | |||
The detrend.sh script uses this file to determine the folders containing the data to be detrended. Assuming all your subject folders have the same run folders to detrend, you would detrend multiple subjects using detrend.sh, specifying a file pattern for the source data (i.e., the name of the preprocessed files generated by FS-FAST, omitting anything after the '?h' hemisphere identifier), followed by a list of subject IDs: | |||
detrend.sh fmcpr.sm6.self FS_T1_501 FS_T2_501 FS_T1_505 FS_T2_505 | |||
The gist is that it calls the mri_glmfit function and saves the residuals after the linear trend has been removed from the data. The detrended data is saved in each run directory as a new file called detrend.''something''.?h.mgh. |
Revision as of 14:47, 4 May 2016
Over the course of a run, there can be a linear drift in the signal in different regions of the brain. There are many possible causes for this that have nothing to do with any interesting aspect of your data -- in other words, this linear drift is a nuisance artifact. The second step is to remove this signal drift from the data because it can introduce spurious correlations between two unrelated time series. You can see this for yourself in a quick experiment you could whip up in Excel: take two vectors of 100 randomly generated numbers (e.g., randbetween(1,99)). They should be uncorrelated. Now add 1, 2, 3, ... , 99, 100 to the values in each vector. This simulates a linear trend in the data. You shouldn't be surprised to find that the two vectors are now highly and positively correlated!
A script has been written called detrend.sh that removes the linear trend in your BOLD data:
detrend.sh
#!/bin/bash USAGE="Usage: detrend.sh filepattern sub1 ... subN" if [ "$#" == "0" ]; then echo "$USAGE" exit 1 fi #first parameter is the filepattern for the .nii.gz time series to be detrended, up to the hemisphere indicator #e.g., fmcpr.sm6.self.?h.nii.gz would use fmcpr.sm6.self as the filepattern filepat="$1" shift #after the shift command, all the arguments are shifted down one place and the first argument (the filepattern) #falls off the list. The remaining arguments should be subject_ids subs=( "$@" ); hemis=( "lh" "rh" ); for sub in "${subs[@]}"; do source_dir=${SUBJECTS_DIR}/${sub}/bold if [ ! -d ${source_dir} ]; then #The subject_id does not exist echo "${source_dir} does not exist!" else cd ${source_dir} readarray -t runs < runs for r in "${runs[@]}"; do for hemi in "${hemis[@]}"; do cd ${source_dir}/${r} pwd #subject_id does exist. Detrend mri_glmfit --y ${source_dir}/${r}/${filepat}.${hemi}.nii.gz \ --glmdir ${source_dir}/${r}/${hemi}.detrend --qa \ --save-yhat --eres-save --surf ${sub} ${hemi} mv ${source_dir}/${r}/${hemi}.detrend/eres.mgh \ ${source_dir}/${r}/${filepat}.${hemi}.mgh done done fi done
Before running this script, you will need to create a text file called 'runs' in the bold/ directory for each subject's dataset, e.g.,
- FS_T1_501/
- bold/
- runs
- 003/
- 004/
- bold/
The runs
file simply lists each run folder on its own line:
003 004
The detrend.sh script uses this file to determine the folders containing the data to be detrended. Assuming all your subject folders have the same run folders to detrend, you would detrend multiple subjects using detrend.sh, specifying a file pattern for the source data (i.e., the name of the preprocessed files generated by FS-FAST, omitting anything after the '?h' hemisphere identifier), followed by a list of subject IDs:
detrend.sh fmcpr.sm6.self FS_T1_501 FS_T2_501 FS_T1_505 FS_T2_505
The gist is that it calls the mri_glmfit function and saves the residuals after the linear trend has been removed from the data. The detrended data is saved in each run directory as a new file called detrend.something.?h.mgh.