Age-Related Differences in Resting-State Functional Connectivity Predict Specific Patterns of Speech Disfluency.
The 3 matches
- [1] § METHODS › Predicting Disfluency From Age, EF, and Network Segregation ↔ Analysis Files/RSFC_stats_analysis_OSF.Rmd, lines 1130–1157 · score 0.57 · Johnson Neyman, simple slopes, intervals, interactively, predicted, Education
- [2] § METHODS › Participant Demographics ↔ Analysis Files/RSFC_stats_analysis_OSF.Rmd, lines 120–170 · score 0.55 · Cook, distance, threshold, outliers, MMSE, MoCA
- [3] § RESULTS › Network Segregation Predicts Disfluency ↔ Analysis Files/RSFC_stats_analysis_OSF.Rmd, lines 1130–1157 · score 0.52 · Johnson Neyman, simple slopes, DMN segregation, younger, interaction, older
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 · 1,813 lines · 56 KB · no license · 3 matches
- ---
- title: "RSFC_stats_analysis"
- output: html_document
- date: "2025-04-25"
- ---
- ```{r load libraries}
- library ("readr")
- library("tidyverse")
- library("ggplot2")
- library("dplyr")
- library("broom")
- library("knitr")
- library("psych")
- library("kableExtra")
- ```
- This script runs the regression and mediation analysis for RSFC data for the DMN, MD, and Language networks and the Speech disfluency data for a dataset comprising thress cohorts "PND", "MP", and "PND2".
- Master_data_updated.csv contains all behavioral data including Fluency (for tasks "Speech" and "Where"), Stroop, moca/mmse, etc.
- All rsfc files contain subject measures of resting state functional connectivity: segregation, within, and between network connectivity
- Note on "discourse type" aka speech elcitation task:
- For MP and PND2, this script calculates averages collapsed across "Speech" and "Where" (Open-ended prompt and "Frog Where Are You?" respectively)
- ```{r load data}
- bhv_data <- read_csv(
- "master_data_updated.csv",
- col_types = cols(sex = col_character())
- )
- rsfc_data_PND <- read_csv("PND_subject_measures.csv")
- rsfc_data_MP <- read_csv("MP_subject_measures.csv")
- rsfc_data_PND2 <- read_csv("PND2_subject_measures.csv")
- #view(bhv_data)
- #view(rsfc_data_PND)
- #view(rsfc_data_MP)
- #view(rsfc_data_PND2)
- ```
- #Data Wrangling Steps
- Here we are collapsing Where and Speech for MP and PND2, merging the Speech data with the RSFC data, and getting a count of the sample before and after exclusion criteria
- ```{r clean behavioral data}
- #Collapse Where and Speech data for MP and PND2
- #Define disfluency columns to average
- cols_to_average <- c(
- "mor_words", "perc_prolongation", "perc_wwr", "perc_total_repetitions", "perc_mono_wwr",
- "perc_phrase_repetitions", "perc_word_revisions", "perc_phrase_revisions", "perc_total_revisions",
- "perc_filled_pauses", "perc_pauses", "perc_typical_disfluencies", "perc_stutter_disfluencies",
- "perc_total_disfluencies", "freq_types", "freq_tokens", "freq_ttr", "total_trad_fps",
- "total_fillers", "percentage_fillers", "percentage_trad_fps", "duration", "speech_rate"
- )
- #Collapse row pairs for MP
- collapsed_MP <- bhv_data %>%
- filter(project == "MP") %>%
- group_by(subject) %>%
- summarise(across(all_of(cols_to_average), mean, na.rm = TRUE), .groups = "drop") %>%
- left_join(
- bhv_data %>% filter(project == "MP") %>% group_by(subject) %>% slice(1) %>%
- select(-all_of(cols_to_average), -discourse_type),
- by = "subject"
- ) %>%
- mutate(discourse_type = "BOTH") %>% #change discourse type label
- relocate(project)
- #Collapse row pairs for PND2
- collapsed_PND2 <- bhv_data %>%
- filter(project == "PND2") %>%
- group_by(subject) %>%
- summarise(across(all_of(cols_to_average), mean, na.rm = TRUE), .groups = "drop") %>%
- left_join(
- bhv_data %>% filter(project == "PND2") %>% group_by(subject) %>% slice(1) %>%
- select(-all_of(cols_to_average), -discourse_type),
- by = "subject"
- ) %>%
- mutate(discourse_type = "BOTH") %>% #change discourse type label
- relocate(project)
- #Keep PND
- PND_unchanged <- bhv_data %>%
- filter(project == "PND")
- #Bind all three dataframes
- final_bhv_df <- bind_rows(PND_unchanged, collapsed_MP, collapsed_PND2)
- View(final_bhv_df)
- ```
- ```{r Merge Behavioral data w RSFC data}
- #Merge all Fluency data with RSFC data
- rsfc_data_PND <- rsfc_data_PND %>%
- rename(subject = Subject_ID) %>%
- mutate(project = "PND")
- rsfc_data_MP <- rsfc_data_MP %>%
- rename(subject = Subject_ID) %>%
- mutate(project = "MP")
- rsfc_data_PND2 <- rsfc_data_PND2 %>%
- rename(subject = Subject_ID) %>%
- mutate(project = "PND2")
- #Combine all RSFC datasets
- rsfc_data_all <- bind_rows(rsfc_data_PND, rsfc_data_MP, rsfc_data_PND2)
- #Merge RSFC with behavioral data
- merged_initial <- final_bhv_df %>%
- left_join(rsfc_data_all, by = c("subject", "project"))
- # Get initial sample size BEFORE exclusions
- initial_n <- nrow(merged_initial)
- cat("Initial sample size (before exclusions):", initial_n, "\n")
- view(merged_initial)
- range_age <- range(merged_initial$age, na.rm = TRUE)
- cat("Youngest participant age:", range_age[1], "\n")
- cat("Oldest participant age:", range_age[2], "\n")
- ```
- ```{r Apply Exclusion criteria}
- # Exclude based on moca and mmse
- excluded_cog <- merged_initial %>%
- filter((!is.na(mmse) & mmse < 24) | (!is.na(moca_score) & moca_score < 26))
- tmp_step1 <- merged_initial %>%
- filter(is.na(mmse) | mmse >= 24) %>%
- filter(is.na(moca_score) | moca_score >= 26)
- # Exclude based on missing key variables
- key_vars <- c("stroop_effect", "perc_total_disfluencies",
- "Lang_LH_within", "DMN_within", "MD_within",
- "Lang_to_DMN", "Lang_to_MD", "DMN_to_MD")
- excluded_missing <- tmp_step1 %>%
- filter(if_any(all_of(key_vars), is.na))
- tmp_step2 <- tmp_step1 %>%
- filter(if_all(all_of(key_vars), ~ !is.na(.)))
- # Exclude based on Cook’s Distance
- model_cook <- lm(perc_total_disfluencies ~ age + education, data = tmp_step2)
- cooks_d <- cooks.distance(model_cook)
- threshold <- 4 / nrow(tmp_step2)
- excluded_outliers <- tmp_step2[which(cooks_d > threshold), ]
- merged_data <- tmp_step2[which(cooks_d <= threshold), ]
- # Summary of Exclusions
- cat("Initial sample size:", initial_n, "\n")
- cat("Excluded for cognitive criteria:", nrow(excluded_cog), "\n")
- cat("Excluded for missing key variables:", nrow(excluded_missing), "\n")
- cat("Excluded as outliers based on Cook’s Distance:", nrow(excluded_outliers), "\n")
- cat("Final analytic sample:", nrow(merged_data), "\n\n")
- # Use Participant IDs to see who was excluded and why
- #excluded_cog %>%
- #select(subject, project) %>%
- #print(n = Inf)
- #excluded_missing %>%
- #select(subject, project) %>%
- #print(n = Inf)
- #excluded_outliers %>%
- #select(subject, project) %>%
- #print(n = Inf)
- view(merged_data)
- ```
- #Quality Check data distrubutions
- ```{r QC key variables}
- # Select key numeric variables for QC
- qc_vars <- c("age", "education", "stroop_effect",
- "perc_total_disfluencies", "perc_total_repetitions",
- "perc_filled_pauses", "perc_pauses", "perc_prolongation",
- "perc_total_revisions")
- # Run descriptive statistics (includes skew, kurtosis)
- describe(merged_data[qc_vars])
- ```
- ```{r QC plots}
- qc_vars <- c(
- "age",
- "education",
- "stroop_effect",
- "perc_total_disfluencies",
- "perc_total_repetitions",
- "perc_filled_pauses",
- "perc_pauses",
- "perc_prolangation",
- "perc_total_revisions"
- )
- # Loop through variables
- for (var in qc_vars) {
- data_vec <- merged_data[[var]]
- # Skip non-numeric just in case
- if (is.numeric(data_vec)) {
- # Set up side-by-side plots
- par(mfrow = c(1, 2))
- # Histogram
- hist(data_vec,
- main = paste("Histogram of", var),
- xlab = var,
- col = "lightgray",
- border = "white")
- # Q-Q plot
- qqnorm(data_vec, main = paste("Q-Q Plot of", var))
- qqline(data_vec, col = "red", lwd = 2)
- # Pause between variables to review each set
- readline(prompt = paste("Press [Enter] to continue to next variable:", var))
- }
- }
- # Reset plotting layout back to default
- par(mfrow = c(1, 1))
- ```
- #Get Descriptives
- ```{r Desciptives}
- merged_data %>%
- summarise(
- N = n(),
- mean_age = mean(age, na.rm = TRUE),
- sd_age = sd(age, na.rm = TRUE),
- min_age = min(age, na.rm = TRUE),
- max_age = max(age, na.rm = TRUE),
- n_female = sum(sex == "F", na.rm = TRUE),
- mean_education = mean(education, na.rm = TRUE),
- min_edu = min(education, na.rm = TRUE),
- max_edu = max(education, na.rm = TRUE),
- sd_education = sd(education, na.rm = TRUE)
- )
- ```
- #Get cog/ling battery performance
- Note that here we are calculating means only for mmse, moca, stroop interference effect, forward digit span, backward digit span, pitt_acc (reading span accuracy), and pitt_pu (reading span partial unit score), and VF semantic category total tokens. Descriptives for the other tasks e.g., WAISS, speed of processing, etc. were calculated in an additional .rmd called RSFC_cog_battery_means.rmd.
- ```{r cognitive performance means}
- cog_vars <- c(
- "mmse", "moca_score", "stroop_effect", "forward_digit", "backward_digit",
- "pitt_acc", "pitt_pu", "phon_total", "sem_total")
- #summary table for mean, SD, and age beta
- summary_stats <- map_dfr(cog_vars, function(var) {
- this_data <- merged_data[[var]]
- model <- lm(reformulate("age", response = var), data = merged_data)
- tibble(
- variable = var,
- mean = mean(this_data, na.rm = TRUE),
- sd = sd(this_data, na.rm = TRUE),
- min = min(this_data, na.rm = TRUE),
- max = max(this_data, na.rm = TRUE),
- beta_age = coef(model)["age"]
- )
- })
- summary_stats
- ```
- #Start of LM analyses
- He we begin the LM analyses. We ran seperate models to test if Age, EF, and all RSFC measures predicted any of the 6 disfluency subtypes.
- We started first with simple Age effects for disfluency, RSFC, and EF (Stroop) performance.
- ## Age effects
- ```{r Age effects for disfluency}
- #first make sure 'project' and is a factor to have it as a covariate
- merged_data$project <- factor(merged_data$project)
- disfluency_vars <- c(
- "perc_total_disfluencies",
- "perc_total_repetitions",
- "perc_filled_pauses",
- "perc_pauses",
- "perc_total_revisions",
- "perc_prolongation"
- )
- age_effects_disfluency <- data.frame()
- for (var in disfluency_vars) {
- # Fit the model controlling for age education, and project
- frm <- as.formula(paste(var, "~ age + education + project"))
- model_disfluency <- lm(frm, data = merged_data)
- #Get age coefficient and CI
- s <- summary(model_disfluency)
- age_coef <- coef(s)["age", ]
- age_ci <- confint(model_disfluency)["age", ] # 95% CI
- #Build a results row including CI
- result_row <- data.frame(
- outcome = var,
- estimate = age_coef["Estimate"],
- std.error = age_coef["Std. Error"],
- statistic = age_coef["t value"],
- p.value = age_coef["Pr(>|t|)"],
- CI_lower = age_ci[1],
- CI_upper = age_ci[2]
- )
- age_effects_disfluency <- rbind(age_effects_disfluency, result_row)
- }
- #Apply fdr correction across the six tests
- age_effects_disfluency$adj.p <- p.adjust(age_effects_disfluency$p.value,
- method = "fdr")
- print(age_effects_disfluency)
- ```
- ```{r Age on disfluency_results_table}
- age_effects_disfluency %>%
- kable(
- format = ifelse(knitr::is_latex_output(), "latex", "html"),
- digits = 3,
- caption = "Age Effects on Disfluency Measures (fdr-adjusted)"
- ) %>%
- kable_styling(full_width = FALSE)
- ```
- ```{r Age effects for RSFC}
- rsfc_vars <- c(
- "Lang_LH_within", "DMN_within", "MD_within",
- "Lang_to_DMN", "Lang_to_MD",
- "Lang_LH_segregation", "DMN_segregation", "MD_segregation"
- )
- #Create an empty data frame to store results
- age_effects_rsfc <- data.frame()
- #Loop through each RSFC variable
- for (var in rsfc_vars) {
- #Fit LM
- model_RSFC <- lm(as.formula(paste(var, "~ age + education + project")), data = merged_data)
- #Extract summary for the age predictor
- model_summary <- summary(model_RSFC)
- age_coef <- coef(model_summary)["age", ]
- #Store results
- result_row <- data.frame(
- outcome = var,
- estimate = age_coef["Estimate"],
- std.error = age_coef["Std. Error"],
- statistic = age_coef["t value"],
- p.value = age_coef["Pr(>|t|)"]
- )
- #Get age coefficient and CI
- s <- summary(model_RSFC)
- age_coef <- coef(s)["age", ]
- age_ci <- confint(model_RSFC)["age", ] # 95% CI
- #Build a results row including CI
- result_row <- data.frame(
- outcome = var,
- estimate = age_coef["Estimate"],
- std.error = age_coef["Std. Error"],
- statistic = age_coef["t value"],
- p.value = age_coef["Pr(>|t|)"],
- CI_lower = age_ci[1],
- CI_upper = age_ci[2]
- )
- age_effects_rsfc <- rbind(age_effects_rsfc, result_row)
- }
- ```
- ```{r Age effects just on network segregation}
- seg_vars <- c("Lang_LH_segregation", "DMN_segregation", "MD_segregation")
- # lm age models
- age_seg <- map_dfr(seg_vars, function(var) {
- m <- lm(as.formula(paste(var, "~ age + education + project")), data = merged_data)
- est <- coef(summary(m))["age", "Estimate"]
- se <- coef(summary(m))["age", "Std. Error"]
- t <- coef(summary(m))["age", "t value"]
- p <- coef(summary(m))["age", "Pr(>|t|)"]
- ci <- confint(m)["age", ]
- tibble(
- network = var,
- estimate = est,
- std.error = se,
- t.value = t,
- p.value = p,
- CI_lower = ci[1],
- CI_upper = ci[2]
- )
- })
- # FDR-correct across the three p-values
- age_seg <- age_seg %>%
- mutate(q_fdr = p.adjust(p.value, method = "fdr"))
- # Print the table
- age_seg %>%
- kable(digits = 3, caption = "Age Effects on Network Segregation (FDR-adjusted)") %>%
- kable_styling(full_width = FALSE)
- ```
- ```{r Age effects for RSFC}
- #Apply fdr correction across the 8 tests
- age_effects_rsfc$adj.p <- p.adjust(age_effects_rsfc$p.value,
- method = "fdr")
- print(age_effects_rsfc)
- age_effects_rsfc %>%
- kable(
- format = ifelse(knitr::is_latex_output(), "latex", "html"),
- digits = 3,
- caption = "Age Effects on RSFC Measures (fdr-adjusted)"
- ) %>%
- kable_styling(full_width = FALSE)
- ```
- ```{r Age on Stroop}
- # Fit model
- age_stroop <- lm(stroop_effect ~ age + education + project, data = merged_data)
- # Model summary
- ci_age <- summary(age_stroop)
- # Extract age coefficient
- coef_age <- ci_age$coefficients["age", ]
- print(ci_age)
- # Extract 95% CI for age
- ci_full <- confint(age_stroop)
- ci_age <- ci_full[match("age", rownames(ci_full)), ]
- # Raw & FDR-adjusted p-value
- p_raw <- coef_age["Pr(>|t|)"]
- p_adj <- p.adjust(p_raw, method = "fdr")
- # View full model summary
- print(ci_age)
- ```
- ##LM Analyses within and between rsfc measures
- Note that the manuscript focuses only on segregation as this is a measures of both within and between. Within and Between analyses and results however are reported in the supplemental materials.
- ```{r Mean center predictor variables}
- #First mean center all preditor variables
- merged_data <- merged_data %>%
- mutate(
- age_c = scale(age, scale = FALSE),
- stroop_effect_c = scale(stroop_effect, scale = FALSE),
- Lang_LH_within_c = scale(Lang_LH_within, scale = FALSE),
- MD_within_c = scale(MD_within, scale = FALSE),
- DMN_within_c = scale(DMN_within, scale = FALSE),
- Lang_to_DMN_c = scale(Lang_to_DMN, scale = FALSE),
- Lang_to_MD_c = scale(Lang_to_MD, scale = FALSE),
- DMN_to_MD_c = scale(DMN_to_MD, scale = FALSE),
- Lang_LH_segregation_c = scale(Lang_LH_segregation, scale = FALSE),
- MD_segregation_c = scale(MD_segregation, scale = FALSE),
- DMN_segregation_c = scale(DMN_segregation, scale = FALSE)
- )
- ```
- ```{r Within DMN models}
- #Total disfluencies
- model_total_disfluencies_DMN <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- #Total repetitions
- model_total_repetitions_DMN <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- #Filled pauses
- model_filled_pauses_DMN <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- #Unfilled pauses
- model_unfilled_pauses_DMN <- lm(
- perc_pauses ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- #Prolongations
- model_prolongation_DMN <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- #Revisions
- model_total_revisions_DMN <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + DMN_within_c +
- age_c:stroop_effect_c + age_c:DMN_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- #List all models
- models <- list(
- total_disfluencies = model_total_disfluencies_DMN,
- total_repetitions = model_total_repetitions_DMN,
- filled_pauses = model_filled_pauses_DMN,
- unfilled_pauses = model_unfilled_pauses_DMN,
- prolongation = model_prolongation_DMN,
- total_revisions = model_total_revisions_DMN
- )
- #Print summary() and confint() for each model
- for(name in names(models)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models[[name]]))
- }
- # extract raw p-values for DMN_within_c
- p_raw <- sapply(models, function(m) {
- summary(m)$coefficients["DMN_within_c", "Pr(>|t|)"]
- })
- # apply fdr correction across 6 tests --> main effects only
- # (the `n=` argument forces it to use 6 even if p_raw is shorter)
- p_adj <- p.adjust(p_raw, method = "fdr", n = 6)
- cat("\n\nfdr-adjusted p-values:\n")
- print(p_adj)
- # Extract raw p-values for interaction term age_c:DMN_within_c
- p_raw_interactions <- sapply(models, function(m) {
- summary(m)$coefficients["age_c:DMN_within_c", "Pr(>|t|)"]
- })
- # Now apply FDR correction across those 6 interaction tests
- p_adj_interactions <- p.adjust(p_raw_interactions, method = "fdr", n = 6)
- cat("\n\nFDR-adjusted p-values for age_c:DMN_within_c interaction:\n")
- print(p_adj_interactions)
- ```
- ```{r total disfluencies interactions}
- library(interactions)
- interact_plot(
- model_total_disfluencies_DMN,
- pred = DMN_within_c,
- modx = age_c,
- interval = TRUE,
- x.label = "Within-network DMN FC (centered)",
- y.label = "Total Disfluencies (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- sim_slopes(
- model_total_disfluencies_DMN,
- pred = DMN_within_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r repetitions}
- interact_plot(
- model_total_repetitions_DMN,
- pred = DMN_within_c,
- modx = age_c,
- interval = TRUE,
- x.label = "Within-network DMN FC (centered)",
- y.label = "Repetitions (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- sim_slopes(
- model_total_repetitions_DMN,
- pred = DMN_within_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r filled pauses}
- interact_plot(
- model_filled_pauses_DMN,
- pred = DMN_within_c,
- modx = age_c,
- interval = TRUE,
- x.label = "Within-network DMN FC (centered)",
- y.label = "Filled Pauses (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- sim_slopes(
- model_filled_pauses_DMN,
- pred = DMN_within_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r Wihin MD models}
- # Within MD --> disfluencies
- # Total disfluencies
- model_total_disfluencies_MD <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_MD <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_MD <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_MD <- lm(
- perc_pauses ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_MD <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_MD <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + MD_within_c +
- age_c:stroop_effect_c + age_c:MD_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all MD models
- models_MD <- list(
- total_disfluencies = model_total_disfluencies_MD,
- total_repetitions = model_total_repetitions_MD,
- filled_pauses = model_filled_pauses_MD,
- unfilled_pauses = model_unfilled_pauses_MD,
- prolongation = model_prolongation_MD,
- total_revisions = model_total_revisions_MD
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_MD)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_MD[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_MD[[name]]))
- }
- #Extract raw p-values for the MD_within_c term
- p_raw_MD <- sapply(models_MD, function(m) {
- summary(m)$coefficients["MD_within_c", "Pr(>|t|)"]
- })
- #Apply fdr correction across 6 tests
- p_adj_MD <- p.adjust(p_raw_MD, method = "fdr", n = 6)
- cat("\n\nfdr-adjusted p-values for MD_within_c across models:\n")
- print(p_adj_MD)
- ```
- ```{r Within Lang}
- # Total disfluencies
- model_total_disfluencies_LANG <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_LANG <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_LANG <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_LANG <- lm(
- perc_pauses ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_LANG <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_LANG <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + Lang_LH_within_c +
- age_c:stroop_effect_c + age_c:Lang_LH_within_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all LANGUAGE models
- models_LANG <- list(
- total_disfluencies = model_total_disfluencies_LANG,
- total_repetitions = model_total_repetitions_LANG,
- filled_pauses = model_filled_pauses_LANG,
- unfilled_pauses = model_unfilled_pauses_LANG,
- prolongation = model_prolongation_LANG,
- total_revisions = model_total_revisions_LANG
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_LANG)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_LANG[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_LANG[[name]]))
- }
- #Extract raw p-values for the Lang_LH_within_c term
- p_raw_LANG <- sapply(models_LANG, function(m) {
- summary(m)$coefficients["Lang_LH_within_c", "Pr(>|t|)"]
- })
- #Apply fdr correction across 6 tests
- p_adj_LANG <- p.adjust(p_raw_LANG, method = "fdr", n = 6)
- cat("\n\nfdr-adjusted p-values for Lang_LH_within_c across models:\n")
- print(p_adj_LANG)
- ```
- ```{r Between Lang to DMN }
- # Between Language to DMN
- # Total disfluencies
- model_total_disfluencies_LangToDMN <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_LangToDMN <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_LangToDMN <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_LangToDMN <- lm(
- perc_pauses ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_LangToDMN <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_LangToDMN <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + Lang_to_DMN_c +
- age_c:stroop_effect_c + age_c:Lang_to_DMN_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all Lang -->DMN models
- models_LangToDMN <- list(
- total_disfluencies = model_total_disfluencies_LangToDMN,
- total_repetitions = model_total_repetitions_LangToDMN,
- filled_pauses = model_filled_pauses_LangToDMN,
- unfilled_pauses = model_unfilled_pauses_LangToDMN,
- prolongation = model_prolongation_LangToDMN,
- total_revisions = model_total_revisions_LangToDMN
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_LangToDMN)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_LangToDMN[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_LangToDMN[[name]]))
- }
- # get raw p-values
- p_raw_main <- sapply(models_LangToDMN, function(m) {
- summary(m)$coefficients["Lang_to_DMN_c", "Pr(>|t|)"]
- })
- p_raw_interaction <- sapply(models_LangToDMN, function(m) {
- summary(m)$coefficients["age_c:Lang_to_DMN_c", "Pr(>|t|)"]
- })
- # Apply FDR correction
- p_adj_main <- p.adjust(p_raw_main, method = "fdr", n = length(p_raw_main))
- p_adj_interaction <- p.adjust(p_raw_interaction, method = "fdr", n = length(p_raw_interaction))
- # Print results
- cat("\n\nFDR-adjusted p-values for Lang_to_DMN_c (main effect):\n")
- print(p_adj_main)
- cat("\n\nFDR-adjusted p-values for age_c:Lang_to_DMN_c (interaction):\n")
- print(p_adj_interaction)
- ```
- ```{r test interactions}
- library(interactions)
- # Plot the interaction: Lang–DMN FC × Age predicting Filled Pauses
- interact_plot(
- model_total_disfluencies_LangToDMN,
- pred = Lang_to_DMN_c,
- modx = age_c,
- interval = TRUE,
- x.label = "Lang–DMN FC (centered)",
- y.label = "Total disfluencies (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- # Simple slopes and Johnson-Neyman test
- sim_slopes(
- model_total_disfluencies_LangToDMN,
- pred = Lang_to_DMN_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r plot interaction}
- # Plot the interaction: Lang–DMN FC × Age predicting Filled Pauses
- interact_plot(
- model_total_repetitions_LangToDMN,
- pred = Lang_to_DMN_c,
- modx = age_c,
- interval = TRUE,
- x.label = "Lang–DMN FC (centered)",
- y.label = "Total disfluencies (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- # Simple slopes and Johnson-Neyman test
- sim_slopes(
- model_total_repetitions_LangToDMN,
- pred = Lang_to_DMN_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r Between Lang to MD}
- # Total disfluencies
- model_total_disfluencies_LangToMD <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_LangToMD <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_LangToMD <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_LangToMD <- lm(
- perc_pauses ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_LangToMD <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_LangToMD <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + Lang_to_MD_c +
- age_c:stroop_effect_c + age_c:Lang_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all Lang→MD models
- models_LangToMD <- list(
- total_disfluencies = model_total_disfluencies_LangToMD,
- total_repetitions = model_total_repetitions_LangToMD,
- filled_pauses = model_filled_pauses_LangToMD,
- unfilled_pauses = model_unfilled_pauses_LangToMD,
- prolongation = model_prolongation_LangToMD,
- total_revisions = model_total_revisions_LangToMD
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_LangToMD)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_LangToMD[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_LangToMD[[name]]))
- }
- # FDR Correction
- #Extract raw p-values for Lang_to_MD_c
- p_raw_LangToMD <- sapply(models_LangToMD, function(m) {
- summary(m)$coefficients["Lang_to_MD_c", "Pr(>|t|)"]
- })
- #Apply fdr correction across 6 tests
- p_adj_LangToMD <- p.adjust(p_raw_LangToMD, method = "fdr", n = 6)
- cat("\n\nfdr-adjusted p-values for Lang_to_MD_c across models:\n")
- print(p_adj_LangToMD)
- ```
- ```{r Between DMN to MD}
- #Ran this model but since there were no a priori hypotheses, this is not included in the manuscript results
- # Total disfluencies
- model_total_disfluencies_DMNtoMD <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_DMNtoMD <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_DMNtoMD <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_DMNtoMD <- lm(
- perc_pauses ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_DMNtoMD <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_DMNtoMD <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + DMN_to_MD_c +
- age_c:stroop_effect_c + age_c:DMN_to_MD_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all DMN to MD models
- models_DMNtoMD <- list(
- total_disfluencies = model_total_disfluencies_DMNtoMD,
- total_repetitions = model_total_repetitions_DMNtoMD,
- filled_pauses = model_filled_pauses_DMNtoMD,
- unfilled_pauses = model_unfilled_pauses_DMNtoMD,
- prolongation = model_prolongation_DMNtoMD,
- total_revisions = model_total_revisions_DMNtoMD
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_DMNtoMD)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_DMNtoMD[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_DMNtoMD[[name]]))
- }
- #FDR correction
- #Extract raw p-values for the DMN_to_MD_c term
- p_raw_DMNtoMD <- sapply(models_DMNtoMD, function(m) {
- summary(m)$coefficients["DMN_to_MD_c", "Pr(>|t|)"]
- })
- #Apply fdr correction across 6 tests
- p_adj_DMNtoMD <- p.adjust(p_raw_DMNtoMD, method = "fdr", n = 6)
- cat("\n\nfdr-adjusted p-values for DMN_to_MD_c across models:\n")
- print(p_adj_DMNtoMD)
- ```
- #LM Analyses Segregation rsfc measure
- Here is the main analyses reported in the manuscript i.e., the Segregation measure
- ```{r Segregation DMN}
- # Total disfluencies
- model_total_disfluencies_DMNseg <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_DMNseg <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_DMNseg <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_DMNseg <- lm(
- perc_pauses ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_DMNseg <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_DMNseg <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + DMN_segregation_c +
- age_c:stroop_effect_c + age_c:DMN_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all DMN segregation models
- models_DMNseg <- list(
- total_disfluencies = model_total_disfluencies_DMNseg,
- total_repetitions = model_total_repetitions_DMNseg,
- filled_pauses = model_filled_pauses_DMNseg,
- unfilled_pauses = model_unfilled_pauses_DMNseg,
- prolongation = model_prolongation_DMNseg,
- total_revisions = model_total_revisions_DMNseg
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_DMNseg)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_DMNseg[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_DMNseg[[name]]))
- }
- ```
- ```{r Test Interactions Age x DMNseg}
- # Model
- model_dmn_total <- lm(
- perc_total_disfluencies ~ age_c + DMN_segregation_c +
- stroop_effect_c + age_c:DMN_segregation_c +
- age_c:stroop_effect_c + education + project,
- data = merged_data
- )
- # Plot interaction
- interact_plot(
- model_dmn_total,
- pred = DMN_segregation_c,
- modx = age_c,
- interval = TRUE,
- x.label = "DMN Segregation (centered)",
- y.label = "Total Disfluencies (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- # Simple slopes and Johnson-Neyman
- sim_slopes(
- model_dmn_total,
- pred = DMN_segregation_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r Test Interactions Age x DMNseg}
- model_dmn_reps <- lm(
- perc_total_repetitions ~ age_c + DMN_segregation_c +
- stroop_effect_c + age_c:DMN_segregation_c +
- age_c:stroop_effect_c + education + project,
- data = merged_data
- )
- interact_plot(
- model_dmn_reps,
- pred = DMN_segregation_c,
- modx = age_c,
- interval = TRUE,
- x.label = "DMN Segregation (centered)",
- y.label = "Repetitions (%)",
- modx.labels = c("Younger", "Average", "Older")
- )
- sim_slopes(
- model_dmn_reps,
- pred = DMN_segregation_c,
- modx = age_c,
- jnplot = TRUE
- )
- ```
- ```{r Segregation MD}
- # Total disfluencies
- model_total_disfluencies_MDseg <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_MDseg <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_MDseg <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_MDseg <- lm(
- perc_pauses ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_MDseg <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_MDseg <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + MD_segregation_c +
- age_c:stroop_effect_c + age_c:MD_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all MD segregation models
- models_MDseg <- list(
- total_disfluencies = model_total_disfluencies_MDseg,
- total_repetitions = model_total_repetitions_MDseg,
- filled_pauses = model_filled_pauses_MDseg,
- unfilled_pauses = model_unfilled_pauses_MDseg,
- prolongation = model_prolongation_MDseg,
- total_revisions = model_total_revisions_MDseg
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_MDseg)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_MDseg[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_MDseg[[name]]))
- }
- ```
- ```{r Segregation Lang}
- # Total disfluencies
- model_total_disfluencies_LANGseg <- lm(
- perc_total_disfluencies ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_disfluencies)),
- na.action = na.exclude
- )
- # Total repetitions
- model_total_repetitions_LANGseg <- lm(
- perc_total_repetitions ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_repetitions)),
- na.action = na.exclude
- )
- # Filled pauses
- model_filled_pauses_LANGseg <- lm(
- perc_filled_pauses ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_filled_pauses)),
- na.action = na.exclude
- )
- # Unfilled pauses
- model_unfilled_pauses_LANGseg <- lm(
- perc_pauses ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_pauses)),
- na.action = na.exclude
- )
- # Prolongations
- model_prolongation_LANGseg <- lm(
- perc_prolongation ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_prolongation)),
- na.action = na.exclude
- )
- # Revisions
- model_total_revisions_LANGseg <- lm(
- perc_total_revisions ~ age_c + stroop_effect_c + Lang_LH_segregation_c +
- age_c:stroop_effect_c + age_c:Lang_LH_segregation_c + education + project,
- data = merged_data %>% filter(!is.na(perc_total_revisions)),
- na.action = na.exclude
- )
- # List all LANGUAGE segregation models
- models_LANGseg <- list(
- total_disfluencies = model_total_disfluencies_LANGseg,
- total_repetitions = model_total_repetitions_LANGseg,
- filled_pauses = model_filled_pauses_LANGseg,
- unfilled_pauses = model_unfilled_pauses_LANGseg,
- prolongation = model_prolongation_LANGseg,
- total_revisions = model_total_revisions_LANGseg
- )
- # Print summary() and 95% CI for each model
- for (name in names(models_LANGseg)) {
- cat("\n\n### Model for", name, "\n")
- print(summary(models_LANGseg[[name]]))
- cat("\n95% CI for coefficients:\n")
- print(confint(models_LANGseg[[name]]))
- }
- ```
- #Correct for Multiple Comparisons Main Effects
- ```{r fdr correction}
- #Extract raw p-values for each network’s 6 disfluency tests
- p_DMN <- sapply(models_DMNseg, function(m) coef(summary(m))["DMN_segregation_c", "Pr(>|t|)"])
- p_MD <- sapply(models_MDseg, function(m) coef(summary(m))["MD_segregation_c", "Pr(>|t|)"])
- p_LANG <- sapply(models_LANGseg, function(m) coef(summary(m))["Lang_LH_segregation_c","Pr(>|t|)"])
- #FDR-adjust within each network
- q_DMN <- p.adjust(p_DMN, method = "fdr")
- q_MD <- p.adjust(p_MD, method = "fdr")
- q_LANG <- p.adjust(p_LANG, method = "fdr")
- #Make a combined table
- seg_by_net <- bind_rows(
- tibble(
- network = "DMN",
- outcome = names(p_DMN),
- p_raw = unname(p_DMN),
- q_fdr = unname(q_DMN)
- ),
- tibble(
- network = "MD",
- outcome = names(p_MD),
- p_raw = unname(p_MD),
- q_fdr = unname(q_MD)
- ),
- tibble(
- network = "LANG",
- outcome = names(p_LANG),
- p_raw = unname(p_LANG),
- q_fdr = unname(q_LANG)
- )
- )
- #Print table
- seg_by_net %>%
- arrange(network, q_fdr) %>%
- kable(
- digits = 3,
- caption = "Network-specific Segregation → Disfluency: raw p and FDR-q"
- ) %>%
- kable_styling(full_width = FALSE)
- ```
- #Correct for Multiple Comparisons: Interactions
- ```{r fdr correction interactions}
- #Extract six interaction p-values per network
- pint_DMN <- sapply(models_DMNseg, function(m) coef(summary(m))["age_c:DMN_segregation_c", "Pr(>|t|)"])
- pint_MD <- sapply(models_MDseg, function(m) coef(summary(m))["age_c:MD_segregation_c", "Pr(>|t|)"])
- pint_LANG <- sapply(models_LANGseg, function(m) coef(summary(m))["age_c:Lang_LH_segregation_c","Pr(>|t|)"])
- #Apply FDR correction
- q_int_DMN <- p.adjust(pint_DMN, method = "fdr")
- q_int_MD <- p.adjust(pint_MD, method = "fdr")
- q_int_LANG <- p.adjust(pint_LANG, method = "fdr")
- #Make a table
- int_by_net <- bind_rows(
- tibble(network = "DMN", outcome = names(pint_DMN), p_int = pint_DMN, q_int = q_int_DMN),
- tibble(network = "MD", outcome = names(pint_MD), p_int = pint_MD, q_int = q_int_MD),
- tibble(network = "LANG", outcome = names(pint_LANG), p_int = pint_LANG, q_int = q_int_LANG)
- )
- int_by_net %>%
- arrange(network, q_int) %>%
- kable(
- digits = 3,
- caption = "Network‐specific Segregation × Age Interactions: raw p and FDR‐q"
- ) %>%
- kable_styling(full_width = FALSE)
- ```
- #Start of mediation analyses
- First we will see if disfluency is mediated by Stroop, then DMN segregation, then Lang-to-DMN between
- ```{r load libraries}
- library(mediation)
- ```
- ##Mediation A: Stroop mediatior for Total Disfluencies
- Age --> Stroop --> Total_Disfluency
- ```{r mediation model A}
- #Path 1: Age --> EF (Stroop)
- model_A1 <- lm(stroop_effect ~ age + education +project, data = merged_data)
- #Path 2: EF (Stroop) --> Total Disfluencies (controlling for Age)
- model_A2 <- lm(perc_total_disfluencies ~ stroop_effect + age + education +project, data = merged_data)
- #Path 3: Age --> Total Disfluencies
- model_A3 <- lm(perc_total_disfluencies ~ age + education + project, data = merged_data)
- summary(model_A1)
- summary(model_A2)
- summary(model_A3)
- ```
- ##Mediation B: Stroop mediatior for Revisions
- Age --> Stroop --> Revisions
- Now I am going to check just revisions since this overall seems to be the disfluency type that was most sensitive
- ```{r mediation model B}
- #Path 1: Age --> Stroop (same)
- model_B1_rev <- lm(stroop_effect ~ age + education + project, data = merged_data)
- #Path 2: Stroop --> Revisions (controlling for Age)
- model_B2_rev <- lm(perc_total_revisions ~ stroop_effect + age + education + project, data = merged_data)
- # Path 3: Age --> Revisions
- model_B3_rev <- lm(perc_total_revisions ~ age + education + project, data = merged_data)
- summary(model_B1_rev)
- summary(model_B2_rev)
- summary(model_B3_rev)
- ```
- ```{r Full mediation model B}
- # Filter to missing data
- modelB_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(stroop_effect), !is.na(perc_total_revisions))
- #re-fit models
- modelB_mediator <- lm(stroop_effect ~ age + education + project, data = modelB_data)
- modelB_outcome <- lm(perc_total_revisions ~ stroop_effect + age + education + project, data = modelB_data)
- #Mediation analysis
- library(mediation)
- set.seed(1234)
- modelB_med <- mediate(
- model.m = modelB_mediator,
- model.y = modelB_outcome,
- treat = "age",
- mediator = "stroop_effect",
- boot = TRUE,
- sims = 5000
- )
- summary(modelB_med)
- ```
- ##Mediation C: Stroop mediator for Filled Pauses
- Age --> Stroop --> Filled Pauses
- ```{r mediation C}
- #Path 1: Age --> Stroop
- model_C1_fp <- lm(stroop_effect ~ age + education + project, data = merged_data)
- #Path 2: Stroop --> Filled Pauses (controlling for Age)
- model_C2_fp <- lm(perc_filled_pauses ~ stroop_effect + age + education + project, data = merged_data)
- #Path 3: Age --> Filled Pauses
- model_C3_fp <- lm(perc_filled_pauses ~ age + education + project, data = merged_data)
- summary(model_C1_fp)
- summary(model_C2_fp)
- summary(model_C3_fp)
- ```
- ```{r Full Mediation model C}
- # Filter to missing data
- modelC_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(stroop_effect), !is.na(perc_filled_pauses))
- #re-fit models
- modelC_mediator <- lm(stroop_effect ~ age + education + project, data = modelC_data)
- modelC_outcome <- lm(perc_filled_pauses ~ stroop_effect + age + education + project, data = modelC_data)
- #Mediation analysis
- library(mediation)
- set.seed(1234)
- modelC_med <- mediate(
- model.m = modelC_mediator,
- model.y = modelC_outcome,
- treat = "age",
- mediator = "stroop_effect",
- boot = TRUE,
- sims = 5000
- )
- summary(modelC_med)
- ```
- ##Mediation D: Stroop mediator for Unfilled Pauses
- Age --> Stroop --> Unfilled Pauses
- ```{r Mediation model D}
- #Path 1: Age --> Stroop
- model_D1_sp <- lm(stroop_effect ~ age + education + project, data = merged_data)
- #Path 2: Stroop --> Silent Pauses (controlling for Age)
- model_D2_sp <- lm(perc_pauses ~ stroop_effect + age + education + project, data = merged_data)
- #Path 3: Age --> Silent Pauses
- model_D3_sp <- lm(perc_pauses ~ age + education + project, data = merged_data)
- summary(model_D1_sp)
- summary(model_D2_sp)
- summary(model_D3_sp)
- ```
- ```{r full mediation model D}
- # Filter to missing data
- modelD_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(stroop_effect), !is.na(perc_pauses))
- #re-fit models
- modelD_mediator <- lm(stroop_effect ~ age + education + project, data = modelD_data)
- modelD_outcome <- lm(perc_filled_pauses ~ stroop_effect + age + education + project, data = modelD_data)
- #Mediation analysis
- library(mediation)
- set.seed(1234)
- modelD_med <- mediate(
- model.m = modelD_mediator,
- model.y = modelD_outcome,
- treat = "age",
- mediator = "stroop_effect",
- boot = TRUE,
- sims = 5000
- )
- summary(modelD_med)
- ```
- #Mediation Analysis RSFC Measures
- Based on the LM analyses results the best candidates identified were:
- Age --> DMN_Segregation --> Revisions
- Age --> Lang_to_DMN --> Revisions
- Age --> Lang_to-MD --> Unfilled Pauses
- Do not meet mediation criteria:
- - MD segregation: Age-related change, but no FC --> disfluency effect
- - MD within / Lang within / Lang segregation: No FC --> disfluency link at all
- - DMN-to-MD: Not predictive of disfluency
- - Lang within: No effects
- - MD within: No effects
- - DMN segregation → total disfluencies: Only marginal effect
- ##Mediation Model E: DMN segregation
- ```{r Mediation model E check}
- # Path 1: Age → DMN segregation
- model_E1 <- lm(DMN_segregation_c ~ age + education + project, data = merged_data)
- # Path 2: DMN segregation → Revisions (controlling for Age)
- model_E2 <- lm(perc_total_revisions ~ DMN_segregation_c + age + education + project, data = merged_data)
- # Path 3: Age → Revisions
- model_E3 <- lm(perc_total_revisions ~ age + education + project, data = merged_data)
- summary(model_E1)
- summary(model_E2)
- summary(model_E3)
- ```
- ```{r Full mediation model E}
- # Filter to complete cases for relevant variables
- med_data_E <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(DMN_segregation_c), !is.na(perc_total_revisions))
- # Make sure the mediator is treated as numeric
- merged_data$DMN_segregation_c <- as.numeric(merged_data$DMN_segregation_c)
- # Refit the models
- modelE_mediator <- lm(DMN_segregation_c ~ age + education + project, data = merged_data)
- modelE_outcome <- lm(perc_total_revisions ~ DMN_segregation_c + age + education + project, data = merged_data)
- # Run mediation
- library(mediation)
- set.seed(1234)
- modelE_med <- mediate(
- model.m = modelE_mediator,
- model.y = modelE_outcome,
- treat = "age",
- mediator = "DMN_segregation_c",
- boot = TRUE,
- sims = 5000
- )
- # Summarize results
- summary(modelE_med)
- ```
- ##Mediation model F: Lang_to_DMN
- ```{r Mediation model F}
- # Path 1: Age → Lang_to_DMN
- #model_F1 <- lm(Lang_to_DMN ~ age + education + project, data = merged_data)
- # Path 2: Lang_to_DMN → Revisions (controlling for Age)
- #model_F2 <- lm(perc_total_revisions ~ Lang_to_DMN + age + education + project, data = merged_data)
- # Path 3: Age → Revisions
- #model_F3 <- lm(perc_total_revisions ~ age + education + project, data = merged_data)
- #summary(model_F1)
- #summary(model_F2)
- #summary(model_F3)
- ```
- ```{r Full mediation model F}
- # Step 1: Subset to complete cases for relevant variables
- modelF_data <- merged_data %>%
- filter( !is.na(age), !is.na(education), !is.na(Lang_to_DMN), !is.na(perc_total_revisions)
- )
- # Step 2: Fit the mediator model (Path a)
- mediator_model_F <- lm(Lang_to_DMN ~ age + education + project, data = modelF_data)
- # Step 3: Fit the outcome model (Paths b and c′)
- outcome_model_F <- lm(perc_total_revisions ~ Lang_to_DMN + age + education + project, data = modelF_data)
- # Step 4: Run mediation analysis
- set.seed(1234)
- mediation_result_F <- mediate(
- model.m = mediator_model_F,
- model.y = outcome_model_F,
- treat = "age",
- mediator = "Lang_to_DMN",
- boot = TRUE,
- sims = 5000
- )
- # Step 5: View results
- summary(mediation_result_F)
- ```
- ##Mediation model G: Lang_to_DMN
- ```{r Mediation model G}
- # Path 1: Age → Lang_to_MD
- model_G1 <- lm(Lang_to_MD ~ age + education + project, data = merged_data)
- # Path 2: Lang_to_MD → Unfilled Pauses (controlling for Age)
- model_G2 <- lm(perc_pauses ~ Lang_to_MD + age + education + project, data = merged_data)
- # Path 3: Age → Unfilled Pauses
- model_G3 <- lm(perc_pauses ~ age + education + project, data = merged_data)
- summary(model_G1)
- summary(model_G2)
- summary(model_G3)
- ```
- ##Mediation model H: Stroop on repetitions
- ```{r mediation model H}
- # Path a: Age --> Stroop
- model_Ha <- lm(stroop_effect ~ age + education + project, data = merged_data)
- # Path b: Stroop --> Repetitions
- model_Hb <- lm(perc_total_repetitions ~ stroop_effect + age + education + project, data = merged_data)
- # Path c: Age --> Repetitions
- model_Hc <- lm(perc_total_repetitions ~ age + education + project, data = merged_data)
- summary(model_Ha)
- summary(model_Hb)
- summary(model_Hc)
- ```
- ```{r full mediation model H}
- # Filter to missing data
- modelH_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(stroop_effect), !is.na(perc_pauses))
- #re-fit models
- modelH_mediator <- lm(stroop_effect ~ age + education + project, data = modelH_data)
- modelH_outcome <- lm(perc_filled_pauses ~ stroop_effect + age + education + project, data = modelH_data)
- #Mediation analysis
- library(mediation)
- set.seed(1234)
- modelH_med <- mediate(
- model.m = modelH_mediator,
- model.y = modelH_outcome,
- treat = "age",
- mediator = "stroop_effect",
- boot = TRUE,
- sims = 5000
- )
- summary(modelH_med)
- ```
- ##Mediation model I: DMN seg on repetitions
- ```{r mediation model I}
- # Path a: Age --> DMN segregation
- model_Ia <- lm(DMN_segregation_c ~ age + education + project, data = merged_data)
- # Path b: DMN segregation --> Repetitions
- model_Ib <- lm(perc_total_repetitions ~ DMN_segregation_c + age + education + project, data = merged_data)
- # Path c: Age --> Repetitions
- model_Ic <- lm(perc_total_repetitions ~ age + education + project, data = merged_data)
- # Review model summaries
- summary(model_Ia)
- summary(model_Ib)
- summary(model_Ic)
- ```
- ```{r full mediation model I}
- # Subset complete cases
- modelI_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(project),
- !is.na(DMN_segregation_c), !is.na(perc_total_repetitions))
- # Convert to numeric (fixes the error)
- modelI_data$DMN_segregation_c <- as.numeric(modelI_data$DMN_segregation_c)
- # Refit models
- modelI_mediator <- lm(DMN_segregation_c ~ age + education + project, data = modelI_data)
- modelI_outcome <- lm(perc_total_repetitions ~ DMN_segregation_c + age + education + project, data = modelI_data)
- # Run mediation
- library(mediation)
- set.seed(1234)
- modelI_med <- mediate(
- model.m = modelI_mediator,
- model.y = modelI_outcome,
- treat = "age",
- mediator = "DMN_segregation_c",
- boot = TRUE,
- sims = 5000
- )
- # Display results
- summary(modelI_med)
- ```
- #Mediation model J: Lang_to_DMN on repetitions
- ```{r mediation model J repetitions}
- # Path a: Age --> Lang-to-DMN
- model_Ja <- lm(Lang_to_DMN ~ age + education + project, data = merged_data)
- # Path b: Lang-to-DMN --> Repetitions
- model_Jb <- lm(perc_total_repetitions ~ Lang_to_DMN + age + education + project, data = merged_data)
- # Path c: Age --> Repetitions
- model_Jc <- lm(perc_total_repetitions ~ age + education + project, data = merged_data)
- # Review model summaries
- summary(model_Ja)
- summary(model_Jb)
- summary(model_Jc)
- ```
- ```{r full mediation model J}
- # Subset complete cases
- modelJ_data <- merged_data %>%
- filter(!is.na(age), !is.na(education), !is.na(project),
- !is.na(Lang_to_DMN), !is.na(perc_total_repetitions))
- # Convert to numeric (fixes potential mediation error)
- modelJ_data$Lang_to_DMN <- as.numeric(modelJ_data$Lang_to_DMN)
- # Refit models
- modelJ_mediator <- lm(Lang_to_DMN ~ age + education + project, data = modelJ_data)
- modelJ_outcome <- lm(perc_total_repetitions ~ Lang_to_DMN + age + education + project, data = modelJ_data)
- # Run mediation
- library(mediation)
- set.seed(1234)
- modelJ_med <- mediate(
- model.m = modelJ_mediator,
- model.y = modelJ_outcome,
- treat = "age",
- mediator = "Lang_to_DMN",
- boot = TRUE,
- sims = 5000
- )
- # Display results
- summary(modelJ_med)
- ```
- #Serial Mediation check: Stroop ~ DMN segregation + age + education
- ```{r lm check}
- model_stroop_DMNseg <- lm(stroop_effect ~ DMN_segregation_c + age + education +project, data = merged_data)
- summary(model_stroop_DMNseg)
- ```
- #Serial Mediation check: Stroop ~ Lang_to_DMN + age + education
- ```{r lm check}
- model_stroop_LangDMN <- lm(stroop_effect ~ Lang_to_DMN + age + education + project, data = merged_data)
- summary(model_stroop_LangDMN)
- ```
- #Serial Mediation Analysis
- ```{r serial mediation}
- # Model 1: Mediator model (Stroop ~ Age + RSFC + education)
- model_m <- lm(stroop_effect ~ age + DMN_segregation + education + project, data = merged_data)
- # Model 2: Outcome model (Disfluency ~ Age + Stroop + RSFC + education)
- model_y <- lm(perc_total_disfluencies ~ age + stroop_effect + DMN_segregation + education + project, data = merged_data)
- # Run mediation analysis
- library(mediation)
- med_out <- mediate(model.m = model_m, model.y = model_y,
- treat = "age", mediator = "stroop_effect",
- boot = TRUE, sims = 5000)
- summary(med_out)
- ```
RSFC_stats_analysis_OSF.Rmd, no license · at the source
Overview
- The Pennsylvania State University, University Park, PA
- Centre for Cognitive and Brain Sciences, Department of Psychology, University of Macau, Taipa, Macau SAR, China
Abstract
Fluent speech production remains largely preserved across adulthood, yet subtle disruptions such as pauses, repetitions, and revisions become more common with age. These disfluencies may reflect underlying cognitive and neural changes that accompany aging, particularly in executive function (EF) and large-scale brain network organization. In this study, we examined whether EF and resting-state functional connectivity (RSFC) independently or jointly explained age-related differences in naturalistic speech disfluencies in an adult lifespan sample (n = 252, ages 20–81 years). RSFC was used to assess network segregation within three systems implicated in language and cognitive control: language network, default mode network (DMN), and multiple demand (MD) network. These task-independent connectivity patterns provide insight into how the brain’s functional architecture impacts speech production and its age-related vulnerabilities. Our findings indicate that age was associated with increased rates of specific disfluency subtypes, such as unfilled pauses, repetitions, and revisions, as well as lower EF and lower language, MD, and DMN network segregation. Although increasing age was associated with lower EF, EF performance did not predict disfluencies or mediate their age-related increase. In contrast, higher DMN segregation predicted lower overall disfluencies, repetitions, and revisions. Age moderated the relationship between DMN segregation and repetitions, with a significant association only in younger and middle-aged adults, suggesting weaker brain–behavior relationships at older ages. DMN segregation also partially mediated the relationship between age and revisions. These findings suggest that while EF relates to planning-related disruptions, changes in functional brain organization may more directly contribute to age-related increases in self-monitoring disfluencies.
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 3 matches between paragraphs and lines of code.
OSF vp9za
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
1 file
- Analysis Files/
RSFC_stats_analysis_OSF. , R, 1,813 lines, 3 matchesRmd
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;
- 1 script, each with its path and the digest of its content;
- 3 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 Statement
The data and analysis scripts are openly available on the OSF at: https://
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, 29 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 3 authors, 5 keywords, 1 funder, 91 references.
Cite
This paper
Nakamura, M. S., Zhang, H., & Diaz, M. T. (2026). Age-Related Differences in Resting-State Functional Connectivity Predict Specific Patterns of Speech Disfluency. Neurobiology of language (Cambridge, Mass.), 7, NOL.a.245. https://
BibTeX
@article{nakamura2026age
author = {Nakamura, Megan S and Zhang, Haoyun and Diaz, Michele T},
title = {{Age-Related Differences in Resting-State Functional Connectivity Predict Specific Patterns of Speech Disfluency}},
journal = {Neurobiology of language (Cambridge, Mass.)},
year = {2026},
month = apr,
volume = {7},
pages = {NOL.a.245},
publisher = {MIT Press},
issn = {2641-4368},
doi = {10.1162/
url = {https://
pmid = {42088907},
pmcid = {PMC13137885}
}
RIS
TY - JOUR
AU - Nakamura, Megan S
AU - Zhang, Haoyun
AU - Diaz, Michele T
TI - Age-Related Differences in Resting-State Functional Connectivity Predict Specific Patterns of Speech Disfluency
T2 - Neurobiology of language (Cambridge, Mass.)
J2 - Neurobiol Lang (Camb)
PY - 2026
DA - 2026/
VL - 7
SP - NOL.a.245
SN - 2641-4368
PB - MIT Press
DO - 10.1162/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1162/
"type": "article-journal",
"title": "Age-Related Differences in Resting-State Functional Connectivity Predict Specific Patterns of Speech Disfluency",
"container-title": "Neurobiology of language (Cambridge, Mass.)",
"author": [
{
"family": "Nakamura",
"given": "Megan S"
},
{
"family": "Zhang",
"given": "Haoyun"
},
{
"family": "Diaz",
"given": "Michele T"
}
],
"container-title-short":
"volume": "7",
"page": "NOL.a.245",
"DOI": "10.1162/
"PMID": "42088907",
"PMCID": "PMC13137885",
"ISSN": "2641-4368",
"publisher": "MIT Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
23
]
]
}
}
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-76598-x
- Preserved topography, lateralization, selectivity, and functional connectivity of the language network in older brains.Journal: Nature communicationsIn common: fMRI, cognitive, 12 references
- [2] doi:10.1038/s42003-026-10282-0 [code]
- Genetic risk of Alzheimer's disease is associated with loss of brain network segregation in midlife.Journal: Communications biologyIn common: psych, broom, ggplot2, 1 other tool, 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: NeuroImageIn common: fMRI, cognitive, 7 references
- [4] doi:10.1162/imag.a.1285 [code]
- Individualized mapping of functional brain networks in older adulthood.Journal: Imaging neuroscience (Cambridge, Mass.)In common: fMRI, 7 references
- [5] doi:10.1186/s40337-026-01671-1 [code]
- Aberrant large- and mesoscale network segregation and integration in bulimia nervosa.Journal: Journal of eating disordersIn common: broom, ggplot2, tidyverse, fMRI, 4 references
- [6] doi:10.1162/netn.a.542
- High brain network system segregation is differentially linked with cognitive performance across the life span.Journal: Network neuroscience (Cambridge, Mass.)In common: fMRI, cognitive, 6 references
- [7] doi:10.1162/imag.a.1283 [code]
- The language network responds robustly to sentences across tasks.Journal: Imaging neuroscience (Cambridge, Mass.)In common: broom, tidyverse, fMRI, 4 references
- [8] doi:10.1162/imag.a.1338 [code]
- Systematic fMRI signal differences across cohorts alter lifespan trajectories of functional brain networks.Journal: Imaging neuroscience (Cambridge, Mass.)In common: fMRI, 5 references
- [9] doi:10.1093/braincomms/fcag279 [code]
- Network flexibility facilitates treatment-induced recovery in post-stroke aphasia.Journal: Brain communicationsIn common: psych, broom, ggplot2, 1 other tool, fMRI, 1 reference
- [10] doi:10.1162/imag.a.1298 [code]
- Frontoparietal control-default mode connectivity predicts TMS effects on cognitive control.Journal: Imaging neuroscience (Cambridge, Mass.)In common: psych, ggplot2, tidyverse, cognitive, 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 3 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:35daa5dc6f560e2d…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
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.
