Amplitude Modulation: De-meaning, X.xmat.1D output, low variability

Hi AFNI experts,

I really appreciate all your help as I move through amplitude modulation in AFNI! I have successfully (yay!) run individual level analyses for my participants, and am looking at the output to ensure I both understand it and have done analyses correctly. For a little more context, I have pasted a portion of my AFNI proc script below and denoted which events are amplitude modulated by a behavioral response (ranging from 1-5):

-regress_stim_labels Class
Ant.Mean (AM)
FB.Mean (AM)
Resp.Mean (AM)
Ant.Nice (AM)
FB.Nice (AM)
Resp.Nice (AM)
Ant.UnpMean (AM)
FB.UnpMean (AM)
Resp.UnpMean (AM)
Ant.UnpNice (AM)
FB.UnpNice (AM)
Resp.UnpNice (AM)
-regress_stim_types ‘AM2’
-regress_basis_multi ‘dmBLOCK(1)’
-regress_make_ideal_sum IDEAL_sum.1D
-regress_motion_file $topdir/derivatives/afni/confounds/sub-${subj}/sub-${subj}_task-seat_allruns_motion.1D
-regress_extra_ortvec $topdir/derivatives/afni/confounds/sub-${subj}/sub-${subj}_task-seat_allruns_aCompCor6.1D
-regress_extra_ortvec_labels aCompcor6 cosine fd

Looking at output has brought up 3 questions:

  1. In examining the X.xmat.1D file, it has the following headers. I just want to confirm my understanding that index 11 for example, is the signal for my Ant.Mean event, modulated by the behavioral response (1-5) after it has been de-meaned WITHIN that condition.

index 0, group -1 , label Run#1Pol#0
index 1, group -1 , label Run#1Pol#1
index 2, group -1 , label Run#1Pol#2
index 3, group -1 , label Run#2Pol#0
index 4, group -1 , label Run#2Pol#1
index 5, group -1 , label Run#2Pol#2
index 6, group -1 , label Run#3Pol#0
index 7, group -1 , label Run#3Pol#1
index 8, group -1 , label Run#3Pol#2
index 9, group 1 , label Class#0
index 10, group 2 , label Ant.Mean#0
index 11, group 2 , label Ant.Mean#1
index 12, group 3 , label FB.Mean#0
index 13, group 3 , label FB.Mean#1
index 14, group 4 , label Resp.Mean#0
index 15, group 4 , label Resp.Mean#1
index 16, group 5 , label Ant.Nice#0
index 17, group 5 , label Ant.Nice#1
index 18, group 6 , label FB.Nice#0
index 19, group 6 , label FB.Nice#1
index 20, group 7 , label Resp.Nice#0
index 21, group 7 , label Resp.Nice#1
index 22, group 8 , label Ant.UnpMean#0
index 23, group 8 , label Ant.UnpMean#1
index 24, group 9 , label FB.UnpMean#0
index 25, group 9 , label FB.UnpMean#1
index 26, group 10 , label Resp.UnpMean#0
index 27, group 10 , label Resp.UnpMean#1
index 28, group 11 , label Ant.UnpNice#0
index 29, group 11 , label Ant.UnpNice#1
index 30, group 12 , label FB.UnpNice#0
index 31, group 12 , label FB.UnpNice#1
index 32, group 13 , label Resp.UnpNice#0
index 33, group 13 , label Resp.UnpNice#1
index 34, group 14 , label Missing#0
index 35, group 0 , label aCompcor6[0]#0
index 36, group 0 , label aCompcor6[1]#0
index 37, group 0 , label aCompcor6[2]#0
index 38, group 0 , label aCompcor6[3]#0
index 39, group 0 , label aCompcor6[4]#0
index 40, group 0 , label aCompcor6[5]#0
index 41, group 0 , label cosine[0]#0
index 42, group 0 , label cosine[1]#0
index 43, group 0 , label cosine[2]#0
index 44, group 0 , label fd[0]#0
index 45, group 0 , label mot_demean_r01[0]#0
index 46, group 0 , label mot_demean_r01[1]#0
index 47, group 0 , label mot_demean_r01[2]#0
index 48, group 0 , label mot_demean_r01[3]#0
index 49, group 0 , label mot_demean_r01[4]#0
index 50, group 0 , label mot_demean_r01[5]#0
index 51, group 0 , label mot_demean_r02[0]#0
index 52, group 0 , label mot_demean_r02[1]#0
index 53, group 0 , label mot_demean_r02[2]#0
index 54, group 0 , label mot_demean_r02[3]#0
index 55, group 0 , label mot_demean_r02[4]#0
index 56, group 0 , label mot_demean_r02[5]#0
index 57, group 0 , label mot_demean_r03[0]#0
index 58, group 0 , label mot_demean_r03[1]#0
index 59, group 0 , label mot_demean_r03[2]#0
index 60, group 0 , label mot_demean_r03[3]#0
index 61, group 0 , label mot_demean_r03[4]#0
index 62, group 0 , label mot_demean_r03[5]#0

  1. this brings me to my second question, I read somewhere in the annals of the internet that when you want to compare conditions (let’s say Ant.Mean - Ant.Nice) on the group-level, you may need to adjust the way in which your AM events on the individual level are being de-meaned. Specifically, since currently each AM event is being demeaned within each condition, for each person individually, you’d instead want to manually calculate the overall mean across subjects and runs, and manually apply that as the mean in your individual analyses instead. Is this true?

  2. Some of my participants have low variability in behavioral responses across a condition. For example, they always respond “1” when the range is 1-5. My advisor and I were wondering if this is a problem for amplitude modulation analyses? Essentially, do subjects without variability need to be excluded?


Hi Megan,

Regarding point 0 (which you did not make, but I am bringing up :), I just noticed that you are using dmBLOCK(1), rather than dmBLOCK, say.

That is something that is only vary rarely done. Generally, we expect the stimulus response to a longer event to convolve into a larger BOLD response, due only to the longer stimulus, while at the same level of basic neuro activity, say.

Given that, we generally recommend using dmBLOCK, dmUBLOCK, or perhaps dmUBLOCK(p), with p < 0 such that |p| is a typical or average response duration (probably across subjects). For example if most subjects responses are around 5s, use dmBLOCK(-5).

  1. That is correct. The mean response is in beta #0, and (de-meaned) modulators are in order after that.

  2. For this, it might be better to know what Gang has to say.
    But yes, that seems correct. Let’s say there are 2 subjects that have identical response to the modulation aspects, but one has a modulator mean that is much larger than the other. In such a case, we might expect the mean response to be larger, based on only on the additional modulation aspect. But the difference would then be seen in the main response term, which might not be appropriate.

For such a case, it makes sense to equate the means of the modulators across subjects, and apply AFNI_3dDeconvolve_rawAM2=YES.

  1. If there is zero variability in the modulator, either the modulation regressor will de-mean to all zero (or worse, some tiny non-zero values), or if AFNI_3dDeconvolve_rawAM2=YES is used, it will end up being perfectly collinear with the main class regressor. If it ends up being exactly zero, that would be preferable (though it would lead to more GOFORIT warnings, and that subject should be omitted from group tests with the modulator).

If it ends up almost zero, they could end up with a large, nonsensical beta.
And if AFNI_3dDeconvolve_rawAM2=YES is applied, it will end up affecting the main response term.

Given all of this, both the main beta and the modulated one might then be questionable for such a subject. So it might indeed be reasonable to drop them from corresponding group tests.

  • rick

Hi Rick,

Thank you so much for the input! I’m going to digest this, and consult with my advisor. I’ll let you know if I have any further questions after that. Thank you again!