OSCR

Motor- and cognitive-dominant functional network adaptations supporting dual-task performance in older adults.

Code ↔ Paper

6 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 6 matches
  1. [1] § Methods › fMRI data analysis › Task-based GLM analysis and ROI selection ↔ analysis_code/ROIs_extraction_from_SPM_activation_results/ROI_extraction_procedures/split_SPM_activation_clusters_into_ROI_HO_atlas.m, lines 1–29 · score 0.58 · Harvard Oxford, Atlas, cluster, masking, voxels, ROI
  2. [2] § Methods › Participants ↔ analysis_code/RGCCA_analysis/Run_RGCCA_analysis.R, lines 1–39 · score 0.58 · Carl von Ossietzky, Oldenburg, cognitive, motor
  3. [3] § Methods › Participants ↔ analysis_code/RGCCA_analysis/Run_RGCCA_analysis.R, lines 1–39 · score 0.58 · Carl von Ossietzky, Oldenburg
  4. [4] § Methods › fMRI data analysis ↔ analysis_code/RGCCA_analysis/Run_RGCCA_analysis.R, lines 168–211 · score 0.55 · component scores, Single Motor FC, Dual Task FC, axis, ellipses, RGCCA
  5. [5] § Methods › Multivariate brain–behavior association analysis ↔ analysis_code/RGCCA_analysis/Run_RGCCA_analysis.R, lines 86–124 · score 0.52 · latent variables, component scores, correlation, RGCCA, blocks, behavioral
  6. [6] § Methods › fMRI data analysis ↔ analysis_code/RGCCA_analysis/Run_RGCCA_analysis.R, lines 302–386 · score 0.51 · Pairwise correlations, Single Task FC, Dual Task FC, density, RGCCA, age

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 · 500 lines · 17 KB · MIT · 5 matches

  1. # RGCCA analysis pipeline
  2. # This pipeline uses motor network input files
  3. # You can replace the input files with cognitive brain FC for cognitive network analysis
  4. # All brain and behavior data are provided in RGCCA folder
  5. # Author: Yan Deng
  6. #
  7. # Biological Psychology Lab,
  8. # Department of Psychology,
  9. # School of Medicine and Health Sciences,
  10. # Carl von Ossietzky Universität Oldenburg,
  11. # Oldenburg, Germany
  12. # Version 3.0 updated: 2026-02-16
  13. #
  14. # Notes:
  15. # - Edit only the "USER SETTINGS" section when moving machines/folders.
  16. # Load the packages
  17. # set the working directory
  18. # =========================
  19. # Libraries
  20. # =========================
  21. library(dplyr)
  22. # this library is used in data cleaning, exploration, and preparation workflows,
  23. # especially with the pipe operator %>%
  24. # Install mixOmics via Bioconductor
  25. if (!requireNamespace("BiocManager", quietly = TRUE))
  26. install.packages("BiocManager")
  27. # Install mixOmics
  28. BiocManager::install("mixOmics")
  29. # Load library mixOmics
  30. library(mixOmics) # Run wrapper.rgcca(), Loaded mixOmics, version: 6.30.0
  31. library(ggplot2)
  32. library(GGally)
  33. library(tibble)
  34. library(qgraph)
  35. library(tidyr)
  36. library(stringr)
  37. # USER SETTINGS
  38. # =========================
  39. project_dir <- "Your Project Directory"
  40. setwd(project_dir)
  41. # Input files (edit if you do cognitive task network analysis)
  42. fc_dual_file <- "Old_Young_SPM_motorNetwork_Go_dual_90connections.csv"
  43. fc_single_file <- "Old_Young_SPM_motorNetwork_motor_single_558connections.csv"
  44. behavior_file <- "Merged_motor_cog_summary_data_imputed.csv"
  45. subjects_file <- "subjects_summary_64_young_old_clean_ID_2Groups.csv"
  46. # Step 1: Prepare data blocks
  47. block1 <- read.csv(fc_dual_file) # Dual-task FC
  48. block2 <- read.csv(fc_single_file) # Single-task FC
  49. # load the behavior data
  50. block3 <- readRDS("data/block3_motor_beh_clean_20250418.rds") # Single and dual behavior
  51. block4 <- readRDS("data/block4_motor_beh_clean_20250418.rds") # Dual behavior only
  52. group_vector <- readRDS("data/group_vector_clean_20250418.rds")
  53. sum(is.na(block1))
  54. sum(is.na(block2))
  55. # subject 08, 14, 28, 29 excluded from brain data analysis
  56. # Step 2: Combine into a list,
  57. # Behavioral measurement includes only the Dual task,
  58. blocks <- list(
  59. "DualTaskFC" = block1,
  60. "SingleMotorFC" = block2,
  61. "DualBehavior" = block4
  62. )
  63. # always make block names character strings, not symbols.
  64. # Step 3: Create the design matrix
  65. # Fully connected design (off-diagonal = 1, diagonal = 0)
  66. # connect every block with the others (no self-links)
  67. design <- matrix(
  68. c(0, 1, 1,
  69. 1, 0, 1,
  70. 1, 1, 0),
  71. nrow = 3, byrow = TRUE)
  72. colnames(design) <- rownames(design) <- names(blocks)
  73. # Make sure they are character strings, matching the block names.
  74. # print and inspect the design:
  75. design
  76. # DualTaskFC SingleMotorFC DualBehavior
  77. #DualTaskFC 0 1 1
  78. #SingleMotorFC 1 0 1
  79. #DualBehavior 1 1 0
  80. #################################################
  81. #___________________ Step 4: Run wrapper.rgcca()
  82. # Set number of components to extract per block
  83. ncomp <- 2 # ncomp: number of components to extract per block
  84. scheme <-"horst" # other options: "factorial", "centroid" (Default: "horst").
  85. set.seed(123) # set seed
  86. # Run RGCCA (wrapper.rgcca)
  87. res_rgcca_dual <- wrapper.rgcca(
  88. X = blocks,
  89. design = design,
  90. ncomp = ncomp,
  91. scheme = scheme,
  92. scale = TRUE,
  93. all.outputs = TRUE
  94. )
  95. # Check the structure of res_rgcca_dual:
  96. str(res_rgcca_dual, max.level = 2)
  97. # a summary of what's inside (scores, loadings, correlations, tau values, etc.).
  98. # 2. Component scores (aka latent variables / variates)
  99. # # Component scores (variates) per block
  100. res_rgcca_dual$variates
  101. # These are the projections of each subject onto the RGCCA components.
  102. # Read scores for difference block
  103. head(res_rgcca_dual$variates$DualBehavior) # Scores for the Behavior block
  104. # 3. Loadings (aka weight vectors or a coefficients)
  105. # tell how much each variable contributes to the component.
  106. res_rgcca_dual$loadings$DualBehavior
  107. # 4. top 10 features by absolute loading on component 1 for each block
  108. # 5. Inner AVE (average variance explained between blocks)
  109. # This reflects how well the blocks relate to each other.
  110. res_rgcca_dual$AVE$AVE_inner
  111. # Look at the first few component scores
  112. head(res_rgcca_dual$variates$DualTaskFC)
  113. head(res_rgcca_dual$variates$SingleMotorFC)
  114. # 7 Plot individuals
  115. plotIndiv(res_rgcca, legend = TRUE)
  116. # If you have a group variable (e.g., AgeGroup):
  117. plotIndiv(res_rgcca_dual, group = group_vector, legend = TRUE)
  118. # Plot Component Scores for All Three Blocks,
  119. # 1. Combine scores from each block
  120. # Extract component scores
  121. scores_dual_fc <- res_rgcca_dual$variates$DualTaskFC
  122. scores_motor_fc <- res_rgcca_dual$variates$SingleMotorFC
  123. scores_behavior <- res_rgcca_dual$variates$DualBehavior
  124. # Create data frames with block labels
  125. df_dual_fc <- data.frame(Comp1 = scores_dual_fc[, 1],
  126. Comp2 = scores_dual_fc[, 2],
  127. Group = group_vector,
  128. Block = "DualTaskFC")
  129. df_motor_fc <- data.frame(Comp1 = scores_motor_fc[, 1],
  130. Comp2 = scores_motor_fc[, 2],
  131. Group = group_vector,
  132. Block = "SingleMotorFC")
  133. df_behavior <- data.frame(Comp1 = scores_behavior[, 1],
  134. Comp2 = scores_behavior[, 2],
  135. Group = group_vector,
  136. Block = "DualBehavior")
  137. # Combine all into one long dataframe
  138. df_all <- rbind(df_dual_fc, df_motor_fc, df_behavior)
  139. # Set block as a factor with desired order
  140. df_all$Block <- factor(df_all$Block,
  141. levels = c("DualTaskFC", "SingleMotorFC", "DualBehavior"))
  142. # Save the data
  143. saveRDS(df_all, "data/df_all_for_Figure7_B.rds")
  144. # Perform Statistical Tests for group comparison
  145. # Run a t-test on Comp1 for each block
  146. stats_results <- df_all %>%
  147. group_by(Block) %>%
  148. summarise(
  149. p_value = t.test(Comp2 ~ Group)$p.value
  150. ) %>%
  151. mutate(
  152. sig_label = case_when(
  153. p_value < 0.001 ~ "***",
  154. p_value < 0.01 ~ "**",
  155. p_value < 0.05 ~ "*",
  156. TRUE ~ "ns"
  157. )
  158. )
  159. print(stats_results)
  160. # 2. Plot all blocks using facetting with fixed axis
  161. df_all <- readRDS("data/df_all_for_Figure7_B.rds")
  162. p <- ggplot(df_all, aes(x = Comp1, y = Comp2, color = Group, shape = Group)) +
  163. geom_point(size = 3, alpha = 0.8) +
  164. stat_ellipse(level = 0.68, type = "norm", linetype = "dashed", size = 0.8) +
  165. facet_wrap(~ Block, scales = "free") +
  166. scale_color_manual(values = c("Young" = "#1f77b4", "Old" = "#ff7f0e")) +
  167. scale_shape_manual(values = c("Young" = 16, "Old" = 17)) +
  168. labs(
  169. #title = "Component Scores Across Blocks",
  170. x = "Component 1",
  171. y = "Component 2",
  172. color = "Group",
  173. shape = "Group"
  174. ) +
  175. theme_minimal(base_size = 14) +
  176. theme(legend.position = "bottom")
  177. print(p)
  178. # Save as high-resolution TIFF
  179. ggsave("20250720_motorNetwork_component_scores_3blocks_final.tiff",
  180. plot = p,
  181. dpi = 600,
  182. width = 10,
  183. height = 5,
  184. units = "in",
  185. compression = "lzw")
  186. # added into supplementary figure
  187. #---------------Splitting the plots per block, full control on each plot
  188. library(patchwork) # for side-by-side layout
  189. # Split the data into subsets
  190. df_dual <- df_all %>% filter(Block == "DualTaskFC")
  191. df_motor <- df_all %>% filter(Block == "SingleMotorFC")
  192. df_behav <- df_all %>% filter(Block == "DualBehavior")
  193. # 1. DualTaskFC plot
  194. p1 <- ggplot(df_dual, aes(x = Comp1, y = Comp2, color = Group, shape = Group)) +
  195. geom_point(size = 2, alpha = 0.7) +
  196. stat_ellipse(level = 0.68, linetype = "dashed") +
  197. coord_cartesian(xlim = c(-12, 25), ylim = c(-15, 15)) +
  198. labs(title = "Dual Task FC", x = "Component 1", y = "Component 2") +
  199. theme_minimal(base_size = 14) +
  200. theme(legend.position = "none")
  201. # 2. SingleMotorFC plot
  202. p2 <- ggplot(df_motor, aes(x = Comp1, y = Comp2, color = Group, shape = Group)) +
  203. geom_point(size = 2, alpha = 0.7) +
  204. stat_ellipse(level = 0.68, linetype = "dashed") +
  205. coord_cartesian(xlim = c(-12, 25), ylim = c(-15, 15)) +
  206. labs(title = "Single Motor FC", x = "Component 1", y = NULL) +
  207. theme_minimal(base_size = 14) +
  208. theme(legend.position = "none")
  209. # 3. DualBehavior plot
  210. p3 <- ggplot(df_behav, aes(x = Comp1, y = Comp2, color = Group, shape = Group)) +
  211. geom_point(size = 2, alpha = 0.7) +
  212. stat_ellipse(level = 0.68, linetype = "dashed") +
  213. coord_cartesian(xlim = c(-10, 10), ylim = c(-10, 10)) +
  214. labs(title = "Dual Behavior", x = "Component 1", y = NULL) +
  215. theme_minimal(base_size = 14)
  216. # Combine all three plots horizontally with shared legend
  217. final_plot <- (p1 | p2 | p3) + plot_layout(guides = "collect") & theme(legend.position = "right")
  218. # Print the final combined plot
  219. print(final_plot)
  220. # Save as high-resolution TIFF
  221. ggsave("20250726_motorNetwork_component_scores_uniformaxis_final.tiff",
  222. plot = final_plot,
  223. dpi = 600,
  224. width = 10,
  225. height = 5,
  226. units = "in",
  227. compression = "lzw")
  228. # Correlation summary panel, version 2, with p value
  229. # Step 1: Data with correlation and p-values
  230. cor_data_all <- data.frame(
  231. Component = rep(c("Motor Network", "Cognitive Network"), each = 2),
  232. Block = rep(c("Dual Task FC", "Single Task FC"), times = 2),
  233. Correlation = c(
  234. 0.432, 0.476, # Motor
  235. 0.402, 0.465 # Cognitive
  236. ),
  237. p_value = c(
  238. 0.0001, 0.0001, # Motor
  239. 0.0001, 0.0001 # Cognitive
  240. )
  241. )
  242. # Step 2: Create significance labels based on p-values
  243. cor_data_all <- cor_data_all %>%
  244. mutate(
  245. stars = case_when(
  246. p_value < 0.001 ~ "***",
  247. p_value < 0.01 ~ "**",
  248. p_value < 0.05 ~ "*",
  249. TRUE ~ ""
  250. ),
  251. label = paste0(formatC(Correlation, format = "f", digits = 2), stars)
  252. )
  253. # Step 3: Factor levels for plot order
  254. cor_data_all$Component <- factor(cor_data_all$Component, levels = c("Motor Network", "Cognitive Network"))
  255. cor_data_all$Block <- factor(cor_data_all$Block, levels = c("Dual Task FC", "Single Task FC"))
  256. # Save the data
  257. saveRDS(cor_data_all,"data/cor_data_all.rds")
  258. # Step 4: Plot heatmap with annotated labels
  259. # Read the data
  260. cor_data_all <- readRDS("data/cor_data_all.rds")
  261. p_corr <- ggplot(cor_data_all, aes(x = Block, y = Component, fill = Correlation)) +
  262. geom_tile(color = "white", linewidth = 0.5) +
  263. geom_text(aes(label = label), size = 5) +
  264. scale_fill_gradient2(
  265. low = "#f7fbff", high = "#08306b", mid = "#c6dbef",
  266. midpoint = 0.3, limit = c(0.0, 0.6), name = "Correlation"
  267. ) +
  268. theme_minimal(base_size = 14) +
  269. theme(
  270. axis.text = element_text(size = 12),
  271. axis.title = element_blank(),
  272. legend.position = "right",
  273. panel.grid = element_blank()
  274. )
  275. ggsave("20250727_brain_behavior_correlation_final.tiff", plot = p_corr, dpi = 600, width = 10, height = 5, units = "in", compression = "lzw")
  276. #---------------------------------------------------
  277. # Plot multiplots for pairwide correlations_ Figure 8
  278. # a simplified version of plotRGCCAMultiPlot():
  279. plotRGCCAMultiPlot <- function(rgcca_result, group = NULL, block_names = NULL, comp = 1,
  280. lower_fn = "points", upper_fn = "cor", diag_fn = "densityDiag") {
  281. require(GGally) # Uses standard GGally wrappers ("points", "cor", "densityDiag")
  282. require(ggplot2)
  283. # Combine variates from each block
  284. variates_list <- lapply(rgcca_result$variates, function(x) x[, comp])
  285. df <- as.data.frame(variates_list)
  286. colnames(df) <- if (is.null(block_names)) names(rgcca_result$variates) else block_names
  287. # Add group only AFTER selecting columns for ggpairs
  288. color_mapping <- aes() # default
  289. if (!is.null(group)) {
  290. group <- as.factor(group)
  291. df$Group <- group
  292. color_mapping <- aes(color = Group)
  293. cols_to_plot <- setdiff(names(df), "Group")
  294. } else {
  295. cols_to_plot <- names(df)
  296. }
  297. # ggpairs plot
  298. p <-GGally::ggpairs(
  299. df,
  300. columns = cols_to_plot,
  301. mapping = color_mapping,
  302. lower = list(continuous = wrap(lower_fn, alpha = 0.7, size = 2)),
  303. upper = list(continuous = wrap(upper_fn, size = 4)),
  304. diag = list(continuous = wrap(diag_fn, alpha = 0.5))
  305. )
  306. print(p)
  307. return(p)
  308. }
  309. # call the plotting function for pairwise correlations_ Figure 8
  310. myplot <- plotRGCCAMultiPlot(
  311. rgcca_result = res_rgcca_dual,
  312. group = group_vector,
  313. block_names = c("DualTaskFC", "SingleMotorFC", "DualBehavior"),
  314. comp = 1
  315. #diag_fn = diag_no_grid
  316. )
  317. # Save as high-resolution TIFF (good for journals)
  318. ggsave("20250722_motorNetwork_correlationMatrix_comp2_final.tiff", plot = myplot, dpi = 600, width = 10, height = 5, units = "in", compression = "lzw")
  319. # Plot both comp 1 and 2. And comp 1 is much better to distinguish age group.
  320. # - plot loadings of behavior. ------------------------------------
  321. # Reusable Function from rgcca loadings
  322. install.packages("tibble") # If haven’t installed it yet
  323. # Function to plot loadings from RGCCA results: Figure 9_Behavior loading
  324. plot_behavior_loadings <- function(rgcca_result, comp = 1, block_name = "DualBehavior", motor_keywords = c("Motor", "motor")) {
  325. # Extract loadings for the specified block and component
  326. loadings <- rgcca_result$loadings[[block_name]][, comp, drop = FALSE] %>%
  327. as.data.frame() %>%
  328. rownames_to_column(var = "Variable")
  329. colnames(loadings)[2] <- "Loading"
  330. # Add category based on variable name
  331. loadings$Category <- ifelse(
  332. grepl(paste(motor_keywords, collapse = "|"), loadings$Variable),
  333. "Motor",
  334. "Cognitive"
  335. )
  336. # Sort variables by absolute loading
  337. loadings <- loadings %>%
  338. arrange(desc(abs(Loading))) %>%
  339. mutate(Variable = factor(Variable, levels = rev(Variable))) # For proper ggplot ordering
  340. # Plot
  341. p <- ggplot(loadings, aes(x = Variable, y = Loading, fill = Category)) +
  342. geom_bar(stat = "identity", width = 0.7) +
  343. coord_flip() +
  344. scale_fill_manual(values = c("Motor" = "#1f77b4", "Cognitive" = "#2ca02c")) +
  345. theme_minimal(base_size = 14) +
  346. labs(
  347. title = paste("Behavioral Loadings (Component", comp, ")"),
  348. x = NULL,
  349. y = "Loading Weight",
  350. fill = "Task Type"
  351. ) +
  352. theme(
  353. panel.grid.major.y = element_blank(),
  354. panel.grid.minor = element_blank(),
  355. legend.position = "top"
  356. )
  357. print(p)
  358. }
  359. # Plot behavior loading
  360. my_plot <- plot_behavior_loadings(res_rgcca_dual, comp = 1)
  361. # Save as high-res TIFF
  362. ggsave("2025_0713_Behavior_Loadings_Comp1_sort.tiff",
  363. plot = my_plot,
  364. width = 8,
  365. height = 5,
  366. dpi = 600,
  367. device = "tiff",
  368. compression = "lzw")
  369. # -------------------------------------------------------
  370. # Pyramid Barplot Function for the daultask FC
  371. plot_pyramid_loadings <- function(rgcca_result, block_name, comp = 2, top_n = 20) {
  372. # Extract and clean loadings
  373. loadings <- rgcca_result$loadings[[block_name]][, comp, drop = FALSE] %>%
  374. as.data.frame()
  375. loadings$FullName <- rownames(loadings)
  376. colnames(loadings)[1] <- "Loading"
  377. pattern_suffix <- if (block_name == "SingleMotorFC") "Motor_single" else "Go_dual"
  378. # Clean variable labels
  379. loadings$Variable <- loadings$FullName %>%
  380. str_extract(paste0("M_ROI_.*?\\.and\\.M_ROI_.*?\\.at\\.", pattern_suffix)) %>%
  381. str_replace_all("M_ROI_", "") %>%
  382. str_replace_all("\\.and\\.", " – ") %>%
  383. str_replace(paste0("\\.at\\.", pattern_suffix), "")
  384. # Keep top N by absolute value
  385. top_loadings <- loadings %>%
  386. slice_max(order_by = abs(Loading), n = top_n) %>%
  387. arrange(Loading) %>%
  388. mutate(Variable = factor(Variable, levels = Variable)) # Keep proper Y ordering
  389. # Plot mirrored barplot
  390. p <- ggplot(top_loadings, aes(x = Loading, y = Variable, fill = Loading > 0)) +
  391. geom_col(width = 0.7) +
  392. scale_fill_manual(
  393. values = c("TRUE" = "#66c2a5", "FALSE" = "#8da0cb"), # softer teal and blue
  394. guide = "none") +
  395. scale_x_continuous(
  396. breaks = scales::pretty_breaks(n = 5),
  397. expand = expansion(mult = c(0.1, 0.1))
  398. ) +
  399. labs(
  400. title = paste("Barplot of Loadings -", block_name, "(Component", comp, ")"),
  401. x = "Loading Weight",
  402. y = NULL
  403. ) +
  404. theme_minimal(base_size = 12) +
  405. theme(
  406. axis.text.y = element_text(size = 10),
  407. plot.title = element_text(size = 12),
  408. panel.grid.minor = element_blank(),
  409. panel.grid.major.y = element_blank()
  410. )
  411. print(p)
  412. return(p)
  413. }
  414. my_plot <- plot_pyramid_loadings(res_rgcca_dual, block_name = "DualTaskFC", comp = 1)
  415. my_plot <- plot_pyramid_loadings(res_rgcca_dual, block_name = "SingleMotorFC", comp = 1)
  416. ggsave("20250719_DualTaskFC_loadings_motor_network_comp1_600.tiff",
  417. my_plot, width = 10, height = 6, dpi = 600, compression = "lzw")
  418. # __ End __#

Run_RGCCA_analysis.R at commit d7975c7, under MIT · at the source

Overview

Authors: Yan Deng1, AmirHussein Abdolalizadeh1, Kayson Fakhar2,3, Tina Schmitt4, Karsten Witt5,6, Carsten Gießing1,6, Jochem W Rieger7, Christiane M Thiel1,6
ORCID iDs: Yan Deng
  1. Biological Psychology Lab, Department of Psychology, School of Medicine and Health Sciences, Carl von Ossietzky Universität Oldenburg, Oldenburg, Germany
  2. MRC Cognition and Brain Sciences Unit, University of Cambridge, Cambridge, United Kingdom
  3. Institute of Computational Neuroscience, University Medical Center Eppendorf-Hamburg, Hamburg University, Hamburg, Germany
  4. Neuroimaging Unit, School of Medicine and Health Sciences, Carl von Ossietzky Universität Oldenburg, Oldenburg, Germany
  5. Department of Neurology, School of Medicine and Health Sciences, Carl von Ossietzky Universität Oldenburg, Oldenburg, Germany
  6. Research Center Neurosensory Science, Carl von Ossietzky Universität Oldenburg, Oldenburg, Germany
  7. Applied Neurocognitive Psychology Lab, Department of Psychology, School of Medicine and Health Sciences, Carl von Ossietzky Universität Oldenburg, Oldenburg, Germany
Journal: Imaging neuroscience (Cambridge, Mass.), volume 4, article IMAG.a.1257
Dates: received 31 August 2025; accepted 30 April 2026; published online 29 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1162/imag.a.1257 · PMID 42232072 · PMCID PMC13224314 · OpenAlex W7160433290
Open access: diamond, a free copy (OpenAlex)
Status: code verified
Categories: fMRI (modality), human (organism)
Methods: Spectral & time-frequency, Statistics, Machine learning, Preprocessing, fMRI & imaging
Keywords: task-based functional connectivity, cognitive–motor dual-task, brain–behavior association, domain-dominant network, regularized generalized canonical correlation analysis (RGCCA)
Topic: Functional Brain Connectivity Studies (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Deutsche Forschungsgemeinschaft (456732630); German Research Foundation (3T MRI INST 184/152-1 FUGG, INST 184/225-1 FUGG)
Citations: cited by 2 papers (Europe PMC); 112 references in the paper
Research resources: in combination with SPM12 RRID:SCR_007037, RRID:SCR_009550, 2019 RRID:SCR_016216

Abstract

Aging is associated with declines in both motor and cognitive functions, which are often examined using cognitive–motor dual-task paradigms. However, the functional brain network mechanisms supporting dual-task performance across these domains remain incompletely understood. We investigated 40 older adults (50–80 years) and 20 younger adults (20–40 years) who performed a motor single task (pedaling), a cognitive single task (Go/NoGo), and a combined cognitive–motor dual-task during functional magnetic resonance imaging (fMRI) using a custom-built MRI-compatible pedaling device. Behaviorally, older adults showed significant dual-task costs in motor performance, whereas cognitive performance was relatively preserved. At the neural level, task-based functional connectivity revealed distinct patterns of age-related network reorganization. Cognitive-dominant networks showed relatively selective connectivity increases within frontal executive and motor-planning regions, consistent with compensatory recruitment supporting preserved cognitive dual-task performance. In contrast, motor-dominant networks exhibited broader reorganization, characterized by strengthened frontoparietal control circuits but weakened cerebello-parietal and sensorimotor pathways, pointing to reduced automaticity and increased reliance on central cognitive control. Multivariate brain–behavior analyses further revealed age-related differences in latent connectivity–behavior relationships. Motor-dominant networks in older adults showed greater dispersion and stronger coupling with behavioral variability, whereas cognitive-network patterns remained largely stable and overlapping across age groups. Motor response time variability, particularly under dual-task conditions, emerged as the strongest behavioral contributor to this latent brain–behavior dimension and was associated with connectivity in frontoparietal control and motor-planning regions. Together, these findings demonstrate that aging involves an asymmetric reorganization of large-scale networks, in which motor systems become increasingly dependent on cognitive control while cognitive systems remain comparatively resilient. This network-level account identifies motor variability and cognitive–motor interdependence as sensitive markers of aging-related brain changes, with implication for understanding why cognitive–motor abilities remain stable in some individuals while declining in others.

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 6 matches between paragraphs and lines of code.

ydeng2021/dual-task-fmri-aging-RGCCA-analysis

License: MIT
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: d7975c7e994754a92e9df037047a5b3879e64622, 28 February 2026
Languages: MATLAB (3), R (1)
Size: 84 files, 4 scripts
Software Heritage: not archived
Found in: “Data and Code Availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: SPM (3 files), ggplot2 (1 file), patchwork (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
6 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;
  • 4 scripts, each with its path and the digest of its content;
  • 6 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 and Code Availability

The broader research project was preregistered on the Open Science Framework (OSF): https://osf.io/pjt2x/overview. Preprocessed task-based fMRI data are publicly available via OSF: https://osf.io/pjt2x/resources. Analysis code is available on GitHub: https://github.com/ydeng2021/dual-task-fmri-aging-RGCCA-analysis and is distributed under the MIT License. While the preregistration specifies the general study design and hypotheses, the analyses reported here represent a subset of the preregistered framework and include additional methodological extensions.

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, pages, dates, 8 authors, 5 keywords, 2 funders, 112 references, 3 RRIDs.

Cite

This paper

Deng, Y., Abdolalizadeh, A., Fakhar, K., Schmitt, T., Witt, K., Gießing, C., Rieger, J. W., & Thiel, C. M. (2026). Motor- and cognitive-dominant functional network adaptations supporting dual-task performance in older adults. Imaging neuroscience (Cambridge, Mass.), 4, IMAG.a.1257. https://doi.org/10.1162/imag.a.1257

BibTeX

@article{deng2026motor,
author = {Deng, Yan and Abdolalizadeh, AmirHussein and Fakhar, Kayson and Schmitt, Tina and Witt, Karsten and Gießing, Carsten and Rieger, Jochem W and Thiel, Christiane M},
title = {{Motor- and cognitive-dominant functional network adaptations supporting dual-task performance in older adults}},
journal = {Imaging neuroscience (Cambridge, Mass.)},
year = {2026},
month = may,
volume = {4},
pages = {IMAG.a.1257},
publisher = {MIT Press},
issn = {2837-6056},
doi = {10.1162/imag.a.1257},
url = {https://doi.org/10.1162/imag.a.1257},
pmid = {42232072},
pmcid = {PMC13224314}
}

RIS

TY - JOUR
AU - Deng, Yan
AU - Abdolalizadeh, AmirHussein
AU - Fakhar, Kayson
AU - Schmitt, Tina
AU - Witt, Karsten
AU - Gießing, Carsten
AU - Rieger, Jochem W
AU - Thiel, Christiane M
TI - Motor- and cognitive-dominant functional network adaptations supporting dual-task performance in older adults
T2 - Imaging neuroscience (Cambridge, Mass.)
J2 - Imaging Neurosci (Camb)
PY - 2026
DA - 2026/05/29
VL - 4
SP - IMAG.a.1257
SN - 2837-6056
PB - MIT Press
DO - 10.1162/imag.a.1257
UR - https://doi.org/10.1162/imag.a.1257
LA - en
ER -

CSL-JSON

{
"id": "10.1162/imag.a.1257",
"type": "article-journal",
"title": "Motor- and cognitive-dominant functional network adaptations supporting dual-task performance in older adults",
"container-title": "Imaging neuroscience (Cambridge, Mass.)",
"author": [
{
"family": "Deng",
"given": "Yan"
},
{
"family": "Abdolalizadeh",
"given": "AmirHussein"
},
{
"family": "Fakhar",
"given": "Kayson"
},
{
"family": "Schmitt",
"given": "Tina"
},
{
"family": "Witt",
"given": "Karsten"
},
{
"family": "Gießing",
"given": "Carsten"
},
{
"family": "Rieger",
"given": "Jochem W"
},
{
"family": "Thiel",
"given": "Christiane M"
}
],
"container-title-short": "Imaging Neurosci (Camb)",
"volume": "4",
"page": "IMAG.a.1257",
"DOI": "10.1162/imag.a.1257",
"PMID": "42232072",
"PMCID": "PMC13224314",
"ISSN": "2837-6056",
"publisher": "MIT Press",
"URL": "https://doi.org/10.1162/imag.a.1257",
"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.1002/hbm.70522 [code]
Investigating Emotional Reactivity in Experienced Users of Psychedelics: A Cross-Sectional fMRI Study.
Journal: Human brain mapping
In common: patchwork, ggplot2, tidyverse, fMRI, 4 references
[2] doi:10.1093/sleep/zsag030 [code]
Divergent disruption of brain networks following total and chronic sleep loss: a longitudinal fMRI study.
Journal: Sleep
In common: fMRI, 5 references
[3] doi:10.1016/j.neuroimage.2026.122186
Aging, brain network connectivity, and cognition: evidence from resting-state dynamic arterial spin labeling.
Journal: NeuroImage
In common: fMRI, 4 references
[4] doi:10.1162/imag.a.1198 [code]
MEPrep: A robust pipeline for multi-echo fMRI denoising and preprocessing.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: fMRI, 5 references
[5] doi:10.1162/imag.a.1278 [code]
Young and old adult brains experience opposite effects of acute sleep restriction on the functional connectivity network.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: ggplot2, tidyverse, fMRI, 2 references
[6] doi:10.1002/hbm.70621 [code]
Optimising 7T-fMRI for Imaging Regions of Magnetic Susceptibility.
Journal: Human brain mapping
In common: SPM, fMRI, 3 references
[7] doi:10.1038/s41467-026-74331-2 [code]
Trial-by-trial fMRI-neurofeedback dissociates fusiform and occipital contributions to face detection and recognition.
Journal: Nature communications
In common: SPM, patchwork, ggplot2, 1 other tool, fMRI
[8] doi:10.1016/j.neuroimage.2026.121857
Echoes of time: Organization of episodic autobiographical memories in the brain according to their remoteness.
Journal: NeuroImage
In common: 4 references
[9] doi:10.1162/imag.a.1285 [code]
Individualized mapping of functional brain networks in older adulthood.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: fMRI, 4 references
[10] doi:10.1371/journal.pone.0353790 [code]
Do common dopaminergic variants modulate processing speed in cognitive aging? A longitudinal candidate gene study.
Journal: PloS one
In common: ggplot2, tidyverse, 2 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.