Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex.
The 11 matches
- [1] § Results › Patient demographics ↔ BOLDDiff_clinicaldata.R, lines 1–60 · score 0.92 · neonatal asphyxia, birth weight, birth height, head circumference, dMRI, fMRI
- [2] § Methods › Neonatal and demographic data statistical analysis ↔ BOLDDiff_clinicaldata.R, lines 1–60 · score 0.89 · birth weight, birth height, categorical variables, continuous variables, head circumference, SES
- [3] § Methods › MRI data statistical analysis ↔ BOLDDiff_Lasso_analysis.R, lines 62–188 · score 0.86 · pure LASSO, zero coefficients, glmnet, RMSE, elastic, selection
- [4] § Methods › Gene expression analysis ↔ Genetic_analysisANDgraphs.R, lines 91–133 · score 0.85 · mid fetal, early fetal, 8–13, 16–22, 35–37, late fetal
- [5] § Results › Genetic expression patterns during early brain development ↔ Genetic_analysisANDgraphs.R, lines 91–133 · score 0.79 · mid fetal, early fetal, 8–13, 16–22, 35–37, late fetal
- [6] § Results › Relationship between longitudinal cortical microstructural changes and BOLD variability delta changes ↔ BOLDDiff_Lasso_analysis.R, lines 230–273 · score 0.69 · pure LASSO, extraMD, elastic, diff, predicted, se
- [7] § Methods › Gene expression analysis ↔ Genetic_analysisANDgraphs.R, lines 1–39 · score 0.62 · A1C, DLPFC, IPC, M1, MFC, VLPFC
- [8] § Methods › Gene expression data analysis ↔ Genetic_analysisANDgraphs.R, lines 403–443 · score 0.62 · post hoc, HSD, Tukey, ANOVA, pairwise, interaction
- [9] § Methods › MRI data statistical analysis ↔ BOLDDiff_clustering_analysis.R, lines 54–98 · score 0.60 · ConsensusClusterPlus, Euclidean, elbow, distance, clustered, optimal
- [10] § Results › Longitudinal cortical BOLD variability and diffusion microstructural changes during early preterm brain development ↔ BOLDDiff_Longitudinal_graphs.R, lines 261–320 · score 0.58 · delta changes, BOLD variability longitudinal, asterisks, AUD, THAL, VIS
- [11] § Results › Longitudinal cortical BOLD variability and diffusion microstructural changes during early preterm brain development ↔ BOLDDiff_Longitudinal_analysis.R, lines 741–811 · score 0.57 · extraTrans, extraMD, diff, DTI, DKI, MK
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 · 901 lines · 32 KB · CC-BY-4.0 · 4 matches
- library(dplyr)
- library(factoextra)
- library(tidyr)
- library(cluster)
- library(ggrepel)
- library(ggplot2)
- library(tidyverse)
- library(nlme)
- library(mgcv)
- require(lme4)
- library(purrr)
- require("emmeans")
- library(broom.mixed)
- library(lmerTest)
- library(easystats)
- setwd("")
- data <- read.csv("PsychENCODE-W5-bulk-RPKM-data-scRNA-filtered-log2_revised.csv", header = TRUE)
- # Remove ITC and add PC to data
- data <- data %>%
- filter(region != 'ITC') %>% # Correct filtering
- mutate(PC = case_when(
- region %in% c('DLPFC', 'VLPFC') ~ 'PC2', # PFC
- region == 'OFC' ~ 'PC2', # Paralimbic belt
- region == 'MFC' ~ 'PC2', # Limbic
- region %in% c('M1', 'S1') ~ 'PC1', # SSM
- region == 'V1' ~ 'PC1', # Visual
- region %in% c('A1C', 'STC') ~ 'PC1', # Auditory
- region == 'IPC' ~ 'PC1' # Precuneus
- ))
- # Add data in Gestational weeks
- data <- data %>%
- mutate(age_weeks = round(age/7, 0))
- # Create sample_counts
- sample_counts <- data %>%
- group_by(age_weeks) %>%
- dplyr::summarize(observations = n_distinct(sample), .groups = 'drop')
- ggplot(sample_counts, aes(x = age_weeks, y = observations)) +
- geom_bar(stat = "identity", fill = "skyblue") + # Bar plot for number of observations
- scale_x_continuous(breaks = sample_counts$age_weeks, labels = sample_counts$age_weeks) + # Set x-axis breaks and labels
- theme_minimal() +
- labs(title = "Number of Observations per Age",
- x = "Age (weeks)",
- y = "Number of Observations") +
- theme(legend.position = "none") # No legend needed
- data <- data %>%
- filter(!age_weeks %in% 55)
- mean_age_weeks <- mean(data$age_weeks)
- sd_age_weeks <- sd(data$age_weeks)
- num_males <- nrow(data[data$sex == "M", ])
- total_subjects <- nrow(data)
- percentage_males <- (num_males / total_subjects) * 100
- mean_RIN <- mean(data$RIN)
- sd_RIN <- sd(data$RIN)
- mean_PMI <- mean(data$PMI)
- sd_PMI <- sd(data$PMI)
- region_count <- data %>%
- filter(symbol == "A2M") %>%
- group_by(sample) %>%
- summarise(region_count = n_distinct(region))
- all_region_count <- region_count %>%
- summarise(total = sum(region_count))
- write.csv(region_count, "region_count_per_sample.csv", row.names = FALSE)
- # Normality tests
- normality_results <- data %>%
- group_by(symbol, PC, Time) %>%
- summarise(p_value = map_dbl(list(log2_rpkm), ~ shapiro.test(.)$p.value), .groups = 'drop')
- non_normal_regions <- normality_results %>%
- filter(p_value < 0.05)
- write.csv(non_normal_regions, "non_normal_regions.csv",row.names = FALSE)
- ############### Fit model per gene ####################
- # OPTION 1 (T0 = mid fetal: 16-22; T1 = late fetal = 35-37 )
- data <- data %>%
- filter(!age_weeks %in% c(8, 9, 12, 13, 55)) %>% # Correct filtering
- mutate(Time = case_when(
- age_weeks %in% c('16', '17', '19', '21', '22') ~ 'T0',
- age_weeks %in% c('35', '37') ~ 'T1',
- ))
- # OPTION 2 (T0 = early fetal: 8-13; T1 = mid fetal = 16-22 )
- data <- data %>%
- filter(!age_weeks %in% c(35, 37, 55)) %>% # Correct filtering
- mutate(Time = case_when(
- age_weeks %in% c('8', '9', '12', '13') ~ 'T0',
- age_weeks %in% c('16', '17', '19', '21', '22' ) ~ 'T1',
- ))
- # OPTION 4 (T0 = early fetal: 8-13; T1 = mid fetal: 16-22; T2 = late fetal = 35-37 )
- data <- data %>%
- filter(!age_weeks %in% 55) %>% # Correct filtering
- mutate(Time = case_when(
- age_weeks %in% c('8', '9', '12', '13') ~ 'T0',
- age_weeks %in% c('16', '17', '19', '21', '22') ~ 'T1',
- age_weeks %in% c('35', '37') ~ 'T2',
- ))
- # Make data factorial
- data <- within(data, {
- PC <- factor(PC)
- Time <- factor(Time)
- sample <- factor(sample)
- symbol <- factor(symbol)
- region <- factor(region)
- age <- as.numeric(age)
- sex <- factor(sex)
- })
- genes <- unique(data$symbol)
- genes_df <- data.frame(gene = genes)
- #write.csv(genes_df, "genes.csv", row.names = FALSE)
- ######## MODEL LMER - Loop through each gene
- model_results <- list()
- for (gene in genes) {
- # Filter data for the current gene
- gene_data <- filter(data, symbol == gene)
- # Fit the model
- model <- tryCatch({
- lmer(log2_rpkm ~ Time * PC + RIN + sex + (1 | sample) + (1 | region),
- data = gene_data)
- }, error = function(e) {
- message("Error fitting model for gene: ", gene)
- return(NA)
- })
- # Store the results
- model_results[[gene]] <- model
- }
- #### Initialize a list to store all p-values
- all_pvalues_TimeT1 <- list()
- all_pvalues_PCPC2 <- list()
- all_pvalues_TimeT1PCPC2 <- list()
- for (gene in names(model_results)) {
- model <- model_results[[gene]]
- if (!is.na(model)) {
- # Check if the model is fitted
- model_summary <- summary(model)
- coefficients <- model_summary$coefficients
- # Extract p-values and estimates for TimeT1, PCPC2, and their interaction
- if ("TimeT1" %in% rownames(coefficients)) {
- estimate <- coefficients["TimeT1", "Estimate"]
- p_value <- coefficients["TimeT1", "Pr(>|t|)"]
- all_pvalues_TimeT1[[gene]] <- list(estimate = estimate, p_value = p_value)
- }
- if ("PCPC2" %in% rownames(coefficients)) {
- estimate <- coefficients["PCPC2", "Estimate"]
- p_value <- coefficients["PCPC2", "Pr(>|t|)"]
- all_pvalues_PCPC2[[gene]] <- list(estimate = estimate, p_value = p_value)
- }
- if ("TimeT1:PCPC2" %in% rownames(coefficients)) {
- estimate <- coefficients["TimeT1:PCPC2", "Estimate"]
- p_value <- coefficients["TimeT1:PCPC2", "Pr(>|t|)"]
- all_pvalues_TimeT1PCPC2[[gene]] <- list(estimate = estimate, p_value = p_value)
- }
- }
- }
- ###### Convert lists to data frames
- create_df <- function(pvalue_list, effect_name) {
- df <- tibble(
- gene = names(pvalue_list),
- estimate = sapply(pvalue_list, function(x) x$estimate),
- p_value = sapply(pvalue_list, function(x) x$p_value)
- ) %>%
- mutate(
- adjusted_p_value_fdr = p.adjust(p_value, method = "fdr"),
- effect = effect_name
- )
- return(df)
- }
- TimeT1_df <- create_df(all_pvalues_TimeT1, "TimeT1")
- PCPC2_df <- create_df(all_pvalues_PCPC2, "PCPC2")
- TimeT1PCPC2_df <- create_df(all_pvalues_TimeT1PCPC2, "TimeT1PCPC2")
- # Function to rename columns
- rename_columns <- function(df, prefix) {
- df %>%
- rename_with(~paste0(prefix, "_", .), -gene)
- }
- # Rename columns in each dataframe
- TimeT1_df <- rename_columns(TimeT1_df, "TimeT1")
- TimeT1_df <- TimeT1_df %>%
- select(-TimeT1_effect)
- PCPC2_df <- rename_columns(PCPC2_df, "PCPC2")
- PCPC2_df <- PCPC2_df %>%
- select(-PCPC2_effect)
- TimeT1PCPC2_df <- rename_columns(TimeT1PCPC2_df, "TimeT1_PCPC2")
- TimeT1PCPC2_df <- TimeT1PCPC2_df %>%
- select(-TimeT1_PCPC2_effect)
- # Join the dataframes
- all_effects_wide_df <- TimeT1_df %>%
- full_join(PCPC2_df, by = "gene") %>%
- full_join(TimeT1PCPC2_df, by = "gene")
- # Create separate dataframes for significant genes for each effect
- significant_TimeT1 <- TimeT1_df %>%
- filter(TimeT1_adjusted_p_value_fdr < 0.05)
- significant_PCPC2 <- PCPC2_df %>%
- filter(PCPC2_adjusted_p_value_fdr < 0.05)
- significant_TimeT1PCPC2 <- TimeT1PCPC2_df %>%
- filter(TimeT1_PCPC2_adjusted_p_value_fdr < 0.05)
- # Write results to CSV files
- write.csv(all_effects_wide_df, "all_effects_df.csv", row.names = FALSE)
- write.csv(significant_TimeT1, "Sign_TimeT1_df.csv", row.names = FALSE)
- write.csv(significant_PCPC2, "Sign_PCPC2_df.csv", row.names = FALSE)
- write.csv(significant_TimeT1PCPC2, "Sign_TimeT1PCPC2.csv", row.names = FALSE)
- ######## Initialize a list to store emmeans results for significant genes
- emmeans_results <- list()
- pairwise_Time <- list()
- pairwise_Cluster <- list()
- p_value_threshold <- 0.05
- all_significant_interaction_genes <- unique(significant_TimeT1PCPC2$gene)
- significant_interaction_genes_df <- data.frame(gene = all_significant_interaction_genes)
- write.csv(significant_interaction_genes_df, "significant_interaction_genes.csv", row.names = FALSE)
- # Perform emmeans analysis for significant genes in the interaction only
- for (gene in all_significant_interaction_genes) {
- model <- model_results[[gene]]
- if (!is.na(model)) {
- # Compute estimated marginal means
- emmCluster <- emmeans(model, ~ Time * PC)
- emmTime <- emmeans(model, ~ PC * Time)
- # Perform pairwise comparisons between T0 and T1 within each PC
- pairwise_comparisonsCluster <- contrast(emmCluster, "pairwise", by = "PC")
- # Perform pairwise comparisons between PC1 and PC2 within each Time point
- pairwise_comparisonsTime <- contrast(emmTime, "pairwise", by = "Time")
- # Store summary of significant differences, not adjusted for multiple comparisons
- pairwise_summaryCluster <- summary(pairwise_comparisonsCluster) %>%
- as.data.frame() %>%
- mutate(comparison_type = "Cluster"
- )
- pairwise_summaryTime <- summary(pairwise_comparisonsTime) %>%
- as.data.frame() %>%
- mutate(comparison_type = "Time"
- )
- #Apply FDR correction separately for Cluster and Time comparisons
- pairwise_summaryCluster <- pairwise_summaryCluster %>%
- mutate(p.adj = p.adjust(p.value, method = "fdr"),
- is_significant = ifelse(p.adj < p_value_threshold, TRUE, FALSE)) # Add significance based on FDR-adjusted p-value
- pairwise_summaryTime <- pairwise_summaryTime %>%
- mutate(p.adj = p.adjust(p.value, method = "fdr"),
- is_significant = ifelse(p.adj < p_value_threshold, TRUE, FALSE)) # Add significance based on FDR-adjusted p-value
- # Combine the results
- combined_summary <- bind_rows(pairwise_summaryCluster, pairwise_summaryTime) %>%
- mutate(gene = gene)
- # Store the combined results in the list
- emmeans_results[[gene]] <- combined_summary
- pairwise_Time[[gene]] <- pairwise_summaryTime
- pairwise_Cluster[[gene]] <- pairwise_summaryCluster
- }
- }
- # Convert the list of emmeans results to a data frame
- emmeans_results_df <- bind_rows(emmeans_results, .id = "gene") %>%
- select(gene, comparison_type, contrast, PC, Time, estimate, SE, df, t.ratio, p.value, p.adj, is_significant) # Reorder columns
- significant_emmeans_results_df <- emmeans_results_df %>%
- filter(is_significant == TRUE)
- pairwise_Time_df <- bind_rows(pairwise_Time, .id = "gene") %>%
- select(gene, contrast, Time, estimate, SE, df, t.ratio, p.value, p.adj, is_significant) # Reorder columns
- significant_pairwise_Time_df <- pairwise_Time_df %>%
- filter(is_significant == TRUE)
- pairwise_Cluster_df <- bind_rows(pairwise_Cluster, .id = "gene") %>%
- select(gene, contrast, PC, estimate, SE, df, t.ratio, p.value, p.adj, is_significant) # Reorder columns
- significant_pairwise_Cluster_df <- pairwise_Cluster_df %>%
- filter(is_significant == TRUE)
- write.csv(emmeans_results_df, "combined_pairwise_comparisons.csv", row.names = FALSE)
- write.csv(pairwise_Time_df, "Time_pairwise_comparisons.csv", row.names = FALSE)
- write.csv(pairwise_Cluster_df, "Cluster_pairwise_comparisons.csv", row.names = FALSE)
- write.csv(significant_emmeans_results_df, "significant_combined_pairwise_comparisons.csv", row.names = FALSE)
- write.csv(significant_pairwise_Time_df, "significant_Time_pairwise_comparisons.csv", row.names = FALSE)
- write.csv(significant_pairwise_Cluster_df, "significant_Cluster_pairwise_comparisons.csv", row.names = FALSE)
- ### Find Gene expression differences bewteen cluster between T0 and T1
- library(tidyr)
- pivot_Cluster <- pivot_wider(
- pairwise_Cluster_df,
- id_cols = gene,
- names_from = PC,
- values_from = c(estimate, is_significant),
- values_fill = NA
- )
- # Filter for genes that significantly increase/decrease in Cluster 1 (PC1) compared to PC2
- sig_differential_increase_morePC1 <- pivot_Cluster %>%
- filter(
- estimate_PC1 < 0 & # PC1 shows a negative estimate (indicating increase)
- is_significant_PC1 == TRUE & # PC1 change is significant
- estimate_PC1 < estimate_PC2 # PC1 increase is greater than PC2
- )
- sig_differential_decrease_morePC1 <- pivot_Cluster %>%
- filter(
- estimate_PC1 > 0 & # PC1 shows a positive estimate (indicating decrease)
- is_significant_PC1 == TRUE & # PC1 change is significant
- estimate_PC1 > estimate_PC2 # PC1 decrease is greater than PC2
- )
- # Filter for genes that significantly increase in Cluster 2 (PC1) compared to PC1
- sig_differential_increase_morePC2 <- pivot_Cluster %>%
- filter(
- estimate_PC2 < 0 & # PC1 shows a negative estimate (indicating increase)
- is_significant_PC2 == TRUE & # PC1 change is significant
- estimate_PC2 < estimate_PC1 # PC1 increase is greater than PC2
- )
- sig_differential_decrease_morePC2 <- pivot_Cluster %>%
- filter(
- estimate_PC2 > 0 & # PC1 shows a positive estimate (indicating decrease)
- is_significant_PC2 == TRUE & # PC1 change is significant
- estimate_PC2 > estimate_PC1 # PC1 decrease is greater than PC2
- )
- write.csv(sig_differential_increase_morePC1, "sig_differential_increase_morePC1.csv", row.names = FALSE)
- write.csv(sig_differential_increase_morePC2, "sig_differential_increase_morePC2.csv", row.names = FALSE)
- write.csv(sig_differential_decrease_morePC1, "sig_differential_decrease_morePC1.csv", row.names = FALSE)
- write.csv(sig_differential_decrease_morePC2, "sig_differential_decrease_morePC2.csv", row.names = FALSE)
- ###### Pairwise Time : evaluate changes between Clusters in each time point
- pairwise_Time_df <- read.csv("Time_pairwise_comparisons.csv", header = TRUE)
- library(tidyr)
- pivot_Time <- pivot_wider(
- pairwise_Time_df,
- id_cols = c(gene, contrast),
- names_from = Time,
- values_from = c(estimate, is_significant),
- values_fill = NA
- )
- # Classify genes based on the direction of their estimates
- # For T0
- T0_PC1supPC2 <- subset(pivot_Time, estimate_T0 > 0 & is_significant_T0 == TRUE)
- T0_PC2supPC1 <- subset(pivot_Time, estimate_T0 < 0 & is_significant_T0 == TRUE)
- # For T1
- T1_PC1supPC2 <- subset(pivot_Time, estimate_T1 > 0 & is_significant_T1 == TRUE)
- T1_PC2supPC1 <- subset(pivot_Time, estimate_T1 < 0 & is_significant_T1 == TRUE)
- write.csv(T0_PC1supPC2, "T0_PC1_sup_PC2_sig.csv", row.names = FALSE)
- write.csv(T0_PC2supPC1, "T0_PC2_sup_PC1_sig.csv", row.names = FALSE)
- write.csv(T1_PC1supPC2, "T1_PC1_sup_PC2_sig.csv", row.names = FALSE)
- write.csv(T1_PC2supPC1, "T1_PC2_sup_PC1_sig.csv", row.names = FALSE)
- ####### Perform t-test for each gene on emmeans
- wide_Cluster_df <- pairwise_Cluster_df %>%
- select(gene, PC, estimate) %>%
- pivot_wider(names_from = PC, values_from = estimate)
- Ttest_results <- wide_Cluster_df %>%
- rowwise() %>%
- mutate(
- p.value = t.test(c(PC1, PC2), alternative = "two.sided", na.rm = TRUE)$p.value,
- is_significant = p.value < p_value_threshold # Add significance column
- ) %>%
- select(gene, p.value, is_significant) # Keep desired columns
- sign_Ttest_results <- Ttest_results %>%
- filter(is_significant)
- write.csv(sign_Ttest_results, "significant_Ttest_Cluster.csv", row.names = FALSE)
- ####### Initialize a list to store ANOVA results
- anova_results_list <- list()
- # Loop through each significant gene
- # Loop through each significant gene
- for (gene in all_significant_interaction_genes) {
- # Subset the data for the current gene
- gene_data <- subset(pairwise_Cluster_df, gene == pairwise_Cluster_df$gene) # Ensure you're checking the correct column
- # Conduct ANOVA for the current gene
- anova_model <- aov(estimate ~ PC, data = gene_data)
- # Store the summary of ANOVA
- anova_results <- summary(anova_model)
- # Check if ANOVA is significant
- if (anova_results[[1]][["Pr(>F)"]][1] < 0.05) {
- # Perform post-hoc test
- post_hoc <- TukeyHSD(anova_model)
- # Extract contrasts from post-hoc results
- post_hoc_df <- as.data.frame(post_hoc$PC)
- # Add the gene name to the post-hoc results
- post_hoc_df$Gene <- gene
- post_hoc_df$Post_Hoc_Comparison <- rownames(post_hoc_df)
- # Add a significance column based on adjusted p-values
- post_hoc_df$Significant <- ifelse(post_hoc_df$`p adj` < 0.05, "Yes", "No")
- # Store significant results in the list
- anova_results_list[[gene]] <- post_hoc_df
- }
- }
- significant_anova_results_df <- do.call(rbind, anova_results_list)
- significant_anova_results_df <- significant_anova_results_df[, c("Gene", "Post_Hoc_Comparison", "diff", "lwr", "upr", "p adj", "Significant")]
- write.csv(significant_anova_results_df, "significant_anova_results.csv", row.names = FALSE)
- # First, let's verify that we have the same genes in both dataframes
- genes1 <- unique(significant_anova_results_df$Gene)
- genes2 <- unique(pairwise_Cluster_df$gene)
- # Merging the data frames
- combined_results <- cbind( pairwise_Cluster_df, significant_anova_results_df)
- write.csv(combined_results, "combined_results_pairwise_anova_results.csv", row.names = FALSE)
- ############### PLOTS
- ############### Genes increasing from T0 to T1 - PC1
- setwd("")
- ensheathment_genes <- read.csv("ensheathmentneurons.csv", header = TRUE) # Use header = TRUE if the first row contains column names
- gliogenesis_genes <- read.csv("gliogenesis.csv", header = TRUE) # Use header = TRUE if the first row contains column names
- oligo_genes <- read.csv("oligodendrocyte.csv", header = TRUE)
- all_genes <- Reduce(union, list(ensheathment_genes$gene, gliogenesis_genes$gene, oligo_genes$gene))
- all_genes_df <- as.data.frame(all_genes)
- common_genes <- Reduce(intersect, list(ensheathment_genes$gene, gliogenesis_genes$gene, oligo_genes$gene))
- common_genes_df <- as.data.frame(common_genes)
- oligo_ensheat_genes <- Reduce(union, list(ensheathment_genes$gene, oligo_genes$gene))
- oligo_ensheat_genes_df <- as.data.frame(oligo_ensheat_genes)
- gliogenesis_genes <- gliogenesis_genes$gene
- gliogenesis_genes_df <- as.data.frame(gliogenesis_genes)
- write.csv(all_genes_df, "combined_oligo_ensheatement_gliogenesis_genes.csv", row.names = FALSE)
- write.csv(common_genes_df, "common_oligo_ensheatement_gliogenesis_genes.csv", row.names = FALSE)
- write.csv(oligo_ensheat_genes_df, "oligo_ensheatement_genes.csv", row.names = FALSE)
- write.csv(gliogenesis_genes_df, "gliogenesis_genes.csv", row.names = FALSE)
- ############### Genes increased at T1 - PC1 vs PC2
- setwd("")
- ensheathment_genes_T1 <- read.csv("ensheathment_neurons_T1.csv", header = TRUE) # Use header = TRUE if the first row contains column names
- gliogenesis_genes_T1 <- read.csv("gliogenesis_T1.csv", header = TRUE) # Use header = TRUE if the first row contains column names
- T1_PC1supPC2_genes <- read.csv("T1_PC1_sup_PC2_sig.csv", header = TRUE) # Use header = TRUE if the first row contains column names
- allT1C1_genes <- Reduce(union, list(ensheathment_genes_T1$gene, gliogenesis_genes_T1$gene))
- allT1C1_genes_df <- as.data.frame(allT1C1_genes)
- allT1C1common_genes <- Reduce(intersect, list(ensheathment_genes_T1$gene, gliogenesis_genes_T1$gene))
- allT1C1common_genes_df <- as.data.frame(allT1C1common_genes)
- ## Genes that are increasing significantly from T0 to T1 more in PC1 vs PC2 and that are increased signficiantly at T1 in PC1 vs PC2
- long_allgenes_atT1 <- Reduce(intersect, list(all_genes_df$all_genes, T1_PC1supPC2_genes$gene))
- long_allgenes_atT1_df <- as.data.frame(long_allgenes_atT1)
- ## From the ones in the the neuro ensheatment, oligo and gliogenesis, increasing longitudinally more in PC1vsPC2
- common_long_T1_C1genes <- Reduce(intersect, list(allT1C1_genes_df$allT1C1_genes, all_genes_df$all_genes))
- common_long_T1_C1genes_df <- as.data.frame(common_long_T1_C1genes)
- write.csv(allT1C1_genes_df, "combinedT1C1_ensheatement_gliogenesis_genes.csv", row.names = FALSE)
- write.csv(allT1C1common_genes_df, "commonT1C1_ensheatement_gliogenesis_genes.csv", row.names = FALSE)
- write.csv(common_long_T1_C1genes_df, "common_LongT1_C1_genes.csv", row.names = FALSE)
- write.csv(long_allgenes_atT1_df, "common_LongT1_atC1_genes.csv", row.names = FALSE)
- #oligo <- oligo$Gene
- # Filter the dataset for genes of interest
- merged_data <- data %>%
- filter(symbol %in% all_genes)
- common_data <- data %>%
- filter(symbol %in% common_genes)
- oligo_ensheat_data <- data %>%
- filter(symbol %in% oligo_ensheat_genes)
- gliogenesis_data <- data %>%
- filter(symbol %in% gliogenesis_genes)
- write.csv(merged_data, "sigGenes_violinplots.csv", row.names = FALSE)
- custom_colors <- c("PC1" = "#A50000", # Example for PC1 (red)
- "PC2" = "#275D90") # Example for PC2 (blue)
- # Violin PLOT
- violin_plot <- ggplot(common_data, aes(x = Time, y = log2_rpkm, fill = PC)) +
- geom_violin(alpha = 0.7) +
- facet_wrap(~symbol, scales = "free_y", ncol = 4) +
- theme_bw() +
- labs(
- title = "Ensheathment, Gliogenesis and Oligodendrocyte Gene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Log2 RPKM",
- fill = "Cluster"
- ) +
- scale_fill_manual(values = custom_colors) +
- theme(
- axis.text.x = element_text(angle = 45, hjust = 1),
- strip.background = element_rect(fill = "white"),
- strip.text = element_text(face = "bold")
- )
- ggplot(merged_data, aes(x = Time, y = log2_rpkm, fill = PC, color = PC)) +
- geom_violin(alpha = 0.6) +
- # Remove width parameter and adjust position_dodge
- geom_jitter(position = position_jitterdodge(dodge.width = 0.8, jitter.width = 0.2),
- size = 1, alpha = 0.6) +
- facet_wrap(~symbol, scales = "free_y", ncol = 7) +
- scale_fill_manual(values = custom_colors) +
- scale_color_manual(values = custom_colors) +
- theme_minimal() +
- labs(
- title = "Ensheathment, Gliogenesis and Oligodendrocyte Gene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Log2 RPKM",
- fill = "Cluster"
- ) +
- theme(legend.position = "none",
- strip.text = element_text(face = "bold", size = 14),
- plot.title = element_text(face = "bold", size = 18, hjust = 0.5)
- ) + # Adjust main title size
- labs(x = "Time Point", y = "Log2 RPKM")
- # BOXPLOTs
- box_plot <- ggplot(gliogenesis_data, aes(x = Time, y = log2_rpkm, fill = region)) +
- geom_boxplot(outlier.shape = NA) + # Removing outliers for cleaner visualization
- facet_wrap(~symbol, scales = "free_y", ncol = 7) +
- theme_bw() +
- labs(
- title = "Gliogenesis Gene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Log2 RPKM",
- fill = "Cluster"
- ) +
- theme(
- axis.text.x = element_text(angle = 45, hjust = 1),
- strip.background = element_rect(fill = "white"),
- strip.text = element_text(face = "bold")
- )
- # Summaries - mean and std dev
- # MERGED DATA
- gene_merged_data <- merged_data %>%
- group_by(symbol, Time, PC) %>%
- summarise(
- gene_mean_expression = mean(log2_rpkm),
- gene_se_expression = sd(log2_rpkm) / sqrt(n()),
- .groups = 'drop'
- )
- cluster_merged_data <- merged_data %>%
- group_by(Time, PC) %>%
- summarise(
- cluster_mean_expression = mean(log2_rpkm),
- cluster_se_expression = sd(log2_rpkm) / sqrt(n()),
- .groups = 'drop'
- )
- write.csv(cluster_merged_data, "sigGenes_lineGraphs.csv", row.names = FALSE)
- # COMMON DATA
- gene_common_data <- PC1_common_data %>%
- group_by(symbol, Time, PC) %>%
- summarise(
- gene_mean_expression = mean(log2_rpkm),
- gene_se_expression = sd(log2_rpkm) / sqrt(n()),
- .groups = 'drop'
- )
- cluster_common_data <- PC1_common_data %>%
- group_by(Time, PC) %>%
- summarise(
- cluster_mean_expression = mean(log2_rpkm),
- cluster_se_expression = sd(log2_rpkm) / sqrt(n()),
- .groups = 'drop'
- )
- common_distinct_shapes <- c(16, 17, 15, 18, 8, 23, 25, 0)
- distinct_shapes <- common_distinct_shapes[1:8] # Use only the first 8 shapes for 8 ge
- merged_distinct_shapes <- c(16, 17, 15, 18, 8, 23, 25, 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 19, 20, 21, 22, 24, 26)
- distinct_shapes <- merged_distinct_shapes[1:27]
- # Sample data for plotting
- shapes <- data.frame(
- x_var = rnorm(100),
- y_var = rnorm(100),
- shape_var = sample(c(0:24, 21, 22, "★", "▲"), 100, replace = TRUE) # Numeric and character shapes
- )
- # Ensure shapes are either all numeric or all characters
- # Convert numeric shapes to factor
- shapes$shape_var <- as.factor(shapes$shape_var)
- # Create the plot with average values
- avg_dot_line_plot <- ggplot(gene_merged_data,
- aes(x = Time, y = gene_mean_expression,
- color = PC, shape = symbol,
- group = interaction(symbol, PC))) +
- geom_point(size = 4) +
- geom_line(linewidth = 1, alpha = 0.7) +
- geom_errorbar(aes(ymin = gene_mean_expression - gene_se_expression,
- ymax = gene_mean_expression + gene_se_expression),
- width = 0.2) +
- scale_shape_manual(values = c(0:24, 21, 22)) + # Using only numeric shapes
- scale_color_brewer(palette = "Set1") +
- theme_bw() +
- labs(
- title = "Average Gene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Average Log2 RPKM",
- color = "Cluster",
- shape = "Gene"
- ) +
- theme(
- axis.text.x = element_text(angle = 45, hjust = 1),
- legend.position = "right",
- panel.grid.minor = element_blank(),
- legend.key.size = unit(1.2, "cm"),
- plot.title = element_text(size = 14, face = "bold"),
- axis.title = element_text(size = 12),
- legend.title = element_text(size = 11),
- legend.text = element_text(size = 10)
- )
- # Plot 1: Line plot of cluster averages
- cluster_line_plot <- ggplot(cluster_merged_data,
- aes(x = Time, y = cluster_mean_expression, color = PC, group = PC)) +
- geom_line(linewidth = 1) +
- geom_point(size = 4) +
- geom_errorbar(aes(ymin = cluster_mean_expression - cluster_se_expression,
- ymax = cluster_mean_expression + cluster_se_expression),
- width = 0.2) +
- scale_color_brewer(palette = "Set1") +
- theme_bw() +
- labs(
- title = "Average Neuronal Ensheathment, Gliogenesis, Oligdendrocyte \nGene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Average Log2 RPKM",
- color = "Cluster"
- ) +
- theme(
- axis.text.x = element_text(angle = 45, hjust = 1),
- panel.grid.minor = element_blank(),
- plot.title = element_text(size = 14, face = "bold"),
- axis.title = element_text(size = 12)
- )
- gene_merged_data <- gene_merged_data %>%
- mutate(x_position = case_when(
- Time == "T0" & PC == "PC1" ~ 0.95,
- Time == "T0" & PC == "PC2" ~ 1.05,
- Time == "T1" & PC == "PC1" ~ 1.95,
- Time == "T1" & PC == "PC2" ~ 2.05
- ))
- gene_common_data <- gene_common_data %>%
- mutate(x_position = case_when(
- Time == "T0" & PC == "PC1" ~ 0.95,
- Time == "T0" & PC == "PC3" ~ 1.05,
- Time == "T1" & PC == "PC1" ~ 1.95,
- Time == "T1" & PC == "PC3" ~ 2.05
- ))
- # Scatter plot per gene in COMMON GENES
- refined_scatter_plot <- ggplot() +
- # Add individual gene points with different symbols
- geom_point(data = gene_merged_data,
- aes(x = x_position, y = gene_mean_expression,
- color = PC, shape = symbol),
- size = 3, alpha = 0.7) +
- # Add average lines
- geom_line(data = cluster_merged_data,
- aes(x = case_when(
- Time == "T0" ~ 1.025,
- Time == "T1" ~ 2.025
- ),
- y = cluster_mean_expression,
- color = PC,
- group = PC),
- linewidth = 1) +
- # Add error bars for cluster averages
- geom_errorbar(data = cluster_merged_data,
- aes(x = case_when(
- Time == "T0" ~ 1.025,
- Time == "T1" ~ 2.025
- ),
- ymin = cluster_mean_expression - cluster_se_expression,
- ymax = cluster_mean_expression + cluster_se_expression,
- color = PC),
- width = 0.05) +
- # Use custom colors
- scale_color_manual(values = custom_colors) +
- scale_shape_manual(values = c(0:24, 21, 22)) + # Using only numeric shapes +
- scale_x_continuous(breaks = c(1, 2), labels = c("T0", "T1")) +
- theme_bw() +
- labs(
- title = "Average Neuronal Ensheathment, Gliogenesis, Oligodendrocyte \nGene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Average Log2 RPKM",
- color = "Cluster",
- shape = "Gene"
- ) +
- theme(
- panel.grid.minor = element_blank(),
- plot.title = element_text(size = 14, face = "bold"),
- axis.title = element_text(size = 12),
- legend.position = "right"
- )
- # Scatter plot per gene in MERGED GENES
- library(ggplot2)
- library(dplyr)
- library(ggrepel)
- unique_genes <- gene_merged_data %>%
- filter(Time == "T1") %>%
- distinct(symbol, PC, .keep_all = TRUE) # Keep unique combinations of gene names and clusters
- unique_genes <- gene_common_data %>%
- filter(Time == "T1") %>%
- distinct(symbol, PC, .keep_all = TRUE) # Keep unique combinations of gene names and clusters
- ggplot() +
- # Add individual gene points without shape, just use color
- geom_point(data = gene_merged_data,
- aes(x = x_position, y = gene_mean_expression, color = PC),
- size = 3, alpha = 0.7) +
- # Add lighter lines for each gene within the same cluster
- geom_line(data = gene_merged_data,
- aes(x = x_position, y = gene_mean_expression, group = interaction(symbol, PC), color = PC),
- linewidth = 0.5, alpha = 0.3) +
- # Label unique genes for each cluster at Time Point 1
- geom_text_repel(data = unique_genes,
- aes(x = x_position, # Use the original x_position for labeling
- y = gene_mean_expression + 0.1,
- label = symbol,
- color = PC),
- size = 3,
- box.padding = 0.1, # Reduced padding around labels
- point.padding = 0.1, # Reduced padding around points
- segment.color = 'grey50') + # Color for connecting lines
- # Add average lines for each cluster
- geom_line(data = cluster_merged_data,
- aes(x = case_when(
- Time == "T0" ~ 1.025,
- Time == "T1" ~ 2.025
- ),
- y = cluster_mean_expression,
- color = PC,
- group = PC),
- linewidth = 1) +
- # Add error bars for cluster averages
- geom_errorbar(data = cluster_merged_data,
- aes(x = case_when(
- Time == "T0" ~ 1.025,
- Time == "T1" ~ 2.025
- ),
- ymin = cluster_mean_expression - cluster_se_expression,
- ymax = cluster_mean_expression + cluster_se_expression,
- color = PC),
- width = 0.05) +
- scale_color_brewer(palette = "Set1") +
- # Add extra space on both sides for the gene labels
- scale_x_continuous(breaks = c(1, 2), labels = c("T0", "T1"), expand = expansion(mult = c(0.1, 0.1))) +
- theme_bw() +
- labs(
- title = "Average Neuronal Ensheathment, Gliogenesis, Oligodendrocyte \nGene Expression Changes Over Time by Cluster",
- x = "Time Point",
- y = "Average Log2 RPKM",
- color = "Cluster"
- ) +
- theme(
- panel.grid.minor = element_blank(),
- plot.title = element_text(size = 14, face = "bold"),
- axis.title = element_text(size = 12),
- legend.position = "right"
- )
- cluster_common_data <- cluster_common_data %>%
- mutate(ymin = cluster_mean_expression - cluster_se_expression,
- ymax = cluster_mean_expression + cluster_se_expression)
- gene_scatter_plot <- ggplot(gene_common_data,
- aes(x = Time, y = gene_mean_expression, color = PC)) +
- # Jittered points for individual observations
- geom_jitter(width = 0.2, size = 3, alpha = 0.7) +
- # Use a color palette for clusters
- scale_color_brewer(palette = "Set1") +
- theme_bw() +
- # Add lines for cluster averages
- geom_line(data = cluster_common_data,
- aes(x = Time,
- y = cluster_mean_expression,
- color = PC,
- group = PC),
- linewidth = 1) +
- # Labels and theme adjustments
- labs(
- title = "Gene Expression Distribution by Time and Cluster",
- x = "Time Point",
- y = "Average Log2 RPKM",
- color = "Cluster"
- ) +
- # Formatting for plot appearance
- theme(
- axis.text.x = element_text(angle = 45, hjust = 1),
- panel.grid.minor = element_blank(),
- plot.title = element_text(size = 14, face = "bold"),
- axis.title = element_text(size = 12)
- )
Genetic_analysisANDgraphs.R, under CC-BY-4.0 · at the source
Overview
- Division of Development and Growth, Department of Women’s, Children’s, and Adolescent Health, University Hospitals of Geneva, Geneva, Switzerland
- Department of Pediatrics, Gynecology and Obstetrics, University of Geneva, Geneva, Switzerland
- Developmental Imaging, Murdoch Children’s Research Institute, Melbourne, VIC Australia
- CIBM Center for Biomedical Imaging, University of Lausanne, Lausanne, Switzerland
- Department of Radiology, University Hospital and University of Lausanne, Lausanne, Switzerland
- Signal Processing Laboratory, Ecole Polytechnique Fédérale de Lausanne (EPFL), Lausanne, Switzerland
- CIBM Center for Biomedical Imaging, University of Geneva, Geneva, Switzerland
- Department of Radiology and Medical Informatics, University of Geneva, Geneva, Switzerland
- Neuro-X Institute, Ecole Polytechnique Fédérale de Lausanne (EPFL), Geneva, Switzerland
- Department of Paediatrics, University of Melbourne, Melbourne, VIC Australia
Abstract
Blood Oxygen Level Dependent (BOLD) variability reflects meaningful brain activity, yet its structural and biological correlates during early development remain unknown. Using longitudinal resting-state fMRI and multi-shell diffusion imaging acquired longitudinally in 54 very preterm infants (at 33-weeks’ gestational age and term-equivalent-age) and 24 full-term newborns, we investigated how BOLD variability evolves in very preterm infants, its relationship with cortical microstructure and gene expression, using the BrainSpan dataset, and how it differs from full-term newborns at term-equivalent age. During preterm development, BOLD variability increased in primary sensory-sensorimotor and proto-Default-Mode-Netwo
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 11 matches between paragraphs and lines of code.
ekaden/smt
b4dfca6779de411ea93e41de470fe3667ae60dc7, 14 January 2019Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
41 files
- docopt.cpp/
include/ , C/C++, 94 linesdocopt.h - docopt.cpp/
include/ , C/C++, 674 linesdocopt_private.h - docopt.cpp/
include/ , C/C++, 120 linesdocopt_util.h - docopt.cpp/
include/ , C/C++, 340 linesdocopt_value.h - docopt.cpp/
src/ , C++, 685 linesdocopt.cpp - include/
besseli0.h , C/C++, 149 lines - include/
cartesianrange.h , C/C++, 90 lines - include/
chebychev.h , C/C++, 56 lines - include/
darray.h , C/C++, 682 lines - include/
debug.h , C/C++, 83 lines - include/
diffenc.h , C/C++, 267 lines - include/
env.h , C/C++, 46 lines - include/
expression.h , C/C++, 158 lines - include/
fitmcmicro.h , C/C++, 248 lines - include/
fitmicrodt.h , C/C++, 261 lines - include/
fmt.h , C/C++, 132 lines - include/
gaussianfit.h , C/C++, 66 lines - include/
indexable.h , C/C++, 193 lines - include/
logit.h , C/C++, 53 lines - include/
meansignal.h , C/C++, 65 lines - include/
neldermead.h , C/C++, 245 lines - include/
nifti.h , C/C++, 1,459 lines - include/
operator.h , C/C++, 233 lines - include/
opts.h , C/C++, 69 lines - include/
parfor.h , C/C++, 169 lines - include/
pow.h , C/C++, 55 lines - include/
progress.h , C/C++, 122 lines - include/
project.h , C/C++, 46 lines - include/
ricedebias.h , C/C++, 209 lines - include/
ricianfit.h , C/C++, 132 lines - include/
sarray.h , C/C++, 590 lines - include/
slicable.h , C/C++, 151 lines - include/
tty.h , C/C++, 150 lines - include/
version.h , C/C++, 37 lines - niftilib/
include/ , C/C++, 1,490 linesnifti1.h - src/
fitmcmicro.cpp , C++, 343 lines - src/
fitmicrodt.cpp , C++, 349 lines - src/
gaussianfit.cpp , C++, 174 lines - src/
ricianfit.cpp , C++, 174 lines - LICENSE.md, License, 23 lines
- README.md, Text, 269 lines
fsl.fmrib.ox.ac.uk/fsl/fslwiki
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
developingconnectome.org
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
git.fmrib.ox.ac.uk/matteob/dhcp_neo_dmri_pipeline_release
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
Zenodo 18875986
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
10 files
- BOLDDiff_Lasso_analysis.
R , R, 414 lines, 2 matches - BOLDDiff_Longitudinal_an
alysis.R , R, 815 lines, 1 match - BOLDDiff_Longitudinal_gr
aphs.R , R, 320 lines, 1 match - BOLDDiff_TEA_analysis.R, R, 696 lines
- BOLDDiff_TEA_graphs.R, R, 233 lines
- BOLDDiff_clinicaldata.R, R, 358 lines, 2 matches
- BOLDDiff_clustering_anal
ysis.R , R, 180 lines, 1 match - BOLD_ALFF_fALFF_longitud
inal_andTEA_analysis.R , R, 2,141 lines - BOLD_ALFF_fALFF_longitud
inal_graphs.R , R, 591 lines - Genetic_analysisANDgraph
s.R , R, 901 lines, 4 matches
Code availability
Software and code used in this study for MRI analysis are publicly available as part of FSL v5.0.10 (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 5 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 49 scripts, each with its path and the digest of its content;
- 11 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
All neuroimaging data were acquired in the context of a research project approved by the ethical committee in 2016. The raw data are protected and are not available due to data privacy laws. Developmental RNA-seq data used in this study were downloaded from: http://
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, issue, pages, dates, 11 authors, 3 keywords, 11 MeSH terms, 2 funders, 121 references.
Cite
This paper
Sa de Almeida, J., Boehringer, A., Loukas, S., Fischi-Gomez, E., Van Der Veek, A., Lordier, L., Courvoisier, S., Lazeyras, F., Van De Ville, D., Ball, G., & Hüppi, P. S. (2026). Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex. Nature communications, 17(1), 4849. https://
BibTeX
@article{sadealmeida2026
author = {Sa de Almeida, Joana and Boehringer, Andrew and Loukas, Serafeim and Fischi-Gomez, Elda and Van Der Veek, Annemijn and Lordier, Lara and Courvoisier, Sebastien and Lazeyras, François and Van De Ville, Dimitri and Ball, Gareth and Hüppi, Petra S},
title = {{Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {4849},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/
url = {https://
pmid = {41957008},
pmcid = {PMC13222875}
}
RIS
TY - JOUR
AU - Sa de Almeida, Joana
AU - Boehringer, Andrew
AU - Loukas, Serafeim
AU - Fischi-Gomez, Elda
AU - Van Der Veek, Annemijn
AU - Lordier, Lara
AU - Courvoisier, Sebastien
AU - Lazeyras, François
AU - Van De Ville, Dimitri
AU - Ball, Gareth
AU - Hüppi, Petra S
TI - Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/
VL - 17
IS - 1
SP - 4849
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex",
"container-title": "Nature communications",
"author": [
{
"family": "Sa de Almeida",
"given": "Joana"
},
{
"family": "Boehringer",
"given": "Andrew"
},
{
"family": "Loukas",
"given": "Serafeim"
},
{
"family": "Fischi-Gomez",
"given": "Elda"
},
{
"family": "Van Der Veek",
"given": "Annemijn"
},
{
"family": "Lordier",
"given": "Lara"
},
{
"family": "Courvoisier",
"given": "Sebastien"
},
{
"family": "Lazeyras",
"given": "François"
},
{
"family": "Van De Ville",
"given": "Dimitri"
},
{
"family": "Ball",
"given": "Gareth"
},
{
"family": "Hüppi",
"given": "Petra S"
}
],
"container-title-short":
"volume": "17",
"issue": "1",
"page": "4849",
"DOI": "10.1038/
"PMID": "41957008",
"PMCID": "PMC13222875",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
9
]
]
}
}
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.1126/sciadv.aec9291 [code]
- Computational mechanisms of perception in autism revealed using games inspired by rodent operant tasks.Journal: Science advancesIn common: glmnet, nlme, psych, 8 other tools
- [2] doi:10.1002/hbm.70496 [code]
- Transdiagnostic Profiles of BOLD Signal Variability in Autism and Schizophrenia Spectrum Disorders: Associations With Cognition and Functioning.Journal: Human brain mappingIn common: broom, tidyverse, fMRI, 9 references
- [3] doi:10.1038/s41398-026-04010-9 [code]
- Bullying victimization and brain development: a longitudinal structural magnetic resonance imaging study from adolescence to early adulthood.Journal: Translational psychiatryIn common: nlme, psych, rstatix, 7 other tools, developmental
- [4] doi:10.1038/s41467-026-73072-6 [code]
- Mapping the spatiotemporal continuum of structural connectivity development across the human connectome in youth.Journal: Nature communicationsIn common: mgcv, psych, easystats, 5 other tools, developmental, 3 references
- [5] doi:10.1073/pnas.2603114123 [code]
- The human hippocampus can pattern separate memories by meaning.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: psych, rstatix, easystats, 6 other tools, 2 references
- [6] doi:10.1016/j.celrep.2026.117505 [code]
- Impaired spatial coding and neuronal hyperactivity in the medial entorhinal cortex of aged APP knock-in mice.Journal: Cell reportsIn common: mgcv, nlme, easystats, 7 other tools
- [7] doi:10.1073/pnas.2606871123 [code]
- Oxytocin modulates the neurocomputational mechanisms engaged in learning rank relationships in social networks.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: nlme, psych, easystats, 7 other tools
- [8] doi:10.1016/j.nicl.2026.104053 [code]
- Childhood white matter organization predicts adolescent internalizing problems among youth with and without ADHD.Journal: NeuroImage. ClinicalIn common: psych, broom, emmeans, 4 other tools, developmental, 4 references
- [9] doi:10.1038/s41586-026-10699-x [code]
- Competing programs shape cortical sensorimotor-association
axis development. Journal: NatureIn common: ggplot2, tidyverse, 8 references - [10] doi:10.1093/bioinformatics/btag592 [code]
- Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.Journal: Bioinformatics (Oxford, England)In common: mgcv, rstatix, broom, 6 other tools, other condition
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: 5 repositories of the authors' code, each at its verified commit and with its license, 49 scripts, and 11 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:9309e00446cb800a…
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
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
