OSCR

Plasma Glial Fibrillary Acidic Protein (GFAP) shows age-dependent associations with externalizing psychopathology and atypical brain connectivity.

Code ↔ Paper

7 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 7 matches
  1. [1] § Materials and methods › Multivariate modeling of brain–GFAP/ NfL associations ↔ 05_run_sPLS.R, lines 1–41 · score 0.96 · optimal sparsity, cv.spls, sparse Partial, cross validation, brain connectivity deviation, brain connectivity features
  2. [2] § Materials and methods › Normative modeling ↔ 03_apply_normative_models.py, lines 1–15 · score 0.81 · normative models, pre trained, cVEDA, network connectivity, python, transfer
  3. [3] § Materials and methods › Sample size justification ↔ 04_run_clinical.R, lines 90–136 · score 0.80 · post hoc power, Johnson Neyman, Gamma GLMs, tailed, JN, EXT
  4. [4] § Materials and methods › Multivariate modeling of brain–GFAP/ NfL associations ↔ 05_run_sPLS.R, lines 1–41 · score 0.76 · ci.spls, optimized parameters, excluded zero, fitting, bootstrapping, Multivariate
  5. [5] § Materials and methods › Moderation analysis ↔ 04_run_clinical.R, lines 1–44 · score 0.62 · Gamma GLMs, age ranges, Moderation, JN, BMI, interaction
  6. [6] § Materials and methods › Functional brain connectivity ↔ 01_run_3dnetcorr.py, lines 1–13 · score 0.61 · dNetCorr, AFNI, network connectivity, Yeo
  7. [7] § Results › Association of resting brain networks with plasma GFAP/ NfL ↔ 05_run_sPLS.R, lines 94–136 · score 0.57 · optimal parameters, sPLS, variance, R2, components, bootstrap

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 · 310 lines · 13 KB · MIT · 3 matches

  1. # =============================================================================
  2. # 05_run_sPLS.R
  3. # Sparse Partial Least Squares (sPLS) for brain connectivity vs. biomarkers
  4. # =============================================================================
  5. #
  6. # Methods (multivariate modeling):
  7. # - Separate sPLS regressions per outcome (e.g. GFAP, NfL).
  8. # - Predictors: brain connectivity deviation (Z) features; standardized.
  9. # - (1) Cross-validation (cv.spls) for optimal sparsity (eta) and K components.
  10. # - (2) Fit sPLS with optimized parameters.
  11. # - (3) Bootstrap (ci.spls, 10,000 resamples); retain predictors whose 95% CI
  12. # excludes zero (correct.spls).
  13. #
  14. # Requires: R package 'spls'
  15. # install.packages("spls")
  16. #
  17. # =============================================================================
  18. library(spls)
  19. # -----------------------------------------------------------------------------
  20. # Configuration: paths and column names (edit for your data)
  21. # -----------------------------------------------------------------------------
  22. # Path to analysis dataset (relative to working directory or absolute).
  23. # Dataset must contain:
  24. # - Outcome variable(s), e.g. GFAP and NfL (concentrations or log-transformed).
  25. # - Predictor columns: connectivity deviation (Z) scores (e.g. 136 BNFC edges),
  26. # in the same order as your template (e.g. VisualA_VisualB ... DefaultC_TemporalParietal).
  27. path_data <- "data_connectivity_biomarkers.csv"
  28. # Column name(s) of outcome(s) to model (one model per outcome).
  29. outcome_names <- c("GFAP_n", "NFL_n")
  30. # How to define predictor columns (connectivity features). Option A or B:
  31. # A) By first and last column names (inclusive).
  32. pred_first <- "VisualA_VisualB"
  33. pred_last <- "DefaultC_TemporalParietal"
  34. # B) Or set pred_cols explicitly, e.g.:
  35. # pred_cols <- setdiff(names(dat), c("sub_id", "age", "sex", outcome_names))
  36. # Cross-validation search grid (sparsity and number of components).
  37. eta_grid <- seq(0.1, 0.9, 0.1)
  38. K_grid <- 3:10
  39. # Bootstrap for confidence intervals.
  40. n_boot <- 10000
  41. ci_level <- 0.95
  42. set_seed <- 1
  43. # Multiple comparison correction over tested predictors (sPLS-selected only).
  44. # "none" = no correction; "bonferroni" = FWER; "BH" = FDR (Benjamini-Hochberg).
  45. # P-values are approximated from the bootstrap 95% CI (SE from CI width, then 2-tailed normal).
  46. multi_correction <- "BH"
  47. # -----------------------------------------------------------------------------
  48. # Load data and define predictor matrix
  49. # -----------------------------------------------------------------------------
  50. dat <- read.csv(path_data, stringsAsFactors = FALSE)
  51. # Predictor columns: connectivity features (between first and last, inclusive).
  52. idx_first <- which(names(dat) == pred_first)
  53. idx_last <- which(names(dat) == pred_last)
  54. if (length(idx_first) != 1 || length(idx_last) != 1)
  55. stop("pred_first and pred_last must each match exactly one column name.")
  56. pred_cols <- names(dat)[idx_first:idx_last]
  57. # Predictor matrix (standardized) and sample size
  58. X_raw <- as.matrix(dat[, pred_cols])
  59. X <- scale(X_raw, center = TRUE, scale = TRUE)
  60. if (is.null(colnames(X))) colnames(X) <- pred_cols
  61. n <- nrow(X)
  62. if (n != nrow(dat)) stop("Row mismatch between dat and X.")
  63. # -----------------------------------------------------------------------------
  64. # Run sPLS for each outcome
  65. # -----------------------------------------------------------------------------
  66. results <- list()
  67. for (outcome_name in outcome_names) {
  68. if (!outcome_name %in% names(dat))
  69. stop("Outcome column not found: ", outcome_name)
  70. Y <- as.matrix(dat[[outcome_name]])
  71. if (any(is.na(Y))) stop("Outcome ", outcome_name, " contains NA; remove or impute.")
  72. message("\n========== Outcome: ", outcome_name, " ==========")
  73. # ---- Step 1: Cross-validation for eta and K ----
  74. set.seed(set_seed)
  75. cv_fit <- cv.spls(X, Y, eta = eta_grid, K = K_grid)
  76. eta_opt <- cv_fit$eta.opt
  77. K_opt <- cv_fit$K.opt
  78. message("CV optimal: eta = ", eta_opt, ", K = ", K_opt)
  79. # ---- Step 2: Fit sPLS with optimal parameters ----
  80. fit <- spls::spls(X, Y, eta = eta_opt, K = K_opt)
  81. print(fit)
  82. # Variance explained (R²) and per-component R²
  83. Y_hat <- predict(fit)
  84. Y_true <- as.numeric(Y)
  85. R2 <- 1 - sum((Y_true - Y_hat)^2) / sum((Y_true - mean(Y_true))^2)
  86. message("Total R² = ", round(R2, 4))
  87. # Component scores and correlation with outcome (squared = variance explained per component)
  88. selected_vars <- rownames(fit$projection)
  89. X_sel <- X[, selected_vars, drop = FALSE]
  90. X_centered <- scale(X_sel, center = fit$meanx[selected_vars], scale = FALSE)
  91. W <- fit$projection
  92. components <- as.matrix(X_centered) %*% as.matrix(W)
  93. colnames(components) <- paste0("Component_", seq_len(fit$K))
  94. R2_components <- apply(components, 2, function(z) cor(z, Y_true)^2)
  95. message("Variance explained per component: ",
  96. paste(round(100 * R2_components, 2), "%", collapse = ", "))
  97. # ---- Step 3: Bootstrap CIs; retain only predictors whose CI excludes zero ----
  98. set.seed(set_seed)
  99. ci_fit <- ci.spls(fit, coverage = ci_level, B = n_boot,
  100. plot.it = FALSE, plot.fix = "y", plot.var = TRUE,
  101. K = fit$K, fit = fit$fit)
  102. # Corrected coefficients from bootstrap (beta = 0 for non-significant; rownames = predictor names)
  103. cf <- correct.spls(ci_fit)
  104. # Coefficient CIs (cibeta: matrix with rows = predictors, cols = lower, upper)
  105. cibeta <- ci_fit$cibeta
  106. if (is.list(cibeta)) cibeta <- cibeta[[1]]
  107. lb <- cibeta[, 1]
  108. ub <- cibeta[, 2]
  109. betas <- coef(fit)
  110. betas <- betas[betas != 0]
  111. # Variable names: same order as cibeta rows (use rownames if present, else names(betas))
  112. var_names <- if (!is.null(rownames(cibeta)) && length(rownames(cibeta)) == nrow(cibeta)) {
  113. rownames(cibeta)
  114. } else {
  115. names(betas)
  116. }
  117. # Significant predictors: 95% CI excludes zero (interval does not contain 0)
  118. sig_pred <- var_names[(lb > 0) | (ub < 0)]
  119. n_sig <- length(sig_pred)
  120. n_total <- ncol(X)
  121. n_selected <- length(selected_vars)
  122. # Optional multiple comparison correction (over n_selected tested predictors)
  123. sig_pred_final <- sig_pred
  124. n_sig_corrected <- n_sig
  125. if (multi_correction %in% c("bonferroni", "BH") && length(var_names) > 0) {
  126. beta_point <- cf[var_names, 1]
  127. if (is.null(names(beta_point))) names(beta_point) <- var_names
  128. na_beta <- is.na(beta_point)
  129. beta_point[na_beta] <- (lb[na_beta] + ub[na_beta]) / 2
  130. SE_approx <- (ub - lb) / (2 * 1.96)
  131. SE_approx[SE_approx <= 0] <- 1e-10
  132. p_approx <- 2 * pnorm(-abs(beta_point) / SE_approx)
  133. p_adj <- p.adjust(p_approx, method = if (multi_correction == "bonferroni") "bonferroni" else "BH")
  134. sig_pred_corrected <- var_names[p_adj < 0.05]
  135. n_sig_corrected <- length(sig_pred_corrected)
  136. sig_pred_final <- sig_pred_corrected
  137. message("After ", multi_correction, " correction: ", n_sig_corrected, " predictor(s) significant (uncorrected: ", n_sig, ").")
  138. }
  139. message("After bootstrap correction: ", n_sig, " predictor(s) with 95% CI excluding zero.")
  140. # Beta from corrected coefficients (cf); fallback to midpoint of CI if cf has no rownames/match
  141. beta_sig <- cf[sig_pred_final, 1]
  142. if (is.null(names(beta_sig))) names(beta_sig) <- sig_pred_final
  143. if (length(sig_pred_final) > 0 && any(is.na(beta_sig))) beta_sig[is.na(beta_sig)] <- (cibeta[sig_pred_final, 1][is.na(beta_sig)] + cibeta[sig_pred_final, 2][is.na(beta_sig)]) / 2
  144. # Variance explained using significant pairs only (after multi-test correction if applied)
  145. R2_sig <- NA_real_
  146. R2_components_sig <- NULL
  147. if (length(sig_pred_final) > 0) {
  148. sig_in_X <- intersect(sig_pred_final, colnames(X))
  149. if (length(sig_in_X) == 0) sig_in_X <- intersect(sig_pred_final, pred_cols)
  150. if (length(sig_in_X) > 0) {
  151. X_sig <- X[, sig_in_X, drop = FALSE]
  152. beta_use <- beta_sig[sig_in_X]
  153. Y_hat_sig <- as.numeric(X_sig %*% beta_use)
  154. R2_sig <- 1 - sum((Y_true - Y_hat_sig)^2) / sum((Y_true - mean(Y_true))^2)
  155. message("Variance explained (significant pairs only): R² = ", round(R2_sig, 4))
  156. # Per-predictor squared correlation with Y (marginal variance explained by each)
  157. R2_components_sig <- setNames(
  158. vapply(sig_in_X, function(v) cor(X_sig[, v] * beta_use[v], Y_true)^2, 0),
  159. sig_in_X
  160. )
  161. }
  162. }
  163. message("Correction summary: sPLS selected ", n_selected, " of ", n_total, " predictors; ",
  164. n_sig, " remained significant after bootstrap",
  165. if (multi_correction %in% c("bonferroni", "BH")) paste0("; ", n_sig_corrected, " after ", multi_correction) else "",
  166. ". R² (full sPLS) = ", round(100 * R2, 2), "%; R² (significant only) = ",
  167. if (length(sig_pred_final) > 0 && !is.na(R2_sig)) round(100 * R2_sig, 2) else "—", "%.")
  168. # Store for reporting / export
  169. res <- list(
  170. outcome_name = outcome_name,
  171. eta_opt = eta_opt,
  172. K_opt = K_opt,
  173. R2 = R2,
  174. R2_sig = R2_sig,
  175. R2_components = R2_components,
  176. R2_components_sig = R2_components_sig,
  177. fit = fit,
  178. coef = betas,
  179. coef_corrected = cf,
  180. cibeta = cibeta,
  181. significant = sig_pred,
  182. significant_final = sig_pred_final,
  183. n_sig_corrected = n_sig_corrected,
  184. multi_correction = multi_correction,
  185. components = components,
  186. Y_hat = Y_hat,
  187. Y_true = Y_true
  188. )
  189. results[[outcome_name]] <- res
  190. # Optional: add component scores and composite to dataset for this outcome
  191. comp_df <- as.data.frame(components)
  192. names(comp_df) <- paste0(outcome_name, "_", names(comp_df))
  193. n_obs <- nrow(X)
  194. # Composite = X_selected %*% coefs (same order: columns of X_sel match order of non-zero coefs from fit)
  195. coefs <- coef(fit)
  196. coefs <- coefs[coefs != 0]
  197. if (length(coefs) == ncol(X_sel)) {
  198. composite <- as.numeric(as.matrix(X_sel) %*% coefs)
  199. } else {
  200. # coef(fit) may be full-length; take coefficients for selected vars by position
  201. idx <- match(selected_vars, colnames(X))
  202. coefs_sel <- coef(fit)[idx]
  203. composite <- as.numeric(as.matrix(X_sel) %*% coefs_sel)
  204. }
  205. if (length(composite) != n_obs) composite <- rep(NA_real_, n_obs)
  206. dat[[paste0(outcome_name, "_Component_Composite")]] <- composite
  207. dat <- cbind(dat, comp_df)
  208. # Print results immediately (significant net pairs with beta and CI, by sign)
  209. cat("\n========== ", outcome_name, " ==========\n", sep = "")
  210. cat("eta = ", eta_opt, ", K = ", K_opt, "\n", sep = "")
  211. cat("Variables: ", n_selected, " selected by sPLS, ", n_sig, " significant after bootstrap", sep = "")
  212. if (multi_correction %in% c("bonferroni", "BH")) cat(" (", n_sig_corrected, " after ", multi_correction, ")", sep = "")
  213. cat(" (of ", n_total, " total).\n", sep = "")
  214. cat("R² (full sPLS) = ", round(100 * R2, 2), "%; R² (significant pairs only) = ", sep = "")
  215. if (length(sig_pred_final) > 0 && !is.na(R2_sig)) {
  216. cat(round(100 * R2_sig, 2), "%.\n", sep = "")
  217. } else {
  218. cat(round(100 * R2, 2), "%.\n", sep = "")
  219. }
  220. if (length(sig_pred_final) == 0) {
  221. cat("No significant connectivity features (95% CI excluding zero", if (multi_correction %in% c("bonferroni", "BH")) paste0("; ", multi_correction, " applied") else "", ").\n")
  222. } else {
  223. # Beta from correct.spls (bootstrap-corrected coefficients)
  224. ci_lo <- cibeta[sig_pred_final, 1]
  225. ci_hi <- cibeta[sig_pred_final, 2]
  226. beta_vals <- cf[sig_pred_final, 1]
  227. if (is.null(names(beta_vals))) names(beta_vals) <- sig_pred_final
  228. if (any(is.na(beta_vals))) beta_vals[is.na(beta_vals)] <- (ci_lo[is.na(beta_vals)] + ci_hi[is.na(beta_vals)]) / 2
  229. pos <- sig_pred_final[beta_vals > 0]
  230. neg <- sig_pred_final[beta_vals < 0]
  231. cat("\nSignificant net pairs (positive association with ", outcome_name, "):\n", sep = "")
  232. if (length(pos) > 0) {
  233. for (v in pos) {
  234. b <- beta_vals[v]
  235. ci <- c(ci_lo[v], ci_hi[v])
  236. cat(" ", v, " beta = ", round(b, 3), ", 95% CI [", round(ci[1], 3), ", ", round(ci[2], 3), "]\n", sep = "")
  237. }
  238. } else {
  239. cat(" (none)\n")
  240. }
  241. cat("\nSignificant net pairs (negative association with ", outcome_name, "):\n", sep = "")
  242. if (length(neg) > 0) {
  243. for (v in neg) {
  244. b <- beta_vals[v]
  245. ci <- c(ci_lo[v], ci_hi[v])
  246. cat(" ", v, " beta = ", round(b, 3), ", 95% CI [", round(ci[1], 3), ", ", round(ci[2], 3), "]\n", sep = "")
  247. }
  248. } else {
  249. cat(" (none)\n")
  250. }
  251. }
  252. }
  253. # -----------------------------------------------------------------------------
  254. # Optional: write results to CSV (coefficients and CIs per outcome)
  255. # -----------------------------------------------------------------------------
  256. #
  257. for (outcome_name in names(results)) {
  258. res <- results[[outcome_name]]
  259. vars <- rownames(res$cibeta)
  260. if (is.null(vars) || length(vars) == 0) next
  261. beta_vals <- res$coef_corrected[vars, 1]
  262. if (is.null(names(beta_vals))) names(beta_vals) <- vars
  263. tbl <- data.frame(
  264. outcome = outcome_name,
  265. predictor = vars,
  266. beta = beta_vals,
  267. CI_lower = res$cibeta[, 1],
  268. CI_upper = res$cibeta[, 2],
  269. significant = vars %in% res$significant
  270. )
  271. write.csv(tbl, paste0("sPLS_", outcome_name, "_coefficients.csv"), row.names = FALSE)
  272. }
  273. write.csv(dat, "data_connectivity_biomarkers_with_sPLS.csv", row.names = FALSE)

05_run_sPLS.R at commit 45856ec, under MIT · at the source

Overview

Authors: B S Niveditha1,2, Bharath Holla3, Sarada Subramanian4, N Gagana2, K M Bhargavi1,2, Eesha Sharma5, Jayant Mahadevan6, Meera Purushottam7, Biju Viswanath6, Vivek Benegal6, Gautham Arunachal1, Jon Heron8, Matthew Hickman8, Debasish Basu9, B N Subodh9, Lenin Singh10, Roshan Singh11, Kalyanaraman Kumaran12,13, Rebecca Kuriyan14, Sunita Simon Kurpad15,16
and 18 other authorsKamakshi Kartik17, Kartik Kalyanram17, Sylvane Desrivieres18, Gareth Barker19, Dimitri Papadopoulos Orfanos20, Mireille B Toledano21, Pratima Murthy6, Nilakshi Vaidya22, Ghattu Krishnaveni13, Gunter Schumann22,23, Kuldeep Kumar Sharma24, Binukumar Bhaskarapillai24, K Thennarasu24, Rajan Kashyap25, Rose Dawn Bharath25, Amit Chakrabarti26, G K Chetan1, Muchukunte Mukunda Srinivas Bharath2,27
27 affiliations
  1. Department of Human Genetics, National Institute of Mental Health and Neurosciences (NIMHANS), No. 2900, Hosur Road, Bengaluru, 560029 Karnataka India
  2. Department of Clinical Psychopharmacology and Neurotoxicology, NIMHANS, Bengaluru, Karnataka India
  3. Department of Integrative Medicine, NIMHANS, Bengaluru, Karnataka India
  4. Department of Neurochemistry, NIMHANS, Bengaluru, Karnataka India
  5. Department of Child and Adolescent Psychiatry, NIMHANS, Bengaluru, Karnataka India
  6. Department of Psychiatry, NIMHANS, Bengaluru, Karnataka India
  7. Rohini Nilekani Centre for Brain and Mind, Department of Psychiatry, NIMHANS, Bengaluru, Karnataka India
  8. Population Health Sciences, Bristol Medical School, University of Bristol, Beacon House, Queens Road, Bristol, BS8 1QU United Kingdom
  9. Department of Psychiatry, Post Graduate Institute of Medical Education and Research, Chandigarh, 160012 India
  10. Department of Psychiatry, Regional Institute of Medical Sciences, Lamphel Road, Lamphelpat, Imphal, Manipur 795004 India
  11. Department of Psychology, Regional Institute of Medical Sciences, Imphal, 795004 India
  12. Primary Care, Population Sciences and Medical Education, University of Southampton, Southampton, United Kingdom
  13. Epidemiology Research Unit, CSI Holdsworth Memorial Hospital, Mysuru, 570001 Karnataka India
  14. Division of Nutrition, St John’s Research Institute, Bengaluru, 560034 India
  15. Department of Psychiatry, St. John’s Medical College and Hospital, Bengaluru, 560034 Karnataka India
  16. Department of Medical Ethics, St. John’s Medical College and Hospital, Bengaluru, 560034 Karnataka India
  17. Rishi Valley Rural Health Centre, Madanapalle, Chittoor, Andhra Pradesh 517352 India
  18. Centre for Population Neuroscience and Precision Medicine, Institute of Psychology, Psychiatry & Neuroscience, MRC SGDP Centre, King’s College London, 16 De Crespgny Park, SE5 8AF London, United Kingdom
  19. Department of Neuroimaging, Institute of Psychology, Psychiatry and Neuroscience, King’s College London, London, SE5 8AF United Kingdom
  20. NeuroSpin, CEA, Université Paris-Saclay, Paris, France
  21. Mohn Centre for Children’s Health and Wellbeing, School of Public Health, Imperial College London, London, United Kingdom
  22. Centre for Population Neuroscience and Precision Medicine, Charite Mental Health, Dept. of Psychiatry and Psychotherapy, Charite Universitaetsmedizin Berlin, Berlin, Germany
  23. Centre for Population Neuroscience and Precision Medicine, Institute for Science and Technology of Brain-Inspired Intelligence, Fudan University, Shanghai, China
  24. Department of Biostatistics, NIMHANS, Bengaluru, Karnataka India
  25. Department of Neuroimaging and Interventional Radiology, NIMHANS, Bengaluru, Karnataka India
  26. ICMR-Centre for Ageing and Mental Health, Indian Council of Medical Research, Block-DP1, Sector-V, Salt Lake, Kolkata, 700 091 India
  27. Centre for Neurobehavioral Toxicology, Department of Clinical Psychopharmacology and Neurotoxicology, NIMHANS, Bengaluru, Karnataka India
Journal: Translational psychiatry, volume 16, issue 1, article 382
Dates: received 4 October 2025; accepted 13 May 2026; published online 29 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41398-026-04114-2 · PMID 42215432 · PMCID PMC13407853 · OpenAlex W7162803449
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), human (organism)
Methods: Connectivity, Smoothing, state filtering, decompositions, Machine learning, Statistics, Preprocessing, fMRI & imaging
Keywords: Biomarkers, Neuroscience
MeSH: Brain*, Glial Fibrillary Acidic Protein*, Adolescent, Adult, Age Factors, Biomarkers, Child, Cross-Sectional Studies, Female, Humans, Magnetic Resonance Imaging, Male, Young Adult (* major topic)
Topic: Functional Brain Connectivity Studies (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Indian Council of Medical Research (ICMR) (5/4-4/16/MH/2022-NCD-II, ICMR/MRC-UK/3/M/2015-NCD-I); NIMH NIH HHS (K01 MH002022); Medical Research Council (MR/N000390/1)
Citations: not cited yet (Europe PMC); 47 references in the paper

Abstract

Externalizing disorders are common neurodevelopmental conditions, yet their underlying biology is not fully understood. Integrating peripheral biomarkers with brain imaging offers a powerful approach to elucidate the pathophysiology of these disorders. This study aimed to investigate the association between indicators of glial activation (glial fibrillary acidic protein; GFAP) and axonal injury (neurofilament light chain; NfL) in plasma with functional brain connectivity, and externalizing psychopathology (EXT) in a neurodevelopmental cohort. Towards this, a cross-sectional study was conducted with 144 participants selected from the Indian cVEDA cohort and balanced into EXT and healthy control (HC) groups using Mahalanobis distance matching. Plasma GFAP and NfL were quantified using Simoa technology. Resting-state fMRI data were used to generate between-network connectivity deviation scores via normative modelling. We used Gamma General Linear Models (Gamma GLMs) to test for an age-by-EXT interaction on GFAP/ NfL levels and sparse partial least squares (sPLS) regression to identify connectivity features that correlated with them. We found a significant age-by-EXT interaction for GFAP (p = 0.002), where EXT was associated with higher GFAP levels only in younger participants (<14 years). No significant effects were found for NfL. The sPLS analysis identified a significant five-feature brain connectivity signature that correlated with GFAP levels. This pattern was characterized by atypically strong connectivity between sensorimotor-limbic and attention-default mode networks, and weaker-than-expected connectivity within the default mode network. In conclusion, our findings identify a strong association between plasma GFAP and EXT in youth in an age dependent manner, suggesting a key role for glial activation in the early pathophysiology of these disorders. This process is linked to a specific, multivariate pattern of brain dysconnectivity, providing a potential neurobiological signature that warrants further investigation.

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

Repository

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

hollabharath/cveda-simoa-connectivity

License: MIT
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 45856ecf6e58e4b352cd85192e38bfeec4f49621, 8 February 2026
Languages: Python (3), R (3)
Size: 10 files, 6 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (2 files), pandas (2 files), AFNI (1 file), easystats (1 file), ggplot2 (1 file), ggpubr (1 file), Matplotlib (1 file), SciPy (1 file), seaborn (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
8 files

The paper's code and data availability statement is in the Data section.

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 6 scripts, each with its path and the digest of its content;
  • 7 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

No dataset and no data link were found in the paper.

Data availability

The analysis scripts used in this study are available in a public GitHub repository: https://github.com/hollabharath/cveda-simoa-connectivity.

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 1, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 38 authors, 2 keywords, 13 MeSH terms, 3 funders, 45 references.

Cite

This paper

Niveditha, B. S., Holla, B., Subramanian, S., Gagana, N., Bhargavi, K. M., Sharma, E., Mahadevan, J., Purushottam, M., Viswanath, B., Benegal, V., Arunachal, G., Heron, J., Hickman, M., Basu, D., Subodh, B. N., Singh, L., Singh, R., Kumaran, K., Kuriyan, R., . . . Srinivas Bharath, M. M. (2026). Plasma Glial Fibrillary Acidic Protein (GFAP) shows age-dependent associations with externalizing psychopathology and atypical brain connectivity. Translational psychiatry, 16(1), 382. https://doi.org/10.1038/s41398-026-04114-2

BibTeX

@article{niveditha2026plasma,
author = {Niveditha, B S and Holla, Bharath and Subramanian, Sarada and Gagana, N and Bhargavi, K M and Sharma, Eesha and Mahadevan, Jayant and Purushottam, Meera and Viswanath, Biju and Benegal, Vivek and Arunachal, Gautham and Heron, Jon and Hickman, Matthew and Basu, Debasish and Subodh, B N and Singh, Lenin and Singh, Roshan and Kumaran, Kalyanaraman and Kuriyan, Rebecca and Kurpad, Sunita Simon and Kartik, Kamakshi and Kalyanram, Kartik and Desrivieres, Sylvane and Barker, Gareth and Papadopoulos Orfanos, Dimitri and Toledano, Mireille B and Murthy, Pratima and Vaidya, Nilakshi and Krishnaveni, Ghattu and Schumann, Gunter and Sharma, Kuldeep Kumar and Bhaskarapillai, Binukumar and Thennarasu, K and Kashyap, Rajan and Bharath, Rose Dawn and Chakrabarti, Amit and Chetan, G K and Srinivas Bharath, Muchukunte Mukunda},
title = {{Plasma Glial Fibrillary Acidic Protein (GFAP) shows age-dependent associations with externalizing psychopathology and atypical brain connectivity}},
journal = {Translational psychiatry},
year = {2026},
month = may,
volume = {16},
number = {1},
pages = {382},
publisher = {Nature Publishing Group},
issn = {2158-3188},
doi = {10.1038/s41398-026-04114-2},
url = {https://doi.org/10.1038/s41398-026-04114-2},
pmid = {42215432},
pmcid = {PMC13407853}
}

RIS

TY - JOUR
AU - Niveditha, B S
AU - Holla, Bharath
AU - Subramanian, Sarada
AU - Gagana, N
AU - Bhargavi, K M
AU - Sharma, Eesha
AU - Mahadevan, Jayant
AU - Purushottam, Meera
AU - Viswanath, Biju
AU - Benegal, Vivek
AU - Arunachal, Gautham
AU - Heron, Jon
AU - Hickman, Matthew
AU - Basu, Debasish
AU - Subodh, B N
AU - Singh, Lenin
AU - Singh, Roshan
AU - Kumaran, Kalyanaraman
AU - Kuriyan, Rebecca
AU - Kurpad, Sunita Simon
AU - Kartik, Kamakshi
AU - Kalyanram, Kartik
AU - Desrivieres, Sylvane
AU - Barker, Gareth
AU - Papadopoulos Orfanos, Dimitri
AU - Toledano, Mireille B
AU - Murthy, Pratima
AU - Vaidya, Nilakshi
AU - Krishnaveni, Ghattu
AU - Schumann, Gunter
AU - Sharma, Kuldeep Kumar
AU - Bhaskarapillai, Binukumar
AU - Thennarasu, K
AU - Kashyap, Rajan
AU - Bharath, Rose Dawn
AU - Chakrabarti, Amit
AU - Chetan, G K
AU - Srinivas Bharath, Muchukunte Mukunda
TI - Plasma Glial Fibrillary Acidic Protein (GFAP) shows age-dependent associations with externalizing psychopathology and atypical brain connectivity
T2 - Translational psychiatry
J2 - Transl Psychiatry
PY - 2026
DA - 2026/05/29
VL - 16
IS - 1
SP - 382
SN - 2158-3188
PB - Nature Publishing Group
DO - 10.1038/s41398-026-04114-2
UR - https://doi.org/10.1038/s41398-026-04114-2
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41398-026-04114-2",
"type": "article-journal",
"title": "Plasma Glial Fibrillary Acidic Protein (GFAP) shows age-dependent associations with externalizing psychopathology and atypical brain connectivity",
"container-title": "Translational psychiatry",
"author": [
{
"family": "Niveditha",
"given": "B S"
},
{
"family": "Holla",
"given": "Bharath"
},
{
"family": "Subramanian",
"given": "Sarada"
},
{
"family": "Gagana",
"given": "N"
},
{
"family": "Bhargavi",
"given": "K M"
},
{
"family": "Sharma",
"given": "Eesha"
},
{
"family": "Mahadevan",
"given": "Jayant"
},
{
"family": "Purushottam",
"given": "Meera"
},
{
"family": "Viswanath",
"given": "Biju"
},
{
"family": "Benegal",
"given": "Vivek"
},
{
"family": "Arunachal",
"given": "Gautham"
},
{
"family": "Heron",
"given": "Jon"
},
{
"family": "Hickman",
"given": "Matthew"
},
{
"family": "Basu",
"given": "Debasish"
},
{
"family": "Subodh",
"given": "B N"
},
{
"family": "Singh",
"given": "Lenin"
},
{
"family": "Singh",
"given": "Roshan"
},
{
"family": "Kumaran",
"given": "Kalyanaraman"
},
{
"family": "Kuriyan",
"given": "Rebecca"
},
{
"family": "Kurpad",
"given": "Sunita Simon"
},
{
"family": "Kartik",
"given": "Kamakshi"
},
{
"family": "Kalyanram",
"given": "Kartik"
},
{
"family": "Desrivieres",
"given": "Sylvane"
},
{
"family": "Barker",
"given": "Gareth"
},
{
"family": "Papadopoulos Orfanos",
"given": "Dimitri"
},
{
"family": "Toledano",
"given": "Mireille B"
},
{
"family": "Murthy",
"given": "Pratima"
},
{
"family": "Vaidya",
"given": "Nilakshi"
},
{
"family": "Krishnaveni",
"given": "Ghattu"
},
{
"family": "Schumann",
"given": "Gunter"
},
{
"family": "Sharma",
"given": "Kuldeep Kumar"
},
{
"family": "Bhaskarapillai",
"given": "Binukumar"
},
{
"family": "Thennarasu",
"given": "K"
},
{
"family": "Kashyap",
"given": "Rajan"
},
{
"family": "Bharath",
"given": "Rose Dawn"
},
{
"family": "Chakrabarti",
"given": "Amit"
},
{
"family": "Chetan",
"given": "G K"
},
{
"family": "Srinivas Bharath",
"given": "Muchukunte Mukunda"
}
],
"container-title-short": "Transl Psychiatry",
"volume": "16",
"issue": "1",
"page": "382",
"DOI": "10.1038/s41398-026-04114-2",
"PMID": "42215432",
"PMCID": "PMC13407853",
"ISSN": "2158-3188",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41398-026-04114-2",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
29
]
]
}
}

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/s41398-026-04010-9 [code]
Bullying victimization and brain development: a longitudinal structural magnetic resonance imaging study from adolescence to early adulthood.
Journal: Translational psychiatry
In common: easystats, ggpubr, ggplot2, 1 other tool, 1 reference, 5 authors
[2] doi:10.1126/sciadv.aed0772 [code]
Deep learning reveals a neurocomputational mechanism predicting depression risk in adolescents.
Journal: Science advances
In common: ggplot2, tidyverse, 5 authors
[3] doi:10.1038/s41386-026-02401-6 [code]
Model-based analysis of stop-signal data reveals robust neural and clinical correlates of evidence accumulation but not inhibition.
Journal: Neuropsychopharmacology : official publication of the American College of Neuropsychopharmacology
In common: ggplot2, tidyverse, pandas, 1 other tool, 1 reference, 3 authors
[4] doi:10.1093/nc/niag029 [code]
A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.
Journal: Neuroscience of consciousness
In common: AFNI, easystats, ggpubr, 7 other tools, 1 reference
[5] doi:10.1038/s41597-026-07350-9 [code]
An open multi-center MEG-EEG dataset for studying conscious visual perception.
Journal: Scientific data
In common: AFNI, easystats, ggplot2, 6 other tools
[6] doi:10.1038/s41597-026-07377-y [code]
An open-access multi-site fMRI dataset for investigating conscious visual perception.
Journal: Scientific data
In common: AFNI, easystats, ggplot2, 6 other tools
[7] doi:10.1162/imag.a.1325 [code]
Decoding everyday levels of musical training from subcortical white-matter architecture.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: ggpubr, ggplot2, seaborn, 5 other tools, 2 references
[8] doi:10.1162/imag.a.1269 [code]
From early to contemporary normative modeling: Mapping individual differences in neurophysiological signals.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: seaborn, pandas, SciPy, 2 other tools, 4 references
[9] doi:10.1162/imag.a.1245 [code]
Towards precision EEG connectomics: Evaluating the benefits of dense sampling.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: AFNI, ggpubr, ggplot2, 6 other tools
[10] doi:10.7554/elife.107088 [code]
Development of auditory and spontaneous movement responses to music over the first postnatal year.
Journal: eLife
In common: easystats, ggpubr, ggplot2, 6 other tools

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.