Recent participants have gotten me thinking (yet again) about the different types of motion during fMRI; causes and consequences. And more immediately practical: which motion censoring thresholds might be reasonable for particular tasks and analyses.
I've long used (and recommended) FD > 0.9 as a censoring threshold for our event-related task fMRI studies (not functional correlation or resting state-type analyses). 0.9 is more lenient than many use for task fMRI; e.g., Siegel 2014: advise 0.5 FD for adults (which we have), 0.9 for kids or clinical populations. (I need to update a previous post; I'd misread Siegel's recommendations.)
Consider the following motion plot of a run from a recent participant, using my usual conventions (grey lines at one-minute intervals, frames along the x-axis); see this QC demonstration paper, the DMCC55B dataset descriptor, etc. for more explanation (and code). The lower panel shows FD, with the red line at the FD 0.9 censoring threshold, and red x marking censored frames; the grey horizontal line is at FD 0.5.
Contrast the above plot with the following (marked with a 2 in the upper left); the same task, scanner, etc., but a different participant:
I'd characterize plot 2 as having more pronounced overt than apparent motion; there are oscillations in the trans_y, but these are dwarfed by the head motions, e.g., in the middle of the first minute. Looking at the censoring, 13 frames (corresponding to the largest overt head motions) are marked for censoring with FD 0.9; 40 are marked with FD 0.5, corresponding to more of the overt head motions. 40/562 = 0.07, well under the 20% censoring dropping threshold.
musings
To my eye, the 0.5 FD threshold is pretty reasonable in the second case, since it censors more of the overt head motion irregularities, and only those spikes. But for the first plot the 0.5 FD threshold seems far too aggressive: censoring part of every few breaths, 23% of the total frames. What do you think?
I hope to do some proper analyses of the impact of different amounts of apparent vs. overt motion on statistical analyses, but it is not a trivial problem, particularly with task entrainment. (Synchronizing breathing to task timing.)
As a final bit of food for thought, here are the tSNR and sd images for each of the two runs, without censoring (all 562 frames), after preprocessing, and with the same color scaling. The first strikes me as higher quality, despite the greater (> 0.5 FD) censoring. I believe apparent motion could have less of an impact on image quality than overt because the head is not actually moving, and so not creating the attendant magnetic disruptions; the differences are clear to the eye when viewing these types of runs as movies, but it's not clear how those differences translate to statistical analyses.
If I understand FD properly, it's only using the three translations and not the rotations at all. This means it will capture the apparent motions which are almost all translation, whereas the three rotations seem to capture the true head motion and ignore the apparent motion. What about calculating only the (absolute) framewise rotations and using that index for setting the scrubbing criteria?
ReplyDeleteI think I'd compute just the absolute mean rotation in degrees and not bother to convert to mm using an assumed sphere, as for FD, and see if it's feasible to set a new threshold for scrubbing based only on average framewise rotation.
ReplyDeleteBtw, rotation was shown to dominate translation in high motion pediatric subjects in 10.1371/journal.pone.0265112. See Fig 3. Perhaps it really is time to use rotations only for real motion evals.
The FD calculation does include all six, both translations and rotations; demo (R, fmriprep derivatives) code follows.
DeleteThat said, I'm not particularly fond of FD; it's the convention, but I don't like the spherical assumption, nor how (as you're mentioning) the single FD timecourse makes it impossible to distinguish the comparative influence of the different sources of translation/rotation.
I've never experimented with using only rotation for censoring, but that's an intriguing idea.
in.tbl <- read.delim("d:/temp/sub-3_desc-confounds_timeseries.tsv", na.strings="n/a");
Dtrans <- cbind(c(0,diff(in.tbl$trans_x)), c(0,diff(in.tbl$trans_y)), c(0,diff(in.tbl$trans_z))); # diff of translations
Drot <- cbind(c(0,diff(in.tbl$rot_x)), c(0,diff(in.tbl$rot_y)), c(0,diff(in.tbl$rot_z))); # diff of rotations
Drot <- Drot * 50; # Drot units in fmriprep are already radians, so just multiply
D <- cbind(Dtrans, Drot);
fd.vec <- apply(abs(D),1,sum);
fd.vec[1:10]
# [1] 0.00000000 0.20383965 0.25367230 0.30234395 0.30884645 0.05154090 0.08638755 0.03775790 0.11892570 0.07067655
in.tbl$framewise_displacement[1:10]
# [1] NA 0.20383965 0.25367230 0.30234395 0.30884645 0.05154090 0.08638755 0.03775790 0.11892570 0.07067655
all.equal(fd.vec[2:length(fd.vec)], in.tbl$framewise_displacement[2:nrow(in.tbl)])
# [1] TRUE