22 - Group Analysis - Hands-On: Part 1 of 2
January 28, 2019
May 31, 2018
Gang Chen, NIMH
All Captioned Videos AFNI Training Bootcamp
Gang Chen, NIMH
For more information and course materials, please visit the workshop website:
We recommend viewing the videos at 1920 x 1080 (Full HD) resolution for the best experience. A lot of code and type is displayed that may be hard to read otherwise.
GANG CHEN: So yesterday we talked about the group analysis approaches available in AFNI. So for this section, we're going to do-- using a few real data sets to try to use the programs to see how you feel about it. So the slides are under that directory, the hands on. It's called afni25_GroupAna_HO.pdf.
So the data is the same directory we have been using. It's AFNI_data6. So the subdirectory is called GroupAna_cases. So some of the AFNI programs, group analysis programs, are written in R. So you'll need-- I mean, I assume everybody has R already installed on your computer-- and plus a few packages.
So this is just a review what we learned about the available AFNI group analysis programs. So we have 3dttest++, 3dMEMA, and 3dMVM, and 3dLME. So in the future we may have 3dISC. That's for the intersubject correlation. And 3dICC, that's for intra cross-correlation.
Then we have a couple of other programs or auxiliary programs. So I forgot to put it there-- the Bayesian approach here, that's-- I'm going to probably demo a little bit to use that program to run ROI-based group analysis. The AFNI-style programming, I mean, usually we write scripts. So that's-- scripting is always sometimes a little bit challenging, I mean, easier to make mistakes.
So one common error is that we tend to forget put-- I mean, either forget to put a backslash at the end of each line or put in some extra spaces after the backslash. Backslash means you tell the program to continue to the next line. So that's basically a continuation character.
So if you put in extra space after the backslash, then the shell will interpret that as the end of the current line. It will not continue to read the next line. So that would cause some trouble.
So there is a tool Rick wrote to help to diagnose those, some of the common problems. So the problem is a shell script program called file_tool. So you can use that to help you diagnose some of the problems like extra spaces after a backslash.
So the next few slides, basically, it's copied from a group analysis talk. So one thing-- this one I wanted to mention about is about R notations, so which are typically used in both 3dMVM and 3dLME. So the notation of A*B, that's the R notation. So when you have two variables, those variables can be factors or can be a quantity of covariate.
So A*B basically means A plus B plus A:B. So that means we have-- those two variables, we want their main effects plus their interaction. So A:B, that means their interaction between the two variables. So A plus B, that means basically main effects without interaction. A:B, that's the interaction. So that's for the fixed effects.
For random effects, the typical ones, we want to tilt one-- tilt it basically means it's approximately. So that's what we want, random intercept. Tilt x, we want the both intercept and slope. So the next few slides, basically, it's the same as we saw yesterday in the talk. So I put those slides there, just there to help you to navigate the programs. And those are what scenarios you would-- of data structure you would-- which programs you would use.
So now this is-- we have probably about six examples we're going to go through. So the-- I think the first one is the case we have three conditions, so just one group of subjects, three conditions. It's MEG data set. So three conditions, so it's within-subject one-way ANOVA, if we can conceptualize as the one-way within-subject ANOVA or repeated-measures ANOVA.
So one factor, that factor is the condition. We have three conditions, three levels. So there's baseline, ketamine, and placebo. One group of subjects, so that's 17 subjects-- so the special thing about this case is that we have some missing data. As you can see on the right-hand side, it lists the data structure, so depends on which condition. We have some of the subjects don't have data available. So that's-- it's typical when we have a longitudinal study.
So for example, for the first, the baseline condition, the subject number 12 does not have data. For the ketamine, actually, all subjects do have data. But the placebo part, we have 1, 2, 3, 4-- four subjects have missing data.
So what can we do when we have missing data? There are three separate approaches. The one approach, if we just stick with the traditional ANOVA data structure, then we would have to remove six subjects, because actually the six subjects have missing data. So that's probably the worst approach. We have to waste those six subjects. We have to sacrifice them.
So that's the first ANOVA approach. Or you can do a pairwise comparison instead of doing ANOVA. I mean, ANOVA doesn't gain much, except the only unique thing about the ANOVA, you are going to get the main effect of the three conditions. The main effect-- I mean, some people call it omnibus F-test. That basically tells us whether there are differences across those three conditions.
That's nice, giving us summary about the three conditions. But it doesn't tell us where those conditions are. Like, you see some differences across the three conditions. Those differences can be between the baseline and ketamine, or between the baseline and the placebo, or between ketamine and the placebo. So we don't know where they are. So we still have to go through all those pairwise comparisons.
So instead of only ANOVA, we could just run three separate pair t-tests. So three conditions is you pair up when you have three separately paired t-tests. So alternatively, we could run three paired t-tests.
If we do that, that would be better, actually, in this case, than the ANOVA, because each pair, we only need to miss a couple of subjects. For example, between baseline and ketamine, only need to remove subject 12 and subject 15. So that's definitely better than the ANOVA approach.
The third approach is, we don't need to waste any information. So even for those six subjects with missed data, we still can-- we can still take advantage of the data available among those six subjects. So that approach is linear mixed effects model. So that's the approach we're going to try here, to demo here.
So let's go to the terminal. Let me-- that's probably-- let me shrink and make it bigger. So go to the AFNI_data6. Once we're there, we go to this directory. It's called GroupAna_cases. So all those hands-on examples are under that directory. So let's go to GroupAna_cases.
Once there, now we'll go to the first example. Just type 1, then hit the Tab key. Then it will automatically complete the rest of the directory. So we go there. Then you will see you have the data directory plus a couple of scripts.
So I already created the scripts there. So if you open the file, first there are some comments, shows the data availability information, basically tells us, I mean, what data we have. So in one group we have 17 subjects, three conditions. Then we have six subjects who have missing data.
So down below is the script, 3dLME script. So it's pretty much similar to what we saw yesterday with 3dMVM example. So before I talk about the script, let's just run it on our computer. So if you have a tc shell-- tc shell, then we can just type tc shell then LME.txt. So hit Return.
So let's try that. Because it may take a few minutes, that's why I want to-- we do that. Then while the computer, it works on-- I mean, running-- I mean, it doesn't work on my computer, because I already have the output file available on my computer. But that's not the case for you. So you should hit-- I mean, run the script and see how it goes.
So let me talk about the script itself. So this is pretty much like a 3dMVM. So at the bottom of this script, it's a data table. So if you are familiar with R, that's a typical R-- the term is called a data frame. So it should have multiple columns.
Each column-- I mean, each row corresponds to one data point. Well, in this case it's the one three-dimension volume data, one brain. So the first column is always subject. So it's fixed. So you list all the subject labels.
The last column is the input files. So the input files can be-- does not have-- they don't have to be in the current directory. As long as you specify the path, you can put it anywhere. I mean, it can be anywhere, as long as you put the directory, the path that points to the input files. So the last column is input files.
Between the first and the last columns are all the variables. In that case-- this case, we only have one, which is the condition. The one factor is condition with three levels-- baseline, ketamine, and the placebo. So that's basically data frame, data table. Nothing fancy about that.
So then, at the beginning we have this program name, 3dLME, then the prefix-- we use that option to specify the output file name-- then number of jobs. So on my laptop, I only have two processors. So that's why I'm specifying the number of jobs with number 2.
The next line, model-- the model in this case is just one variable, which is condition, which is the second column in the data table. The next line, SS type, that's the sum of squares type. If you familiar with SAS or SPSS, you probably-- you may have heard the type, different types of sum of squares.
So there are three types-- type 1, type 2, and type 3. Here we have type 1 and type 3 available. The popular one is called type 3. So you may wonder what they are and what's the differences among those types. This is something that's controversial in this-- amongst statisticians.
What that means is that there are different ways to measure the contribution of each variable in a model. So type 3, if the-- the name is called marginal effect. So suppose you have multiple variables. Each variable may make contributions to the date variability.
So marginal effect, that means you put all the other variables in the model first. So this variable is-- would be the last the one entering into the model. So that's why it's marginal. So you've already explained everything else first. Each variable's unique contribution would be the extra one, would be the last one.
So you let everything else, all the other variables, take whatever they're called, first. Then you measure the unique contribution by putting that variables as the last item coming into the model. So that's called the marginal effect. Yes?
AUDIENCE: Do you have a list of commands? Because I made a syntax error and now it won't [INAUDIBLE] I typed one thing wrong, and I'm not-- I have an error saying the data table is not rectangular. [INAUDIBLE] somewhere? Or if you can walk through it--
GANG CHEN: Walk through what? The--
AUDIENCE: When you type the command in, I must have typed it wrong.
GANG CHEN: Oh, OK. OK. So--
AUDIENCE: I had the right file, I just typed--
GANG CHEN: So type tcsh LME.txt. Is that-- so that's the concept of sum of squares, different types. So there's-- type 3 means that it's a marginal effect. Type 1 is called the sequential. That means it's sensitive to the order. Basically, you-- as a user, you specify the order of the variables. So you let-- it would be the-- the order will decide how much contribution each variable [INAUDIBLE].
So owe the first variable in the model would take as much as it could then move to the next. So that's-- people don't like that. Some people like that and some people don't, because that's-- it depends on where you put it in the-- where the order in the model, then you may have different result. But that's-- we have type 1 and type 3 available in 3dLME.
So the next line is the random effects specification. In this case, since there is only one variable, the random effects specification is pretty simple. It's just random intercept. The next line tells the problem there, how many number of, like, General Linear Test-- GLT, General Linear Tests. So we want five. So each line specifies the test, post-hoc test we want.
So the first one, general-- GLT label, let's just use that to specify what this test is about. So in this case, we want the ketamine condition. So remember, there's just one variable condition. There are three levels for this variable, this factor.
So GLT code will use that option to specify what the code-- what exactly we want. So that, we put in quote, within quotes, condition is the variable name, is the factor, then space, colon space. Then 1, that's the weight. Star, that means that weight applies to that level. So in this case, it's the ketamine label, the first label. So this, the first post-hoc test is pretty simple.
The second the one is the contrast between ketamine and the placebo. So you can see now we have two weights, 1 and minus 1. Then basically we compare the two conditions.
So the next line, I mean, it may not be meaningful-- I just wanted to use that to demo what you-- what kind of weighting we can do. So in this case, we wanted the ketamine minus placebo and minus baseline. So there are three weights. We basically compare ketamine versus the sum of placebo and the baseline.
Any questions about the post-hoc test? So it's similar to the symbolic coding in 3dDeconvolve in AFNI afni_proc.py. It's similar. So that's what this program does-- I mean, what this script means.
For those of you who already got the result, so we can look at the result. So launch AFNI. So on the terminal-- actually the output file probably is called LME something. LME-- yeah. For me, it's called condition-- cond.lme2. I mean, yours-- probably something similar. So that's the output.
So on the terminal, let's type AFNI and launch the GUI and look at the result. So I don't have an anatomic data set here. So that's why you see the underlay is a little bit fuzzy. So this is like the anatomic data. Basically the output actually from 3dLME. So that's underlay.
Overlay is already loaded, because that's the only data-- three-dimensional data set available. So let's look at the-- here. So, I mean, at this point I think everybody's familiar with the AFNI interface. So underlay, we don't have the anatomic data set, but we just leave the-- using the output as the underlay.
So this overlay-- for example, we want to look at the, for example, the subject number four, which is the contrast between ketamine and the placebo. So that's the overlay. Then threshold, we use the t-test. In this case, it's a z-score-- z-statistic. It's a Gaussian test instead of a t. You may wonder why it's z-statistic, not t. That's because for 3dLME, some of the test is-- we don't have the t-test available. So we convert it to z-score-- I mean, z-statistic.
So we need to change the range of the threshold bar, because by default it's always from 0 to 1. In this case, z is pretty much like t. We want to change the range. So we switch this order 10 to the power 1 instead of 10 the power of 0.
So now let's navigate-- move this ratio bar a little bit down to something reasonable number, like 2-point-something. Now you will see some color blobs, clusters. Yeah?
AUDIENCE: [INAUDIBLE] question.
GANG CHEN: Yeah.
AUDIENCE: [INAUDIBLE] but I have a black background instead of a white background.
GANG CHEN: Oh. That's-- I changed my default, my setting. Yours is the [INAUDIBLE] one. Usually I don't like the black background. I think there is an option that allows you to-- I don't remember where. But if you like it, I can tell you later on what change you need to make to get that.
I mean, especially when I save the images for-- to put it in a paper, I don't like the black one. When people print out, they print a lot of-- waste a lot of ink. You may notice, as I mentioned yesterday, under this threshold bar, there is a p-value there, and also there is a q-value. Do you remember what that q-value is about? It's the FDR-- Forced Discovery Rate.
So that's-- automatically you can use that as a one way to handle multiple testing correction, so if you had the result. But in this case, there's a lot going on in the brain. So if you read the q, it doesn't change much, actually. So you can see here the F discovery rate is truly conservative-- I mean, especially for this data set.
One more thing I want to mention here is, usually it's reasonable to adopt two-sided or two-tailed testing, as we keep arguing that. But even though [INAUDIBLE] failed, everybody else uses a one-tailed test. That [INAUDIBLE] unless you have prior assumption about the directionality of each effect. Otherwise, you-- people just keep doing pair of one-sided tests.
I mean, automatically you have multiple comparison issue if you adjust the p-values. Nobody does that. So that basically cause-- you automatically inflated your [INAUDIBLE] false positive-- I mean, false positive rate. So that's problematic.
But if you can justify your one-tailed testing, you can do that in AFNI, even though the default, what you're seeing on the screen right now, the p-value under the slide show, the bar, it's the one-- I mean, it's two-tailed. But if you can justify your choice, you can switch to one-tailed.
How can you do that? You can use your right mouse button by putting the cursor to the top of the threshold bar. Then hold down the right mouse button, then you bring up this menu. On that menu, there's a sign. Currently, you can see pos and the neg-- positive and negative, both. So [INAUDIBLE] two-tailed.
Anybody has trouble-- have trouble getting that menu? So you go to the top of the threshold bar here, then use the-- then hit the right mouse button, hold there. That brings up another menu. On that menu, you see this-- at the middle of that menu is a sign. It says both pos and negative. So if you use your left mouse button, you can choose positive only or negative only.
So in this case, suppose I want to choose positive only. So now, the blue [INAUDIBLE] negatives are gone-- are hidden. And the p-value changed. The p-value suddenly divided by 2. That's because before it was two-tailed-- that means the sum area of the two tails add up. Now I just focus on the positive, on the right-hand side. That's the positive one. So that's why the p [INAUDIBLE] by 2 now.
So you can do the same thing for the negative one. So go there then-- I mean, then change that to negative only. So now on the screen you see the blue one. You don't see the orange clusters. So that's how you deal with-- I mean, switch [INAUDIBLE] directions.
I think that's [INAUDIBLE] there's a simple test. They just-- I mean, data structure is pretty straightforward. It's one factor with three levels. Typically, this would be one-way repeated-measures ANOVA. But because of the missing data, we're using linear mixed effects modeling approach to handle the situation.
Now let's switch to the second [INAUDIBLE] one directory up, go to the second one, 2.3 groups. So in this case we have three groups. So there are many ways. Here I put five different ways to model-- to handle the situation. But now let's look at the number five, the last one.
So three groups, that means it's a one-way between-subject ANOVA, plus a covariate. So this ought to be an ANCOVA, actually. So anybody has trouble getting to the directory? So you go one way up from the previous directory. So it's 2.3 groups. So once you [INAUDIBLE] multiple scripts.
So we can run the script by typing tcsh 5-- number 5-- type that. The that would run 3dMVM. Hit Return. I mean-- ah. I have this rectangular. That's probably-- I don't know if you have this problem. I'm not so sure why this-- I have to take a look.
Probably changed something recently.
AUDIENCE: [INAUDIBLE] find but I don't have--
GANG CHEN: You don't?
AUDIENCE: I don't have-- yeah.
GANG CHEN: Huh. OK, all right. What is 4? 4-- OK. The 4 is not MVM. But anyway, let's-- well then, you just have to listen to me then. This is-- remember, there's three groups. Whoops. What is going on here?
Three groups. There's three genotypes, actually. There are homozygotes, there is a heterozygote group, so two homozygote group. So there are three subjects for the first group, 10 subjects for the second group, and nine subjects for the third group. So three genotype groups.
So there are unequal number of subject across the three groups. That's not a big deal. But the thing here, we have a covariate, so which is the FD. So that's-- I forget what that is, actually-- some quantity of measurement for each subject.
So at the bottom, it's pretty much like the previous linear mixed effects modeling 3dLME. We'll have this data table. The data table-- remember, first column is always subject labels. Last column is the [INAUDIBLE] input files. So you'll notice that the data is put in the subdirectory-- data directory. Each input file will use the sub-brick selector, use the label to choose which sub-brick we want to use as a input file.
So between the first and last columns, they are all the variables that we want to consider. So the last column basically is the y, the response variable. Between the last and-- the first and the last columns are those experimental variables.
So one thing I want to mention, that you can put your table, but you don't have to use columns in your model. So that-- I mean, for example, here we have two columns in between. But you could put other variables, which you may-- you don't have to use in your model. So that would allow you-- you create one table, you can change your different models. So you can try that.
So here we basically [INAUDIBLE] columns two experimental variables. First one is the group. So we have three groups-- so the two homozygote groups plus the heterozygote group. Then we have the covariate fd That's a quantitative covariate.
So that's the data structure we have. Then the first line on the script is program name, 3dMVM. So we use the multivariate modeling approach to handle this ANCOVA structure. So we don't use-- in AFNI we don't use univariate general linear model, because that approach is very limited, and these people don't do the-- I mean, capability [INAUDIBLE] and if you don't do it carefully, you may get your wrong results as what's going on in the current other software packages.
So then you use prefix to specify the output file. Then again, we use jobs option to run parallelization. So the next line is-- the next two lines are different from 3dLME in the sense we don't directly specify the model. Instead, we specify the model-- the variable types.
So bs vars, that's between-subject variables. So in this case, we have two. [INAUDIBLE] then we have the fd value. So we put a star between the two variables. That means we want the both main effects and the interaction between the two variables. So in this case, [INAUDIBLE] variable one is the factor, one is the covariate.
So in the next line, it's q vars. q means-- so when you tell the program, fd is not a categorical variable, instead it's a quantitative variable-- if you don't do that, the program will treat fd as a factor. Then that now would be-- totally would mess up the analysis. So that's-- so we use-- basically use those two lines to specify the variable types.
Then there's the issue of centering. Since we have a quantitative variable, do we need to do centering? If we don't do-- say anything, don't use-- there is an option called q centers-- q vars centers. If we don't use that option, the program automatically centers along the [INAUDIBLE] across all the three groups.
But in this case, I already centered within each group. So I did with-group centering instead of [INAUDIBLE] centering. So that's why I didn't specify-- I didn't specifically add the option there to tell the program to remove the center.
So the next few lines basically specify the post-hoc tests. So for example, the first one, we want the contrast between those two genotypes. So the coding, we just put the weights [INAUDIBLE] each factor level, so either 1 or minus 1 typically.
The third one I want to mention is that, remember we have two variables. One is the genotype group, the other one is the quantitative covariate. So we can-- this, the third line, is a little bit different from the [INAUDIBLE] post-hoc test. We want the covariate effect-- so you see the variable name space colon. That's it. That means we want to see the quantitative effect, the slope.
So the next two lines are pretty much similar, except we want to test the fd effect-- see the fd effect difference between the two groups. So we want the slope differences between those two groups. That's the script for 3dMVM.
So then, I mean, this-- there is alternative approach to write the script. You don't have to write, write, write it. You can use-- let me see if I have it here. You can use-- there's a shiny program Justin or [INAUDIBLE] wrote recently that can use the GUI space to write the 3dMVM script.
So how can we do that? There is a web page I think he set up. So let me start from the beginning. So usually-- I mean, you can start from anywhere on the AFNI web page. So for example, we start from the message board. So you click this Documentation, that tab.
So once you are on that page, I think you go to the number 8.11, this one-- 3dMVM validator. I think-- at least, I hope-- he will write one for 3dLME as well later. But we are still testing this one. So this, 8.11, that's the 3dMVM validator.
So that web page is specifically-- is devoted for this script generator. So you can read this, I mean, follow the instruction there. But here I just want to demonstrate a little bit. Where's that-- I think he mentioned somewhere. That's not it. Oh, here.
Basically, on the terminal you just-- what do you need to do is, you have to create a table. That part. the GUI does not help you. So you have to create this table. Basically that step at the bottom of either 3dLME or 3dMVM data table. For that table, as I mentioned several times already, first column is always subject labels, last column is the input files. In between, you list all your variables.
In this case, we have the groups, three groups. The second variable is the quantitative covariate. So you create this table. Once you have this table, on the terminal you type this command-- 3dMVM_validator dash data table, then put the name of the-- file name of the data table you created.
So then you hit Enter. So now what it does, it's going to check whether you have all the R packages installed, then launch AFNI, then load up one data from the list of the last column from the input files. And also, it will launch the validator on your browser, automatically open your browser then load up this page.
So on the AFNI here, in this case, you may wonder why it's not a brain. Because in this data set, I simplified just-- I believe it was just 3 by 3 by 3 [INAUDIBLE] voxels instead of a whole brain. That's just for demo purpose.
So on this, the browser, the three-- on the left panel, there are three steps. So you need the first one, get the coordinates. That means, the reason we want to get one voxel [INAUDIBLE] surface one node is that we want to test your model before we run the whole thing-- so whether if the model works or not.
So that's why we need the-- oh, I moved-- sorry, moved to the [INAUDIBLE]. OK. So first we go to the AFNI interface, go to one of the three panels, then pick one voxel. Suppose I pick the one in the middle. So you have to watch me. You don't have the-- probably you don't have the table created on your-- in that directory on your computer. I forgot to do that this time, but next time I will do it.
So pick one of the two-dimensional panel. You click one voxel, then you say, I get the coordinates for that voxel. So on the panel you will-- here it will show the coordinates-- the coordinates, the x, y, z, [INAUDIBLE] and it depends on this [INAUDIBLE] or IJK. So it shows up. So it shows the location of that voxel.
On the lower right corner, it will show it successfully loaded-- I mean, found that voxel. If there's something wrong with this, it would be red. So that's first step. We get one voxel for model testing purpose.
Then you will-- well, in this case it's ROI-- I mean, it's a voxel instead of ROI. So next step, extract the data from that voxel. So you may notice the right-- lower right corner will tell you if there is something wrong or [INAUDIBLE]. So in this case, it's already loaded the data. So that's the second step.
The third a step, on the left panel is, we load the data. So we load the data. So once we have the data, so now we start to work [INAUDIBLE] part, modeling testing. So on the top, it shows it automatically detects how many variables we have, because it just reads the table. So it's like R, you read the data frame.
So it tells us there's a group variable, there's-- the quantitative variable is FD. It automatically tells us-- I mean, it's a numerical variable, or whether it's numerical or categorical. Down below, so here, specify between-subject model-- I mean, variables. We have a group [INAUDIBLE] put there.
Then specify within-subject variables. We don't have [INAUDIBLE] so let-- both variables are between-subjects. The next line, specify quantitative variables. So we need this-- fd is a quantitative variable. So basically we do that. So it automatically updates once you type in the variable name.
By centering-- well, in this case it's already centered, so we don't need to do anything. So at the bottom, it shows the modeling result of the current model. We haven't fully specified the model yet. So at this line, I need to put the fd there.
So once I do that, it automatically updates the model. See, that's pretty much like ANOVA output. So you have two main effects plus the interaction. It shows the degrees of freedom, shows the F-statistic, shows the p-value for this particular voxel.
So [INAUDIBLE] part-- so then we need to-- that will only give you the main effects-- I mean, directions. So now we need to something about the post-hoc test. So we click this tab, GLTs. So we put a label. Suppose we wanted the contrast between the two genotype groups. So variable name, that's group.
Then specify the levels. So suppose we only compare v versus vn. So we choose those two. Then we put the weights, 1 and minus 1, so we'll add the variables. So then it automatically generates the coding, as we saw before in that 3dMVM script.
So once we have that, then we just add the GLT name. Once we have [INAUDIBLE] so we can check the script. So now at the bottom you can see that that's pretty much what we-- the script I wrote myself. So right now i just specify the one-- oh, didn't-- I forgot we failed to add the GLT. But let me see why it's failed.
Oh, it didn't-- for some reason it didn't work. Anyway. Huh. OK. I forgot to test. So now [INAUDIBLE] test shows that for that post-hoc test. Now I can add. So once I add there then go back to the script, then we see the general linear test is added to the 3dMVM script.
So that's the 3DMVM validator. So you can use that to create a script, if you-- especially for the beginners, probably that's-- maybe it's a good idea to use. So then later on you may just write yourself, without using the validator.
But it is a good idea-- not just the script itself. It also tests, allows you to test, whether the model is a reasonable model. If something wrong, you can immediately-- to figure out, instead of one whole analysis on the whole brain. So that-- it is nice for the model testing purpose, not just the scripting.
Any questions about this, about the script, and also the validator?