#+startup: beamer #+TITLE: Structural similarity networks predict #+TITLE: clinical outcome in early-phase schizophrenia * Preamble :ignore: ** General comments :ignore: # ---------------------------------------------------------------------- # - Turn on synonyms by starting synosaurus-mode # - Look up words using C-c sr # - Turn on dictionary by starting flyspell-mode # - Count words by section using org-wc-display # ---------------------------------------------------------------------- ** Specific comments for this manuscript :ignore: # ---------------------------------------------------------------------- ** org specific settings :ignore: # ---------------------------------------------------------------------- #+OPTIONS: email:nil toc:nil num:nil author:nil date:t tex:t title:nil #+STARTUP: align fold #+SEQ_TODO: TODO(t) | DONE(d) #+TAGS: figure(f) check(c) noexport(n) ignore(i) #+LANGUAGE: en #+EXCLUDE_TAGS: noexport TODO #+DATE: {{{time(%Y-%m-%d %H:%M)}}} # ---------------------------------------------------------------------- ** Latex header :ignore: # ---------------------------------------------------------------------- #+LATEX_CLASS: mybeamerposter #+LATEX_HEADER: \setlength{\paperwidth}{36in} #+LATEX_HEADER: \setlength{\paperheight}{48in} #+LATEX_HEADER: \setlength{\textwidth}{0.98\paperwidth} #+LATEX_HEADER: \setlength{\textheight}{0.98\paperheight} # LATEX_HEADER: \usepackage[absolute,overlay]{textpos} #+LATEX_HEADER: \graphicspath{{../output/figures/}{../lib/}} #+LATEX_HEADER: \usepackage[export]{adjustbox} #+LATEX_HEADER: \usepackage{graphicx,caption} #+LATEX_HEADER: \usepackage{eurosym} #+LATEX_HEADER: \usepackage{textcomp} #+LATEX_HEADER: \usepackage{bibentry} # LATEX_HEADER: \setlength{\TPVertModule}{1cm} # LATEX_HEADER: \setlength{\oddsidemargin}{0.1in} # LATEX_HEADER: \title{The demise of the spotted swamp frog} # LATEX_HEADER: \author{Rob J Hyndman} # LATEX_HEADER: \footer{ # LATEX_HEADER: \textbf{Philipp Homan, MD, PhD}\\ # LATEX_HEADER: phoman1@northwell.edu\\ # LATEX_HEADER: github.com/philipphoman} #+LATEX_HEADER: \date{} # ---------------------------------------------------------------------- ** Authors and affiliations :ignore: # ---------------------------------------------------------------------- #+LATEX_HEADER: \author{ #+LATEX_HEADER: Philipp Homan$^{1}$, #+LATEX_HEADER: Miklos Argyelan$^{1}$, #+LATEX_HEADER: Pamela DeRosse$^{1}$, #+LATEX_HEADER: Delbert Robinson$^{1}$, #+LATEX_HEADER: John M. Kane$^{1}$, #+LATEX_HEADER: Todd Lencz$^{1}$, #+LATEX_HEADER: Anil K. Malhotra$^{1}$ #+LATEX_HEADER: \\ #+LATEX_HEADER: \normalsize{$^{1}$Department of Psychiatry,} #+LATEX_HEADER: \normalsize{The Donald and Barbara Zucker} #+LATEX_HEADER: \normalsize{School of Medicine at Northwell/Hofstra,} #+LATEX_HEADER: \normalsize{Hempstead, NY}\\ #+LATEX_HEADER: } # ---------------------------------------------------------------------- ** Buffer-wide source code blocks :ignore: # ---------------------------------------------------------------------- # Set elisp variables need for nice formatting We want no new lines in # inline results and a paragraph size of 80 characters Important: this # has to be evaluated witch C-c C-c in order to work in the current # buffer #+BEGIN_SRC emacs-lisp :exports none :results silent ; set timestamp format ;(setq org-export-date-timestamp-format "%FT%T%z") (require 'org-wc) (flyspell-mode t) ;(evil-declare-change-repeat 'company-complete) (setq synosaurus-choose-method 'popup) (synosaurus-mode t) (auto-complete-mode t) ;(ac-config-default) ;(add-to-list 'ac-modes 'org-mode) (linum-mode t) (whitespace-mode t) (setq org-babel-inline-result-wrap "%s") (setq org-export-with-broken-links "mark") (setq fill-column 72) (setq whitespace-line-column 72) ;(setq org-latex-caption-above '(table image)) (setq org-latex-caption-above nil) (org-toggle-link-display) ; don't remove logfiles at export (setq org-latex-remove-logfiles nil) ; Keybindings ; (global-set-key (kbd " c") "#+CAPTION: ") (defun setfillcolumn72 () (interactive) (setq fill-column 72) ) (defun setfillcolumn42 () (interactive) (setq fill-column 42) ) (define-key org-mode-map (kbd "C-c c #") "#+CAPTION: ") (define-key org-mode-map (kbd "C-c l #") "#+LATEX_HEADER: ") (define-key org-mode-map (kbd "C-c f c 4 2") 'setfillcolumn42) (define-key org-mode-map (kbd "C-c f c 7 2") 'setfillcolumn72) (setq org-odt-category-map-alist '(("__Figure__" "*Figure*" "value" "Figure" org-odt--enumerable-image-p))) ; let ess not ask for starting directory (setq ess-ask-for-ess-directory nil) ;(setq org-latex-pdf-process '("latexmk -pdflatex='xelatex ;-output-directory=../output/tex/ -interaction nonstopmode' -pdf ;-bibtex -f %f")) (setq org-latex-logfiles-extensions (quote("bcf" "blg" "fdb_latexmk" "fls" "figlist" "idx" "log" "nav" "out" "ptc" "run.xml" "snm" "toc" "vrb" "xdv"))) ; deactivate link resolving (setq org-activate-links nil) #+END_SRC # # # # ---------------------------------------------------------------------- ** End preamble :ignore: # ---------------------------------------------------------------------- * References :ignore: \bibliographystyle{nature} \nobibliography{master} * The poster :PROPERTIES: :BEGIN: :BEAMER_env: fullframe :END: ** Code :ignore: # First, make sure all variables are availabe #+HEADER: :exports none #+BEGIN_SRC R :results silent :session source("../src/fe_func.R") source("../src/fe_load.R") fef <- read.csv("../data/fe_cidar.csv") feo <- read.csv("../data/fe_omega3.csv") hca <- read.csv("../data/fe_hcm.csv") # Load necessary results tables roistab <- read.csv("../output/tables/fe_freesurfer_roinames.csv") roitvalstab <- read.csv("../output/tables/fe_freesurfer_roitvals.csv") permuttab <- read.csv("../output/tables/fe_msn_permut_rsq.csv") bootstraptab <- read.csv("../output/tables/fe_msn_bootstrap_rsq.csv") crossvaltab <- read.csv("../output/tables/fe_msn_crossvalidation.csv") graphsumtab <- read.csv("../output/tables/fe_freesurfer_graphsum.csv") plsrtab <- read.csv("../output/tables/fe_msn_plsscore_rs.csv") deltadegreestab <- read.csv("../output/tables/fe_freesurfer_deltadegrees.csv") # Custom functions pvalstr <- function(pval) { if (pval < 0.001) { return("< 0.001") } else { return(paste("=", round(pval, 3))) } } #+END_SRC #+HEADER: :exports none #+BEGIN_SRC R :results silent :session :cache yes # Merge data sets and keep only interesting variables # Rename variables for later fefa <- fef %>% dplyr::filter(day==0&included16w==1) %>% dplyr::mutate(study="CIDAR", group="SZ") %>% dplyr::select(dup, iq, mccb, bprs, bprs_td, bprs_tdbl, age, sex, race, hasmri, study, group, education, bmi, class, alcohol, drugs) feoa <- feo %>% dplyr::filter(day==0&included16w==1) %>% dplyr::mutate(study="Omega3", group="SZ") %>% dplyr::select(dup, iq, mccb, bprs, bprs_td, bprs_tdbl, age, sex, race, hasmri, study, group, education, bmi, class, alcohol, drugs) #hca$male[hca$sex==1] <- 1 #hca$female[hca$sex==2] <- 1 hcab <- hca %>% dplyr::rename(age=age) %>% filter(age<50) %>% dplyr::select(sex, age, education, iq) %>% dplyr::mutate(study="HC", group="HC") hcmeanage <- round(mean(hcab$age), 1) hcsdage <- round(sd(hcab$age), 1) hcmales <- sum(hcab$sex==1, na.rm=TRUE) hcfemales <- sum(hcab$sex==2, na.rm=TRUE) feffeo <- rbind(fefa, feoa) %>% filter(hasmri==1) # Custom function parse_agesex <- function() { print(paste("(", n_females, " females; mean age [SD] = ", meanage, " [", sdage, "])", sep="")) } parse_n <- function(group) { switch(group, sz={ print(paste("(/N/ = ", n_partic, ")", sep="")) }, hc={ print(paste("(/N/ = ", n_partic_hc, ")", sep="")) }) } # R version rvers <- version$version.string # Python version # pyvers <- system("python --version") # pysurfvers <- system("pip freeze | grep pysurf") #pyvers <- "2.7.13" #pysurfvers <- "0.7" pyplusvers <- system("pyv=$(python -V 2>&1); echo $pyv", intern=TRUE) pysurfplusvers <- system("pip list | grep pysurf", intern=TRUE) # Custom variables n_nodes <- 2 * nlevels(roistab$name) n_partic <- nrow(feffeo) n_partic_hc <- nrow(hcab) n_partic_full_bothsamples <- nrow(rbind(fef %>% filter(day==0), feo %>% filter(day==0))) n_females <- sum(feffeo$sex==1) n_males <- sum(feffeo$sex==2) meanage <- round(mean(feffeo$age, na.rm=TRUE), 1) sdage <- round(sd(feffeo$age, na.rm=TRUE), 1) # Cross validation values cvkfold_k <- crossvaltab$k cvrsq_mean <- crossvaltab$mean cvrsq_sd <- crossvaltab$sd # Permutation and bootstrap values rsqorig <- unique(permuttab$rsq_orig) npermut <- unique(permuttab$niter) prsq_pval <- unique(permuttab$prsq_pva) # PLS correlation values pls1r <- plsrtab$r[plsrtab$component=="PLS1"] pls1rpval <- plsrtab$pval[plsrtab$component=="PLS1"] pls2r <- plsrtab$r[plsrtab$component=="PLS2"] pls2rpval <- plsrtab$pval[plsrtab$component=="PLS2"] # Graph summary, drop Cp and keep transitivity # as the two are essential equal graphsumtab <- graphsumtab %>% filter(metric!="Cp") %>% mutate(metric=recode(metric, transitivity="Cluster coef.", diameter="Diameter", E.global="Global efficiency", E.local="Local efficiency", num.hubs="Number of hubs", richclub="Rich club coef.", vulnerability="Vulnerability")) #+END_SRC ** Left column :BMCOL: :PROPERTIES: :BEAMER_col: 0.45\textwidth :BEAMER_opt: [t] :END: *** Background :B_block: :PROPERTIES: :BEAMER_env: block :END: - Schizophrenia has long been considered a disorder of dysconnectivity in the brain - Using graph theory, we computed statistical similarity networks for each individual (Fig [[figflowchart]], [[figshrinkage]]) in two early-phase schizophrenia cohorts src_R[:session]{parse_n("sz")} {{{results((/N/ = 82))}}} and in healthy controls src_R[:session]{parse_n("hc")} {{{results((/N/ = 77))}}} and tested whether network architecture predicted treatment response *** Methods: Structural similarity networks :B_block: :PROPERTIES: :BEAMER_env: block :END: \captionsetup{justification=justified,width=.85\linewidth} #+NAME: figflowchart #+CAPTION: *Analysis flow chart.* #+CAPTION: The similarity between any pair of region was #+CAPTION: estimated by calculating the #+CAPTION: Kullback-Leibler (KL) divergence of their #+CAPTION: probability distributions, resulting in #+CAPTION: a similarity matrix. #+CAPTION: The similarity matrix #+CAPTION: was then thresholded into a binary matrix to #+CAPTION: create a network graph. Graph-based #+CAPTION: degree (or hubness) for each node was then #+CAPTION: calculated for each individual participant. #+CAPTION: Nodal degrees were then entered as #+CAPTION: predictors into a partial #+CAPTION: least squares regression, using individual #+CAPTION: treatment response slopes as outcome #+CAPTION: measure. #+ATTR_LATEX: :width 0.85\textwidth [[file:fe_freesurfer_flowchart.pdf]] *** Methods: Individual treatment response :B_block: :PROPERTIES: :BEAMER_env: block :END: \captionsetup{justification=justified,width=.85\linewidth} #+NAME: figshrinkage #+CAPTION: *Partial pooling to regularize individual response slopes.* #+CAPTION: *A.* *Individual time courses for all participants* #+CAPTION: *from the first schizophrenia cohort.* #+CAPTION: Partial pooling regularized #+CAPTION: the individual slopes, i.e., the influence #+CAPTION: of outliers with only few assessments was attenuated. #+CAPTION: *B.* *The partial pooling effect* #+CAPTION: *is demonstrated by the individual responses being* #+CAPTION: *pulled toward the average treatment effect.* #+CAPTION: As a consequence, outliers are less influential. #+CAPTION: *C, D.* The same is shown for the second schizophrenia #+CAPTION: cohort. #+CAPTION: Dotted ellipses indicate confidence regions for the #+CAPTION: average treatment effect. #+ATTR_LATEX: :width 0.85\textwidth [[file:fe_freesurfer_shrinkage.pdf]] ** Right column :BMCOL: :PROPERTIES: :BEAMER_col: 0.45\textwidth :BEAMER_opt: [t] :END: *** Results: Partial least squares regression :B_block: :PROPERTIES: :BEAMER_env: block :END: - Individual differences in the configuration of structural similarity networks explained a significant proportion of variance in treatment response (Fig. [[figplsbrains]]) - Exploratory analysis: increased clustering and decreased network integration in patients compared to controls (Fig. [[figge]], [[figclus]]) \captionsetup{justification=justified,width=.8\linewidth} #+NAME: figplsbrains #+CAPTION: *PLS scores with individual treatment* #+CAPTION: *response and contribution of cortical nodes* #+CAPTION: *in the schizophrenia cohort* #+CAPTION: Nodal degree for each of #+CAPTION: the src_R[:session]{n_nodes} {{{results(68)}}} #+CAPTION: was entered into a partial least squares (PLS) #+CAPTION: regression, with individual treatment response #+CAPTION: slopes as outcome measure. The first two #+CAPTION: PLS components explained a significant proportion #+CAPTION: of variance in treatment response. *A, B.* The first #+CAPTION: PLS component correlated most strongly with #+CAPTION: nodal degree of orbito- and prefrontal cortices #+CAPTION: and posterior cingulate cortex. Note that #+CAPTION: more negative slopes meant better #+CAPTION: treatment response. #+CAPTION: *B, C.* The second PLS component correlated most #+CAPTION: most strongly with superior temporal, precentral, #+CAPTION: and middle cingulate brain areas. #+ATTR_LATEX: :width 0.8\textwidth [[file:fe_freesurfer_plsbrains.pdf]] *** Results: Increased clustering in patients :B_block: :PROPERTIES: :BEAMER_env: block :END: **** Left :PROPERTIES: :BEAMER_col: 0.48 :BEAMER_opt: [T] :END: \captionsetup{justification=justified,width=.8\linewidth} #+NAME: figge #+CAPTION: *Decreased network integration in* #+CAPTION: *schizophrenia patients compared to controls.* #+CAPTION: Means with error bands #+CAPTION: are shown. #+CAPTION: Non-overlapping error bands #+CAPTION: indicate significant group differences (/P/ < 0.05). #+ATTR_LATEX: :width 0.9\textwidth :options page=3 [[file:fe_freesurfer_graphsum_individual.pdf]] **** Right :PROPERTIES: :BEAMER_col: 0.48 :BEAMER_opt: [T] :END: \captionsetup{justification=justified,width=.8\linewidth} #+NAME: figclus #+CAPTION: *Increased clustering in schizophrenia patients* #+CAPTION: *compared to controls.* #+CAPTION: Means with error bands are shown. #+CAPTION: Non-overlapping error bands #+CAPTION: indicate significant group differences (/P/ < 0.05). #+ATTR_LATEX: :width 0.9\textwidth :options page=9 [[file:fe_freesurfer_graphsum_individual.pdf]] *** Conclusions :B_block: :PROPERTIES: :BEAMER_env: block :END: - These data suggest a potential link between brain network morphology and clinical outcome in early-phase schizophrenia