Faecalibacterium prausnitzii, depleted in the Parkinson's disease microbiome, improves motor deficits in α-synuclein overexpressing mice.
The 9 matches
- [1] § Methods › Motor and gastrointestinal function testing ↔ notebooks/Fp_motor_pooling_MLE_analysis.ipynb, lines 369–492 · score 0.87 · bootstrap resampling, bias corrected, bootstrap distribution, bootstrap sample, Confidence intervals, accelerated
- [2] § Methods › Fecal microbiome analysis with shotgun metagenomics ↔ Main-Analysis-SGB.Rmd, lines 271–304 · score 0.73 · addMDS, PCoA, genotype treatment, mia, beta, variance
- [3] § Methods › RNA sequencing ↔ notebook/shell_scripts/fastq_processing.sh, lines 42–80 · score 0.71 · FeatureCounts, Primary Assembly, M36, GENCODE, genome, RNA
- [4] § Results › F. prausnitzii supplementation remodels the gene expression profile of the large intestine ↔ notebook/bulk-rnaseq-analysis.qmd, lines 788–866 · score 0.69 · Slc8a3, Tnfrsf12a, gene expression, Edn3, Thy1 ASO, intestinal
- [5] § Methods › RNA sequencing ↔ notebook/R_scripts/quick_enrich.R, lines 14–69 · score 0.67 · log2 fold change, clusterProfiler, ontology, enrichment, Gene
- [6] § Results › F. prausnitzii supplementation remodels the gene expression profile of the large intestine ↔ notebook/bulk-rnaseq-analysis.qmd, lines 788–866 · score 0.66 · Cd8a, gene expression, CCL5, Tfrc, Thy1 ASO, large intestine
- [7] § Results › F. prausnitzii treatment aligns the Thy1-ASO microbiome to more closely resemble a WT profile ↔ Main-Analysis-SGB.Rmd, lines 595–651 · score 0.63 · beam traversal errors, MetaPhlAn, ASO controls, mediators, SGBs, Mediation
- [8] § Results › F. prausnitzii supplementation remodels the gene expression profile of the large intestine ↔ notebook/bulk-rnaseq-analysis.qmd, lines 681–785 · score 0.54 · log2 fold change, gene expression, Pearson, scatter, Box, large intestine
- [9] § Results › F. prausnitzii treatment aligns the Thy1-ASO microbiome to more closely resemble a WT profile ↔ Main-Analysis-SGB.Rmd, lines 489–534 · score 0.52 · bead expulsion, GI symptom, mediator, beam, mediation, errors
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 · 961 lines · 35 KB · no license · 3 matches
- ---
- title: "*Faecalibacterium prausnitzii*, depleted in the Parkinson’s disease microbiome, improves motor deficits in alpha-synuclein overexpressing mice"
- subtitle: "Data: Metaphlan 4.1.1 relative abundances"
- author:
- - name: Anastasiya Moiseyenko
- - name: Giacomo Antonello
- - name: Aubrey Schonhoff
- - name: Kaelyn Long
- - name: Joseph Boktor
- - name: Blake Dirks
- - name: Anastasiya Oguienko
- - name: Alex Villoria-Winnett
- - name: Rustem Ismagilov
- - name: Rosa Krajmalnik-Brown
- - name: Nicola Segata
- - name: Levi Waldron
- - name: Sarkis K. Mazmanian
- date: "`r format(Sys.time(), '%B %d, %Y')`"
- output:
- rmdformats::robobook:
- self_contained: true
- toc_depth: 3
- toc_float: false
- use_bookdown: true
- highlight: haddock
- params:
- basic_outdir: "results"
- assayTested: "relabundance"
- microbiome_data_type: "SGB"
- beta_dist: "bray"
- beta_MDS: "MDS"
- ---
- ```{r setup, include=FALSE}
- knitr::opts_chunk$set(warning = FALSE, message = FALSE)
- # packages for tabular data manipulation
- library(tidyverse)
- # microbiome specific packages
- library(maaslin3) # this version needs a custom fix in a fork I made pending approval as of Jul 28 2025. install with remotes::install_github("g-antonello/maaslin3", force = TRUE)
- library(mia)
- library(biobakeryUtils)
- # some packages for data visualization (plots and tables)
- library(miaViz)
- library(ggpubr)
- library(kableExtra)
- library(ggtext) # enhanced text handling in ggplot
- # MAC's package to download data
- library(parkinsonsMetagenomicData)
- # library to clean linear models output
- library(broom)
- library(ggh4x) # for complex ggplot2 faceting
- # remotes::install_github("cmartin/ggConvexHull")
- library(ggConvexHull) # for convex hulls geometries
- # set ggplot2 plot themes
- theme_set(theme_light())
- # set seed for reproducibility
- set.seed(1234)
- # bugsigdb packages
- library(bugsigdbr)
- library(bugSigSimple)
- # utility functions for biobakery and other microbiome analyses
- library(biobakeryUtils)
- ###################################################################
- # pairwise PERMANOVA source code
- source("https://raw.githubusercontent.com/pmartinezarbizu/pairwiseAdonis/refs/heads/master/pairwiseAdonis/R/pairwise.adonis.R")
- ###################################################################
- ###################################################################
- # function to colorize text of ggplot object matching with a pattern
- # This function will apply ALL color rules to EACH label string
- colorize_labels <- function(labels, mapping) {
- # Start with the original labels
- colored_labels <- labels
- # Loop through each pattern-color rule in your map
- for (pattern in names(mapping)) {
- color <- mapping[[pattern]]
- # The text to display is the pattern without the escape slashes
- display_text <- gsub("\\\\", "", pattern)
- # Apply the coloring rule. This will modify labels that have already been partially colored.
- colored_labels <- gsub(
- pattern = pattern,
- replacement = paste0("<span style='color:", color, ";'>", display_text, "</span>"),
- x = colored_labels,
- fixed = TRUE
- )
- }
- return(colored_labels)
- }
- ###################################################################
- # load data for analyses and create output directory
- #####################################
- # Load data for analyses
- MetaPhlAn.tse <- read_TSE_from_dir("Data/MetaPhlAn.tse/")
- # create base output directory
- dir.create(file.path(params$basic_outdir, params$microbiome_data_type),
- showWarnings = FALSE, recursive = TRUE)
- # make a study-wide color palette for the variables tested
- overall_color_palette <- c("WT Control" = "#b2df8a", "Thy1-ASO Control" = "#a6cee3", "Thy1-ASO *F. prausnitzii*" = "#1f78b4", "Thy1-ASO F. prausnitzii" = "#1f78b4")
- # load Genome Taxonomy Data Base (originally from the MetaPhlAn GitHub release)
- GTDB.df <- read_tsv("Data/GTDB_202403.tsv")
- # Initialize figure indices
- SuppFigIndex <- 1
- MainFigIndex <- 1
- SuppTabIndex <- 1
- MainTabIndex <- 1
- # print input data
- MetaPhlAn.tse
- ```
- # Preliminary statistics
- ## Uniform reads distribution per condition
- ```{r, fig.height=7, fig.width=7}
- normality_test <- shapiro.test(MetaPhlAn.tse@colData$number_reads)
- hist_reads <- ggplot(colData(MetaPhlAn.tse), aes(x = number_reads/1e6, color = genotype_treatment, fill = genotype_treatment)) +
- scale_color_manual(values = overall_color_palette, aesthetics = c("fill", "color")) +
- geom_density(alpha = 0.1) +
- labs(
- x = "Million reads per sample retained",
- y = "Density",
- color = "Genotype and Treatment",
- fill = "Genotype and Treatment",
- caption = sprintf("Shapiro-Wilk: W = %.3f, P = %.3f", normality_test$statistic, normality_test$p.value)
- )
- test_reads <- pairwise.t.test(MetaPhlAn.tse@colData$number_reads, MetaPhlAn.tse@colData$genotype_treatment, pool.sd = FALSE,p.adjust.method = NULL) %>%
- broom::tidy()
- reads_per_condition <- ggarrange(hist_reads, ggtexttable(test_reads, rows = NULL), common.legend = TRUE, labels = "AUTO", nrow = 2, heights = c(1, 0.3))
- sapply(c("png", "svg", "pdf"), function(fmt)
- ggsave(
- plot = reads_per_condition,
- filename = sprintf(
- "%s/%s/Supplementary Figure %i - Reads distribution per condition.%s",
- params$basic_outdir,
- params$microbiome_data_type,
- SuppFigIndex,
- fmt
- ),
- height = 8,
- width = 8,
- dpi = 600,
- bg = "white"
- )) %>% invisible()
- SuppFigIndex <- sum(SuppFigIndex, 1)
- ```
- ## Alpha diversity does not vary in relation to sequencing depth
- ```{r}
- alphaDivIndices <- c(
- "dbp_dominance",
- "observed_richness",
- "shannon_diversity",
- "gini"
- )
- MetaPhlAn.tse <- addAlpha(MetaPhlAn.tse, assay.type = params$assayTested, index = alphaDivIndices)
- ```
- ```{r}
- histograms_alpha <- lapply(alphaDivIndices,
- function(div) {
- stats_basic <- shapiro.test(as.data.frame(colData(MetaPhlAn.tse))[[div]])
- text <- paste0("Shapiro-Wilk test: W = ", round(stats_basic$statistic, 2), "; P-value = ", round(stats_basic$p.value, 3))
- plot <- ggplot(as.data.frame(colData(MetaPhlAn.tse)), aes(x = !!sym(div))) +
- geom_histogram() +
- labs(
- title = div,
- caption = text
- )
- }
- ) %>%
- ggarrange(plotlist = .)
- ```
- ```{r, tab.cap="Assessment of dependence of alpha diversity measures in relation to sequencing depth"}
- tmp <- sapply(alphaDivIndices, function(div) {
- lm(as.formula(paste(div, "~", "number_reads")), data = colData(MetaPhlAn.tse))
- }, USE.NAMES = TRUE, simplify = FALSE)
- table_results.df <- tmp %>% lapply(broom::tidy) %>%
- bind_rows(.id = "AlphaIndex") %>%
- filter(!grepl("Intercept", term)) %>%
- as_tibble()
- alpha_vs_reads_plot <- ggarrange(
- histograms_alpha,
- ggtexttable(table_results.df, rows = NULL),
- nrow = 2
- )
- sapply(c("png", "svg", "pdf"), function(fmt)
- ggsave(plot = alpha_vs_reads_plot, filename = sprintf(
- "%s/%s/Supplementary Figure %i - Alpha Indices vs number of reads.%s",
- params$basic_outdir,
- params$microbiome_data_type,
- SuppFigIndex,
- fmt
- ),
- height = 8,
- width = 8,
- dpi = 600,
- bg = "white"
- )
- ) %>% invisible()
- SuppFigIndex <- sum(SuppFigIndex, 1)
- ```
- ```{r, tab.cap="Assessment of dependence of alpha diversity measures in relation to sequencing depth"}
- table_results.df %>%
- kbl() %>%
- row_spec(which(table_results.df$p.value < 0.05), bold = TRUE) %>%
- kable_styling()
- ```
- # Main figure
- ## A - Stackplot relative abundances at Phylum Level
- ```{r}
- panelA_stackplot <- plotAbundance(
- x = MetaPhlAn.tse,
- assay.type = params$assayTested,
- group = "Phylum") +
- facet_grid(cols = vars(genotype_treatment_legend), scales = "free_x") +
- theme_light() +
- scale_x_discrete(labels = "x") +
- theme(
- panel.spacing.x = unit(0, "lines"),
- strip.background.x = element_rect(fill = "white", colour = "gray40", linewidth = unit(0.8, "mm")),
- panel.grid = element_blank(),
- panel.border = element_rect(colour = "gray40", linewidth = unit(0.8, units = "mm")),
- strip.text = element_text(color = "black"),
- axis.text.x = element_text(color = "white"),
- axis.ticks.x = element_blank(),
- strip.text.x = element_markdown()
- ) +
- labs(
- fill = "Phylum",
- x = " "
- )
- panelA_stackplot$data$colour_by <- gsub("p__", "", panelA_stackplot$data$colour_by)
- panelA_stackplot$data$colour_by <- gsub("_", " ", panelA_stackplot$data$colour_by)
- ```
- ## B - PCoA
- ```{r}
- set.seed(1234)
- dimRedName <- paste("Fp7", params$beta_dist, "mds", sep = "_")
- MetaPhlAn.tse <- mia::addMDS(
- MetaPhlAn.tse,
- assay.type = params$assayTested,
- method = params$beta_dist,
- ncomponents = 3, name = dimRedName
- )
- variances_explained <- attr(reducedDim(MetaPhlAn.tse, dimRedName), "eig")
- prop_variances_explained <- variances_explained/sum(variances_explained)
- Fp7_colData_for_PCoA.df <- cbind.data.frame(as.data.frame(colData(MetaPhlAn.tse)), reducedDim(MetaPhlAn.tse, dimRedName) %>% as.data.frame() %>% set_names(paste("MDS", 1:ncol(.))))
- panelB_PCoA <- Fp7_colData_for_PCoA.df %>%
- ggplot(aes(x = `MDS 1`, y = `MDS 2`, color = genotype_treatment_legend, fill = genotype_treatment_legend)) +
- geom_point(size = 2.5, stroke = 1, color = "black") +
- geom_point(size = 2.5) +
- ggConvexHull::geom_convexhull(show.legend = FALSE, alpha = 0.2) +
- scale_color_manual(values = overall_color_palette) +
- scale_fill_manual(values = overall_color_palette) +
- theme(legend.position = "top", legend.text = element_markdown()) +
- labs(color = "Genotype and Treatment",
- fill = "Genotype and Treatment",
- x = paste0("PCoA Axis 1 [", round(prop_variances_explained[1]*100, 1), "%]"),
- y = paste0("PCoA Axis 2 [", round(prop_variances_explained[2]*100, 2), "%]")
- )
- # panelB_PCoA
- ```
- ## C - Pairwise bray-curtis dissimilarities
- ### Statistical test (Bray-curtis)
- ```{r}
- dissimName <- paste("Fp7", params$beta_dist, sep = "_")
- MetaPhlAn.tse <- addDissimilarity(MetaPhlAn.tse, method = "bray", name = dissimName, assay.type = params$assayTested)
- mtx <- metadata(MetaPhlAn.tse)[[dissimName]]
- mtx[upper.tri(mtx,diag = TRUE)] <- NA
- pairwise_dissim_bray <- reshape2::melt(mtx) %>%
- filter(complete.cases(.)) %>%
- dplyr::inner_join(., as.data.frame(colData(MetaPhlAn.tse)) %>% transmute(Var1 = uuid, genotype_treatment_legend = genotype_treatment_legend), by = "Var1") %>%
- dplyr::inner_join(., as.data.frame(colData(MetaPhlAn.tse)) %>% transmute(Var2 = uuid, genotype_treatment_legend = genotype_treatment_legend), by = "Var2") %>%
- dplyr::select(Var1, Var2, contains(c("uuid", "genotype", "treatment")), value) %>%
- mutate(pairs = paste(genotype_treatment_legend.y, genotype_treatment_legend.x, sep = " vs ")) %>%
- filter(genotype_treatment_legend.x != genotype_treatment_legend.y)
- ```
- ```{r}
- set.seed(1234)
- library(vegan)
- pairwise_adonis_stats <- pairwise.adonis(x = as.dist(metadata(MetaPhlAn.tse)[[dissimName]]),
- factors = MetaPhlAn.tse@colData$genotype_treatment,
- perm = 9999,
- p.adjust.m = "BH"
- )
- ```
- ### Boxplot dissimilarities
- ```{r}
- pairwise_adonis_stats_asterisks <- pairwise_adonis_stats %>%
- mutate(pairs = gsub("Thy1-ASO F. prausnitzii", "Thy1-ASO *F. prausnitzii*", pairs))
- panelC_pairwise_dissim_boxplot <- pairwise_dissim_bray %>%
- ggplot(
- aes(x = pairs, y = value)
- ) +
- geom_point(position = position_jitter(width = 0.2, seed = 1234), stroke = 1.1) +
- geom_point(position = position_jitter(width = 0.2, seed = 1234), color = "gray30") +
- geom_boxplot(outliers = FALSE, alpha = 0.6, width = 0.3) +
- geom_text(data = pairwise_adonis_stats_asterisks %>%
- dplyr::left_join(
- group_by(pairwise_dissim_bray, pairs) %>%
- reframe(value = max(value)*1.1), by = "pairs") %>%
- mutate(pairs = factor(pairs, levels = pairs)),
- mapping = aes(x = pairs, y = value, label = sprintf("FDR = %.3f", p.adjusted)), hjust = 0, angle = 90) +
- # Apply the colorize_labels function to your x-axis labels
- scale_x_discrete(labels = function(x) colorize_labels(x, overall_color_palette)) +
- # Tell ggplot to render the axis text as Markdown/HTML
- theme(
- axis.text.x = ggtext::element_markdown(angle = 90, hjust = 1, vjust = 0.5)
- ) +
- ylim(min(pairwise_dissim_bray$value)*0.9, max(pairwise_dissim_bray$value)*1.5) +
- labs(
- x = "",
- y = "Bray-Curtis Pairwise Dissimilarity"
- )
- # make a horizontal version just in case
- panelC_pairwise_dissim_boxplot_horiz <- pairwise_dissim_bray %>%
- ggplot(
- aes(y = pairs, x = value)
- ) +
- geom_point(position = position_jitter(height = 0.2, seed = 1234), stroke = 1.1) +
- geom_point(position = position_jitter(height = 0.2, seed = 1234), color = "gray30") +
- geom_boxplot(outliers = FALSE, alpha = 0.6, width = 0.3) +
- geom_text(data = pairwise_adonis_stats_asterisks %>%
- dplyr::left_join(
- group_by(pairwise_dissim_bray, pairs) %>%
- reframe(value = max(value)*1.1), by = "pairs") %>%
- mutate(pairs = factor(pairs, levels = pairs)),
- mapping = aes(y = pairs, x = value, label = sprintf("FDR = %.3f", p.adjusted)), hjust = 0) +
- # Apply the colorize_labels function to your x-axis labels
- scale_y_discrete(labels = function(x) colorize_labels(x, overall_color_palette)) +
- # Tell ggplot to render the axis text as Markdown/HTML
- theme(axis.text.y = ggtext::element_markdown(angle = 0, hjust = 1)) +
- xlim(min(pairwise_dissim_bray$value)*0.9, max(pairwise_dissim_bray$value)*1.5) +
- labs(
- y = "",
- x = "Bray-Curtis Pairwise Dissimilarity"
- )
- ```
- ## D - Differentially abundant features due to treatment in Thy1-ASO mice
- Model formula is:
- $$
- \log_2(Microbiome)_{Thy1-ASO} \sim treament
- $$
- ```{r}
- # prepare input data
- tmp.tse <- MetaPhlAn.tse[,MetaPhlAn.tse@colData$genotype != "WT"]
- tmp.tse@colData$treatment <- relevel(tmp.tse@colData$treatment, "Control")
- tmp.tse@colData$treatment <- droplevels(tmp.tse@colData$treatment)
- tmp.tse <- tmp.tse[rowSums(assay(tmp.tse, params$assayTested)) > 0,]
- tmp.tse
- # define experiment name and output directories
- maaslin3_expmt <- "maaslin3_treatments_vs_Control_in_Thy1-ASO"
- maaslin3_final_outdir <- file.path(params$basic_outdir, params$microbiome_data_type, maaslin3_expmt)
- # create definitive output directory
- dir.create(maaslin3_final_outdir, showWarnings = FALSE, recursive = TRUE)
- ```
- Results are stored in ``r maaslin3_final_outdir``
- ```{r}
- set.seed(1234)
- treatments_vs_Control_in_Thy1ASO.maaslin3 <- maaslin3(
- input_data = tmp.tse,
- formula = ~ treatment,
- transform = "LOG",
- output = maaslin3_final_outdir,
- # do not standardize continuous metadata variables in the model
- standardize = FALSE,
- plot_associations = TRUE,
- save_plots_rds = TRUE,
- verbosity = "ERROR",
- summary_plot_first_n = 15
- )
- # enrich results with taxonomy information only in case of Metaphlan
- if(agrepl("metaphlan", params$assayTested)){
- ## add taxonomy to output tables: all_results.tsv
- dplyr::right_join(GTDB.df %>% mutate(SGB = paste0("t__", SGB)), read_tsv(file.path(maaslin3_final_outdir, "all_results.tsv")) %>% dplyr::rename(!!sym(params$microbiome_data_type) := feature), by = params$microbiome_data_type) %>%
- #arrange again based on increasing qval_individual
- arrange(qval_individual) %>%
- write_tsv(file.path(maaslin3_final_outdir, "all_results.tsv"))
- ## add taxonomy to output tables: significant_results.tsv
- dplyr::right_join(GTDB.df %>% mutate(SGB = paste0("t__", SGB)), read_tsv(file.path(maaslin3_final_outdir, "significant_results.tsv")) %>% dplyr::rename(!!sym(params$microbiome_data_type) := feature), by = params$microbiome_data_type) %>%
- write_tsv(file.path(maaslin3_final_outdir, "significant_results.tsv"))
- }
- # save raw output
- saveRDS(treatments_vs_Control_in_Thy1ASO.maaslin3, file = file.path(maaslin3_final_outdir, "maaslin3_raw_output.rds"))
- ```
- ```{r}
- GTDB.df <- GTDB.df %>%
- mutate(
- altNames = sapply(
- strsplit(paste(trimws(Genus), trimws(Species), sprintf("[%s]", SGB)), " ", fixed = TRUE),
- function(x) paste(unique(x), collapse = " ")
- )
- )
- altNames.chr <- GTDB.df$altNames
- names(altNames.chr) <- GTDB.df$SGB
- panelD_diffAbund <- readRDS(file = file.path(maaslin3_final_outdir, "figures", "summary_plot_gg.RDS")) +
- theme(strip.text = element_blank()) +
- # expand plot to show full errorbars
- scale_x_continuous(expand = expansion(mult = c(.1))) +
- # remove the null HP that would mess with the panel rendering
- guides(linetype = "none")
- panelD_diffAbund2 <- panelD_diffAbund +
- scale_y_discrete(
- labels = function(y) {
- altnamesBasic <- altNames.chr[gsub("t__", "", y)]
- altnamesItalics <- strsplit(altnamesBasic, "\\ ") %>% lapply(function(x)
- ifelse(str_ends(x, "cter|culum|terium|cter|monas|ccus|llus|cus|ctor|ella"), paste0("*", x, "*"), x)) %>%
- purrr::map_chr(.f = function(x) paste(x, collapse = " "))
- return(altnamesItalics)
- }
- ) + theme(
- axis.text.x = element_text(size = 12),
- axis.text.y = element_text(size = 12)
- )
- ```
- ## E - Mediation analysis with PCoA axes 1-3 on constipation and motor symptoms
- - Constipation symptoms: $Bead~expulsion~(minutes)$
- - Motor symptoms: $\frac{slips}{steps}~on~beam$
- We use the standard 3-equation approach:
- - (1) $Mediator \sim Treatment$
- - (2) $Outcome \sim Treatment$
- - (3) $Outcome \sim Mediator + Treatment$
- Where `Mediator` = PCo.x, `Outcome` = Bead Expulsion or Errors/Steps, `Treatment`
- *F. prausnitzii* supplementation.
- ```{r}
- # gather bead_expulsion_n data
- motor_gi_symptoms.list <- sapply(c("Beam_steps", "Bead_exp"), function(x) openxlsx::read.xlsx("Data/Fp7_GI_motor_assessment.xlsx", sheet = x), simplify = FALSE, USE.NAMES = TRUE)
- # prepare bead expulsion variable
- motor_gi_symptoms.list$Bead_exp <- motor_gi_symptoms.list$Bead_exp %>%
- dplyr::transmute(
- mouse_id = ID,
- bead_expulsion_min = Trial1)
- # prepare slips over steps variable
- motor_gi_symptoms.list$Beam_steps <- motor_gi_symptoms.list$Beam_steps %>%
- rowwise() %>%
- transmute(
- mouse_id = ID,
- Slips = Slips_Trial1,
- Steps = Steps_Trial1,
- # older choice of presenting data
- # Slips = mean(c(Slips_Trial1, Slips_Trial2), na.rm = TRUE),
- # Steps = mean(c(Steps_Trial1, Steps_Trial2), na.rm = TRUE),
- slips_over_steps = Slips/Steps)
- additional_variables.df <- purrr::reduce(motor_gi_symptoms.list, dplyr::full_join, by = "mouse_id")
- # incorporate these columns into the colData of the input
- new_df <- DataFrame(dplyr::left_join(as.data.frame(colData(MetaPhlAn.tse)), additional_variables.df, by = "mouse_id"))
- rownames(new_df) <- new_df$uuid
- colData(MetaPhlAn.tse) <- new_df
- ```
- ### Mediation analysis of bead expulsion
- ```{r}
- library(mediation)
- set.seed(1234)
- mediationData.df <- cbind.data.frame(
- as.data.frame(colData(MetaPhlAn.tse)),
- as.data.frame(reducedDim(MetaPhlAn.tse, dimRedName))) %>%
- dplyr::rename(
- PCo.1 = V1,
- PCo.2 = V2,
- PCo.3 = V3
- ) %>%
- filter(
- # remove NAs from covariates of interest
- complete.cases(dplyr::select(., contains("PCo"), genotype_treatment, bead_expulsion_min)),
- # remove WT Control and use ASO control as baseline
- genotype_treatment != "WT Control"
- ) %>%
- mutate(
- treatment = droplevels(treatment)
- )
- # make 3 mediation analyses as list, one per Principal Component
- mediations_Princ.Coord <- sapply(grepv("PCo", colnames(mediationData.df)), function(x) {
- # Model 1 - Effect of exposure on mediator
- mediation.lm <- lm(as.formula(paste(x, "treatment", sep = "~")), data = mediationData.df)
- # Model 2 - Effect of exposure on outcome (Total effect)
- outcome.lm <- lm(as.formula(paste("bead_expulsion_min ~ treatment", x, sep = "+")), data = mediationData.df)
- # Model 3 - Meidation analysis
- mediation_analysis = mediate(
- model.m = mediation.lm,
- model.y = outcome.lm,
- sims = 1000,
- treat = "treatment",
- mediator = x,
- boot = FALSE,
- robustSE = TRUE
- )
- # return all 3 models for completeness
- return(
- list(
- mediator.lm = mediation.lm,
- outcome.lm = outcome.lm,
- mediation_analysis = mediation_analysis
- )
- )
- }, simplify = FALSE, USE.NAMES=TRUE)
- data_as_long_table_bead_expulsion <- mediations_Princ.Coord %>%
- lapply("[[", "mediation_analysis") %>%
- lapply(tidy_mediation) %>%
- bind_rows(.id = "PCo") %>%
- mutate(Exposure = "Bead Expulsion (min)")
- ```
- ### Mediation analysis of Errors/steps
- ```{r}
- library(mediation)
- set.seed(1234)
- mediationData.df <- cbind.data.frame(
- as.data.frame(colData(MetaPhlAn.tse)),
- as.data.frame(reducedDim(MetaPhlAn.tse, dimRedName))) %>%
- dplyr::rename(
- PCo.1 = V1,
- PCo.2 = V2,
- PCo.3 = V3
- ) %>%
- filter(
- # remove NAs from covariates of interest
- complete.cases(dplyr::select(., contains("PCo"), genotype_treatment, slips_over_steps)),
- # remove WT Control and use ASO control as baseline
- genotype_treatment != "WT Control"
- ) %>%
- mutate(
- treatment = droplevels(treatment)
- )
- # make 3 mediation analyses as list, one per Principal Component
- mediations_Princ.Coord <- sapply(grepv("PCo", colnames(mediationData.df)), function(x) {
- # Model 1 - Effect of exposure on mediator
- mediation.lm <- lm(as.formula(paste(x, "treatment", sep = "~")), data = mediationData.df)
- # Model 2 - Effect of exposure on outcome (Total effect)
- outcome.lm <- lm(as.formula(paste("slips_over_steps ~ treatment", x, sep = "+")), data = mediationData.df)
- # Model 3 - Meidation analysis
- mediation_analysis = mediate(
- model.m = mediation.lm,
- model.y = outcome.lm,
- sims = 1000,
- treat = "treatment",
- mediator = x,
- boot = FALSE,
- robustSE = TRUE
- )
- # return all 3 models for completeness
- return(
- list(
- mediator.lm = mediation.lm,
- outcome.lm = outcome.lm,
- mediation_analysis = mediation_analysis
- )
- )
- }, simplify = FALSE, USE.NAMES=TRUE)
- data_as_long_table_slips_over_steps <- mediations_Princ.Coord %>%
- lapply("[[", "mediation_analysis") %>%
- lapply(tidy_mediation) %>%
- bind_rows(.id = "PCo") %>%
- mutate(Exposure = "Beam Traversal - Errors/Steps")
- ```
- ### Panel E plot generation
- ```{r}
- data_as_long_table_for_horizPlot <- rbind.data.frame(data_as_long_table_slips_over_steps,data_as_long_table_bead_expulsion) %>%
- mutate(
- PCo = factor(PCo, levels = sort(unique(data_as_long_table_slips_over_steps$PCo), decreasing = TRUE)),
- Effect = factor(Effect, levels = sort(unique(Effect), decreasing = TRUE))
- )
- ```
- ```{r}
- panelE_mediation_motor_GI_symptoms <- ggplot(data_as_long_table_for_horizPlot, aes(x = Estimate, y = Effect, color = PCo, shape = P.value < 0.05)) +
- geom_vline(xintercept = 0, lty = "dashed", color = "darkgray") +
- geom_errorbar(aes(xmin = CI_Lower_95, xmax = CI_Upper_95, y = Effect, color = PCo), position = position_dodge(width = 0.5, preserve = "total"), width = 0, show.legend = FALSE) +
- geom_point(position = position_dodge(width = 0.5, preserve = "total"), size = 4) +
- scale_shape_manual(values = c(1,19)) +
- facet_nested(cols = vars(Exposure), scales = "free_x") +
- scale_color_manual(values = c("darksalmon", "brown3", "brown4"), labels = c("PCo 3", "PCo 2", "PCo 1")) +
- guides(color = guide_legend(reverse = TRUE), shape = "none") +
- theme(
- panel.spacing.x = unit(0, "lines"),
- strip.background.x = element_rect(fill = "white", colour = "gray40", linewidth = unit(0.8, "mm")),
- strip.text = element_text(color = "black"),
- axis.text = element_text(size = 12),
- axis.title = element_text(size = 12)
- ) +
- labs(
- color = NULL,
- y = NULL,
- x = expression(beta~Estimate)
- )
- panelE_mediation_motor_GI_symptoms
- panelE_mediation_motor_GI_symptoms_shorterLabels <- panelE_mediation_motor_GI_symptoms + scale_y_discrete(labels = function(x) gsub("Average\\ |Causal\\ ", "", x))
- ```
- ## Arrange panels and save figure
- ```{r, fig.height=8, fig.width=12}
- panel_A_legend <- get_legend(panelA_stackplot + guides(fill = guide_legend(nrow = 2, title = "Phylum", position = "top")))
- Microbiome_Main_Figure <- ggarrange(
- ggarrange(
- panelA_stackplot + guides(fill = guide_legend(title = "Phylum")) + labs(y = "Relative Abundance", x = "Mouse") + theme(axis.title = element_text(size = 12)),
- panelB_PCoA + theme(axis.title = element_text(size = 12)),
- common.legend = TRUE, widths = c(1, 1), legend = "top", labels = c("A", "B")),
- ggarrange(
- panelC_pairwise_dissim_boxplot_horiz + theme(axis.title = element_text(size = 12), axis.text = element_text(size = 9)),
- ggarrange(
- get_legend(panelB_PCoA + guides(color = guide_legend(ncol = 1, position = "right"))),
- ggplot() + theme_void(), nrow = 2, heights = c(1, 0.35)
- ),
- nrow = 1, widths = c(1,0.2), labels = c("C", "")
- ),
- ggarrange(
- ggarrange(
- ggplot() + theme_void(),
- panelD_diffAbund2 +
- coord_flip() +
- theme(axis.text.x = element_markdown(angle = 90, hjust = 1, vjust = 0.5), axis.title = element_text(hjust = 1),
- legend.position = "none") +
- labs(x = expression(log[2]~Fold~Change), y = NULL) +
- theme(axis.title = element_text(size = 12)),
- panelE_mediation_motor_GI_symptoms_shorterLabels + theme(legend.position = "bottom"),
- widths = c(0.05, 0.85, 1), nrow = 1, labels = c("D", "", "E")
- ),
- get_legend(panelD_diffAbund2 + theme(legend.position = "bottom", legend.text = element_text(size = 10), legend.title = element_text(size = 12))), nrow = 2,
- heights = c(1, 0.2)
- ),
- nrow = 3,
- heights = c(1, 0.25, 1)
- )
- sapply(c("png", "svg", "pdf"), function(fmt)
- ggsave(plot = Microbiome_Main_Figure, filename = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Main_Microbiome_Figure.%s", fmt)), width = 11, height = 13, bg = "white")
- )
- ```
- # Supplementary Figure `r SuppFigIndex` - alpha and F/B ratios vs genotype treatment
- ```{r}
- alpha_data.df <- MetaPhlAn.tse %>%
- colData() %>%
- as.data.frame() %>%
- dplyr::rename(
- `Shannon Diversity` = shannon_diversity,
- `Observed Richness` = observed_richness
- )
- comparisons <- combn(levels(alpha_data.df$genotype_treatment_legend), 2, simplify = FALSE)
- ```
- ## A - Observed Richness
- ```{r}
- anova_test <- broom::tidy(aov(`Observed Richness` ~ genotype_treatment, data = alpha_data.df)) %>%
- as.data.frame()
- anova_test.text <- sprintf("ANOVA: df = %i, F = %.3f, P = %.4f", anova_test[1,"df"],
- anova_test[1,"statistic"], anova_test[1,"p.value"])
- panelA_Obs_boxplot <- alpha_data.df %>%
- ggplot(aes(x = genotype_treatment_legend, y = `Observed Richness`, color = genotype_treatment_legend, fill = genotype_treatment_legend)) +
- geom_boxplot(outliers = FALSE, show.legend = FALSE, color = "black", alpha = 0.4) +
- geom_point(color = "black", stroke = 1.1, position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- geom_point(position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- scale_color_manual(values = overall_color_palette) +
- scale_fill_manual(values = overall_color_palette) +
- # stat_pvalue_manual(stats_obs, label = "p.adj.round3", tip.length = 0.01) +
- theme(axis.text.x = element_blank(), legend.text = element_markdown()) +
- labs(
- x = NULL,
- color = "Genotype and Treatment",
- fill = "Genotype and Treatment",
- caption = anova_test.text)
- ```
- ## B - Shannon Diversity
- ```{r}
- anova_test <- broom::tidy(aov(`Shannon Diversity` ~ genotype_treatment, data = alpha_data.df)) %>%
- as.data.frame()
- anova_test.text <- sprintf("ANOVA: df = %i, F = %.3f, P = %.4f", anova_test[1,"df"],
- anova_test[1,"statistic"], anova_test[1,"p.value"])
- panelB_Shannon_boxplot <- alpha_data.df %>%
- ggplot(aes(x = genotype_treatment_legend, y = `Shannon Diversity`, color = genotype_treatment_legend, fill = genotype_treatment_legend)) +
- geom_boxplot(outliers = FALSE, show.legend = FALSE, color = "black", alpha = 0.4) +
- geom_point(color = "black", stroke = 1.1, position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- geom_point(position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- scale_color_manual(values = overall_color_palette) +
- scale_fill_manual(values = overall_color_palette) +
- # stat_pvalue_manual(stats_shannon, label = "p.adj.round3", tip.length = 0.01) +
- theme(axis.text.x = element_blank(), legend.text = element_markdown()) +
- labs(
- x = NULL,
- color = "Genotype and Treatment",
- fill = "Genotype and Treatment",
- caption = anova_test.text
- )
- ```
- ## C - Firmicutes/Bacteroidetes Ratio
- ```{r}
- assayextractedPhylum <- assay(agglomerateByRank(MetaPhlAn.tse, "Phylum"), params$assayTested)
- MetaPhlAn.tse$FB.Ratio <- assayextractedPhylum["p__Firmicutes",]/assayextractedPhylum["p__Bacteroidota",]
- anova_test <- broom::tidy(aov(FB.Ratio ~ genotype_treatment, data = colData(MetaPhlAn.tse))) %>%
- as.data.frame()
- anova_test.text <- sprintf("ANOVA: df = %i, F = %.3f, P = %.4f", anova_test[1,"df"],
- anova_test[1,"statistic"], anova_test[1,"p.value"])
- panelF_FB.Ratio.df <- colData(MetaPhlAn.tse) %>%
- as.data.frame() %>%
- dplyr::select(genotype_treatment, genotype_treatment_legend, FB.Ratio)
- panelC_FB.Ratio <- panelF_FB.Ratio.df %>%
- ggplot(aes(x = genotype_treatment_legend, y = FB.Ratio, color = genotype_treatment_legend, fill = genotype_treatment_legend)) +
- geom_boxplot(outliers = FALSE, show.legend = FALSE, color = "black", alpha = 0.4) +
- geom_point(color = "black", stroke = 1.1, position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- geom_point(position= position_jitterdodge(jitter.width = 0.5, seed = 1234)) +
- scale_color_manual(values = overall_color_palette) +
- scale_fill_manual(values = overall_color_palette) +
- # stat_pvalue_manual(stats_fbrartio, label = "p.adj.round3", tip.length = 0.01) +
- theme(axis.text.x = element_blank(), legend.text = element_markdown()) +
- labs(
- x = NULL,
- y = "Firmicutes/Bacteroidetes Ratio",
- color = "Genotype and Treatment",
- fill = "Genotype and Treatment",
- caption = anova_test.text)
- ```
- ## Arrange panels and save figure
- ```{r}
- microbiome_panel_Supplementary <- ggarrange(
- panelA_Obs_boxplot + theme(axis.ticks.x = element_blank()) + scale_y_continuous(expand = expansion(mult = 0.08)),
- panelB_Shannon_boxplot + theme(axis.ticks.x = element_blank()) + scale_y_continuous(expand = expansion(mult = 0.08)),
- panelC_FB.Ratio + theme(axis.ticks.x = element_blank()) + scale_y_continuous(expand = expansion(mult = 0.08)),
- nrow = 1, labels = c("A", "B", "C"),
- common.legend = TRUE)
- sapply(c("png", "svg", "pdf"), function(fmt)
- ggsave(plot = microbiome_panel_Supplementary, filename = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Figure %i - Alpha richness, diversity and FB Ratio.%s", SuppFigIndex, fmt)), width = 10, height = 4)
- )
- SuppFigIndex <- sum(SuppFigIndex, 1)
- microbiome_panel_Supplementary
- ```
- # Supplementary Tables
- ## Supplementary Table `r SuppTabIndex` - BugSigDB Parkinson gut microbiome siganture across studies
- ```{r}
- host <- "Homo sapiens"
- bsdb <- importBugSigDB(version = "devel", cache=FALSE)
- bsdb_PD_signatures_allMethods <- filter(bsdb,
- # get studies/signatures on Parkinson alone
- grepl("Parkinson's disease", Condition),
- # restrict search to Homo sapiens
- `Host species` == "Homo sapiens"
- ) %>%
- # fix taxa names in case k__ is duplicated because of some weird
- # changes found on May 20 2025
- mutate(
- `MetaPhlAn taxon names` = lapply(`MetaPhlAn taxon names`, function(x) gsub("|k__", "_", x = x, fixed = TRUE))
- )
- # fix typo of feces,blood
- bsdb_PD_signatures_allMethods <- mutate(bsdb_PD_signatures_allMethods,
- `Body site` = ifelse(`Body site` == "Feces,Blood", "Blood,Feces", `Body site`))
- bsdb_PD_signatures_allMethods_onlyFeces <- filter(bsdb_PD_signatures_allMethods, `Body site` == "Feces")
- top50_bugsigdb_PD_taxa <- createTaxonTable(bsdb_PD_signatures_allMethods_onlyFeces, n = 50) %>%
- filter(`Taxonomic Level` %in% c("genus", "species")) %>%
- arrange(`Binomial Test pval`) %>%
- dplyr::select(`Taxon Name`:`Binomial Test pval`, metaphlan_name)
- write_tsv(top50_bugsigdb_PD_taxa, file = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - BugSigDB Parkinson disease signature as of %s.tsv", SuppTabIndex, Sys.Date())))
- SuppTabIndex <- SuppTabIndex + 1
- ```
- ## Supplementary Table `r SuppTabIndex` - PERMANOVA relative to Main Figure Panel B
- ```{r}
- MetaPhlAn.tse <- addPERMANOVA(MetaPhlAn.tse,
- formula = x ~ genotype_treatment,
- assay.type = params$assayTested,
- method = params$beta_dist,
- permutations = 9999,
- by = "margin")
- permanova_table.df <- PERMANOVA_to_table(MetaPhlAn.tse)
- write_tsv(permanova_table.df, file = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - PERMANOVA of %s distance relative to Main Figure panel B.tsv", SuppTabIndex, params$beta_dist)))
- SuppTabIndex <- SuppTabIndex + 1
- ```
- ## Supplementary Table `r SuppTabIndex` - Pairwise PERMANOVA statistics related to Main Figure Panel C
- ```{r}
- write_tsv(pairwise_adonis_stats, file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - pairwise PERMANOVA of %s distance relative to Main Figure panel C.tsv", SuppTabIndex, params$beta_dist)))
- SuppTabIndex <- SuppTabIndex + 1
- ```
- ## Supplementary Table `r SuppTabIndex` - Genome Taxonomy Database of the SGBs in the study
- ```{r}
- taxaNames_no_UN_no_Prefix <- gsub("t__", "", rownames(MetaPhlAn.tse)) %>%
- .[!grepl("^UN", .)]
- GTDB.df[match(taxaNames_no_UN_no_Prefix, GTDB.df$SGB),] %>%
- write_tsv(file = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - GTDB taxonomy of the SGBs in the study.tsv", SuppTabIndex)))
- SuppTabIndex <- SuppTabIndex + 1
- ```
- ## Supplementary Table `r SuppTabIndex` - Full Differential abundance analysis results
- ```{r}
- file.copy(from = file.path(params$basic_outdir, params$microbiome_data_type, maaslin3_expmt, "all_results.tsv"), to = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - MaAsLin3 Differential abundance analysis ASO_Treated vs ASO_Control.tsv", SuppTabIndex)))
- SuppTabIndex <- sum(SuppTabIndex, 1)
- ```
- ## Supplementary Table `r SuppTabIndex` - Mediation analysis on bead expulsion related to Main Figure panel E
- ```{r}
- write_tsv(data_as_long_table_bead_expulsion, file = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - Mediation analysis on bead expulsion against PCo 1,2,3.tsv", SuppTabIndex)))
- SuppTabIndex <- sum(SuppTabIndex, 1)
- ```
- ## Supplementary Table `r SuppTabIndex` - Mediation analysis on slips.over.steps ratio related to Main Figure panel E
- ```{r}
- write_tsv(data_as_long_table_bead_expulsion, file = file.path(params$basic_outdir, params$microbiome_data_type, sprintf("Supplementary Table %i - Mediation analysis on slips.over.steps ratio against PCo 1,2,3.tsv", SuppTabIndex)))
- SuppTabIndex <- sum(SuppTabIndex, 1)
- ```
- # Session Info
- ```{r}
- sessionInfo()
- ```
Main-Analysis-SGB.Rmd, no license · at the source
Overview
- Division of Biology and Biological Engineering, California Institute of Technology, Pasadena, CA USA
- Aligning Science Across Parkinson’s (ASAP) Collaborative Research Network, Chevy Chase, MD USA
- Department of Epidemiology and Biostatistics and Institute for Implementation Science in Population Health, Graduate School of Public Health and Health Policy, City University of New York (CUNY), New York, NY USA
- Department of Cellular, Computational and Integrative Biology (CIBIO), University of Trento, Povo, Trento Italy
- Biodesign Center for Health through Microbiomes, Arizona State University, Tempe, AZ USA
- UCLA-Caltech Medical Scientist Training Program, University of California Los Angeles, Los Angeles, CA USA
- Division of Chemistry and Chemical Engineering, California Institute of Technology, Pasadena, CA USA
- School of Sustainable Engineering and the Built Environment, Arizona State University, Tempe, AZ USA
Abstract
Gut microbiome composition is altered in Parkinson’s disease (PD), the fastest-growing neurological condition, that is characterized by neurodegeneration, motor dysfunction, and is frequently accompanied by gastrointestinal (GI) symptoms. Notably, microbial taxa with anti-inflammatory properties are consistently depleted in PD patients compared to controls. To explore whether specific gut bacteria may be disease-protective, we assembled a microbial consortium of 8 human-associated taxa that are reduced in individuals with PD. Treatment of α-synuclein overexpressing (Thy1-ASO) mice, an animal model of PD, with this consortium improved motor and GI deficits. A single bacterial species from this consortium, Faecalibacterium prausnitzii, was sufficient to correct gut microbiome deviations in Thy1-ASO mice, induce anti-inflammatory immune responses, and promote protective colonic gene expression profiles. Accordingly, oral treatment with F. prausnitzii robustly ameliorated motor and GI deficits and reduced α-synuclein aggregates in the brain. These findings support the emerging hypothesis of functional contributions by the microbiome to PD outcomes, and embolden the development of potential probiotic therapies to treat motor and non-motor symptoms.
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 9 matches between paragraphs and lines of code.
pmartinezarbizu/pairwiseAdonis
cb190f7668a0c82c0b0853927db239e7b9ec3e83, 2 June 2023Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
4 files
- pairwiseAdonis/
R/ , R, 129 linespairwise.adonis.R - pairwiseAdonis/
R/ , R, 137 linespairwise.adonis2.R - LICENSE, License, 674 lines
- README.md, Text, 122 lines
Zenodo 17137678
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
Zenodo 17128213
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
4 files
- 01-data-preparation.Rmd, R, 209 lines
- Main-Analysis-Pathways.R
md , R, 261 lines - Main-Analysis-SGB.Rmd, R, 961 lines, 3 matches
- README.md, Text, 111 lines
Zenodo 17981510
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
4 files
- notebook/
R_scripts/ , R, 69 linesquick_enrich.R - notebook/
bulk-rnaseq-analysis.qmd , Quarto, 1,080 lines - notebook/
shell_scripts/ , Shell, 166 linesfastq_processing.sh - README.md, Text, 34 lines
anamois/amoiseyenko2025
521ea8c08870f321f01eca853104c64930cbe4b4, 14 February 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
6 files
- notebooks/
Bencom_motor_GI_analysis , Jupyter, 477 lines.ipynb - notebooks/
Bencom_motor_pooling_MLE , Jupyter, 1,086 lines_analysis.ipynb - notebooks/
Fp_motor_GI_analysis.ipy , Jupyter, 479 linesnb - notebooks/
Fp_motor_pooling_MLE_ana , Jupyter, 2,166 lines, 1 matchlysis.ipynb - LICENSE, License, 21 lines
- README.md, Text, 34 lines
jboktor/fprausnitzii-treatment-rnaseq
66d3461a83022c15e6dc032bad5b8148ba0d2cf3, 18 December 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
4 files
- notebook/
R_scripts/ , R, 69 lines, 1 matchquick_enrich.R - notebook/
bulk-rnaseq-analysis.qmd , Quarto, 1,080 lines, 3 matches - notebook/
shell_scripts/ , Shell, 166 lines, 1 matchfastq_processing.sh - README.md, Text, 34 lines
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:
- 6 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 15 scripts, each with its path and the digest of its content;
- 9 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- zenodo:16929959, at Zenodo; found in “Data availability”
Data availability
The data, code, protocols, and key lab materials used and generated in this study are listed in the Key Resource Table (Supplementary Table 2, also available at 10.5281/
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, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 15 authors, 3 keywords, 6 funders, 144 references, 21 RRIDs.
Cite
This paper
Moiseyenko, A., Antonello, G., Schonhoff, A. M., Boktor, J. C., Long, K., Dirks, B., Oguienko, A. D., Winnett, A. V., Simpson, P., Daeizadeh, D., Ismagilov, R. F., Krajmalnik-Brown, R., Segata, N., Waldron, L. D., & Mazmanian, S. K. (2026). Faecalibacterium prausnitzii, depleted in the Parkinson's disease microbiome, improves motor deficits in α-synuclein overexpressing mice. NPJ Parkinson's disease, 12(1), 94. https://
BibTeX
@article{moiseyenko2026f
author = {Moiseyenko, Anastasiya and Antonello, Giacomo and Schonhoff, Aubrey M and Boktor, Joseph C and Long, Kaelyn and Dirks, Blake and Oguienko, Anastasiya D and Winnett, Alexander Viloria and Simpson, Patrick and Daeizadeh, Dorsa and Ismagilov, Rustem F and Krajmalnik-Brown, Rosa and Segata, Nicola and Waldron, Levi D and Mazmanian, Sarkis K},
title = {{Faecalibacterium prausnitzii, depleted in the Parkinson's disease microbiome, improves motor deficits in α-synuclein overexpressing mice}},
journal = {NPJ Parkinson's disease},
year = {2026},
month = mar,
volume = {12},
number = {1},
pages = {94},
publisher = {Nature Publishing Group},
issn = {2373-8057},
doi = {10.1038/
url = {https://
pmid = {41786774},
pmcid = {PMC13077053}
}
RIS
TY - JOUR
AU - Moiseyenko, Anastasiya
AU - Antonello, Giacomo
AU - Schonhoff, Aubrey M
AU - Boktor, Joseph C
AU - Long, Kaelyn
AU - Dirks, Blake
AU - Oguienko, Anastasiya D
AU - Winnett, Alexander Viloria
AU - Simpson, Patrick
AU - Daeizadeh, Dorsa
AU - Ismagilov, Rustem F
AU - Krajmalnik-Brown, Rosa
AU - Segata, Nicola
AU - Waldron, Levi D
AU - Mazmanian, Sarkis K
TI - Faecalibacterium prausnitzii, depleted in the Parkinson's disease microbiome, improves motor deficits in α-synuclein overexpressing mice
T2 - NPJ Parkinson's disease
J2 - NPJ Parkinsons Dis
PY - 2026
DA - 2026/
VL - 12
IS - 1
SP - 94
SN - 2373-8057
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Faecalibacterium prausnitzii, depleted in the Parkinson's disease microbiome, improves motor deficits in α-synuclein overexpressing mice",
"container-title": "NPJ Parkinson's disease",
"author": [
{
"family": "Moiseyenko",
"given": "Anastasiya"
},
{
"family": "Antonello",
"given": "Giacomo"
},
{
"family": "Schonhoff",
"given": "Aubrey M"
},
{
"family": "Boktor",
"given": "Joseph C"
},
{
"family": "Long",
"given": "Kaelyn"
},
{
"family": "Dirks",
"given": "Blake"
},
{
"family": "Oguienko",
"given": "Anastasiya D"
},
{
"family": "Winnett",
"given": "Alexander Viloria"
},
{
"family": "Simpson",
"given": "Patrick"
},
{
"family": "Daeizadeh",
"given": "Dorsa"
},
{
"family": "Ismagilov",
"given": "Rustem F"
},
{
"family": "Krajmalnik-Brown",
"given": "Rosa"
},
{
"family": "Segata",
"given": "Nicola"
},
{
"family": "Waldron",
"given": "Levi D"
},
{
"family": "Mazmanian",
"given": "Sarkis K"
}
],
"container-title-short":
"volume": "12",
"issue": "1",
"page": "94",
"DOI": "10.1038/
"PMID": "41786774",
"PMCID": "PMC13077053",
"ISSN": "2373-8057",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
5
]
]
}
}
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.1093/bioinformatics/btag592 [code]
- Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.Journal: Bioinformatics (Oxford, England)In common: FastQC, Subread (featureCounts), STAR, 12 other tools, 4 references
- [2] doi:10.21203/rs.3.rs-9927928/v1 [code]
- Genome-wide and allele-resolved maps of the radial architecture of the mouse genomeJournal: Research Square (preprint)In common: FastQC, Subread (featureCounts), STAR, 11 other tools, mouse, 3 references
- [3] doi:10.1126/sciadv.aed2952 [code]
- Activation of transposable elements is linked to a region- and cell type-specific interferon response in Parkinson's disease.Journal: Science advancesIn common: Subread (featureCounts), STAR, SAMtools, 10 other tools, Parkinson's, cellular / molecular, 3 references
- [4] doi:10.1038/s41586-026-10512-9 [code]
- Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.Journal: NatureIn common: Subread (featureCounts), STAR, SAMtools, 9 other tools, mouse, cellular / molecular, 3 references
- [5] doi:10.1038/s41386-026-02406-1 [code]
- Functional genomic profiling of schizophrenia-associated
genes reveals key microglial regulators. Journal: Neuropsychopharmacology : official publication of the American College of NeuropsychopharmacologyIn common: FastQC, STAR, SAMtools, 7 other tools, cellular / molecular, 3 references - [6] doi:10.1016/j.celrep.2026.117073 [code]
- Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.Journal: Cell reportsIn common: Subread (featureCounts), SAMtools, broom, 10 other tools, mouse, cellular / molecular, 1 reference
- [7] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: Subread (featureCounts), SAMtools, broom, 10 other tools, mouse, cellular / molecular
- [8] doi:10.7554/elife.107393 [code]
- Chromosome-scale genome assembly of the European common cuttlefish &
lt;i& gt;Sepia officinalis& lt;/ i& gt;. Journal: eLifeIn common: Subread (featureCounts), STAR, SAMtools, 7 other tools, cellular / molecular, 4 references - [9] doi:10.1038/s41467-026-71432-w [code]
- MeCP2 gene dosage-dependent neurodevelopmentally restricted defects arise by aberrant activation of cell fate-determining bivalent genes.Journal: Nature communicationsIn common: FastQC, Subread (featureCounts), STAR, 8 other tools, mouse, cellular / molecular
- [10] doi:10.1038/s41380-026-03578-4 [code]
- Assessing molecular gene by treatment interactions using a population of neural progenitors exposed to valproic acid and lithium.Journal: Molecular psychiatryIn common: FastQC, Subread (featureCounts), STAR, 6 other tools, cellular / molecular, 1 reference
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: 6 repositories of the authors' code, each at its verified commit and with its license, 15 scripts, and 9 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:d5977fa4ac756b02…
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.
