3dDeconvolve -nodata Matrix inverse average error

Hi all-
I'm modifying a task and trying to evaluate the design using 3dDeconvolve -nodata.

Each block of the task consists of a combination of three different conditions and there are four variants of each condition (64 possible combinations, each possible combination appears once). I'd like to run a model looking at each of the 12 possible variants (each variant appears 16 times). Given the complexity of the task there is bound to be some degree of collinearity, but I'm wondering if there is too much collinearity.

I get "++ VERY GOOD ++" for all of the matrix conditions, but I am seeing a "** BEWARE **" Matrix inverse average error and very large norm. std. dev. values (in the thousands [see below]). I've played around with some of the task parameters, increasing the number of runs, varying the ITIs, etc., but I still get similar results. Is this design/analysis plan acceptable? How concerned should I be with the matrix inverse average error and norm std dev values?

3dDeconvolve command

3dDeconvolve -nodata 1840 1 \
-concat '1D: 0 460 920 1380' \
-num_stimts 12 \
-stim_times 1 all_both.1D 'BLOCK(20,1)' \
-stim_times 2 all_notboth.1D 'BLOCK(20,1)' \
-stim_times 3 all_either.1D 'BLOCK(20,1)' \
-stim_times 4 all_neither.1D 'BLOCK(20,1)' \
-stim_times 5 all_red.1D 'BLOCK(20,1)' \
-stim_times 6 all_vert.1D 'BLOCK(20,1)' \
-stim_times 7 all_high.1D 'BLOCK(20,1)' \
-stim_times 8 all_constant.1D 'BLOCK(20,1)' \
-stim_times 9 all_li.1D 'BLOCK(20,1)' \
-stim_times 10 all_lm.1D 'BLOCK(20,1)' \
-stim_times 11 all_ri.1D 'BLOCK(20,1)' \
-stim_times 12 all_rm.1D 'BLOCK(20,1)' \
-xjpeg nodata -polort A

The output

*+ WARNING: no -stim_label given for stim #1 ==> label = 'Stim#1'
*+ WARNING: no -stim_label given for stim #2 ==> label = 'Stim#2'
*+ WARNING: no -stim_label given for stim #3 ==> label = 'Stim#3'
*+ WARNING: no -stim_label given for stim #4 ==> label = 'Stim#4'
*+ WARNING: no -stim_label given for stim #5 ==> label = 'Stim#5'
*+ WARNING: no -stim_label given for stim #6 ==> label = 'Stim#6'
*+ WARNING: no -stim_label given for stim #7 ==> label = 'Stim#7'
*+ WARNING: no -stim_label given for stim #8 ==> label = 'Stim#8'
*+ WARNING: no -stim_label given for stim #9 ==> label = 'Stim#9'
*+ WARNING: no -stim_label given for stim #10 ==> label = 'Stim#10'
*+ WARNING: no -stim_label given for stim #11 ==> label = 'Stim#11'
*+ WARNING: no -stim_label given for stim #12 ==> label = 'Stim#12'
++ 3dDeconvolve: AFNI version=AFNI_24.2.01 (Jul 16 2024) [64-bit]
++ Authored by: B. Douglas Ward, et al.
++ using TR=1 seconds for -stim_times and -nodata
++ using NT=1840 time points for -nodata
++ Imaging duration=460.0 s; Automatic polort=4
++ -stim_times using TR=1 s for stimulus timing conversion
++ -stim_times using TR=1 s for any -iresp output datasets
++ [you can alter the -iresp TR via the -TR_times option]
++ ** -stim_times NOTE ** guessing GLOBAL times if 1 time per line; LOCAL otherwise
++ ** GUESSED ** -stim_times 1 using LOCAL times
++ ** GUESSED ** -stim_times 2 using LOCAL times
++ ** GUESSED ** -stim_times 3 using LOCAL times
++ ** GUESSED ** -stim_times 4 using LOCAL times
++ ** GUESSED ** -stim_times 5 using LOCAL times
++ ** GUESSED ** -stim_times 6 using LOCAL times
++ ** GUESSED ** -stim_times 7 using LOCAL times
++ ** GUESSED ** -stim_times 8 using LOCAL times
++ ** GUESSED ** -stim_times 9 using LOCAL times
++ ** GUESSED ** -stim_times 10 using LOCAL times
++ ** GUESSED ** -stim_times 11 using LOCAL times
++ ** GUESSED ** -stim_times 12 using LOCAL times
++ Number of time points: 1840 (no censoring)

  • Number of parameters: 32 [20 baseline ; 12 signal]
    ++ Wrote matrix image to file nodata.jpg
    ++ Wrote matrix values to file nodata.xmat.1D
    ++ ----- Signal+Baseline matrix condition (1840x32): 2.21842 ++ VERY GOOD ++
    *+ WARNING: !! in Signal+Baseline matrix:
  • Largest singular value=1.96037
  • 2 singular values are less than cutoff=1.96037e-07
  • Implies strong collinearity in the matrix columns!
    ++ Signal+Baseline matrix singular values:
    0 0 0.398334 0.562453 0.605234
    0.667968 0.716197 0.728911 0.763709 0.810864
    0.845201 0.863785 0.993715 0.994667 0.996958
    0.998195 0.998801 1.00117 1.00224 1.00426
    1.00494 1.00624 1.12005 1.13376 1.15804
    1.19266 1.21188 1.22015 1.24485 1.27737
    1.29586 1.96037
    ++ ----- Signal-only matrix condition (1840x12): 1.31652 ++ VERY GOOD ++
    *+ WARNING: !! in Signal-only matrix:
  • Largest singular value=1.73267
  • 2 singular values are less than cutoff=1.73267e-07
  • Implies strong collinearity in the matrix columns!
    ++ Signal-only matrix singular values:
    0 0 0.999676 0.99976 0.999793
    0.999853 0.999874 0.999897 0.999999 1.00001
    1.00006 1.73267
    ++ ----- Baseline-only matrix condition (1840x20): 1.00728 ++ VERY GOOD ++
    ++ ----- polort-only matrix condition (1840x20): 1.00728 ++ VERY GOOD ++
    ++ Wrote matrix values to file nodata_XtXinv.xmat.1D
    *+ WARNING: +++++ !! Matrix inverse average error = 0.0153459 ** BEWARE **
    ++ Matrix setup time = 3.47 s

Stimulus: Stim#1
h[ 0] norm. std. dev. = 172503.7031

Stimulus: Stim#2
h[ 0] norm. std. dev. = 172503.7031

Stimulus: Stim#3
h[ 0] norm. std. dev. = 172503.7031

Stimulus: Stim#4
h[ 0] norm. std. dev. = 172503.7031

Stimulus: Stim#5
h[ 0] norm. std. dev. = 156609.9844

Stimulus: Stim#6
h[ 0] norm. std. dev. = 156609.9844

Stimulus: Stim#7
h[ 0] norm. std. dev. = 156609.9844

Stimulus: Stim#8
h[ 0] norm. std. dev. = 156609.9844

Stimulus: Stim#9
h[ 0] norm. std. dev. = 164366.0312

Stimulus: Stim#10
h[ 0] norm. std. dev. = 164366.0312

Stimulus: Stim#11
h[ 0] norm. std. dev. = 164366.0312

Stimulus: Stim#12
h[ 0] norm. std. dev. = 164366.0312

I'd be happy to share the stimulus timing files if that would be helpful.

Thanks

AFNI version info (afni -ver): Precompiled binary macos_10.12_local: Jul 16 2024 (Version AFNI_24.2.01 'Macrinus')

Hello,

Given the description and the view the regression matrix, it seems possible that each event is part of exactly one of the first 4 regressors, and also part of exactly one of the second 4 and also part of exactly one of the third 4. If this is the case, then (ignoring the other (baseline) columns) the sum of the first 4 columns will show every event exactly once. But so would the sum of the second 4 and the sum of the third 4. If so, this model would suffer from multi-collinearity. Does that seem correct?

If you would like I will send you an address to send the timing files to, so I can look directly.

  • rick

Hi Rick-

Thanks for getting back to me. You're exactly right. Each event contains three different types of "rules". Each of these types of rules have 4 variants. So, every trial has one entry in columns 1-4, one entry in columns 5-8, and one entry in columns 9-12. The task is collinear by design. Maybe I need to think a little bit more about how to model the task.

Another possibility would be to model each trial individually, similar to a beta series approach, then average across the betas that appear in each column. Does that seem like a reasonable approach? Any other recommendations come to mind?

Thanks,
Doug

Hi Doug,

Even if you break the model up into 2 levels, it is not clear how you would choose to separate the main effect of the 3 different conditions. Suppose there is a mean effect from each of the 3 conditions. Then every event will have that mean effect from each of those 3 conditions, so how do you tell them apart? It seems to me that there needs to be an overall change to the model.

For example, is "neither" really a condition to affect the BOLD signal, or is it an absence of one? The same might go for "constant".

  • rick