Reading Development project

From CCN Wiki
Jump to navigation Jump to search

The Reading Development project uses an open dataset collected between 2008-2013 in James Booth's Developmental Child Neuroscience Lab at Northwestern. The data are available at openneuro.org.

General Notes

To be added later.

Constrained Classifier Project

Participants

28 Children (14 TD, 14 RD) with either strong or weak (incl. dyslexia diagnosis) reading skills and no other diagnosis and data from 2 time points. Children were scored according to Z score on 3 reading measures (WATT, Pseudoword decoding, something else), with an additional -1 or -0.5 assigned for a clinical dyslexia diagnosis (-1) or reading difficulty diagnosis (-.5). I selected the children with the top and bottom 14 summed scores.

Preprocessing

Anatomical surfaces reconstructed using T1w images at both early and late time points. Functional data from VV runs (word and nonword) preprocessed with both 6mm and 2mm blurring, Siemens slice time:

smoothing=2
nohup preproc-sess -sf fssubs -surface fsaverage lhrh -per-run -fsd bold -sliceorder siemens -fwhm ${smoothing} &

Functional Masking Using GLMA

A GLMA was carried out, contrasting all lexical vs. baseline to create group-level functional masks for TD and RD (p<.001, cluster P<.05). Union of masks was calculated. Masks were subdivided along template anatomical boundaries using custom scripts intersection clusters with template region boundaries. These regions were further subdivided using mris_divide_whatever.

Time Series Extraction

The 2mm-smoothed data were detrended using detrend_wmcsf.sh to remove linear trend, motion and wm and csf signal as nuisance regressors:

detrend_wmcsf.sh fmcpr.siemens.sm2 fsaverage `cat fssubs`

The surfacetimecourses.sh shell script was used to extract time series in fsaverage space to plaintext files. We used the ?h.rdrdcompact.annot annotation file, which can be found in the /ubfs/openfmri/label folder:

surfacetimecourses.sh tdrdcompact fmcpr.siemens.sm2 fsaverage `cat fssubs`

Functional Connectivity Estimation

Both Pearson R and cross-mutual information (XMI) was used to calculate a functional connectivity matrix for each functional run (8 runs/participant) using a custom MATLAB script. Why both Pearson R and XMI? Well, I was curious whether one might be better than the other. You do end up with somewhat different values either way.

MATLAB FC Pseudocode

for each subject S:
   for each time series file:
      load the files for lh and rh
      merge lh and rh into a single ts matrix
      eliminate timepoints at spikes (3SD from mean)
      initialize empty adjacency matrices A and R
      for each ordered pair of regions (i,j) in upper triangle of A:
         calculate the number of bins required for the cross-mutual-information calculation
         calculate the cross-mutual-information for time series in regions i and j and store in A[i,j]
         calculate the pearson correlation for time series in regions i and j and store in R[i,j]
    append A and R to collection of adjacency matrices for S
 save all adjacency matrices for S to a .mat file

FC Pattern Generation

Upper triangle of XMI matrix was extracted as a vector and normalized (Z Score) and scaled to fall between 0 and 1. The resulting distribution was very positively skewed so the square root of these values was calculated to make the distribution more normal. The scaled FC vectors for each of the 8 runs per participant were tagged for lexicality (word=1, pseudoword=0) at element n-2, and reading skill (RD=0, TD=1) at element n-1 and the decimal equivalent of the lexicality+reading skill code (e.g., 10 = 2) at element n, which was necessary to allow the k-folds cross-validation to balance the category distributions. This generated a matrix of 224 (28 subjects * 8 runs) by 6789 (6786 connections + lexicality code + group code + combined code). The matrix was written to a single .csv file.

Alternative Approaches

I had two options for generating the normalized XMI matrices. My first intuition was to normalize the XMI values within each matrix individually. This meant that the connectivity values were scaled with reference to the rest of the connectivity values for that participant for that run. It also occurred to me that I might instead normalize the XMI values globally, with respect to all XMI values occurring in all runs for all participants. I ended up writing a script that generated the FC patterns using normalized and scaled values computed individually and globally as two separate pattern files. It turned out that this was a lucky happenstance, because using both sets of patterns together lead to much better performance than either of them individually. I'm not sure whether that is because I doubled the amount of training data or because the two methods of pattern generation bolstered each other to give the models a better picture of the feature relations.

I also had the option of splitting up the time series and computing connectivity within the first and second-half of the run as a way of both doubling the data and also allowing consistency to influence training (i.e., if a participant uses wildly different networks in the first and second halves of the run, this might be both informative but also a challenge for the network to learn).

Model Training

4-layer feedforward networks were created. The number of hidden units in the first hidden layer was set to be log2 of the number of inputs. The size of the 2 subsequent hidden layers was set to half the size of the first hidden layer. There were two 1-unit output layers, classifying reading skill (RD=0 vs TD=1) and whether the pattern came from a pseudoword (0) or a word (1) run. Training began with the full set of connectivity values, with the exception of roughly 250 connections that were identified during the FC calculation step as being between two subregions of the same functional cluster because they seem less interesting and may be more influenced by things like regional blood flow.