OSCR

Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches
  1. [1] § Methods › Common variant enrichment analysis ↔ Fig2.Rmd, lines 231–325 · score 0.78 · NPD SNPs ranked, full GWAS, median rank, NPD GWAS, cortical GWAS, FDR
  2. [2] § Results › Structural variants preferentially affect surface area with larger effects than psychiatric diagnoses ↔ Fig2.Rmd, lines 231–325 · score 0.64 · median ranking, ranked NPD associated, NPD SNPs, cortical GWAS, ADHD, MDD
  3. [3] § Methods › Twin and SNP Heritability Estimates ↔ Fig4.Rmd, lines 119–223 · score 0.63 · Twin heritability, spin permutation, cortical gradient, profiles, regional, correlated
  4. [4] § Methods › Cortical gradient analysis ↔ Fig4.Rmd, lines 119–223 · score 0.62 · gene expression, cortical gradient, Regional profiles, Desikan, correlated
  5. [5] § Results › Structural variants preferentially affect sensorimotor cortex, diverging from psychiatric diagnostic patterns ↔ Fig4.Rmd, lines 10–117 · score 0.51 · regional CT, regional profiles, cortical gradient, NPD associated common, common variant, twin

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

R Markdown · 419 lines · 16 KB · MIT · 3 matches

  1. ---
  2. title: "Fig4"
  3. output: github_document
  4. ---
  5. ```{r setup, include=FALSE}
  6. knitr::opts_chunk$set(echo = TRUE, warning = FALSE)
  7. ```
  8. ## Fig. 4: statistics and panel figures
  9. Panel A) number of FDR significant cortical regions (out of 34) per CNV/NPD for cortical thickness (up, red) and surface area (down, blue). B) Regional profiles of twin heritability, and mean absolute effect sizes across common and rare genetic variants and NPDs for cortical thickness and surface area across 34 Desikan cortical regions. Each point represents: i) First two: the twin heritability and 95% CI; ii) third: mean estimate from linear regression for NPD associated common variants (SA NPD-SNPs); and iii) bottom four: mean absolute effect size (Cohen’s d), with error bars showing the standard error of the mean. X-axis: cortical regions ordered according to the cortical gradient from sensorimotor to association regions. Dotted line: correlation with the cortical gradient.
  10. ## Plot Fig. 4 A: Number of FDR significant cortical regions CNV and NPDs
  11. ```{r fig_4a, echo=TRUE}
  12. library(ggplot2)
  13. library(ggprism) # we use ggprism theme
  14. library(ggrepel)
  15. library(dplyr)
  16. ## Load data for 4A
  17. load(file = paste0("data_fig4a_es_pval_CNVs_NPDs.RData"))
  18. ## 1. function to apply FDR across a matrix of p-values
  19. fPval_adj_in_mat <- function(in_pval_mat,padj_method='fdr'){
  20. in_pval_mat_FDR <- matrix(p.adjust(as.vector(as.matrix(in_pval_mat)), method=padj_method),ncol=ncol(in_pval_mat))
  21. return(in_pval_mat_FDR)
  22. }
  23. ## 2. Function to count number of FDR significant ROIs per CNV/NPD
  24. count_nfdr_rois = function(df_pval_CT_adj,df_pval_SA_adj){
  25. #num_cols <- ncol(df_pval_CT_adj)
  26. exp_names <- colnames(df_pval_CT_adj) # Assuming column names are the same in both data frames
  27. nsig_fdr_CT <- colSums(df_pval_CT_adj < 0.05)
  28. nsig_fdr_SA <- colSums(df_pval_SA_adj < 0.05)
  29. df_nfdr_rois_CT_SA <- data.frame(
  30. exp_names = exp_names,
  31. nsig_fdr_CT = nsig_fdr_CT,
  32. nsig_fdr_SA = nsig_fdr_SA
  33. )
  34. return(df_nfdr_rois_CT_SA)
  35. }
  36. ## 3. Function to make barplot with number of FDR signif ROIs per CNV/NPD
  37. ##
  38. col_values_metric = c("CT" = "#e41a1c", "SA" = "#377eb8")
  39. barplot_nfdr <- function(df_subset, current_type) {
  40. # Calculate means for lines
  41. mean_CT <- mean(df_subset$nsig_fdr_CT)
  42. mean_SA <- mean(df_subset$nsig_fdr_SA)
  43. p <- ggplot(df_subset, aes(x = exp_names)) +
  44. geom_bar(aes(y = nsig_fdr_CT), stat = "identity", fill = "#e41a1c", color = "black") +
  45. geom_bar(aes(y = -nsig_fdr_SA), stat = "identity", fill = "#377eb8", color = "black") + # Negative for flipped axis
  46. # Add values on top of bars
  47. geom_text(aes(y = nsig_fdr_CT, label = nsig_fdr_CT), vjust = -1, size = 3) + # vjust = -0.5,
  48. geom_text(aes(y = -nsig_fdr_SA, label = nsig_fdr_SA), vjust = 1.5, size = 3) + # vjust = 1.5,
  49. scale_y_continuous(
  50. limits = c(-35,35),
  51. breaks = seq(-30, 30, by = 10),
  52. labels = function(x) ifelse(x < 0, -x, x) # Show positive values on both sides
  53. ) +
  54. labs(title = NULL, x = NULL, y = "Count") +
  55. theme_bw() +
  56. theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotate x-axis labels if needed
  57. #print(p)
  58. return(p)
  59. }
  60. ## 1. FDR across regional CT and SA p-values for CNVs
  61. p_stacked_CNVs = cbind(df_pval_CT_CNVs,df_pval_SA_CNVs)
  62. p_stacked_CNVs_Adj = as.data.frame(fPval_adj_in_mat(p_stacked_CNVs,padj_method='fdr'))
  63. df_pval_CT_CNVs_adj = as.data.frame(p_stacked_CNVs_Adj[,c(1:ncol(df_pval_CT_CNVs))])
  64. df_pval_SA_CNVs_adj = as.data.frame(p_stacked_CNVs_Adj[,c( (ncol(df_pval_CT_CNVs) + 1):ncol(p_stacked_CNVs_Adj))])
  65. colnames(df_pval_CT_CNVs_adj) = colnames(df_pval_CT_CNVs)
  66. colnames(df_pval_SA_CNVs_adj) = colnames(df_pval_SA_CNVs)
  67. ## Count number of FDR signficant ROIs
  68. df_nfdr_rois_CT_SA_CNVs = count_nfdr_rois(df_pval_CT_CNVs_adj,df_pval_SA_CNVs_adj)
  69. ## Make barplot
  70. df = df_nfdr_rois_CT_SA_CNVs
  71. current_type = "CNV"
  72. pbar_n_fdr_cnv = barplot_nfdr(df, current_type) + ggtitle("CNV: # FDR signif ROIs (max= 34 Desikan ROIs)")
  73. print(pbar_n_fdr_cnv)
  74. ## 2. FDR across regional CT and SA p-values for NPDs
  75. p_stacked_NPDs = cbind(df_pval_CT_NPDs_all,df_pval_SA_NPDs_all)
  76. p_stacked_NPDs_Adj = as.data.frame(fPval_adj_in_mat(p_stacked_NPDs,padj_method='fdr'))
  77. df_pval_CT_NPDs_adj = as.data.frame(p_stacked_NPDs_Adj[,c(1:ncol(df_pval_CT_NPDs_all))])
  78. df_pval_SA_NPDs_adj = as.data.frame(p_stacked_NPDs_Adj[,c( (ncol(df_pval_CT_NPDs_all) + 1):ncol(p_stacked_NPDs_Adj))])
  79. colnames(df_pval_CT_NPDs_adj) = colnames(df_pval_CT_NPDs_all)
  80. colnames(df_pval_SA_NPDs_adj) = colnames(df_pval_SA_NPDs_all)
  81. ## Count number of FDR signficant ROIs
  82. df_nfdr_rois_CT_SA_NPDs = count_nfdr_rois(df_pval_CT_NPDs_adj,df_pval_SA_NPDs_adj)
  83. ## Make barplot
  84. df = df_nfdr_rois_CT_SA_NPDs
  85. current_type = "NPD"
  86. pbar_n_fdr_npd = barplot_nfdr(df, current_type) + ggtitle("NPD: # FDR signif ROIs (max= 34 Desikan ROIs)")
  87. print(pbar_n_fdr_npd)
  88. ```
  89. ## Statistics Fig. 4 B: Regional profiles of CT and SA twin heritability and concensus maps (mean absolute effect sizes)
  90. ```{r Stats4b, echo=TRUE}
  91. ## 1. load data for Fig. 4B
  92. # a. Regional twin hearitability estimates from Grasby 2020
  93. load("data_fig4b_twin_h2_CT_SA.RData") ## loads df: data_fig4b_twin_h2 ## NOTE: SA are adjusted for total SA
  94. # b. Mean absolute effect sizes + SE for CNVs, NPDs, and NPD-SNPs
  95. load(file = paste0("data_fig4b_meanAbsES_SNPs_CNVs_NPDs.RData")) ## loads df: data_fig4b
  96. ## 2. Statistics: Correlation + spin permutation p-value with cortical gradient
  97. # function to compute correlation with a reference profile + spin permutation p-value
  98. load("df_perm_ids_DesikanLH34_nIterNull_10000.RData") # pre-compute NULL spin rotations
  99. # # A .------ Spin Perm test --------------------
  100. get_pspin = function(x,y,perm.id,corr.type='pearson') {
  101. nroi = dim(perm.id)[1] # number of regions
  102. nperm = dim(perm.id)[2] # number of permutations
  103. corr_emp = cor(x,y,method=corr.type) # empirical correlation
  104. # permutation of measures
  105. x.perm = y.perm = array(NA,dim=c(nroi,nperm))
  106. for (r in 1:nperm) {
  107. for (i in 1:nroi) {
  108. x.perm[i,r] = x[perm.id[i,r]]
  109. y.perm[i,r] = y[perm.id[i,r]]
  110. }
  111. }
  112. # correlation to unpermuted measures
  113. rho.null.xy = rho.null.yx = vector(length=nperm)
  114. for (r in 1:nperm) {
  115. rho.null.xy[r] = cor(x.perm[,r],y,method=corr.type)
  116. rho.null.yx[r] = cor(y.perm[,r],x,method=corr.type)
  117. }
  118. # p-value definition depends on the sign of the empirical correlation
  119. if (corr_emp>0) {
  120. p_xy = sum(rho.null.xy>corr_emp)/nperm
  121. p_yx = sum(rho.null.yx>corr_emp)/nperm
  122. } else {
  123. p_xy = sum(rho.null.xy<corr_emp)/nperm
  124. p_yx = sum(rho.null.yx<corr_emp)/nperm
  125. }
  126. # return average p-value
  127. pval_avg <- (p_xy+p_yx)/2
  128. # check if p-value is 0; set to minimum or 1/nperm
  129. if(pval_avg == 0){
  130. pval_avg = 1/nperm
  131. }
  132. return(pval_avg)
  133. }
  134. cor_pspin_with_gradient = function(df_map_mat,ref_profile,df_perm_ids_LH,corr.type){
  135. array_map_name = c()
  136. array_cor = c()
  137. array_pspin = c()
  138. for( loop_a in c(1:ncol(df_map_mat))){
  139. array_map_name = c(array_map_name,colnames(df_map_mat)[loop_a])
  140. temp_cor = cor(df_map_mat[c(1:34),loop_a],ref_profile)
  141. temp_pspin = get_pspin(df_map_mat[c(1:34),loop_a],ref_profile,perm.id = df_perm_ids_LH,corr.type=corr.type)
  142. array_cor = c(array_cor,temp_cor)
  143. array_pspin = c(array_pspin,temp_pspin)
  144. }
  145. df_cor_pspin_with_ref = data.frame(map = array_map_name,
  146. cor = array_cor,
  147. pspin = array_pspin)
  148. return(df_cor_pspin_with_ref)
  149. }
  150. ## Make a df of all 7 maps (ROIs are ordered along ggseg Desikan ROIs order)
  151. df_regional_maps = data.frame(twin_h2_CT = data_fig4b_twin_h2[,"twin_h2_CT"], twin_h2_SA = data_fig4b_twin_h2[,"twin_h2_SA"],
  152. SNPs_NPD_SA = data_fig4b[,"meanES_SA_NPD_SNPs"],
  153. CNVs_CT = data_fig4b[,"meanES_CT_CNVs"],
  154. CNVs_SA = data_fig4b[,"meanES_SA_CNVs"],
  155. NPDs_CT = data_fig4b[,"meanES_CT_NPDs"],
  156. NPDs_SA = data_fig4b[,"meanES_SA_NPDs"])
  157. ## Correlation with gradient (transcriptomics: PC1 of AHBA gene-expression)
  158. array_cortical_gradient = data_fig4b[,"cortical_gradient"]
  159. df_cor_pspin_with_gradient_fig4b = cor_pspin_with_gradient(df_map_mat = df_regional_maps,ref_profile = array_cortical_gradient,df_perm_ids_LH,corr.type="pearson")
  160. print("Statistics: correlations of regional profiles with cortical gradient")
  161. print(df_cor_pspin_with_gradient_fig4b)
  162. ```
  163. ## Plots Fig. 4 B: Regional profiles of CT and SA twin heritability and cortical gradient
  164. ```{r Fig4b_twin_h2, echo=TRUE}
  165. ## Make plots
  166. ## Fix ROI input order: gradient => Sensorimotor to Association
  167. array_input_gradient = data_fig4b[,"cortical_gradient"]
  168. index_order = order(array_input_gradient,decreasing = FALSE)
  169. input_order = data_fig4b[index_order,"roi"]
  170. plot_point_h2 <- function(df,input_order,input_color,in_y_label,ylim_min,ylim_max) {
  171. # Order ROIs by input_order
  172. df$ROI <- factor(df$ROI, levels = input_order)
  173. df[,"ROI_numeric"] <- as.numeric(factor(df$ROI)) # Create numeric ROI index
  174. p <- ggplot(df, aes(x = ROI, y = h2)) +
  175. theme_prism(base_size = 14,base_line_size = 0.75) +
  176. geom_errorbar(aes(x = ROI, ymin = h2_min, ymax = h2_max),
  177. color = input_color, width = 0.1,inherit.aes = FALSE) + # Add error bars
  178. geom_point( size=2,color = input_color) +
  179. geom_smooth(aes(x = ROI_numeric, y = h2), # Use numeric ROI
  180. method = "lm", color = "black", linetype = "dashed", se = FALSE) +
  181. scale_x_discrete(labels = df$ROI, breaks = df$ROI) + #Keep original ROI labels
  182. labs(x = NULL,y = in_y_label) +
  183. ylim(c(ylim_min,ylim_max))+
  184. guides(size = "none") +
  185. theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
  186. panel.grid.major = element_blank(),
  187. panel.grid.minor = element_blank())
  188. return(p) # Return the plot object
  189. }
  190. ## 1. CT twin h2
  191. input_color = "#e41a1c" # color code for CT
  192. in_y_label = "Twin heritability"
  193. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  194. h2 = data_fig4b_twin_h2[,"twin_h2_CT"],
  195. h2_min = data_fig4b_twin_h2[,"twin_h2_CT_ymin"],
  196. h2_max = data_fig4b_twin_h2[,"twin_h2_CT_ymax"])
  197. plot_CT_twin_h2 <- plot_point_h2(df,input_order,input_color,in_y_label,ylim_min = 0.15,ylim_max = 0.8)
  198. temp_title = paste0("CT twin h2; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[1,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[1,"pspin"],4))
  199. plot_CT_twin_h2 = plot_CT_twin_h2 + ggtitle(temp_title)
  200. print(plot_CT_twin_h2)
  201. ## 2. SA twin h2 (adj for total SA)
  202. input_color = "#377eb8" # color code for SA
  203. in_y_label = "Twin heritability"
  204. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  205. h2 = data_fig4b_twin_h2[,"twin_h2_SA"],
  206. h2_min = data_fig4b_twin_h2[,"twin_h2_SA_ymin"],
  207. h2_max = data_fig4b_twin_h2[,"twin_h2_SA_ymax"])
  208. plot_SA_twin_h2 <- plot_point_h2(df,input_order,input_color,in_y_label,ylim_min = 0.15,ylim_max = 0.8)
  209. temp_title = paste0("SA twin h2; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[2,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[2,"pspin"],4))
  210. plot_SA_twin_h2 = plot_SA_twin_h2 + ggtitle(temp_title)
  211. print(plot_SA_twin_h2)
  212. ```
  213. ## Plots Fig. 4 B: Regional CT and SA concensus maps (mean absolute effect sizes) and cortical gradient
  214. ```{r Fig4b_concensus, echo=TRUE}
  215. ## Make plots
  216. plot_point_mean_effect_sizes <- function(df,input_order,input_color,in_y_label,ylim_min,ylim_max) {
  217. # Order ROIs by input_order
  218. df$ROI <- factor(df$ROI, levels = input_order)
  219. df[,"ROI_numeric"] <- as.numeric(factor(df$ROI)) # Create numeric ROI index
  220. p <- ggplot(df, aes(x = ROI, y = ES)) +
  221. theme_prism(base_size = 14,base_line_size = 0.75) +
  222. geom_errorbar(aes(x = ROI, ymin = ES_min, ymax = ES_max),
  223. color = input_color, width = 0.1,inherit.aes = FALSE) + # Add error bars
  224. geom_point( size=2,color = input_color) +
  225. geom_smooth(aes(x = ROI_numeric, y = ES), # Use numeric ROI
  226. method = "lm", color = "black", linetype = "dashed", se = FALSE) +
  227. scale_x_discrete(labels = df$ROI, breaks = df$ROI) + #Keep original ROI labels
  228. labs(x = NULL,y = in_y_label) +
  229. ylim(c(ylim_min,ylim_max))+
  230. guides(size = "none") +
  231. theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
  232. panel.grid.major = element_blank(),
  233. panel.grid.minor = element_blank())
  234. return(p) # Return the plot object
  235. }
  236. ## row 3. effect sizes SA NPD-SNPs (linear regression estimates from Grasby 2020)
  237. input_color = "#377eb8" # color code for SA
  238. in_y_label = "Effect size"
  239. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  240. ES = data_fig4b[,"meanES_SA_NPD_SNPs"],
  241. ES_min = data_fig4b[,"meanES_SA_NPD_SNPs"] - data_fig4b[,"SE_SA_NPD_SNPs"],
  242. ES_max = data_fig4b[,"meanES_SA_NPD_SNPs"] + data_fig4b[,"SE_SA_NPD_SNPs"])
  243. plot_SA_NPD_SNPs <- plot_point_mean_effect_sizes(df,input_order,input_color,in_y_label,ylim_min = 0,ylim_max = 7)
  244. temp_title = paste0("SA NPD SNPs; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[3,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[3,"pspin"],4))
  245. plot_SA_NPD_SNPs = plot_SA_NPD_SNPs + ggtitle(temp_title)
  246. print(plot_SA_NPD_SNPs)
  247. ## row 4. effect sizes CT CNVs
  248. input_color = "#e41a1c" # color code for CT
  249. in_y_label = "Effect size"
  250. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  251. ES = data_fig4b[,"meanES_CT_CNVs"],
  252. ES_min = data_fig4b[,"meanES_CT_CNVs"] - data_fig4b[,"SE_CT_CNVs"],
  253. ES_max = data_fig4b[,"meanES_CT_CNVs"] + data_fig4b[,"SE_CT_CNVs"])
  254. plot_CT_CNVs <- plot_point_mean_effect_sizes(df,input_order,input_color,in_y_label,ylim_min = 0.1,ylim_max = 0.5)
  255. temp_title = paste0("CT CNVs; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[4,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[4,"pspin"],4))
  256. plot_CT_CNVs = plot_CT_CNVs + ggtitle(temp_title)
  257. print(plot_CT_CNVs)
  258. ## row 5: effect sizes SA CNVs
  259. input_color = "#377eb8" # color code for SA
  260. in_y_label = "Effect size"
  261. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  262. ES = data_fig4b[,"meanES_SA_CNVs"],
  263. ES_min = data_fig4b[,"meanES_SA_CNVs"] - data_fig4b[,"SE_SA_CNVs"],
  264. ES_max = data_fig4b[,"meanES_SA_CNVs"] + data_fig4b[,"SE_SA_CNVs"])
  265. plot_SA_CNVs <- plot_point_mean_effect_sizes(df,input_order,input_color,in_y_label,ylim_min = 0.1,ylim_max = 0.5)
  266. temp_title = paste0("SA CNVs; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[5,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[5,"pspin"],4))
  267. plot_SA_CNVs = plot_SA_CNVs + ggtitle(temp_title)
  268. print(plot_SA_CNVs)
  269. ## row 6. effect sizes CT NPDs
  270. input_color = "#e41a1c" # color code for CT
  271. in_y_label = "Effect size"
  272. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  273. ES = data_fig4b[,"meanES_CT_NPDs"],
  274. ES_min = data_fig4b[,"meanES_CT_NPDs"] - data_fig4b[,"SE_CT_NPDs"],
  275. ES_max = data_fig4b[,"meanES_CT_NPDs"] + data_fig4b[,"SE_CT_NPDs"])
  276. plot_CT_NPDs <- plot_point_mean_effect_sizes(df,input_order,input_color,in_y_label,ylim_min = 0.04,ylim_max = 0.2)
  277. temp_title = paste0("CT NPDs; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[6,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[6,"pspin"],4))
  278. plot_CT_NPDs = plot_CT_NPDs + ggtitle(temp_title)
  279. print(plot_CT_NPDs)
  280. ## row 7: effect sizes SA NPDs
  281. input_color = "#377eb8" # color code for SA
  282. in_y_label = "Effect size"
  283. df = data.frame(ROI = data_fig4b_twin_h2[,"roi"],
  284. ES = data_fig4b[,"meanES_SA_NPDs"],
  285. ES_min = data_fig4b[,"meanES_SA_NPDs"] - data_fig4b[,"SE_SA_NPDs"],
  286. ES_max = data_fig4b[,"meanES_SA_NPDs"] + data_fig4b[,"SE_SA_NPDs"])
  287. plot_SA_NPDs <- plot_point_mean_effect_sizes(df,input_order,input_color,in_y_label,ylim_min = 0.01,ylim_max = 0.1)
  288. temp_title = paste0("SA NPDs; Corr with gradient r=",round(df_cor_pspin_with_gradient_fig4b[7,"cor"],2)," pspin=",round(df_cor_pspin_with_gradient_fig4b[7,"pspin"],4))
  289. plot_SA_NPDs = plot_SA_NPDs + ggtitle(temp_title)
  290. print(plot_SA_NPDs)
  291. ```

Fig4.Rmd at commit 88805ec, under MIT · at the source

Overview

Authors: Kuldeep Kumar1, Zhijie Liao2, Jakub Kopal3, Clara Moreau4, Christopher Ching5, Claudia Modenato6, Will Snyder7, Sayeh Kazem8, Charles-Olivier Martin9, Anne-Marie Belanger9, Valerie Fontaine, Khadije Jizi2, Guillaume Huguet10, Rune Boen11, Leila Kushan12, Ana Silva13, Marianne van den Bree14, David Linden15, Michael Owen14, Jeremy Hall14
and 14 other authorsSarah Lippé2, Guillaume Dumas16, Bodgan Draganski17, Laura Almasy18, Sophia Thomopoulos, Neda Jahanshad19, Ida Sønderby20, Ole Andreassen21, David Glahn22, Armin Raznahan23, Carrie Bearden11, Tomas Paus2, Paul Thompson24, Sebastien Jacquemont25
25 affiliations
  1. Centre de recherche CHU Sainte-Justine and University of Montréal
  2. University of Montreal
  3. Centre for Precision Psychiatry, Division of Mental Health and Addiction, Oslo University Hospital & Institute of Clinical Medicine, University of Oslo
  4. Centre de recherche CHU Sainte Justine, University of Montreal
  5. Imaging Genetics Center, Mark and Mary Stevens Neuroimaging and Informatics Institute, Keck School of Medicine, University of Southern California
  6. Centre Hospitalier Universitaire Vaudois and University of Lausanne
  7. Section on Developmental Neurogenomics, Human Genetics Branch, NIMH, NIH, and Department of Psychiatry, University of Cambridge
  8. Univeristy of Montreal
  9. Centre de recherche CHU Sainte-Justine and University of Montreal
  10. Centre Hospitalier Universitaire Sainte-Justine Research Center
  11. UCLA
  12. University of California Los Angeles
  13. Center for Magnetic Resonance Research, Department of Radiology, University of Minnesota
  14. Cardiff University
  15. Maastricht University
  16. Centre de recherche CHU Sainte-Justine and University of Montreal, and Mila, Quebec Artificial Intelligence Institute
  17. Lausanne University Hospital (CHUV) and University of Lausanne (UNIL)
  18. Children’s Hospital of Philadelphia
  19. University of Southern California
  20. University of Oslo
  21. Oslo University Hospital & Institute of Clinical Medicine, University of Oslo
  22. Department of Psychiatry, Boston Children’s Hospital and Harvard Medical School, Boston, MA 02115;Harvard Medical School, Boston, MA 02115
  23. National Institute of Mental Health
  24. University of Southern California, Los Angeles
  25. Université de Montréal
Dates: published online 6 May 2026
Type: Preprint · Language: English
License: CC BY
Identifiers: DOI 10.21203/rs.3.rs-9246968/v1 · OpenAlex W7160446254
Open access: green, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), clinical / translational (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Preprocessing
Topic: Genomic variations and chromosomal abnormalities (Genetics, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: National Science Foundation (32003B_135679, 32003B_159780); Biogen; Canadian Institute for Advanced Research; Fondation Brain Canada; Wellcome Trust (100202, 100202/Z/12/Z); Health and Care Research Wales (100202/Z/12/Z); Compute Canada; Simons Foundation; European Regional Development Fund (100202, HORIZON2020, 847776); Schweizerischer Nationalfonds zur Förderung der Wissenschaftlichen Forschung (223273, R01MH116147, 159780, 192755, 135679, 190185, 121246); Norges Forskningsråd (223273); Canada First Research Excellence Fund (#CF00137433); Institut de Valorisation des Données (CF00137433); National Institutes of Health (223273, 1u01mh119690-01, 1rf1mh123163-01a1, R01MH085953, U54‐EB020403, R01MH121246, R01 MH116147); Canadian Institutes of Health Research (CIHR_400528); Natural Sciences and Engineering Research Council of Canada (CF00137433, dgecr-2023-00089); Helse Sør-Øst RHF (#2020060, 223273); National Institute of Mental Health (R01MH123163, R01 MH085953, R01MH100900, U54EB020403, R01 MH121246, R01-MH116147)
Citations: not cited yet (Europe PMC); 59 references in the paper

Abstract

Structural variants, including copy number variants (CNVs), confer substantial risk for neurodevelopmental and psychiatric disorders (NPDs), yet whether their cortical effects relate to those observed in the psychiatric conditions they predispose to remains unclear. Here, we present the first systematic comparison of cortical phenotypes across 18 NPD-associated CNVs and aneuploidies, disorder-associated common variants, and 8 psychiatric disorders. Rare CNVs preferentially affected total surface area (SA), with 11-fold larger effects than psychiatric diagnoses, while NPDs preferentially affected mean cortical thickness (CT), with most CT effects observed in medicated subgroups, suggesting non-genetic contributions. NPD-associated common variants showed enrichment in SA but not CT associations. Regionally, both rare and common genetic variants showed larger effects in sensorimotor regions, aligning with the sensorimotor-to-association cortical gradient as well as regional heritability estimates. In contrast, psychiatric diagnoses showed larger effects in association regions. Individual NPD-associated variants were evenly split between those increasing and decreasing surface area. This heterogeneity likely explains why aggregating variants using polygenic scores shows only weak associations with SA. Overall, cortical signatures of psychiatric diagnoses diverge from those associated with genetic risk. Genetic variants preferentially impact SA and sensorimotor regions through early developmental mechanisms, while psychiatric diagnoses are associated with CT and association regions likely reflecting medication, illness chronicity, and environmental factors.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.

MartineauJeanLouis/MIND-GENESPARALLELCNV

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 917c7c2ecf11444ff572e4af1c029d48df612d3d, 22 January 2020
Languages: Shell (8), Python (6), JavaScript (1)
Size: 164 files, 15 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, environment (.circleci/requirements.txt), continuous integration, documentation
Not found: license file, CITATION.cff, tests
Tools: NumPy (1 file), pandas (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
16 files

kkumar-iitkgp/ct_sa_across_disorders_and_variants

License: MIT
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 88805ec4b84c52c71e185d856d42a2b2fbd51d8d, 29 April 2025
Languages: R (5)
Size: 52 files, 5 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, 4 notebooks
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: ggplot2 (5 files), ggpubr (4 files), tidyverse (3 files), circlize (2 files), ComplexHeatmap (2 files), ggseg (2 files), cowplot (1 file), lme4 (1 file), nlme (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
7 files

Code availability

The code for generating all the figures, along with processed summary measures, is available in the following GitHub repository:

https://github.com/kkumar-iitkgp/ct_sa_across_disorders_and_variants.git

Reproduced under the paper's license (CC BY), from the paper cited above.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 20 scripts, each with its path and the digest of its content;
  • 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability

UK Biobank data was downloaded under the application 40980 and may be accessed via their standard data access procedure (see http://www.ukbiobank.ac.uk/register-apply). UK Biobank CNVs were called using the pipeline developed in the Jacquemont Lab, as described at https://github.com/MartineauJeanLouis/MIND-GENESPARALLELCNV. The final CNV calls are available for download from the UK Biobank returned datasets (Return ID: 3104, https://biobank.ndph.ox.ac.uk/ukb/dset.cgi?id=3104). The 22q11.2 UCLA raw data are currently available by request from the project PI. Raw neuroimaging data for rare variants are available through request and data access agreement from the PIs of the projects (Brain Canada: S.J. CHUSJ Montreal; 22q11.2: C.E.B. UCLA, Cardiff: D.E.J.L., M.J.O., M.V.B., J.H, Cardiff University; SCA: A.R. NIMH). References to the processing pipeline and R package versions used for analysis are listed in the methods. The GWAS summary statistics are publicly available and can be accessed following the reference papers.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 2, 28 September 2026

  • Language: n/a → en
  • Funding: added National Science Foundation: 32003B_135679, 32003B_159780; Biogen; Canadian Institute for Advanced Research; Fondation Brain Canada; Wellcome Trust: 100202, 100202/Z/12/Z; Health and Care Research Wales: 100202/Z/12/Z; Compute Canada; Simons Foundation Autism Research Initiative; European Commission: 100202, HORIZON2020, 847776; Schweizerischer Nationalfonds zur Förderung der Wissenschaftlichen Forschung: 223273, R01MH116147, 159780, 192755, 135679, 190185, 121246; Norges Forskningsråd: 223273; Canada First Research Excellence Fund: #CF00137433; Institut de Valorisation des Données: CF00137433; National Institutes of Health: 223273, 1u01mh119690-01, 1rf1mh123163-01a1, R01MH085953, U54‐EB020403, R01MH121246, R01 MH116147; Canadian Institutes of Health Research: CIHR_400528; Natural Sciences and Engineering Research Council of Canada: CF00137433, dgecr-2023-00089; Helse Sør-Øst RHF: #2020060, 223273; National Institute of Mental Health: R01MH123163, R01 MH085953, R01MH100900, U54EB020403, R01 MH121246, R01-MH116147

Version 1, 28 September 2026: the first record

Recorded: type, journal, dates, 34 authors, 55 references.

Cite

This paper

Kumar, K., Liao, Z., Kopal, J., Moreau, C., Ching, C., Modenato, C., Snyder, W., Kazem, S., Martin, C.-O., Belanger, A.-M., Fontaine, V., Jizi, K., Huguet, G., Boen, R., Kushan, L., Silva, A., van den Bree, M., Linden, D., Owen, M., . . . Jacquemont, S. (2026). Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders. Research Square (preprint). https://doi.org/10.21203/rs.3.rs-9246968/v1

BibTeX

@article{kumar2026copy,
author = {Kumar, Kuldeep and Liao, Zhijie and Kopal, Jakub and Moreau, Clara and Ching, Christopher and Modenato, Claudia and Snyder, Will and Kazem, Sayeh and Martin, Charles-Olivier and Belanger, Anne-Marie and Fontaine, Valerie and Jizi, Khadije and Huguet, Guillaume and Boen, Rune and Kushan, Leila and Silva, Ana and van den Bree, Marianne and Linden, David and Owen, Michael and Hall, Jeremy and Lippé, Sarah and Dumas, Guillaume and Draganski, Bodgan and Almasy, Laura and Thomopoulos, Sophia and Jahanshad, Neda and Sønderby, Ida and Andreassen, Ole and Glahn, David and Raznahan, Armin and Bearden, Carrie and Paus, Tomas and Thompson, Paul and Jacquemont, Sebastien},
title = {{Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders}},
journal = {Research Square (preprint)},
year = {2026},
month = may,
publisher = {Research Square},
issn = {2693-5015},
doi = {10.21203/rs.3.rs-9246968/v1},
url = {https://doi.org/10.21203/rs.3.rs-9246968/v1}
}

RIS

TY - JOUR
AU - Kumar, Kuldeep
AU - Liao, Zhijie
AU - Kopal, Jakub
AU - Moreau, Clara
AU - Ching, Christopher
AU - Modenato, Claudia
AU - Snyder, Will
AU - Kazem, Sayeh
AU - Martin, Charles-Olivier
AU - Belanger, Anne-Marie
AU - Fontaine, Valerie
AU - Jizi, Khadije
AU - Huguet, Guillaume
AU - Boen, Rune
AU - Kushan, Leila
AU - Silva, Ana
AU - van den Bree, Marianne
AU - Linden, David
AU - Owen, Michael
AU - Hall, Jeremy
AU - Lippé, Sarah
AU - Dumas, Guillaume
AU - Draganski, Bodgan
AU - Almasy, Laura
AU - Thomopoulos, Sophia
AU - Jahanshad, Neda
AU - Sønderby, Ida
AU - Andreassen, Ole
AU - Glahn, David
AU - Raznahan, Armin
AU - Bearden, Carrie
AU - Paus, Tomas
AU - Thompson, Paul
AU - Jacquemont, Sebastien
TI - Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders
T2 - Research Square (preprint)
J2 - Res Sq
PY - 2026
DA - 2026/05/06
SN - 2693-5015
PB - Research Square
DO - 10.21203/rs.3.rs-9246968/v1
UR - https://doi.org/10.21203/rs.3.rs-9246968/v1
LA - en
ER -

CSL-JSON

{
"id": "10.21203/rs.3.rs-9246968/v1",
"type": "article",
"title": "Copy number variants reveal divergent genetic and diagnostic cortical signatures across psychiatric disorders",
"container-title": "Research Square (preprint)",
"author": [
{
"family": "Kumar",
"given": "Kuldeep"
},
{
"family": "Liao",
"given": "Zhijie"
},
{
"family": "Kopal",
"given": "Jakub"
},
{
"family": "Moreau",
"given": "Clara"
},
{
"family": "Ching",
"given": "Christopher"
},
{
"family": "Modenato",
"given": "Claudia"
},
{
"family": "Snyder",
"given": "Will"
},
{
"family": "Kazem",
"given": "Sayeh"
},
{
"family": "Martin",
"given": "Charles-Olivier"
},
{
"family": "Belanger",
"given": "Anne-Marie"
},
{
"family": "Fontaine",
"given": "Valerie"
},
{
"family": "Jizi",
"given": "Khadije"
},
{
"family": "Huguet",
"given": "Guillaume"
},
{
"family": "Boen",
"given": "Rune"
},
{
"family": "Kushan",
"given": "Leila"
},
{
"family": "Silva",
"given": "Ana"
},
{
"family": "van den Bree",
"given": "Marianne"
},
{
"family": "Linden",
"given": "David"
},
{
"family": "Owen",
"given": "Michael"
},
{
"family": "Hall",
"given": "Jeremy"
},
{
"family": "Lippé",
"given": "Sarah"
},
{
"family": "Dumas",
"given": "Guillaume"
},
{
"family": "Draganski",
"given": "Bodgan"
},
{
"family": "Almasy",
"given": "Laura"
},
{
"family": "Thomopoulos",
"given": "Sophia"
},
{
"family": "Jahanshad",
"given": "Neda"
},
{
"family": "Sønderby",
"given": "Ida"
},
{
"family": "Andreassen",
"given": "Ole"
},
{
"family": "Glahn",
"given": "David"
},
{
"family": "Raznahan",
"given": "Armin"
},
{
"family": "Bearden",
"given": "Carrie"
},
{
"family": "Paus",
"given": "Tomas"
},
{
"family": "Thompson",
"given": "Paul"
},
{
"family": "Jacquemont",
"given": "Sebastien"
}
],
"container-title-short": "Res Sq",
"DOI": "10.21203/rs.3.rs-9246968/v1",
"ISSN": "2693-5015",
"publisher": "Research Square",
"URL": "https://doi.org/10.21203/rs.3.rs-9246968/v1",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
6
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41467-026-76676-0 [code]
Determinants of functional burden pleiotropy and gene dosage responses across human traits.
Journal: Nature communications
In common: circlize, ComplexHeatmap, ggpubr, 4 other tools, genetics / omics, 6 references, 6 authors
[2] doi:10.64898/2026.03.06.709690
Genetic insights on the mechanisms of human cortical folding
Journal: bioRxiv (preprint)
In common: genetics / omics, 12 references, 5 authors
[3] doi:10.1038/s43856-026-01510-z [code]
Mapping genetic convergence across brain structure, mental health, and cardiometabolic disease.
Journal: Communications medicine
In common: ggpubr, ggplot2, tidyverse, 2 other tools, genetics / omics, 12 references, 2 authors
[4] doi:10.64898/2026.08.13.26360304 [code]
Lifespan brain structural variation reveals shared organization across mental health conditions
Journal: medRxiv (preprint)
In common: pandas, NumPy, clinical / translational, 10 references, 2 authors
[5] doi:10.1038/s41380-026-03497-4 [code]
Transcriptome-informed brain cartography of polygenic risk and association with brain structure in major psychiatric disorders.
Journal: Molecular psychiatry
In common: ggseg, circlize, ComplexHeatmap, 4 other tools, genetics / omics, 11 references
[6] doi:10.1038/s41467-026-72875-x [code]
Lifespan normative modeling of brain microstructure.
Journal: Nature communications
In common: pandas, NumPy, 1 reference, 4 authors
[7] doi:10.1038/s41380-026-03641-0
Cerebral cortical alterations in adolescent early-onset psychosis: a surface-based morphometry mega-analysis.
Journal: Molecular psychiatry
In common: 3 references, 3 authors
[8] doi:10.1093/cercor/bhag105 [code]
The tangential growth of the human visual cortex and maternal smoking during pregnancy.
Journal: Cerebral cortex (New York, N.Y. : 1991)
In common: pandas, 4 references, 2 authors
[9] doi:10.1002/hbm.70605 [code]
BrainEnrich: Revealing Biological Insights for Imaging-Derived Phenotypes Through Transcriptomic Enrichment.
Journal: Human brain mapping
In common: ggseg, nlme, cowplot, 5 other tools, genetics / omics, 3 references
[10] doi:10.1038/s41380-026-03500-y [code]
Altered frontal and occipital cortical microstructure in obsessive-compulsive disorder - a multisite mega-analysis.
Journal: Molecular psychiatry
In common: ggseg, lme4, ggplot2, 1 other tool, clinical / translational, 6 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.