Case Study for Biometrika Resubmission

Author

Andrew DiLernia

Code
library(tidyverse)
library(JointNets)

# Loading ROI data for AAL 116 atlas
data(aal116coordinates, package = 'JointNets')

# DMN regions from https://www.researchgate.net/figure/Table-of-ROIs-in-the-AAL-brain-atlas-corresponding-to-the-DMN-Default-Mode-Network-and_tbl1_335765319
# Acronyms to full ROI names: https://www.researchgate.net/figure/116-brain-regions-defined-by-AAL-The-regions-highlighted-are-those-used-in-our_tbl1_221654598
# Frontal Superior Medial L
# Frontal Superior Medial R
# Cingulum Anterior L
# Cingulum Anterior R
# Cingulum Posterior L
# Cingulum Posterior R
# Angular L
# Angular R
# Precuneus L
# Precuneus R

roiNames <- data.frame(old = c("SFGmed.L", "SFGmed.R", "ACG.L", "ACG.R", 
                               "PCG.L", "PCG.R", "ANG.L", "ANG.R", "PCUN.L", "PCUN.R"), 
                       new = c("Frontal Superior Medial L", "Frontal Superior Medial R", 
                               "Cingulum Anterior L", "Cingulum Anterior R", 
                               "Cingulum Posterior L", "Cingulum Posterior R", 
                               "Angular L", "Angular R", "Precuneus L", "Precuneus R"))

dmnROIs <- aal116coordinates %>% 
  right_join(roiNames, by = c("name" = "old"))
Code
library(furrr)

dataDir <- "../../groupComp/Outputs/dparsf/nofilt_noglobal/rois_aal/"

if(file.exists("aalTS.rds") == FALSE) {
# Importing in parallel
plan(multisession, workers = 4)

# Importing time series data
aalTS <- future_map(.x = paste0(dataDir, list.files(dataDir)), 
                         .f = function(x) {as.matrix(read_table(x, show_col_types = FALSE))},
                    .progress = TRUE)

# Saving
write_rds(aalTS, "aalTS.rds")
} else {
  aalTS <- read_rds("aalTS.rds")
}

# Discarding scans with <110 time points in the resting state scan
drops <- sapply(aalTS, FUN = nrow) < 110

# Importing subject demographic data from GitHub
# ABIDE II Data legend: http://fcon_1000.projects.nitrc.org/indi/abide/ABIDEII_Data_Legend.pdf
# Quality assessment variables legend; http://preprocessed-connectomes-project.org/abide/quality_assessment.html
phenotypesFull <- read_csv("https://raw.githubusercontent.com/preprocessed-connectomes-project/abide/master/Phenotypic_V1_0b_preprocessed1.csv") %>% 
  dplyr::mutate(subject = as.character(subject),
         FILE_ID = str_to_lower(FILE_ID))

# Subject demographic data extracted from file names
subjFiles <- unique(list.files(dataDir))
phenotypesSub <- data.frame(Site = map_chr(str_split(subjFiles, pattern = "_"), 1),
                            ID = map_chr(str_split(subjFiles, pattern = "_"), 2)) %>% 
  mutate(Site = case_when(ID %in% c(1:2) ~ paste0(Site, "_", ID),
                        TRUE ~ Site),
         ID = case_when(ID %in% c(letters, 1:2) ~ map_chr(str_split(subjFiles, pattern = "_"), 3),
                        TRUE ~ ID),
         FILE_ID = paste0(str_to_lower(Site),  "_", ID))

# Merging and only keeping those with at least 2 of 3 raters rating image as 'good'
phenoData <- phenotypesSub %>% 
  left_join(phenotypesFull, by = c("FILE_ID" = "FILE_ID")) %>% 
  rowwise() %>% 
  mutate(qc_rater_1 = str_trim(str_to_lower(qc_rater_1)),
                     qc_func_rater_2 = str_trim(str_to_lower(qc_func_rater_2)),
                     qc_func_rater_3 = str_trim(str_to_lower(qc_func_rater_3)),
         Keep = sum((qc_rater_1 == "ok") + (qc_func_rater_2 == "ok") + (qc_func_rater_3 == "ok"), na.rm = TRUE) >= 2) %>% 
  dplyr::select(Site:FILE_ID, SEX, DX_GROUP, AGE_AT_SCAN, EYE_STATUS_AT_SCAN, CURRENT_MED_STATUS, FIQ, func_mean_fd, Keep, qc_rater_1, qc_func_rater_2, qc_func_rater_3,
         HANDEDNESS_CATEGORY, everything())

# Final phenotype data
phenoFinal <- phenoData[which(!drops & phenoData$Keep), ]

# Final fMRI time series data
roiInds <- match(dmnROIs$name, aal116coordinates$name)
aalTSfinal<- map(aalTS[which(!drops & phenoData$Keep)], .f = function(x) {x[, roiInds]})

# Saving for analysis
write_rds(list(aalTSfinal = aalTSfinal, 
               phenoFinal = phenoFinal, 
               dmnROIs = dmnROIs), "analysisData.rds")
Code
# Adding participant IDs to time series data
names(aalTSfinal) <- phenoFinal$ID

# Subsetting to female participants diagnosed with Autism from the Stanford site
stanford_female_autism <- phenoFinal %>% 
  dplyr::filter(Site == "Stanford",
                SEX == 2,
                DX_GROUP == 1)

nCandidates <- nrow(stanford_female_autism)
triInds <- upper.tri(matrix(nrow = nCandidates, ncol = nCandidates), diag = FALSE)

# Selecting participants most similar in age
similarIDs <- expand_grid(Part1 = stanford_female_autism$ID,
            Part2 = stanford_female_autism$ID) %>% 
  dplyr::filter(Part1 != Part2) %>% 
  dplyr::slice(which.min((stanford_female_autism %>% 
  dplyr::pull(AGE_AT_SCAN) %>% 
  outer(X = ., Y = .,
        FUN = function(x, y) (x - y)^2))[triInds])) %>% 
  t()

candIDs <- stanford_female_autism$ID

# Data for pair of similar participants for analysis
similar_pheno <- stanford_female_autism %>% 
  dplyr::filter(ID %in% candIDs)

similar_mvts <- aalTSfinal[candIDs]
Code
library(pcCov)

# Estimating asymptotic covariance matrices
asymp_covs <- map(.x = similar_mvts, .f = function(mvts) {
  pcCov::partialCov(scale(mvts, center = TRUE, scale = TRUE))
  })
Code
# Calculating estimated AR parameters
p <- ncol(similar_mvts[[1]])

# Function for summarize estimated AR(1) parameters for participants
ar_summary <- function(x) {
  summary(diag(matrix(ar(similar_mvts[[x]], order.max = 1, aic = FALSE)$ar, nrow = p))) %>% 
    broom::tidy() %>% 
    flextable::flextable()
}

map(.x = 1:nCandidates, .f = ar_summary)

Individual-Level Analysis

We demonstrate the utility of our proposed inferential methods by analyzing resting-state functional magnetic resonance imaging data from the Autism Brain Imaging Data Exchange (ABIDE) initiative (Craddock et al., 2013). We analyze imaging data from a single site provided by Stanford University that was preprocessed using the Data Processing Assistant for Resting-State fMRI pipeline. Within this site, we consider data from female participants diagnosed with autism spectrum disorder who were approximately 10 years old at the time of data acquisition. The Automated Anatomical Labeling atlas was used to extract data for 116 regions of interest, but we focus our analysis on ten brain regions in the Default Mode Network. See Craddock et al. (2013) for more details on data acquisition and preprocessing steps.

Since the resting-state fMRI data consists of 175 volumes for 10 regions of interest, and the average autoregressive parameter estimated for the data for each participant is about 0.40, the simulation setting that most aligns with these settings has \(N=100\) observations, \(p=10\) variables, and \(\phi = 0.4\) for the autoregressive parameter.

Partial correlation plot

Code
# Vector of brain regions
regions <- stringr::str_remove_all(roiNames$old, pattern = "[.]")

fullRegions <- str_replace_all(str_replace_all(roiNames$new, pattern = " R", replacement = " Right"), pattern = " L", replacement = " Left")

# Function for creating plots of group-level networks
analyzeNetwork <- function(myGraph, rois = regions) {
  
  p <- ncol(myGraph[[1]])
  
  # Creating "network" objects
  myNet <- network::network(myGraph > 0, directed = FALSE,
                   vertex.attr = list(rois),
                   vertex.attrnames = list("ROI"))
  
  # Setting edge weights
  set.edge.value(myNet, "weight", myGraph)

# Creating network data frames for plotting
roiCoords <- ggnetwork(myNet, layout = "fruchtermanreingold") %>% 
  dplyr::distinct(x, y, ROI) %>% 
  dplyr::select(x, y) %>% 
  as.matrix()

ggnetDF <- ggnetwork(myNet, layout = roiCoords)

# Plotting networks
ggNet <- ggnetDF %>% 
  ggplot(aes(x = x, y = y, xend = xend, yend = yend))
  
# Plotting darkest edges first
for(w in sort(ggnetDF$weight, decreasing = FALSE)) {
  ggNet <- ggNet + geom_edges(data = ggnetDF %>% dplyr::filter(weight == w), 
                                    aes(color = weight), 
             linetype = "solid", linewidth = 1.5)
}

# Adding nodes
  ggNet <- ggNet +
  geom_nodes(aes(x, y), color = "steelblue", size = 11) +
  geom_nodetext(aes(label = ROI),
                size = 2.5, color = "white") +
  scale_color_gradient2(high = "black", mid = "white", low = "white",
                     limits=c(0,1), breaks = seq(0, 1, by = 0.20), 
                     midpoint = 0.50,
                     guide = guide_colorbar(frame.colour = "black", ticks.colour = "black")) +
  labs(color = "Proportion of individuals with an edge present:") +
   theme_facet() +
  theme(legend.position = "bottom")

return(ggNet)
}

# Function for calculating matrix of p-values based on covariance matrices & pc estimates
calcPvalueMat <- function(covMat, pcorrs) {
  se2s <- diag(covMat)
  pc2s <- pcorrs^2
  zs <- pc2s / se2s
  
  chiCritical <- qchisq(p = 1 - 0.05, df = 1, ncp = 0)
  q <- length(pcorrs)
  p <- (1 + sqrt(1 + 8*q)) / 2
  
  pvals <- pchisq(q= zs, ncp = 0, df = 1, lower.tail = FALSE)
  pvalMat <- diag(rep(0, p))
  pvalMat[upper.tri(pvalMat, diag = FALSE)] <- pvals
  
  return(pvalMat + t(pvalMat))
}

library(ggcorrplot)
library(grid)

p <- ncol(similar_mvts[[1]])
q <- choose(p, 2)
triInds <- upper.tri(diag(p))

# Creating list of vectors of partial correlations
partialCorrs <- map(1:nCandidates, .f = function(part_num) {
  pcCov::corrMat_cpp(tsData = similar_mvts[[part_num]], partial = TRUE)[triInds]})

# Obtaining list of matrices of p-values based on Wald test
pvalueMats <- map(1:nCandidates, .f = function(part_num) {
  pMat <- calcPvalueMat(covMat = asymp_covs[[part_num]], 
                        pcorrs = partialCorrs[[part_num]])
  
    colnames(pMat) <- rownames(pMat) <- regions
  
  return(pMat)
  })

# Creating common plot function
matrixPlot <- function(myMatrix, myTitle) {
  ggcorrplot::ggcorrplot(myMatrix, method = "circle", type = "upper") + 
  scale_fill_gradient2(high = "#0072B2", low = "white",
                       limits=c(0, 10), breaks = seq(0, 10, by = 2)) + 
  labs(x = "", y = "", fill = expression("-log"[10]*"(p-value)"), title = myTitle) + 
    theme_bw() + theme(legend.key.height = unit(1, "cm"), text = element_text(face = "bold"),
      axis.text.y = element_text(size = 6, face = "bold"),
      axis.text.x = element_text(size = 6, face = "bold"),
      plot.title = element_text(size = 15, face = "bold"))
}

# Plots for partial correlations
myMats <- map(pvalueMats, .f = function(pmat) {
                pmat <- -log(pmat, base = 10)
                
# Thresholding for plotting
for(r in 1:nrow(pmat)) {
  for(column in 1:ncol(pmat)) {
    pmat[r, column] <- min(pmat[r, column], 10)
  }
}
                
                return(pmat)
                })

myCorrGGs <- map(myMats, .f = function(myMat) {
  myGG <- matrixPlot(myMat, 
         myTitle = "Individual Wald Tests of Partial Correlations")
  
  myGG[["plot_env"]][["p"]][["layers"]][[1]][["mapping"]][["size"]] <- 1
  
  return(myGG)
})

# Saving plots
map(1:nCandidates, .f = function(p_num) {
  if(!file.exists(paste0("correlation_plot_", p_num, ".png"))) {
ggsave(filename = paste0("correlation_plot_", p_num, ".png"), 
       plot = myCorrGGs[[p_num]], units = "mm",
       width = 1344 / 8, height = 960 / 8)
  }
})
Results of Wald tests of individual partial correlations being 0 or not for each participant.

Confidence interval results

Code
# Function for rounding numbers
my_round <- function(x, ndigits = 2) {
  str_replace_all(sprintf(fmt = paste0("%.", ndigits, "f"), x), 
                  pattern = paste(c("-0.", rep("0", ndigits)),
                                  collapse = ""), 
                  replacement = paste(c("0.", rep("0", 2)),
      collapse = ""))
}

# Function for calculating confidence interval limits for table
calc_CI <- function(covMat, pcorrs, conf_level = 0.95, 
                    multiplier = NULL) {
  if(is.null(multiplier)) {
  Zstar <- qnorm(p = 1 - (1 - conf_level) / 2)
  }
  
  SEs <- sqrt(diag(covMat))
  ciDF <- data.frame(Interval = str_c("(", 
                                      my_round(pcorrs - Zstar*SEs), 
                                      ", ", 
                                      my_round(pcorrs + Zstar*SEs), 
                                      ")"))
  
  return(ciDF)
}

# Indices for regions
regionInds <- unique(pcCov::royVarhelper(p)[, 1:2])

### Table of hypothesis test p-values and confidence interval limits

make_CI_table <- function(mvts, pCorrs, asymp_cov) {
# Adding Wald CI results
ciTable <- calc_CI(covMat = asymp_cov,
        pcorrs = pCorrs, 
        conf_level = 0.95) %>% 
  dplyr::mutate(Region1 = regions[regionInds[, 1]],
                Region2 = regions[regionInds[, 2]],
                Correlation = my_round(pCorrs)) %>% 
  dplyr::rename(Wald = Interval) %>% 
  dplyr::select(Region1:Correlation, Wald)

# Adding block-bootstrap CI results
set.seed(1994)

bootResults <- pcCov::bootVar(ts = mvts, 
                  winLength = NULL, nboots = 1000)

ciTable$Bootstrap <- bootResults[[2]] %>% 
  as_tibble() %>% 
  dplyr::mutate(Bootstrap = str_c("(", my_round(`2.5%`), ", ", 
                                       my_round(`97.5%`), ")")) %>% 
  dplyr::pull(Bootstrap)

# Fisher transformation CI results
N <- nrow(mvts)
fishSEs <- sqrt(1 / (N - p - 1))
fishPCs <- atanh(pCorrs)  
Zstar <- qnorm(p = 1 - (1 - 0.95) / 2)

ciTable$Fisher <- str_c("(",  my_round(tanh(fishPCs - Zstar*fishSEs)), 
                       ", ", my_round(tanh(fishPCs + Zstar*fishSEs)), ")")

# Naïve transformation CI results
naiveSEs <- sqrt((1 - pCorrs^2) / (N - p))
tstar <- qt(p = 1 - (1 - 0.95) / 2, df = N - p)

ciTable$Naïve <- str_c("(",  my_round(pCorrs - tstar*naiveSEs), 
                      ", ", my_round(pCorrs + tstar*naiveSEs), ")")

return(ciTable)
}

### Hypothesis test p-values

# Printing overall table
ciTables <- pmap(.l = list(mvts = similar_mvts,
                          pCorrs = partialCorrs,
                          asymp_cov = asymp_covs),
                 .f = make_CI_table)

Region1

Region2

Correlation

Wald

Bootstrap

Fisher

Naïve

SFGmedL

SFGmedR

0.23

(0.07, 0.38)

(0.06, 0.37)

(0.08, 0.37)

(0.08, 0.38)

SFGmedL

ACGL

0.29

(0.14, 0.43)

(0.14, 0.43)

(0.14, 0.42)

(0.14, 0.43)

SFGmedR

ACGL

-0.11

(-0.27, 0.04)

(-0.29, 0.05)

(-0.26, 0.04)

(-0.27, 0.04)

SFGmedL

ACGR

0.13

(-0.03, 0.30)

(-0.04, 0.29)

(-0.02, 0.28)

(-0.02, 0.29)

SFGmedR

ACGR

0.30

(0.16, 0.45)

(0.14, 0.47)

(0.16, 0.44)

(0.16, 0.45)

ACGL

ACGR

0.04

(-0.11, 0.20)

(-0.12, 0.25)

(-0.11, 0.19)

(-0.11, 0.20)

SFGmedL

PCGL

0.06

(-0.11, 0.22)

(-0.11, 0.23)

(-0.10, 0.21)

(-0.10, 0.21)

SFGmedR

PCGL

0.01

(-0.16, 0.17)

(-0.12, 0.14)

(-0.14, 0.16)

(-0.15, 0.16)

ACGL

PCGL

0.09

(-0.06, 0.25)

(-0.07, 0.26)

(-0.06, 0.24)

(-0.06, 0.24)

ACGR

PCGL

0.14

(-0.03, 0.30)

(-0.03, 0.28)

(-0.02, 0.28)

(-0.02, 0.29)

SFGmedL

PCGR

0.01

(-0.13, 0.16)

(-0.13, 0.16)

(-0.14, 0.17)

(-0.14, 0.17)

SFGmedR

PCGR

-0.01

(-0.17, 0.14)

(-0.14, 0.11)

(-0.16, 0.14)

(-0.16, 0.14)

ACGL

PCGR

0.10

(-0.05, 0.25)

(-0.11, 0.28)

(-0.06, 0.25)

(-0.06, 0.25)

ACGR

PCGR

-0.03

(-0.18, 0.13)

(-0.17, 0.18)

(-0.18, 0.12)

(-0.18, 0.13)

PCGL

PCGR

0.63

(0.53, 0.72)

(0.46, 0.71)

(0.52, 0.71)

(0.51, 0.75)

SFGmedL

ANGL

0.00

(-0.16, 0.16)

(-0.15, 0.16)

(-0.15, 0.15)

(-0.15, 0.15)

SFGmedR

ANGL

0.41

(0.27, 0.55)

(0.26, 0.53)

(0.28, 0.53)

(0.27, 0.55)

ACGL

ANGL

-0.23

(-0.37, -0.08)

(-0.33, -0.08)

(-0.37, -0.08)

(-0.38, -0.08)

ACGR

ANGL

-0.37

(-0.52, -0.23)

(-0.53, -0.18)

(-0.50, -0.24)

(-0.52, -0.23)

PCGL

ANGL

0.18

(0.02, 0.34)

(0.04, 0.31)

(0.03, 0.33)

(0.03, 0.33)

PCGR

ANGL

-0.12

(-0.27, 0.03)

(-0.24, 0.03)

(-0.27, 0.03)

(-0.27, 0.03)

SFGmedL

ANGR

0.15

(0.00, 0.31)

(-0.03, 0.30)

(0.00, 0.30)

(0.00, 0.30)

SFGmedR

ANGR

-0.29

(-0.43, -0.15)

(-0.40, -0.13)

(-0.42, -0.14)

(-0.43, -0.14)

ACGL

ANGR

0.04

(-0.12, 0.19)

(-0.10, 0.23)

(-0.12, 0.19)

(-0.12, 0.19)

ACGR

ANGR

0.37

(0.23, 0.51)

(0.23, 0.46)

(0.23, 0.49)

(0.23, 0.51)

PCGL

ANGR

-0.18

(-0.34, -0.01)

(-0.34, 0.03)

(-0.32, -0.03)

(-0.33, -0.03)

PCGR

ANGR

0.10

(-0.06, 0.26)

(-0.09, 0.24)

(-0.05, 0.25)

(-0.05, 0.25)

ANGL

ANGR

0.13

(-0.03, 0.29)

(-0.06, 0.27)

(-0.02, 0.28)

(-0.02, 0.28)

SFGmedL

PCUNL

0.16

(0.00, 0.32)

(0.00, 0.29)

(0.01, 0.30)

(0.01, 0.31)

SFGmedR

PCUNL

0.07

(-0.09, 0.23)

(-0.08, 0.24)

(-0.08, 0.22)

(-0.08, 0.22)

ACGL

PCUNL

-0.07

(-0.23, 0.09)

(-0.23, 0.12)

(-0.22, 0.08)

(-0.22, 0.08)

ACGR

PCUNL

0.06

(-0.10, 0.23)

(-0.15, 0.22)

(-0.09, 0.21)

(-0.09, 0.22)

PCGL

PCUNL

0.52

(0.39, 0.64)

(0.40, 0.63)

(0.39, 0.62)

(0.38, 0.65)

PCGR

PCUNL

-0.14

(-0.29, 0.01)

(-0.27, 0.05)

(-0.28, 0.01)

(-0.29, 0.01)

ANGL

PCUNL

0.24

(0.08, 0.39)

(0.03, 0.38)

(0.09, 0.38)

(0.09, 0.39)

ANGR

PCUNL

0.03

(-0.14, 0.20)

(-0.16, 0.19)

(-0.12, 0.18)

(-0.12, 0.19)

SFGmedL

PCUNR

-0.11

(-0.26, 0.05)

(-0.25, 0.05)

(-0.26, 0.04)

(-0.26, 0.04)

SFGmedR

PCUNR

0.03

(-0.13, 0.19)

(-0.13, 0.17)

(-0.12, 0.18)

(-0.12, 0.19)

ACGL

PCUNR

0.02

(-0.14, 0.18)

(-0.15, 0.17)

(-0.13, 0.18)

(-0.13, 0.18)

ACGR

PCUNR

-0.25

(-0.40, -0.09)

(-0.41, -0.03)

(-0.38, -0.10)

(-0.39, -0.10)

PCGL

PCUNR

-0.26

(-0.42, -0.10)

(-0.40, -0.15)

(-0.40, -0.11)

(-0.41, -0.11)

PCGR

PCUNR

0.11

(-0.04, 0.27)

(-0.03, 0.24)

(-0.04, 0.26)

(-0.04, 0.26)

ANGL

PCUNR

-0.04

(-0.21, 0.12)

(-0.19, 0.14)

(-0.19, 0.11)

(-0.20, 0.11)

ANGR

PCUNR

0.43

(0.29, 0.57)

(0.27, 0.57)

(0.30, 0.55)

(0.29, 0.57)

PCUNL

PCUNR

0.60

(0.49, 0.71)

(0.49, 0.69)

(0.49, 0.69)

(0.47, 0.72)

Region1

Region2

Correlation

Wald

Bootstrap

Fisher

Naïve

SFGmedL

SFGmedR

0.65

(0.56, 0.74)

(0.53, 0.74)

(0.55, 0.73)

(0.53, 0.77)

SFGmedL

ACGL

0.17

(0.02, 0.32)

(0.04, 0.34)

(0.02, 0.31)

(0.02, 0.32)

SFGmedR

ACGL

-0.22

(-0.36, -0.07)

(-0.37, -0.08)

(-0.36, -0.07)

(-0.37, -0.07)

SFGmedL

ACGR

-0.15

(-0.32, 0.01)

(-0.31, 0.02)

(-0.30, 0.00)

(-0.31, 0.00)

SFGmedR

ACGR

0.24

(0.09, 0.39)

(0.05, 0.42)

(0.09, 0.38)

(0.09, 0.39)

ACGL

ACGR

0.80

(0.75, 0.86)

(0.75, 0.87)

(0.74, 0.85)

(0.71, 0.89)

SFGmedL

PCGL

0.05

(-0.10, 0.20)

(-0.10, 0.17)

(-0.10, 0.20)

(-0.10, 0.20)

SFGmedR

PCGL

-0.11

(-0.26, 0.03)

(-0.26, 0.04)

(-0.26, 0.04)

(-0.27, 0.04)

ACGL

PCGL

-0.10

(-0.26, 0.05)

(-0.25, 0.03)

(-0.25, 0.05)

(-0.26, 0.05)

ACGR

PCGL

0.10

(-0.06, 0.25)

(-0.04, 0.27)

(-0.06, 0.24)

(-0.06, 0.25)

SFGmedL

PCGR

-0.13

(-0.29, 0.02)

(-0.29, 0.09)

(-0.28, 0.02)

(-0.29, 0.02)

SFGmedR

PCGR

0.37

(0.24, 0.51)

(0.18, 0.51)

(0.24, 0.50)

(0.23, 0.52)

ACGL

PCGR

0.25

(0.10, 0.40)

(0.06, 0.41)

(0.10, 0.39)

(0.10, 0.40)

ACGR

PCGR

-0.23

(-0.39, -0.07)

(-0.43, 0.00)

(-0.37, -0.08)

(-0.38, -0.08)

PCGL

PCGR

0.48

(0.36, 0.60)

(0.32, 0.60)

(0.35, 0.59)

(0.34, 0.61)

SFGmedL

ANGL

0.46

(0.34, 0.59)

(0.33, 0.59)

(0.33, 0.57)

(0.32, 0.60)

SFGmedR

ANGL

-0.07

(-0.22, 0.08)

(-0.25, 0.11)

(-0.22, 0.08)

(-0.22, 0.08)

ACGL

ANGL

0.06

(-0.09, 0.22)

(-0.13, 0.20)

(-0.09, 0.21)

(-0.09, 0.22)

ACGR

ANGL

0.16

(0.00, 0.31)

(0.01, 0.34)

(0.00, 0.30)

(0.00, 0.31)

PCGL

ANGL

0.24

(0.09, 0.38)

(0.09, 0.37)

(0.09, 0.37)

(0.09, 0.38)

PCGR

ANGL

-0.12

(-0.28, 0.03)

(-0.31, 0.06)

(-0.27, 0.03)

(-0.28, 0.03)

SFGmedL

ANGR

0.03

(-0.14, 0.20)

(-0.16, 0.20)

(-0.12, 0.18)

(-0.12, 0.19)

SFGmedR

ANGR

0.04

(-0.12, 0.20)

(-0.12, 0.20)

(-0.11, 0.19)

(-0.11, 0.19)

ACGL

ANGR

-0.09

(-0.27, 0.08)

(-0.26, 0.12)

(-0.24, 0.06)

(-0.25, 0.06)

ACGR

ANGR

0.01

(-0.18, 0.20)

(-0.21, 0.18)

(-0.14, 0.16)

(-0.14, 0.17)

PCGL

ANGR

0.12

(-0.04, 0.28)

(-0.02, 0.26)

(-0.03, 0.27)

(-0.03, 0.27)

PCGR

ANGR

0.01

(-0.16, 0.18)

(-0.18, 0.21)

(-0.15, 0.16)

(-0.15, 0.16)

ANGL

ANGR

0.24

(0.09, 0.39)

(0.12, 0.39)

(0.09, 0.38)

(0.09, 0.39)

SFGmedL

PCUNL

0.28

(0.14, 0.42)

(0.11, 0.40)

(0.14, 0.42)

(0.14, 0.43)

SFGmedR

PCUNL

-0.23

(-0.37, -0.09)

(-0.35, -0.06)

(-0.37, -0.08)

(-0.38, -0.08)

ACGL

PCUNL

-0.01

(-0.16, 0.14)

(-0.19, 0.09)

(-0.16, 0.14)

(-0.16, 0.14)

ACGR

PCUNL

0.17

(0.02, 0.32)

(0.04, 0.33)

(0.02, 0.31)

(0.02, 0.32)

PCGL

PCUNL

0.20

(0.05, 0.34)

(0.03, 0.32)

(0.05, 0.34)

(0.05, 0.35)

PCGR

PCUNL

-0.06

(-0.21, 0.10)

(-0.23, 0.14)

(-0.21, 0.10)

(-0.21, 0.10)

ANGL

PCUNL

-0.15

(-0.31, 0.00)

(-0.28, 0.00)

(-0.30, 0.00)

(-0.31, 0.00)

ANGR

PCUNL

-0.01

(-0.17, 0.15)

(-0.14, 0.14)

(-0.16, 0.14)

(-0.16, 0.14)

SFGmedL

PCUNR

-0.24

(-0.38, -0.09)

(-0.40, -0.08)

(-0.38, -0.09)

(-0.39, -0.09)

SFGmedR

PCUNR

0.26

(0.12, 0.40)

(0.14, 0.37)

(0.11, 0.39)

(0.11, 0.41)

ACGL

PCUNR

-0.12

(-0.27, 0.03)

(-0.23, 0.04)

(-0.27, 0.03)

(-0.27, 0.03)

ACGR

PCUNR

0.12

(-0.04, 0.27)

(-0.05, 0.26)

(-0.03, 0.27)

(-0.03, 0.27)

PCGL

PCUNR

-0.11

(-0.26, 0.03)

(-0.26, 0.07)

(-0.26, 0.04)

(-0.27, 0.04)

PCGR

PCUNR

0.40

(0.27, 0.53)

(0.21, 0.54)

(0.27, 0.52)

(0.26, 0.54)

ANGL

PCUNR

0.05

(-0.10, 0.21)

(-0.08, 0.18)

(-0.10, 0.20)

(-0.10, 0.21)

ANGR

PCUNR

0.18

(0.02, 0.34)

(0.04, 0.32)

(0.03, 0.33)

(0.03, 0.33)

PCUNL

PCUNR

0.67

(0.58, 0.76)

(0.56, 0.75)

(0.58, 0.75)

(0.56, 0.78)

Region1

Region2

Correlation

Wald

Bootstrap

Fisher

Naïve

SFGmedL

SFGmedR

0.69

(0.60, 0.77)

(0.61, 0.78)

(0.60, 0.76)

(0.58, 0.80)

SFGmedL

ACGL

0.05

(-0.10, 0.21)

(-0.13, 0.23)

(-0.10, 0.20)

(-0.10, 0.21)

SFGmedR

ACGL

-0.12

(-0.29, 0.04)

(-0.35, 0.09)

(-0.27, 0.03)

(-0.28, 0.03)

SFGmedL

ACGR

0.02

(-0.14, 0.18)

(-0.15, 0.18)

(-0.13, 0.17)

(-0.13, 0.17)

SFGmedR

ACGR

0.15

(-0.01, 0.32)

(-0.05, 0.34)

(0.00, 0.30)

(0.00, 0.30)

ACGL

ACGR

0.87

(0.84, 0.91)

(0.83, 0.90)

(0.83, 0.91)

(0.80, 0.95)

SFGmedL

PCGL

-0.13

(-0.29, 0.02)

(-0.29, 0.05)

(-0.28, 0.02)

(-0.29, 0.02)

SFGmedR

PCGL

0.02

(-0.14, 0.18)

(-0.15, 0.13)

(-0.13, 0.17)

(-0.13, 0.17)

ACGL

PCGL

0.00

(-0.16, 0.15)

(-0.13, 0.14)

(-0.15, 0.15)

(-0.16, 0.15)

ACGR

PCGL

0.04

(-0.12, 0.19)

(-0.10, 0.16)

(-0.11, 0.19)

(-0.12, 0.19)

SFGmedL

PCGR

0.09

(-0.06, 0.25)

(-0.11, 0.27)

(-0.06, 0.24)

(-0.06, 0.25)

SFGmedR

PCGR

0.05

(-0.11, 0.21)

(-0.10, 0.23)

(-0.10, 0.20)

(-0.10, 0.20)

ACGL

PCGR

0.05

(-0.11, 0.20)

(-0.14, 0.21)

(-0.11, 0.20)

(-0.11, 0.20)

ACGR

PCGR

-0.10

(-0.26, 0.05)

(-0.22, 0.04)

(-0.25, 0.05)

(-0.26, 0.05)

PCGL

PCGR

0.66

(0.57, 0.74)

(0.56, 0.73)

(0.56, 0.73)

(0.54, 0.77)

SFGmedL

ANGL

0.43

(0.29, 0.57)

(0.28, 0.55)

(0.30, 0.55)

(0.29, 0.57)

SFGmedR

ANGL

-0.04

(-0.22, 0.13)

(-0.21, 0.13)

(-0.19, 0.11)

(-0.19, 0.11)

ACGL

ANGL

-0.06

(-0.22, 0.10)

(-0.20, 0.09)

(-0.21, 0.09)

(-0.21, 0.09)

ACGR

ANGL

-0.01

(-0.17, 0.15)

(-0.13, 0.13)

(-0.16, 0.14)

(-0.16, 0.15)

PCGL

ANGL

0.28

(0.13, 0.42)

(0.08, 0.44)

(0.13, 0.41)

(0.13, 0.42)

PCGR

ANGL

-0.15

(-0.31, 0.00)

(-0.28, 0.00)

(-0.30, 0.00)

(-0.31, 0.00)

SFGmedL

ANGR

0.03

(-0.14, 0.20)

(-0.15, 0.21)

(-0.13, 0.18)

(-0.13, 0.18)

SFGmedR

ANGR

-0.12

(-0.30, 0.05)

(-0.32, 0.07)

(-0.27, 0.03)

(-0.28, 0.03)

ACGL

ANGR

0.25

(0.09, 0.40)

(0.09, 0.42)

(0.10, 0.38)

(0.10, 0.39)

ACGR

ANGR

-0.12

(-0.28, 0.05)

(-0.27, 0.01)

(-0.26, 0.04)

(-0.27, 0.04)

PCGL

ANGR

-0.22

(-0.38, -0.07)

(-0.36, -0.07)

(-0.36, -0.07)

(-0.37, -0.07)

PCGR

ANGR

0.13

(-0.03, 0.28)

(0.00, 0.29)

(-0.03, 0.27)

(-0.03, 0.28)

ANGL

ANGR

0.44

(0.30, 0.57)

(0.27, 0.55)

(0.31, 0.55)

(0.30, 0.57)

SFGmedL

PCUNL

0.11

(-0.06, 0.27)

(-0.04, 0.30)

(-0.05, 0.25)

(-0.05, 0.26)

SFGmedR

PCUNL

-0.06

(-0.24, 0.12)

(-0.25, 0.09)

(-0.21, 0.09)

(-0.21, 0.09)

ACGL

PCUNL

0.20

(0.05, 0.36)

(0.03, 0.37)

(0.05, 0.34)

(0.05, 0.35)

ACGR

PCUNL

-0.03

(-0.19, 0.13)

(-0.18, 0.13)

(-0.18, 0.12)

(-0.19, 0.12)

PCGL

PCUNL

0.14

(-0.02, 0.29)

(-0.07, 0.28)

(-0.01, 0.28)

(-0.01, 0.29)

PCGR

PCUNL

0.05

(-0.10, 0.21)

(-0.08, 0.23)

(-0.10, 0.20)

(-0.10, 0.20)

ANGL

PCUNL

0.13

(-0.04, 0.30)

(-0.13, 0.33)

(-0.02, 0.27)

(-0.02, 0.28)

ANGR

PCUNL

-0.32

(-0.48, -0.16)

(-0.50, -0.13)

(-0.45, -0.18)

(-0.47, -0.18)

SFGmedL

PCUNR

-0.13

(-0.29, 0.03)

(-0.30, 0.00)

(-0.28, 0.02)

(-0.28, 0.02)

SFGmedR

PCUNR

0.24

(0.08, 0.40)

(0.09, 0.39)

(0.10, 0.38)

(0.09, 0.39)

ACGL

PCUNR

-0.28

(-0.43, -0.12)

(-0.44, -0.11)

(-0.41, -0.13)

(-0.43, -0.13)

ACGR

PCUNR

0.16

(0.00, 0.32)

(0.03, 0.32)

(0.01, 0.31)

(0.01, 0.31)

PCGL

PCUNR

-0.10

(-0.26, 0.05)

(-0.23, 0.07)

(-0.25, 0.05)

(-0.26, 0.05)

PCGR

PCUNR

0.24

(0.10, 0.39)

(0.07, 0.36)

(0.10, 0.38)

(0.10, 0.39)

ANGL

PCUNR

-0.18

(-0.34, -0.02)

(-0.36, 0.04)

(-0.33, -0.03)

(-0.33, -0.03)

ANGR

PCUNR

0.58

(0.46, 0.70)

(0.44, 0.68)

(0.47, 0.67)

(0.46, 0.71)

PCUNL

PCUNR

0.73

(0.66, 0.81)

(0.65, 0.81)

(0.66, 0.80)

(0.63, 0.84)

Region1

Region2

Correlation

Wald

Bootstrap

Fisher

Naïve

SFGmedL

SFGmedR

0.59

(0.49, 0.69)

(0.43, 0.70)

(0.48, 0.68)

(0.47, 0.72)

SFGmedL

ACGL

0.03

(-0.11, 0.18)

(-0.13, 0.18)

(-0.12, 0.19)

(-0.12, 0.19)

SFGmedR

ACGL

0.04

(-0.11, 0.19)

(-0.10, 0.18)

(-0.11, 0.19)

(-0.11, 0.19)

SFGmedL

ACGR

0.06

(-0.09, 0.20)

(-0.09, 0.22)

(-0.10, 0.21)

(-0.10, 0.21)

SFGmedR

ACGR

0.13

(-0.01, 0.28)

(-0.02, 0.29)

(-0.02, 0.28)

(-0.02, 0.28)

ACGL

ACGR

0.82

(0.77, 0.87)

(0.74, 0.87)

(0.76, 0.86)

(0.73, 0.91)

SFGmedL

PCGL

-0.07

(-0.22, 0.08)

(-0.26, 0.10)

(-0.22, 0.08)

(-0.22, 0.08)

SFGmedR

PCGL

-0.06

(-0.21, 0.09)

(-0.21, 0.11)

(-0.21, 0.09)

(-0.21, 0.09)

ACGL

PCGL

0.18

(0.03, 0.32)

(0.02, 0.30)

(0.03, 0.32)

(0.03, 0.33)

ACGR

PCGL

-0.19

(-0.33, -0.05)

(-0.33, 0.00)

(-0.33, -0.04)

(-0.34, -0.04)

SFGmedL

PCGR

-0.12

(-0.28, 0.04)

(-0.29, 0.06)

(-0.27, 0.03)

(-0.27, 0.03)

SFGmedR

PCGR

0.23

(0.09, 0.38)

(0.09, 0.36)

(0.09, 0.37)

(0.08, 0.38)

ACGL

PCGR

-0.24

(-0.38, -0.10)

(-0.41, -0.05)

(-0.38, -0.09)

(-0.39, -0.09)

ACGR

PCGR

0.30

(0.16, 0.43)

(0.11, 0.45)

(0.15, 0.43)

(0.15, 0.44)

PCGL

PCGR

0.66

(0.58, 0.74)

(0.56, 0.73)

(0.56, 0.74)

(0.54, 0.78)

SFGmedL

ANGL

0.24

(0.09, 0.40)

(0.10, 0.39)

(0.09, 0.38)

(0.09, 0.39)

SFGmedR

ANGL

-0.14

(-0.30, 0.01)

(-0.32, 0.05)

(-0.29, 0.01)

(-0.30, 0.01)

ACGL

ANGL

-0.06

(-0.21, 0.10)

(-0.18, 0.11)

(-0.21, 0.10)

(-0.21, 0.10)

ACGR

ANGL

0.11

(-0.04, 0.25)

(-0.06, 0.21)

(-0.05, 0.25)

(-0.05, 0.26)

PCGL

ANGL

0.32

(0.19, 0.45)

(0.17, 0.46)

(0.18, 0.45)

(0.18, 0.47)

PCGR

ANGL

-0.02

(-0.19, 0.14)

(-0.16, 0.13)

(-0.18, 0.13)

(-0.18, 0.13)

SFGmedL

ANGR

-0.10

(-0.27, 0.07)

(-0.27, 0.07)

(-0.25, 0.05)

(-0.25, 0.05)

SFGmedR

ANGR

0.17

(0.01, 0.33)

(0.00, 0.34)

(0.02, 0.31)

(0.02, 0.32)

ACGL

ANGR

-0.08

(-0.22, 0.07)

(-0.22, 0.07)

(-0.23, 0.08)

(-0.23, 0.08)

ACGR

ANGR

0.07

(-0.07, 0.22)

(-0.07, 0.22)

(-0.08, 0.22)

(-0.08, 0.23)

PCGL

ANGR

-0.16

(-0.31, -0.02)

(-0.30, -0.01)

(-0.31, -0.01)

(-0.31, -0.01)

PCGR

ANGR

0.16

(0.00, 0.33)

(0.00, 0.33)

(0.01, 0.31)

(0.01, 0.31)

ANGL

ANGR

0.33

(0.18, 0.48)

(0.20, 0.46)

(0.19, 0.46)

(0.19, 0.48)

SFGmedL

PCUNL

0.24

(0.08, 0.40)

(0.06, 0.41)

(0.09, 0.38)

(0.09, 0.39)

SFGmedR

PCUNL

-0.30

(-0.44, -0.15)

(-0.44, -0.13)

(-0.43, -0.15)

(-0.44, -0.15)

ACGL

PCUNL

0.27

(0.14, 0.41)

(0.12, 0.40)

(0.13, 0.41)

(0.13, 0.42)

ACGR

PCUNL

-0.23

(-0.36, -0.09)

(-0.37, -0.05)

(-0.37, -0.08)

(-0.38, -0.08)

PCGL

PCUNL

0.07

(-0.07, 0.22)

(-0.10, 0.25)

(-0.08, 0.22)

(-0.08, 0.23)

PCGR

PCUNL

0.05

(-0.11, 0.21)

(-0.12, 0.22)

(-0.10, 0.20)

(-0.10, 0.20)

ANGL

PCUNL

0.05

(-0.13, 0.22)

(-0.10, 0.20)

(-0.11, 0.20)

(-0.11, 0.20)

ANGR

PCUNL

0.17

(0.01, 0.34)

(-0.04, 0.35)

(0.02, 0.32)

(0.02, 0.33)

SFGmedL

PCUNR

-0.01

(-0.18, 0.16)

(-0.18, 0.21)

(-0.17, 0.14)

(-0.17, 0.14)

SFGmedR

PCUNR

0.22

(0.06, 0.37)

(0.07, 0.35)

(0.07, 0.36)

(0.07, 0.37)

ACGL

PCUNR

0.01

(-0.14, 0.16)

(-0.14, 0.19)

(-0.14, 0.17)

(-0.14, 0.17)

ACGR

PCUNR

-0.04

(-0.18, 0.11)

(-0.21, 0.11)

(-0.19, 0.12)

(-0.19, 0.12)

PCGL

PCUNR

0.14

(0.00, 0.28)

(-0.02, 0.27)

(-0.01, 0.29)

(-0.01, 0.29)

PCGR

PCUNR

-0.02

(-0.19, 0.14)

(-0.21, 0.17)

(-0.17, 0.13)

(-0.18, 0.13)

ANGL

PCUNR

-0.09

(-0.25, 0.08)

(-0.27, 0.07)

(-0.23, 0.07)

(-0.24, 0.07)

ANGR

PCUNR

0.23

(0.07, 0.40)

(0.04, 0.44)

(0.08, 0.37)

(0.08, 0.38)

PCUNL

PCUNR

0.47

(0.33, 0.60)

(0.35, 0.57)

(0.34, 0.58)

(0.33, 0.60)

Code
# Determining common statistically significant correlations
commonSigs <- Reduce(map(.x = 1:nCandidates, .f = function(x) {
  p.adjust(pvalueMats[[x]][triInds], method = "holm", 
           n = nCandidates*length(pvalueMats[[x]][triInds])) < 0.05
}), f = "*")

for(s in 1:sum(commonSigs)) {
print(roiNames[regionInds[as.logical(commonSigs), ][s, ], ])
}

After applying a multiplicity adjustment as proposed by Holm (1979), the partial correlation between the right and left cingulum posterior regions, and the partial correlation between the right and left precuneus regions were statistically significant for all participants at the \(5\%\) significance level.

References

  1. Cameron Craddock, Yassine Benhajali, Carlton Chu, Francois Chouinard, Alan Evans, András Jakab, Budhachandra Singh Khundrakpam, John David Lewis, Qingyang Li, Michael Milham, Chaogan Yan, Pierre Bellec (2013). The Neuro Bureau Preprocessing Initiative: open sharing of preprocessed neuroimaging data and derivatives. In Neuroinformatics 2013, Stockholm, Sweden.

  2. Holm, S. (1979). A simple sequentially rejective multiple test procedure. Scandinavian Journal of Statistics, 6, 65–70. https://www.jstor.org/stable/4615733.