OSCR

Xanthohumol and its non-estrogenic derivatives link to the gut-liver-brain axis to improve cognition in mice with diet-induced obesity.

Code ↔ Paper

9 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 9 matches
  1. [1] § Results › Variation in the mouse gut metagenome resulting from treatment associates with cognitive outcomes and ceramide concentrations in the brain and liver ↔ README.Rmd, lines 1449–1507 · score 0.89 · family transcriptional regulator, copper sensing transcriptional, csoR, tRNA, L_Vis1, L_Hid6
  2. [2] § Results › Supplementation with XN compounds affects the mouse gut metagenome ↔ README.Rmd, lines 944–1009 · score 0.78 · acyl CoA dehydrogenase, enoate reductase, indolepyruvate, sulfotransferase, random forest model, mouse metagenomes
  3. [3] § Materials and methods › Statistical approach ↔ README.Rmd, lines 1174–1247 · score 0.77 · Arrows indicate vectors, dbRDA, treatment interaction term, greatest change, Bray Curtis, KO composition
  4. [4] § Materials and methods › Statistical approach ↔ Helper_scripts/random_forest_and_importance_functions.R, lines 60–175 · score 0.72 · random forest models, RMSE, ROC, caret, splitrule, tuning
  5. [5] § Materials and methods › Statistical approach ↔ README.Rmd, lines 887–930 · score 0.69 · predicting mouse diet, Kruskal Wallis, Bonferroni corrected, important KOs, random forest models, Abundance
  6. [6] § Materials and methods › Shotgun metagenome data pre-processing ↔ README.Rmd, lines 536–563 · score 0.68 · Kyoto Encyclopedia, shotgun metagenomic, reference sequences, Genomes, database, gut microbiome
  7. [7] § Results › Variation in the mouse gut metagenome resulting from treatment associates with cognitive outcomes and ceramide concentrations in the brain and liver ↔ README.Rmd, lines 1626–1733 · score 0.66 · ceramide concentrations, Arrows indicate, dbRDA, treatment interaction term, Bray Curtis, Percent variance
  8. [8] § Results › Supplementation with XN compounds affects the mouse gut metagenome ↔ maybe_useful_old_code.R, lines 81–122 · score 0.55 · enoate reductase, acyl, indolepyruvate, sulfotransferase, dehydrogenase, tryptophan
  9. [9] § Materials and methods › Statistical approach ↔ README.Rmd, lines 565–678 · score 0.54 · PCoA, dbRDA, Bray Curtis, capscale, beta, treatment

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

R Markdown · 1,929 lines · 64 KB · no license · 7 matches

  1. ---
  2. title: "Linking metagenome composition and behavioral responses"
  3. author: "Keaton Stagaman"
  4. date: "2020-05-01"
  5. output: github_document
  6. editor_options:
  7. chunk_output_type: console
  8. chunk_output_type: console
  9. ---
  10. ```{r setup, include=FALSE}
  11. # if (!grepl("xanthahumol", getwd()) & !grepl("Users", getwd())) {
  12. # setwd("Rstudio_scratch/xanthahumol")
  13. # }
  14. saveDir <- "Saved_objects"
  15. inDir <- "Input"
  16. plotDir <- "Plots"
  17. maxCores <- 120
  18. checkDirs <- lapply(c(saveDir, inDir, plotDir), function(dir) {
  19. if (!dir.exists(dir)) {
  20. dir.create(dir)
  21. }
  22. })
  23. knitr::opts_chunk$set(
  24. echo = FALSE,
  25. message = FALSE,
  26. warning = FALSE,
  27. dpi = 150,
  28. cache = FALSE
  29. )
  30. source("packages_sources.R")
  31. source("Helper_scripts/map_kos.R")
  32. source("Helper_scripts/random_forest_and_importance_functions.R")
  33. theme_set(theme_cowplot())
  34. my_theme <- theme_update(
  35. legend.position = "top",
  36. legend.box = "vertical",
  37. legend.box.just = "left",
  38. legend.title = element_text(size = 10),
  39. legend.text = element_text(size = 9),
  40. strip.text = element_text(size = 10),
  41. plot.caption = element_text(hjust = 0, size = 10),
  42. axis.text = element_text(size = 8)
  43. )
  44. nCores <- ifelse(!str_detect(getwd(), "/Users"), maxCores, 3)
  45. img.dpi <- 150
  46. img.ht <- 8
  47. img.wd <- 8
  48. assign.redo(
  49. c(
  50. "make.igc.phyloseq",
  51. "make.kos.phyloseq",
  52. "kraken.analyses",
  53. "microbiome.prep",
  54. "diet.ords.data",
  55. "diet.random.forest",
  56. "diet.by.covars",
  57. "diet.by.ceramide",
  58. "covar.random.forest",
  59. "ceramide.random.forest"
  60. ),
  61. state = FALSE
  62. )
  63. set.redo.true(c("ceramide.random.forest"))
  64. annotation.sets <- c("KOs", "IGCs") %>% set_names(., .)
  65. sample.df <- read.csv(
  66. file.path(inDir, "SpatialLearning_metadata.csv"),
  67. header = T,
  68. row.names = 1
  69. )
  70. sample.df <- sample.df[complete.cases(sample.df), ]
  71. sample.df$Diet <- factor(
  72. sample.df$Diet,
  73. levels = c("Control", "XN", "DXN", "TXN")
  74. )
  75. sample.dt <- as.data.table(sample.df, keep.rownames = "Sample") %>% setkeyv("Sample")
  76. spat.learn.vars <- names(sample.df)[-1]
  77. igc.phyloseq.file <- file.path(saveDir, "phyloseq_with_igc_contig_counts.rds")
  78. ps.igc <- redo.if("make.igc.phyloseq", igc.phyloseq.file, {
  79. igc.contig.mat0 <- read.table(
  80. file.path(inDir, "XN_count_table.txt"),
  81. header = T,
  82. sep = "\t",
  83. row.names = 1
  84. ) %>% as.matrix()
  85. gene.lens0 <- igc.contig.mat0[, 1]
  86. igc.contig.mat1 <- igc.contig.mat0[, -1]
  87. row.sums <- rowSums(igc.contig.mat1)
  88. col.sums <- colSums(igc.contig.mat1)
  89. keep.rows <- row.sums[row.sums > 0] %>% names()
  90. igc.contig.mat2 <- igc.contig.mat1[keep.rows, ]
  91. gene.lens1 <- gene.lens0[keep.rows]
  92. igc.contig.mat3 <- igc.contig.mat2 / gene.lens1
  93. col.names <- colnames(igc.contig.mat3)
  94. for (name in col.names) {
  95. igc.contig.mat3[, name] <- igc.contig.mat3[, name] / col.sums[name]
  96. }
  97. colnames(igc.contig.mat3) <- gsub("sample_", "s", colnames(igc.contig.mat3))
  98. igc.contig.mat4 <- t(igc.contig.mat3)
  99. igc.contig.mat <- igc.contig.mat4[row.names(sample.df), ]
  100. phyloseq(
  101. sample_data(sample.df),
  102. otu_table(igc.contig.mat, taxa_are_rows = FALSE)
  103. )
  104. })
  105. kos.phyloseq.file <- file.path(
  106. saveDir,
  107. "phyloseq_with_ko-collapsed_contig_counts.rds"
  108. )
  109. ps.kos <- redo.if("make.kos.phyloseq", kos.phyloseq.file, {
  110. igc.mat0 <- otu.matrix(ps.igc)
  111. map.tbl0 <- read.table(
  112. file.path(inDir, "XN_gene_to_ko_mapping.tsv"),
  113. header = F,
  114. sep = "\t"
  115. ) %>% as.data.table()
  116. names(map.tbl0) <- c("Contig", "GeneID", "KO", "Length")
  117. map.tbl1 <- map.tbl0[KO != ""]
  118. multi.kos <- str_subset(map.tbl1$KO, ",")
  119. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  120. registerDoParallel(cl, nCores)
  121. new.rows.dt <- foreach(
  122. multi.ko = multi.kos,
  123. .final = rbindlist,
  124. .verbose = TRUE
  125. ) %dopar% {
  126. kos <- str_split(multi.ko, ",")[[1]]
  127. rows <- map.tbl1[KO == multi.ko]
  128. kos.dt <- lapply(kos, function(ko) {
  129. rows$KO <- ko
  130. return(rows)
  131. }) %>% rbindlist()
  132. return(kos.dt)
  133. }
  134. stopCluster(cl)
  135. map.tbl2 <- rbind(map.tbl1[!str_detect(KO, ",")], new.rows.dt)
  136. nrow(map.tbl1)
  137. nrow(map.tbl2)
  138. keep.contigs <- unique(map.tbl2$Contig)
  139. keep.contigs <- keep.contigs[keep.contigs %in% colnames(igc.mat0)]
  140. map.tbl <- map.tbl2[Contig %in% keep.contigs]
  141. igc.mat <- igc.mat0[, keep.contigs]
  142. uniq.kos <- unique(map.tbl$KO)
  143. kos.mat <- NULL
  144. for (ko in uniq.kos) {
  145. cat(ko, sep = "\n")
  146. ko.contigs <- map.tbl[KO == ko]$Contig
  147. ko.igcs <- igc.mat[, ko.contigs, drop = F]
  148. ko.col <- rowSums(ko.igcs, na.rm = TRUE)
  149. kos.mat <- cbind(kos.mat, ko.col)
  150. colnames(kos.mat)[ncol(kos.mat)] <- ko
  151. }
  152. phyloseq(
  153. sample_data(sample.df),
  154. otu_table(kos.mat, taxa_are_rows = FALSE)
  155. )
  156. })
  157. ps.list <- list(
  158. IGCs = ps.igc,
  159. KOs = ps.kos
  160. )
  161. map.tbl <- map.kos(ps.list$KOs)
  162. names(map.tbl) <- c("Feature", "Name", "Mod", "Mod.name")
  163. setkey(map.tbl, Feature)
  164. igc.kos.map <- read.table(
  165. file.path(inDir, "XN_gene_to_ko_mapping.tsv"), header = F, sep = "\t"
  166. ) %>% as.data.table()
  167. names(igc.kos.map) <- c("IGC", "GeneID", "KO", "Length")
  168. setkey(igc.kos.map, IGC)
  169. igc.eggnog.map0 <- readRDS(
  170. file.path(inDir, "EggNOG_xanthohumol_annotations.rds")
  171. ) %>% as.data.table()
  172. keep.cols <- c("query_name", "Preferred_name")
  173. igc.eggnog.map <- igc.eggnog.map0[, ..keep.cols]
  174. names(igc.eggnog.map)[1] <- "IGC"
  175. setkey(igc.eggnog.map, IGC)
  176. igc.kraken.map0 <- read.table(
  177. file.path(inDir, "kraken2_all_counts.txt"),
  178. sep = "\t",
  179. header = T,
  180. row.names = 1
  181. ) %>% as.matrix()
  182. taxa.lvl.mat <- igc.kraken.map0[
  183. str_detect(rownames(igc.kraken.map0), "s__") &
  184. !str_detect(rownames(igc.kraken.map0), "Eukaryota|Viruses"),
  185. ] %>% t()
  186. taxa.lvl.labs <- colnames(taxa.lvl.mat)
  187. # taxa.lvl.labs[3720]
  188. taxa.lvl.dt <- data.table(
  189. Level = c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species"),
  190. ID = c("d__", "p__", "c__", "o__", "f__", "g__", "s__")
  191. )
  192. # lab <- "d__Bacteria|p__Cyanobacteria|o__Synechococcales|f__Synechococcaceae|g__Synechococcus|s__Synechococcus_sp__Minos11"
  193. kraken.id.tbl <- NULL
  194. for(lab in taxa.lvl.labs) {
  195. # cat(which(taxa.lvl.labs == lab), sep = "\n")
  196. # lab <- gsub(" |\\.|\\-|\\(|\\)", "_", lab)
  197. if (str_count(lab, "\\|") < nrow(taxa.lvl.dt) - 1) {
  198. previous.lvl <- "d__Unknown"
  199. good.lab.vec <- NULL
  200. for (ptrn in taxa.lvl.dt$ID) {
  201. lvl.assign <- str_extract(lab, paste0(ptrn, "\\w+"))
  202. if (is.na(lvl.assign)) {
  203. lvl.assign <- paste0(
  204. ptrn,
  205. str_remove(previous.lvl, "^\\w__"), "_",
  206. taxa.lvl.dt[ID == ptrn]$Level
  207. )
  208. }
  209. good.lab.vec <- c(good.lab.vec, lvl.assign)
  210. previous.lvl <- lvl.assign
  211. }
  212. good.lab <- paste(good.lab.vec, collapse = "|")
  213. } else {
  214. good.lab <- lab
  215. }
  216. # cat(good.lab, sep = "\n")
  217. lab.vec <- strsplit(good.lab, "\\|")[[1]] %>%
  218. str_remove(pattern = "^\\w__")
  219. lab.row <- matrix(
  220. lab.vec, nrow = 1,
  221. dimnames = list(good.lab, taxa.lvl.dt$Level)
  222. ) %>%
  223. as.data.frame()
  224. kraken.id.tbl <- rbind(kraken.id.tbl, lab.row)
  225. }
  226. # colnames(taxa.lvl.mat) <- row.names(kraken.id.tbl)
  227. ps.kraken <- phyloseq(
  228. sample_data(sample.df),
  229. otu_table(taxa.lvl.mat, taxa_are_rows = FALSE),
  230. tax_table(as.matrix(kraken.id.tbl))
  231. )
  232. ba.lipid.data <- read.csv(
  233. file.path(inDir, "reformatted_bileAcids_and_lipids_data.csv")
  234. ) %>%
  235. as.data.table() %>%
  236. setkeyv("Sample")
  237. ba.lipid.leg <- read.csv(
  238. file.path(inDir, "bileAcids_and_lipids_legend.csv")
  239. ) %>%
  240. as.data.table() %>%
  241. setkeyv("varID")
  242. ceramide.leg <- ba.lipid.leg[str_detect(Label, "ceramide")]
  243. ceramide.dt <- ba.lipid.data[, c("Sample", ceramide.leg$varID), with = F] %>%
  244. merge(sample.dt, by = "Sample") %>%
  245. setkeyv("Sample")
  246. taxa.mat <- otu.matrix(ps.kraken)
  247. kos.mat <- otu.matrix(ps.kos)
  248. smpl.df <- sample.data.frame(ps.kos)
  249. ceramide.df <- as.data.frame(ceramide.dt) %>%
  250. set_rownames(ceramide.dt$Sample)
  251. ceramide.df$Sample <- NULL
  252. ceramide.legend.df <- as.data.frame(ceramide.leg) %>%
  253. set_rownames(ceramide.leg$varID)
  254. ceramide.legend.df$varID <- NULL
  255. ceramide.ids <- str_subset(names(ceramide.df), "var")
  256. ps.cer.list <- lapply(annotation.sets, function(set) {
  257. new.ps <- ps.list[[set]]
  258. sample_data(new.ps) <- ceramide.df
  259. return(new.ps)
  260. })
  261. list.redos()
  262. ```
  263. ```{r ad-hoc-functions, include=FALSE}
  264. prev.table <- function(tbl, nrow = 6, ncol = 6) {
  265. ncol <- ifelse(ncol > ncol(tbl), ncol(tbl), ncol)
  266. print(tbl[1:nrow, 1:ncol])
  267. }
  268. par.dbrdas <- function(
  269. dist.mats,
  270. dbrda.frm,
  271. sample.data,
  272. nCores,
  273. verbose = TRUE
  274. ) {
  275. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  276. registerDoParallel(cl, nCores)
  277. dbrda.list <- foreach(
  278. n = names(dist.mats),
  279. .final = function(x) setNames(x, names(dist.mats)),
  280. .verbose = verbose
  281. ) %dopar% {
  282. dist <- dist.mats[[n]]
  283. dbrda.obj <- capscale(as.formula(dbrda.frm), data = sample.data)
  284. return(dbrda.obj)
  285. }
  286. stopCluster(cl)
  287. return(dbrda.list)
  288. }
  289. ordi.log <- file.path(saveDir, "ordistep.log")
  290. if (!file.exists(ordi.log)) {
  291. file.create(ordi.log)
  292. }
  293. par.ordistep <- function(
  294. full.dbrdas,
  295. selectDirection,
  296. nCores,
  297. seed = 42,
  298. verbose = TRUE
  299. ) {
  300. cl <- makeCluster(nCores, type = "FORK")
  301. registerDoParallel(cl, nCores)
  302. dbrda.select.list <- foreach(
  303. n = names(full.dbrdas),
  304. .final = function(x) setNames(x, names(full.dbrdas)),
  305. .verbose = verbose
  306. ) %dopar% {
  307. possibleDirections <- c("both", "forward", "reverse")
  308. dbrda0 <- full.dbrdas[[n]]
  309. set.seed(seed)
  310. dbrda.select <- try(
  311. ordistep(dbrda0, direction = selectDirection),
  312. silent = T
  313. )
  314. if ("try-error" %in% class(dbrda.select)) {
  315. cat(
  316. paste0(
  317. "# ", Sys.time(), "\n",
  318. "\tOrdistep on full model for ", n, " distance with `direction = ",
  319. selectDirection, "` failed."
  320. ),
  321. file = ordi.log,
  322. sep = "\n",
  323. append = TRUE
  324. )
  325. for (
  326. newDirection in possibleDirections[possibleDirections != selectDirection]
  327. ) {
  328. cat(
  329. paste0("\tTrying `direction = ", newDirection, "`..."),
  330. file = ordi.log,
  331. sep = " ",
  332. append = TRUE
  333. )
  334. set.seed(seed)
  335. dbrda.select <- try(
  336. ordistep(dbrda0, direction = newDirection),
  337. silent = T
  338. )
  339. if ("try-error" %in% class(dbrda.select)) {
  340. cat(paste0("Failed."), file = ordi.log, sep = "\n", append = TRUE)
  341. } else {
  342. cat(paste0("Success"), file = ordi.log, sep = "\n", append = TRUE)
  343. return(dbrda.select)
  344. }
  345. }
  346. } else {
  347. return(dbrda.select)
  348. }
  349. }
  350. stopCluster(cl)
  351. return(dbrda.select.list)
  352. }
  353. par.anova.rda <- function(
  354. dbrdas,
  355. by.what = c("term", "margin", "axis"),
  356. perm.model = c("reduced", "direct", "full"),
  357. nCores,
  358. seed = 42,
  359. verbose = TRUE
  360. ) {
  361. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  362. registerDoParallel(cl, nCores)
  363. dbrda.anova.list <- foreach(
  364. n = names(dbrdas),
  365. .final = function(x) setNames(x, names(dbrdas)),
  366. .verbose = verbose
  367. ) %dopar% {
  368. dbrda.obj <- dbrdas[[n]]
  369. set.seed(seed)
  370. permanova <- anova(dbrda.obj, by = by.what, model = perm.model)
  371. return(permanova)
  372. }
  373. stopCluster(cl)
  374. return(dbrda.anova.list)
  375. }
  376. print.list <- function(l) {
  377. to.print <- lapply(names(l), function(n) {
  378. i <- l[[n]]
  379. cat(paste("###", n, "###"), sep = "\n")
  380. print(i)
  381. cat("############\n", sep = "\n")
  382. })
  383. }
  384. obj.size <- function(x) {
  385. paste("Object size:", format(object.size(x), units = "auto"))
  386. }
  387. f.size <- function(x) {
  388. paste("File size:", round(file.size(x) / 1024^2, 1), "Mb")
  389. }
  390. ```
  391. ```{r covar-model-plot-functions, include=FALSE}
  392. plot.linear.interactions <- function(
  393. covar,
  394. covar.dt,
  395. ref.dt,
  396. sig.features.dt,
  397. physeq,
  398. feature.type
  399. ) {
  400. sig.feats <- sig.features.dt[Covar == covar]$Feature
  401. sig.feat.dt <- otu.matrix(physeq)[, sig.feats, drop = F] %>%
  402. as.data.table(keep.rownames = "Sample") %>%
  403. setkeyv("Sample")
  404. smpl.dt.cols <- c("Sample", "Diet", covar)
  405. smpl.dt <- covar.dt[, ..smpl.dt.cols] %>% setkeyv("Sample")
  406. if (covar == "P_Cross") {
  407. smpl.dt[[covar]] <- as.numeric(smpl.dt[[covar]])
  408. }
  409. plot.dt <- smpl.dt[sig.feat.dt] %>%
  410. melt(
  411. id.vars = smpl.dt.cols,
  412. variable.name = feature.type,
  413. value.name = "Abund"
  414. )
  415. if (feature.type == "IGC") {
  416. new.igcs <- sig.features.dt[
  417. , Label := paste0(Feature, " (", Name, ")")
  418. ][, .(Feature, Label)] %>%
  419. unique() %>%
  420. setkeyv("Feature")
  421. plot.dt[, IGC := new.igcs[as.character(plot.dt$IGC)]$Label]
  422. }
  423. if (str_detect(covar, "var[0-9][0-9][0-9]")) {
  424. title.text <- paste(
  425. str_extract(ceramide.legend.df[covar, "Category"], "brain|liver"),
  426. ceramide.legend.df[covar, "Label"],
  427. "scores by",
  428. feature.type,
  429. "abundances"
  430. )
  431. } else {
  432. title.text <- paste(covar, "scores by", feature.type, "abundances")
  433. }
  434. p <- ggplot(plot.dt, aes_string(x = "Abund", y = covar, color = "Diet")) +
  435. geom_point() +
  436. stat_smooth(method = "lm", formula = y ~ x, se = F, size = 0.5) +
  437. facet_wrap(facets = feature.type, scale = "free") +
  438. scale_color_brewer(palette = "Dark2") +
  439. labs(
  440. x = paste(feature.type, "normalized abundance"),
  441. y = paste(
  442. ifelse(ref.dt[covar]$Transformed, "Transformed", ""), covar, "score"
  443. ),
  444. title = title.text
  445. )
  446. return(p)
  447. }
  448. plot.logistic.interactions <- function(
  449. covar,
  450. covar.dt,
  451. sig.features.dt,
  452. physeq,
  453. feature.type
  454. ) {
  455. sig.feats <- sig.features.dt[Covar == covar]$Feature
  456. sig.feat.dt <- otu.matrix(physeq)[, sig.feats, drop = F] %>%
  457. as.data.table(keep.rownames = "Sample") %>%
  458. setkeyv("Sample")
  459. smpl.dt.cols <- c("Sample", "Diet", covar)
  460. smpl.dt <- covar.dt[, ..smpl.dt.cols] %>% setkeyv("Sample")
  461. plot.dt0 <- smpl.dt[sig.feat.dt]
  462. plot.dt <- melt(
  463. plot.dt0,
  464. id.vars = smpl.dt.cols,
  465. variable.name = feature.type,
  466. value.name = "Abund"
  467. )
  468. plot.dt[, (covar) := ifelse(plot.dt[[covar]] == "Low", 0, 1)]
  469. if (feature.type == "IGC") {
  470. new.igcs <- sig.features.dt[
  471. , Label := paste0(Feature, " (", Name, ")")
  472. ][, .(Feature, Label)] %>%
  473. unique() %>%
  474. setkeyv("Feature")
  475. plot.dt[, IGC := new.igcs[as.character(plot.dt$IGC)]$Label]
  476. }
  477. if (str_detect(covar, "var[0-9][0-9][0-9]")) {
  478. title.text <- paste(
  479. str_extract(ceramide.legend.df[covar, "Category"], "brain|liver"),
  480. ceramide.legend.df[covar, "Label"],
  481. "scores by",
  482. feature.type,
  483. "abundances"
  484. )
  485. } else {
  486. title.text <- paste(covar, "scores by", feature.type, "abundances")
  487. }
  488. p <- ggplot(plot.dt, aes_string(x = "Abund", y = covar, color = "Diet")) +
  489. geom_point() +
  490. stat_smooth(
  491. method = "glm",
  492. method.args = list(family = "binomial"),
  493. formula = y ~ x,
  494. se = F,
  495. size = 0.5
  496. ) +
  497. facet_wrap(facets = feature.type, scale = "free") +
  498. scale_color_brewer(palette = "Dark2") +
  499. scale_y_continuous(breaks = c(0, 1), labels = c("Low", "High")) +
  500. labs(
  501. x = paste(feature.type, "normalized abundance"),
  502. y = paste(covar, "categorization"),
  503. title = title.text
  504. )
  505. return(p)
  506. }
  507. ```
  508. ## Background
  509. Xanthohumol (XN), a flavonoid produced by hops, has been shown to mitigate the effects of metabolic syndrome due to high-fat diets (HFD) in various animal models. However, XN can spontaneously form a stable isomer, isoxanthohumol (IX). Both animals and gut microbiome constituents produce enzymes that can transform IX into 8-prenylnaringenin (8-PN), the most potent phytoestrogen known to date. Alternatives to XN, i.e., hydrogenated derivatives of XN: α,β-dihydro-XN (DXN) and tetrahydro-XN (TXN), show negligible affinity for estrogen receptors, and cannot be metabolically converted into 8-PN. These compounds have been shown to have similar effects on metabolic syndrome, in including improving spatial learning outcomes in mice. Here, we endeavor to determine how XN, DXN, and TXN influence the functional potential (metagenome) of mice being fed high-fat diets, and whether these such effects associate with specific spatial learning outcomes. We assigned shotgun metagenomic sequences using two methods: the first was to align them to reference sequences (KOs) in the Kyoto Encyclopedia of Gene and Genomes (KEGG) database; the second was to align the sequences to a integrated gene catalog (IGC) of the mouse metagenomes. The following analyses utilize both of these data sets.
  510. ## Effects of Diet alone
  511. ### Differences in overall composition (beta-diversity)
  512. ```{r distance-matrices}
  513. dist.lists <- lapply(annotation.sets, function(set) {
  514. dist.rds <- file.path(
  515. saveDir, paste("list", set, "distance_matrices.rds", sep = "_")
  516. )
  517. redo.if("microbiome.prep", save.file = dist.rds, {
  518. gen.dist.matrices(
  519. ps = ps.list[[set]],
  520. methods = c("Bray-Curtis", "Canberra", "Sørensen"),
  521. cores = nCores,
  522. verbose = T
  523. ) %>%
  524. lapply(., function(x) {
  525. attributes(x)$call <- NULL
  526. return(x)
  527. })
  528. }) %>% return()
  529. })
  530. ```
  531. ```{r diet-ordinations}
  532. gen.pcoa.labs <- function(axes, ord) {
  533. sapply(axes, function(axis) {
  534. paste0(
  535. "PCoA.", axis, " (",
  536. round(ord$values$Relative_eig[axis] * 100, 1),
  537. "%)"
  538. )
  539. }) %>% return()
  540. }
  541. ord.methods <- c("PCoA", "dbRDA")
  542. betas <- "Bray-Curtis"
  543. plot.env <- new.env()
  544. plot.env$axis.labs <- NULL
  545. diet.ords.data.file <- file.path(saveDir, "diet_ordinations_data_dt.rds")
  546. diet.ords.data <- redo.if("diet.ords.data", diet.ords.data.file, {
  547. ords.data <- lapply(ord.methods, function(ord.method) {
  548. lapply(betas, function(beta) {
  549. lapply(annotation.sets, function(set) {
  550. dist.mat <- dist.lists[[set]][[beta]]
  551. physeq <- ps.list[[set]]
  552. if (ord.method == "PCoA") {
  553. ord <- ordinate(physeq, method = "PCoA", distance = dist.mat)
  554. ord.data <- plot_ordination(physeq, ord, justDF = T) %>%
  555. as.data.table(keep.rownames = "Sample")
  556. plot.env$axis.labs <- rbind(
  557. plot.env$axis.labs,
  558. data.table(
  559. Method = ord.method,
  560. Beta = beta,
  561. Annotation.set = set,
  562. Label = gen.pcoa.labs(1:2, ord = ord),
  563. Axis.1 = c(max(ord.data$Axis.1), min(ord.data$Axis.1)) * 1.8,
  564. Axis.2 = c(min(ord.data$Axis.2), max(ord.data$Axis.2)) * 1.8,
  565. Angle = c(0, 90)
  566. )
  567. )
  568. } else {
  569. ord <- capscale(dist.mat ~ Diet, data = sample.data.frame(physeq))
  570. ord.data.list <- get.biplot.data(ord = ord, ps = physeq) %>%
  571. suppressWarnings()
  572. ord.data <- ord.data.list$sample.coords
  573. names(ord.data)[which(str_detect(names(ord.data), "CAP"))] <- c(
  574. "Axis.1",
  575. "Axis.2"
  576. )
  577. plot.env$axis.labs <- rbind(
  578. plot.env$axis.labs,
  579. data.table(
  580. Method = ord.method,
  581. Beta = beta,
  582. Annotation.set = set,
  583. Label = ord.data.list$axes.labs,
  584. Axis.1 = c(max(ord.data$Axis.1), min(ord.data$Axis.1)) * 1.8,
  585. Axis.2 = c(min(ord.data$Axis.2), max(ord.data$Axis.2)) * 1.8,
  586. Angle = c(0, 90)
  587. )
  588. )
  589. }
  590. ord.data[
  591. , `:=`(
  592. Method = ord.method,
  593. Beta = beta,
  594. Annotation.set = set
  595. )
  596. ]
  597. return(ord.data)
  598. }) %>% rbindlist()
  599. }) %>% rbindlist()
  600. }) %>% rbindlist()
  601. saveRDS(
  602. plot.env$axis.labs,
  603. file.path(saveDir, "diet_ordinations_labels_dt.rds")
  604. )
  605. ords.data
  606. })
  607. if (is.null(plot.env$axis.labs)) {
  608. plot.env$axis.labs <- readRDS(
  609. file.path(saveDir, "diet_ordinations_labels_dt.rds")
  610. )
  611. }
  612. caption <- paste(
  613. "Bray-Curtis ordination for both KO and IGC annotations of mouse metagenome samples by diet treatment. Points represent individual samples, ellipses represent the 95% C.I. around the diet treatment centroid. Percent variance of distances explained is shown in the axis labels"
  614. )
  615. {
  616. ggplot(
  617. diet.ords.data,
  618. aes(x = Axis.1, y = Axis.2, color = Diet)
  619. ) +
  620. geom_point(alpha = 0.6, size = 2) +
  621. stat_ellipse() +
  622. scale_color_brewer(palette = "Dark2") +
  623. geom_text(
  624. data = plot.env$axis.labs,
  625. aes(
  626. label = Label,
  627. angle = Angle
  628. ),
  629. hjust = 1,
  630. color = "grey40"
  631. ) +
  632. facet_wrap(~ Method + Annotation.set, scales = "free") +
  633. gg_figure_caption(caption = caption)
  634. } %>%
  635. ggsave(
  636. filename = file.path(plotDir, "diet_ordinations.png"),
  637. dpi = img.dpi,
  638. width = img.wd,
  639. height = img.ht
  640. )
  641. ```
  642. ```{r diet-permanovas, include=FALSE}
  643. cap <- "PERMANOVA results for Bray-Curtis distances by diet treatment for both KO and IGC annotations of mouse metagenomes."
  644. diet.aovs.data.file <- file.path(saveDir, "diet_permanovas_data_dt.rds")
  645. diet.aovs.data <- redo.if("diet.ords.data", diet.aovs.data.file, {
  646. lapply(betas, function(beta) {
  647. lapply(annotation.sets, function(set) {
  648. dist.mat <- dist.lists[[set]][[beta]]
  649. aov.data <- sample.data.frame(ps.list[[set]])
  650. aov <- adonis2(dist.mat ~ Diet, data = aov.data) %>%
  651. tidy() %>%
  652. suppressWarnings() %>%
  653. as.data.table()
  654. aov[
  655. , `:=`(
  656. Beta = beta,
  657. Annotations = set
  658. )
  659. ]
  660. setcolorder(aov, c(7:8, 1:6))
  661. }) %>% rbindlist()
  662. }) %>% rbindlist()
  663. }) %>% flextable() %>%
  664. theme_box() %>%
  665. set_caption(table.caption(cap)) %>%
  666. merge_v(j = 1:2) %>%
  667. align(j = 1:2, align = "center") %>%
  668. align(j = 3, align = "right") %>%
  669. colformat_double(j = 5:7, digits = 2) %>%
  670. colformat_double(j = 8, digits = 3) %>%
  671. autofit() %>%
  672. save_as_image(path = file.path(plotDir, "diet_permanova_results.png"))
  673. ```
  674. ![](Plots/diet_ordinations.png)
  675. ![](Plots/diet_permanova_results.png)
  676. The presence of XN or its derivatives affects the composition of the potential functional capacity of the gut microbiome in mice (Figure 1 & Table 1). The distinctions appear to be clearer when using the IGC data set, rather than the KO set. In either case, however, XN treatment appears to result in metagenomic composition more similar to the controls than DXN or TXN treatments do. It *appears* that the control (HFD) metagenomes have much less beta-dispersion (average distance from the centroid) than the diet treatments.
  677. ### Taxonomic (Kraken2) composition
  678. ```{r kraken-distance-matrices}
  679. kraken.dist.list.file <- file.path(saveDir, "list_kraken_distance_matrices.rds")
  680. kraken.dist.list <- redo.if("kraken.analyses", kraken.dist.list.file, {
  681. gen.dist.matrices(
  682. ps = ps.kraken,
  683. methods = "taxonomic",
  684. cores = nCores,
  685. verbose = T
  686. ) %>%
  687. lapply(., function(x) {
  688. attributes(x)$call <- NULL
  689. return(x)
  690. })
  691. })
  692. ```
  693. ```{r kraken-pcoa-diet}
  694. plot.env <- new.env()
  695. plot.env$Axis.var <- data.table()
  696. ord.data <- lapply(names(kraken.dist.list), function(beta) {
  697. ord <- ordinate(
  698. physeq = ps.kraken,
  699. method = "PCoA",
  700. distance = kraken.dist.list[[beta]]
  701. )
  702. ord.data <- plot_ordination(ps.kraken, ord, justDF = T) %>%
  703. as.data.table(keep.rownames = "Sample")
  704. ord.data[, Beta := beta]
  705. plot.env$Axis.var <- rbind(
  706. plot.env$Axis.var,
  707. data.table(
  708. Beta = beta,
  709. Var = paste0(round(ord$values$Relative_eig[1:2] * 100, 2), "%"),
  710. Axis.1 = c(max(ord.data$Axis.1), min(ord.data$Axis.1)) * 1.5,
  711. Axis.2 = c(min(ord.data$Axis.2), max(ord.data$Axis.2)) * 1.5,
  712. Angle = c(0, 90)
  713. )
  714. )
  715. return(ord.data)
  716. }) %>% rbindlist()
  717. plot.env$Axis.var[Angle == 90]$Axis.1[1] <-
  718. plot.env$Axis.var[Angle == 90]$Axis.1[1] - 0.7
  719. plot.env$Axis.var[Angle == 90]$Axis.1[2] <-
  720. plot.env$Axis.var[Angle == 90]$Axis.1[2] - 0.3
  721. caption <- paste(
  722. "PCoA ordinations for mouse metagenomic samples. Points represent individual samples, ellipses represent the 95% C.I. around the diet treatment centroid. Both of these are colored by diet treatment. Percent variance in distances explained are presented in gray text near axes."
  723. )
  724. {
  725. ggplot(ord.data, aes(x = Axis.1, y = Axis.2)) +
  726. geom_point(aes(color = Diet), alpha = 0.6, size = 2) +
  727. stat_ellipse(aes(color = Diet)) +
  728. scale_color_brewer(palette = "Dark2") +
  729. geom_text(
  730. data = plot.env$Axis.var,
  731. aes(label = Var, angle = Angle),
  732. hjust = 1,
  733. color = "gray40"
  734. ) +
  735. facet_wrap(~ Beta, scales = "free") +
  736. labs(
  737. title = "Taxonomic (Kraken2)",
  738. x = "PCoA.1",
  739. y = "PCoA.2"
  740. ) +
  741. gg_figure_caption(caption = caption, caption.width = 120)
  742. } %>% ggsave(
  743. filename = file.path("Plots/diet_taxonomic_ordination.png"),
  744. dpi = img.dpi,
  745. width = img.wd * 1.5,
  746. height = img.ht * 0.6
  747. )
  748. ```
  749. ```{r kraken-permanovas, include=FALSE}
  750. cap <- "PERMANOVA results for beta-diversity distances by diet treatment for both taxonomic (Kraken2) annotations of mouse metagenomes."
  751. kraken.aovs.data.file <- file.path(saveDir, "kraken_permanovas_data_dt.rds")
  752. kraken.aovs.data <- redo.if("kraken.analyses", kraken.aovs.data.file, {
  753. lapply(names(kraken.dist.list), function(beta) {
  754. dist.mat <- kraken.dist.list[[beta]]
  755. aov.data <- sample.data.frame(ps.kraken)
  756. aov <- adonis2(dist.mat ~ Diet, data = aov.data) %>%
  757. tidy() %>%
  758. suppressWarnings() %>%
  759. as.data.table()
  760. aov[, Beta := beta]
  761. setcolorder(aov, 7)
  762. return(aov)
  763. }) %>% rbindlist()
  764. }) %>% flextable() %>%
  765. theme_box() %>%
  766. set_caption(table.caption(cap)) %>%
  767. merge_v(j = 1) %>%
  768. align(j = 1, align = "center") %>%
  769. align(j = 2, align = "right") %>%
  770. colformat_double(j = 4:6, digits = 2) %>%
  771. colformat_double(j = 7, digits = 3) %>%
  772. autofit() %>%
  773. save_as_image(path = file.path(plotDir, "kraken_permanova_results.png"))
  774. ```
  775. ![](Plots/diet_taxonomic_ordination.png)
  776. ![](Plots/kraken_permanova_results.png)
  777. We used Kraken 2 to assign taxonomy to the mouse metagenomic sequences to assess whether administration of XN and its derivatives affects not just the potential functional capacity of the mouse gut microbiome, but also which microbial taxa are present. While there are statistically significant differences for all three distance metics measured (Table 2), the differences in the ordinations indicate some interesting results. Bray-Curtis, which is weighted by abundance, implies that there many high-abundance taxa share across the treatments, while Sørensen (presence-absence) indicates a strong effect of diet treatment on the rarer taxa. That is to say, administration of XN, DXN, and TXN to mice being fed HFDs appears to primarily affect the presence or absence of rare taxa, and have a smaller (but still stastically signficant) effect on the more abundant taxa. As with the functional potential, taxonomic composition of mice supplemented with XN apppears to be more similar to the HFD controls than supplementation with DXN or TXN.
  778. ### Associations with individual functional annotations
  779. ```{r diet-random-forests}
  780. threshholds <- c(0.95, 0.8, 0.6, 0.4, 0.2, 0)
  781. kw.sig.dt.file <- file.path(
  782. saveDir,
  783. "dt_diet_randForests_imptFeatures_sig_effects.rds"
  784. )
  785. kw.sig.dt <- redo.if("diet.random.forest", kw.sig.dt.file, {
  786. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  787. registerDoParallel(cl, nCores)
  788. res.dt <- lapply(annotation.sets, function(set) {
  789. selected.diet.rf <- gen.diet.random.forests(
  790. threshholds,
  791. physeq = ps.list[[set]]
  792. )
  793. sig.impt.dt <- id.sig.important.features(
  794. selected.diet.rf,
  795. feature.type = str_remove(set, "s$")
  796. )
  797. sig.impt.kw.dt <- diet.impt.feature.kw.tests(
  798. sig.feature.dt = sig.impt.dt,
  799. physeq = ps.list[[set]],
  800. feature.type = str_remove(set, "s$")
  801. )
  802. names(sig.impt.kw.dt)[1] <- "Feature"
  803. sig.impt.kw.dt[, Set := set]
  804. return(sig.impt.kw.dt)
  805. }) %>% rbindlist()
  806. stopCluster(cl)
  807. res.dt
  808. })
  809. ### Manual fix
  810. # kos.sig.dt <- readRDS(
  811. # file.path(saveDir, "dt_diet_randForests_imptKOs_sig_effects.rds")
  812. # )
  813. # names(kos.sig.dt)[1] <- "Feature"
  814. # kos.sig.dt[, Set := "KOs"]
  815. # setcolorder(kos.sig.dt, 6)
  816. #
  817. # igc.sig.dt <- readRDS(
  818. # file.path(saveDir, "dt_diet_randForests_imptIGCs_sig_effects.rds")
  819. # )
  820. # names(igc.sig.dt)[1] <- "Feature"
  821. # igc.sig.dt[, Set := "IGCs"]
  822. # setcolorder(igc.sig.dt, 6)
  823. #
  824. # kw.sig.dt <- rbind(kos.sig.dt, igc.sig.dt)
  825. # saveRDS(kw.sig.dt, kw.sig.dt.file)
  826. ```
  827. ```{r diet-models-plot-impt-features}
  828. top.n <- 12
  829. diet.impt.plots <- lapply(annotation.sets, function(set) {
  830. physeq <- ps.list[[set]]
  831. top.feats <- kw.sig.dt[Set == set]$Feature[1:top.n]
  832. feat.mat <- otu.matrix(physeq)
  833. plot.dt0 <- feat.mat[, top.feats] %>% as.data.table(keep.rownames = "Sample")
  834. plot.dt0[, Diet := sample.df$Diet]
  835. plot.dt1 <- melt(
  836. plot.dt0,
  837. id.vars = c("Sample", "Diet"),
  838. variable.name = "Feature",
  839. value.name = "Abund"
  840. ) %>%
  841. setkeyv("Feature")
  842. if (set == "IGCs") {
  843. map.tbl <- igc.eggnog.map[top.feats]
  844. plot.dt <- plot.dt1[map.tbl, on = "Feature==IGC"]
  845. plot.dt[, Facet.lab := paste0(Feature, " (", Preferred_name, ")")]
  846. } else {
  847. plot.dt <- copy(plot.dt1)
  848. plot.dt[, Facet.lab := Feature]
  849. }
  850. caption <- paste("Top", top.n, "most important KOs & IGCs for predicting mouse diet according to random forest models that were also significant according to Kruskal-Wallis tests (bonferroni corrected).")
  851. plot <- ggplot(plot.dt, aes(x = Diet, y = Abund)) +
  852. geom_quasirandom(dodge.width = 0.8) +
  853. stat_summary(fun.data = "mean_cl_boot", color = "red", geom = "errorbar") +
  854. facet_wrap(~ Facet.lab, scales = "free_y", ncol = 4) +
  855. labs(y = "Normalized Abundance", title = set)
  856. if (set == "IGCs") {
  857. plot <- plot + gg_figure_caption(caption = caption, caption.width = 130)
  858. }
  859. return(plot)
  860. })
  861. plot_grid(plotlist = diet.impt.plots, ncol = 1, rel_heights = c(1, 1.1)) %>%
  862. ggsave(
  863. filename = file.path(plotDir, "diet_rf_sig_impt_features.png"),
  864. dpi = img.dpi,
  865. width = img.wd * 1.5,
  866. height = img.ht * 1.5
  867. )
  868. ```
  869. ```{r diet-models-plot-impt-kos-tbl, include=FALSE}
  870. diet.rf.impt.ko.tbl <- map.tbl[kw.sig.dt[Set == "KOs"]$Feature[1:top.n]]
  871. names(diet.rf.impt.ko.tbl)[1] <- "KO"
  872. flextable(diet.rf.impt.ko.tbl[order(KO)]) %>%
  873. theme_box() %>%
  874. set_caption(
  875. table.caption("Important (diet random forests) KO Assignments")
  876. ) %>%
  877. autofit() %>%
  878. save_as_image(path = file.path(plotDir, "diet_rf_sig_impt_kos_tbl.png"))
  879. ```
  880. ![](Plots/diet_rf_sig_impt_features.png)
  881. ![](Plots/diet_rf_sig_impt_kos_tbl.png)
  882. After to assessing the overall composition of the mouse metagenomes, we wanted to determine if there association with diet treatment and specific metagenomic functions. To do so, we created two random forest models, the first using KO abundances and the second using IGC abundances, to predict diet treatment. We assessed feature (KO or IGC abudance) importance through a non-parametric (permutational) method and ploted the abundance-by-diet relationships of the top 12 significantly important features for each data set (Figure 3). Higher level (module) assignments, if determined, are presented in Table 3.
  883. <!-- fix code and fill out text (KOs previously shown to associate with XN) -->
  884. ```{r xn-kos-of-interest-plot, include=FALSE}
  885. ko.id.tbl <- readRDS(file.path(inDir, "my_ko_names_and_mod_name.rds"))
  886. search.terms <- c(
  887. "aromatic amino acid aminotransferase",
  888. "tryptophanase",
  889. "tryptophan monooxygenase",
  890. "tryptophan decarboxylase",
  891. "indolelactate",
  892. "indolepyruvate",
  893. "acyl-coa dehydrogenase",
  894. "indoleacetate",
  895. "indoleacetaldehyde",
  896. "indoleacetamide",
  897. "cytochrome P450 family 2 subfamily E",
  898. "sulfotransferase",
  899. "enoate reductase"
  900. )
  901. xn.kos <- ko.id.tbl[
  902. grepl(paste(search.terms, collapse = "|"), ko.name, ignore.case = T)
  903. ]$ko %>% unique()
  904. ko.dt <- otu.data.table(ps.list$KOs)
  905. ko.vec <- names(ko.dt)[-1]
  906. keep.kos <- c("Sample", ko.vec[ko.vec %in% xn.kos])
  907. xn.ko.dt <- ko.dt[, ..keep.kos]
  908. xn.ko.plot.dt <- sample.data.table(ps.kos)[xn.ko.dt, on = "Sample"] %>%
  909. melt(
  910. id.vars = "Diet",
  911. measure.vars = keep.kos[-1],
  912. variable.name = "KO",
  913. value.name = "Abund"
  914. )
  915. xn.ko.plot.dt[, KO := factor(KO, levels = sort(levels(KO)))]
  916. fig.cap <- "Abundance by diet treatment for KOs whose description matches key terms identified as associating with XN (or derivatives) in prior work."
  917. {
  918. ggplot(xn.ko.plot.dt, aes(x = Diet, y = Abund)) +
  919. stat_summary(fun.data = "mean_cl_boot", geom = "errorbar") +
  920. geom_quasirandom(aes(color = Diet), groupOnX = T) +
  921. scale_color_brewer(palette = "Dark2") +
  922. facet_wrap(~ KO, scales = "free_y", ncol = 4) +
  923. gg_figure_caption(caption = fig.cap)
  924. } %>%
  925. ggsave(
  926. filename = file.path(plotDir, "diet_xn_kos_of_interest.png"),
  927. dpi = img.dpi,
  928. width = img.wd,
  929. height = img.ht * 0.6
  930. )
  931. xn.ko.tbl <- ko.id.tbl[ko %in% ko.vec[ko.vec %in% xn.kos]]
  932. names(xn.ko.tbl) <- c("KO", "Name", "Mod", "Mod.name")
  933. flextable(xn.ko.tbl[order(KO)]) %>%
  934. theme_box() %>%
  935. set_caption(
  936. table.caption("Module assignments for XN-related KOs of interest.")
  937. ) %>%
  938. autofit() %>%
  939. save_as_image(path = file.path(plotDir, "diet_xn_kos_of_interest_tbl.png"))
  940. ```
  941. ![](Plots/diet_xn_kos_of_interest.png)
  942. ![](Plots/diet_xn_kos_of_interest_tbl.png)
  943. Previous work had identified particular KOs that associated with XN diet supplementation. We search for KOs in this work that matched any of a set of keywords from that prior work and plotted their abundances by diet treatment.
  944. ## Diet and Spatial Learning covariate interactions
  945. ### Differences in overall composition (beta-diversity)
  946. #### Methods
  947. 1. Generate dbRDA ordinations with all Spatial Learning covariates
  948. 2. Use `ordistep` to select Spatial Learning covariates that explain the most variance in beta-diversity
  949. 3. Significance assessment on `ordistep`-selected dbRDAs with permanova
  950. 4. Add in diet term (main effect)
  951. 5. More tests of significance
  952. 6. Add in diet term interactions to full models
  953. 7. Use `ordistep` to select Spatial Learning covariates by Diet interactions that explain the most variance in beta-diversity
  954. 8. Significance assessment on `ordistep`-selected dbRDAs with permanova
  955. ```{r diet-and-covars-dbrdas, include=FALSE}
  956. full.dbrdas.file <- file.path(saveDir, "lists_full_dbRDAs.rds")
  957. dbrda.frm0 <- paste("dist ~", paste(spat.learn.vars, collapse = " + "))
  958. full.dbrdas <-redo.if("diet.by.covars", save.file = full.dbrdas.file, {
  959. lapply(annotation.sets, function(set) {
  960. par.dbrdas(
  961. dist.mats = dist.lists[[set]],
  962. dbrda.frm = dbrda.frm0,
  963. sample.data = sample.df,
  964. nCores = nCores
  965. ) %>% return()
  966. })
  967. })
  968. select.dbrdas.file <- file.path(saveDir, "lists_selected_dbRDAs.rds")
  969. select.dbrdas <- redo.if("diet.by.covars", save.file = select.dbrdas.file, {
  970. lapply(annotation.sets, function(set) {
  971. par.ordistep(
  972. full.dbrdas = full.dbrdas[[set]],
  973. selectDirection = "both",
  974. nCores = nCores
  975. )
  976. }) %>% return()
  977. })
  978. dbrda.anovas.file <- file.path(saveDir, "lists_dbRDA_permanovas.rds")
  979. dbrda.anovas <- redo.if("diet.by.covars", save.file = dbrda.anovas.file, {
  980. lapply(annotation.sets, function(set) {
  981. par.anova.rda(
  982. select.dbrdas[[set]],
  983. by.what = "margin",
  984. nCores = nCores
  985. )
  986. })
  987. })
  988. # print.list(dbrda.anovas) ###
  989. selectTreat.dbrdas.file <- file.path(
  990. saveDir,
  991. "list_selected_dbRDAs_with_dietTreatment.rds"
  992. )
  993. selectTreat.dbrdas <- redo.if("diet.by.covars", selectTreat.dbrdas.file, {
  994. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  995. registerDoParallel(cl, nCores)
  996. res.list <- lapply(annotation.sets, function(set) {
  997. foreach(
  998. n = names(select.dbrdas[[set]]),
  999. .final = function(x) setNames(x, names(select.dbrdas[[set]])),
  1000. .verbose = TRUE
  1001. ) %dopar% {
  1002. dbrda.s <- select.dbrdas[[set]][[n]]
  1003. dbrda.selectTreat <- update(dbrda.s, . ~ . + Diet)
  1004. return(dbrda.selectTreat)
  1005. }
  1006. })
  1007. stopCluster(cl)
  1008. res.list
  1009. })
  1010. dbrda.treat.anovas.file <- file.path(
  1011. saveDir,
  1012. "list_dbRDA_permanovas_with_dietTreatment.rds"
  1013. )
  1014. dbrda.treat.anovas <- redo.if("diet.by.covars", dbrda.treat.anovas.file, {
  1015. lapply(annotation.sets, function(set) {
  1016. par.anova.rda(
  1017. selectTreat.dbrdas[[set]],
  1018. by.what = "margin",
  1019. nCores = nCores
  1020. )
  1021. })
  1022. })
  1023. # print.list(dbrda.treat.anovas) ###
  1024. intrxn.full.dbrdas.file <- file.path(saveDir, "list_full_interactions_dbRDAs.rds")
  1025. dbrda.int0.frm <- paste(
  1026. "dist ~ Diet +", paste(paste0("Diet:", spat.learn.vars), collapse = " + ")
  1027. )
  1028. intrxn.full.dbrdas <- redo.if("diet.by.covars", intrxn.full.dbrdas.file, {
  1029. lapply(annotation.sets, function(set) {
  1030. par.dbrdas(
  1031. dist.mats = dist.lists[[set]],
  1032. dbrda.frm = dbrda.int0.frm,
  1033. sample.data = sample.df,
  1034. nCores = nCores
  1035. )
  1036. })
  1037. })
  1038. intrxn.select.dbrdas.file <- file.path(
  1039. saveDir, "list_selected_interactions_dbRDAs.rds"
  1040. )
  1041. intrxn.select.dbrdas <- redo.if("diet.by.covars", intrxn.select.dbrdas.file, {
  1042. lapply(annotation.sets, function(set) {
  1043. par.ordistep(
  1044. full.dbrdas = intrxn.full.dbrdas[[set]],
  1045. selectDirection = "both",
  1046. nCores = nCores
  1047. )
  1048. })
  1049. })
  1050. dbrda.intrxn.anovas.file <- file.path(
  1051. saveDir,
  1052. "list_interaction_dbRDA_permanovas.rds"
  1053. )
  1054. dbrda.intrxn.anovas <- redo.if("diet.by.covars", dbrda.intrxn.anovas.file, {
  1055. lapply(annotation.sets, function(set) {
  1056. par.anova.rda(
  1057. intrxn.select.dbrdas[[set]],
  1058. by.what = "margin",
  1059. nCores = nCores
  1060. )
  1061. })
  1062. })
  1063. cap <- "PERMANOVA results for beta-diversity distances by diet treatment and spatial learning covariate interactions for both KO and IGC annotations of mouse metagenomes."
  1064. lapply(annotation.sets, function(set) {
  1065. lapply(names(dbrda.intrxn.anovas[[set]]), function(beta) {
  1066. aov.dt <- dbrda.intrxn.anovas[[set]][[beta]] %>%
  1067. tidy() %>%
  1068. as.data.table() %>%
  1069. suppressWarnings()
  1070. aov.dt[, `:=`(Set = set, Beta = beta)]
  1071. setcolorder(aov.dt, 6:7)
  1072. }) %>% rbindlist()
  1073. }) %>%
  1074. rbindlist() %>%
  1075. flextable() %>%
  1076. theme_box() %>%
  1077. set_caption(table.caption(cap)) %>%
  1078. merge_v(j = 1:2) %>%
  1079. align(j = 1:2, align = "center") %>%
  1080. align(j = 3, align = "right") %>%
  1081. colformat_double(j = 5:6, digits = 2) %>%
  1082. colformat_double(j = 7, digits = 3) %>%
  1083. autofit() %>%
  1084. save_as_image(
  1085. path = file.path(plotDir, "diet_by_covars_permanova_results.png")
  1086. )
  1087. ```
  1088. ```{r diet-and-covars-dbrda-plots}
  1089. beta <- "Bray-Curtis"
  1090. caption <- paste(
  1091. "dbRDA ordinations of", beta, "distances of IGC and KO composition for mouse microbiome samples. Circles represent individual samples; arrows indicate vectors of greatest change for the significant spatial learning covariate (indicated by the panel label) by diet treatment interaction term from the PERMANOVA results. Both of these are colored by diet treatment. Percent variance in", beta, "distance explained is presented in parentheses in the axis labels."
  1092. )
  1093. diet.covars.plots <- lapply(annotation.sets, function(set) {
  1094. dbrda.obj <- intrxn.select.dbrdas[[set]][[beta]]
  1095. permanova.dt <- dbrda.intrxn.anovas[[set]][[beta]] %>%
  1096. tidy() %>%
  1097. as.data.table() %>%
  1098. suppressWarnings()
  1099. sig.spat.vars <- str_split(permanova.dt[p.value <= 0.05]$term, ":") %>%
  1100. sapply(`[`, 2)
  1101. biplot.data <- get.biplot.data(
  1102. smpls = ps.list[[set]],
  1103. ord = dbrda.obj,
  1104. plot.axes = c(1, 2)
  1105. )
  1106. sample.coords <- melt(
  1107. biplot.data$sample.coords,
  1108. id.vars = c("Sample", "CAP1", "CAP2", "Diet"),
  1109. measure.vars = sig.spat.vars,
  1110. variable.name = "Spat.Var"
  1111. )
  1112. vector.coords <- biplot.data$vector.coords[
  1113. str_detect(Variable, paste(sig.spat.vars, collapse = "|"))
  1114. ]
  1115. vector.coords[, Spat.Var := sapply(str_split(Variable, ":"), `[`, 2)]
  1116. vector.coords[, Diet := str_remove(str_remove(Variable, "Diet"), ":.*")]
  1117. centroid.coords0 <- biplot.data$centroid.coords
  1118. centroid.coords0[, Diet := sub("Diet", "", Variable)]
  1119. centroid.coords <- lapply(sig.spat.vars, function(var) {
  1120. dt <- copy(centroid.coords0)
  1121. dt[, Spat.Var := var]
  1122. }) %>% rbindlist()
  1123. dbrda.plot <- ggplot(sample.coords, aes(x = CAP1, y = CAP2, color = Diet)) +
  1124. geom_point(alpha = 0.3, size = 2) +
  1125. # geom_point(data = centroid.coords, shape = 3, alpha = 0.5, size = 4) +
  1126. geom_segment(
  1127. data = vector.coords,
  1128. x = 0, y = 0,
  1129. aes(xend = CAP1, yend = CAP2),
  1130. arrow = arrow(length = unit(0.03, "npc"))
  1131. ) +
  1132. labs(
  1133. title = set,
  1134. subtitle = beta,
  1135. x = biplot.data$axes.labs[1],
  1136. y = biplot.data$axes.labs[2]
  1137. ) +
  1138. facet_wrap(~ Spat.Var) +
  1139. scale_color_brewer(palette = "Dark2") +
  1140. theme(legend.position = "top")
  1141. if (set == "KOs") {
  1142. dbrda.plot <- dbrda.plot +
  1143. gg_figure_caption(caption = caption, caption.width = 160)
  1144. }
  1145. return(dbrda.plot)
  1146. })
  1147. plot_grid(
  1148. diet.covars.plots[[1]],
  1149. plot_grid(diet.covars.plots[[2]], NULL, ncol = 1, rel_heights = c(1.1, 2)),
  1150. nrow = 1,
  1151. rel_widths = c(2.6, 1)
  1152. ) %>% ggsave(
  1153. filename = file.path(plotDir, "diet_by_covars_ordinations.png"),
  1154. dpi = img.dpi,
  1155. width = img.wd * 2,
  1156. height = img.ht * 1.5
  1157. )
  1158. ```
  1159. ![](Plots/diet_by_covars_ordinations.png)
  1160. ![](Plots/diet_by_covars_permanova_results.png)
  1161. Distance-based redundancy analysis (dbRDA) revealed a number of significant interactions between diet treatment and spatial learning covariates in predicting differences in metagenomic composition (Figure 4 & Table 4). Significant interactions, in this case, implies that the association between a given spatial learning covariate score and metagenomic composition is dependent on which diet treatment (control, XN, DXN, or TXN) the mouse received. Of note, selection on models predicting Sørensen (presence-absence) scores return no significant interactions between diet and spatial learning covariates, while Bray-Curtis and Canberra (both abundance-weighted) did. This implies that the spatial learning covariates associate with changes in abundance of ceratain (probably overall abundant) microbial taxa, rather than the presence or absence of particular microbial taxa.
  1162. ### Associations with individual functional annotations
  1163. ```{r covar-modelling}
  1164. threshholds <- c(0.95, 0.8, 0.6, 0.4, 0.2, 0)
  1165. covars <- names(sample.df)[-1]
  1166. glm.sig.dt.file <- file.path(
  1167. saveDir,
  1168. "dt_allCovar_randForests_imptFeature_sig_interactions.rds"
  1169. )
  1170. glm.sig.dt <- redo.if("covar.random.forest", glm.sig.dt.file, {
  1171. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  1172. registerDoParallel(cl, nCores)
  1173. res.dt <- lapply(annotation.sets, function(set) {
  1174. ft <- str_remove(set, "s$")
  1175. rf.list <- gen.covar.random.forests(
  1176. covars = covars,
  1177. threshholds = threshholds,
  1178. physeq = ps.list[[set]],
  1179. feature.type = ft
  1180. )
  1181. all.sig.impt.dt <- id.sig.important.features(rf.list, feature.type = ft)
  1182. trans.and.cat.dt <- trans.and.cat.covars(copy(sample.dt), covars)
  1183. res <- covar.impt.feature.regressions(
  1184. covars = covars,
  1185. sig.feature.dt = all.sig.impt.dt,
  1186. covar.dt = trans.and.cat.dt,
  1187. physeq = ps.list[[set]],
  1188. feature.type = ft
  1189. )
  1190. names(res)[2] <- "Feature"
  1191. res[, Set := set]
  1192. setcolorder(res, 4)
  1193. return(res)
  1194. }) %>% rbindlist()
  1195. stopCluster(cl)
  1196. res.dt[Intrxn.pval < 0.05]
  1197. })
  1198. ### Manual fix
  1199. # old.files <- list(
  1200. # IGCs = file.path(
  1201. # saveDir,
  1202. # "dt_allCovar_randForests_imptIGCs_sig_interactions.rds"
  1203. # ),
  1204. # KOs = file.path(
  1205. # saveDir,
  1206. # "dt_allCovar_randForests_imptKOs_sig_interactions.rds"
  1207. # )
  1208. # )
  1209. # glm.sig.dt <- lapply(annotation.sets, function(set) {
  1210. # old.dt <- readRDS(old.files[[set]])
  1211. # names(old.dt)[2] <- "Feature"
  1212. # old.dt[, Set := set]
  1213. # setcolorder(old.dt, 4)
  1214. # return(old.dt)
  1215. # }) %>% rbindlist()
  1216. # glm.sig.dt <- glm.sig.dt[Intrxn.pval < 0.05]
  1217. # saveRDS(glm.sig.dt, glm.sig.dt.file)
  1218. ```
  1219. ```{r covar-modelling-table}
  1220. names(igc.eggnog.map) <- c("Feature", "Name")
  1221. glms.sig.igc.dt <- igc.eggnog.map[glm.sig.dt[Set == "IGCs"], on = "Feature"]
  1222. glms.sig.kos.dt <- map.tbl[
  1223. glm.sig.dt[Set == "KOs" & Feature != "Diet"],
  1224. on = "Feature"
  1225. ]
  1226. all.names <- unique(c(names(glms.sig.igc.dt), names(glms.sig.kos.dt)))
  1227. names.ordered <- all.names[c(3, 1:2, 6:7, 4:5)]
  1228. for (col.name in names.ordered[!(names.ordered %in% names(glms.sig.igc.dt))]) {
  1229. glms.sig.igc.dt[[col.name]] <- NA
  1230. }
  1231. glms.sig.igc.dt <- glms.sig.igc.dt[, ..names.ordered]
  1232. print.glm.sig.dt <- rbind(glms.sig.igc.dt, glms.sig.kos.dt)
  1233. write.table(
  1234. print.glm.sig.dt[order(Set, Covar, Feature)],
  1235. file = file.path(plotDir, "diet_by_covars_rf_sig_impt_features_table.csv"),
  1236. row.names = FALSE,
  1237. sep = ","
  1238. )
  1239. ```
  1240. ```{r covar-modelling-plots}
  1241. modelling.plotDir <- "Plots/Diet_by_covar_rf_sig_impt_features_plots"
  1242. trans.and.cat.res <- lapply(annotation.sets, function(set) {
  1243. trans.and.cat.covars(
  1244. dt = sample.data.table(ps.list[[set]]),
  1245. covars = covars,
  1246. reference = T
  1247. ) %>% return()
  1248. })
  1249. sig.features.dt <- lapply(annotation.sets, function(set) {
  1250. if (set == "IGCs") {
  1251. res <- igc.eggnog.map[glm.sig.dt[Set == "IGCs"], on = "Feature"]
  1252. names(res)[1] <- "Feature"
  1253. setcolorder(res, c(3:4, 1:2, 5))
  1254. } else {
  1255. res <- glm.sig.dt[Set == "KOs" & Feature != "Diet"]
  1256. res[, Name := NA]
  1257. setcolorder(res, c(1:3, 5, 4))
  1258. }
  1259. return(res)
  1260. }) %>% rbindlist()
  1261. # covar <- covars[1]
  1262. # set <- "IGCs"
  1263. to.plot <- lapply(covars, function(covar) {
  1264. covar.plots <- lapply(annotation.sets, function(set) {
  1265. linear.plot <- !trans.and.cat.res[[set]]$REF.DT[Covar == covar]$Categorized
  1266. if (linear.plot) {
  1267. plot.linear.interactions(
  1268. covar = covar,
  1269. covar.dt = trans.and.cat.res[[set]]$DT,
  1270. ref.dt = trans.and.cat.res[[set]]$REF.DT,
  1271. sig.features.dt = sig.features.dt[Set == set],
  1272. physeq = ps.list[[set]],
  1273. feature.type = str_remove(set, "s$")
  1274. )
  1275. } else {
  1276. plot.logistic.interactions(
  1277. covar = covar,
  1278. covar.dt = trans.and.cat.res[[set]]$DT,
  1279. sig.features.dt = sig.features.dt[Set == set],
  1280. physeq = ps.list[[set]],
  1281. feature.type = str_remove(set, "s$")
  1282. )
  1283. }
  1284. })
  1285. grid.data <- lapply(covar.plots, function(plot) {
  1286. panels <- ggplot_build(plot)$data[[1]]$PANEL %>%
  1287. as.numeric() %>%
  1288. max()
  1289. nrows <- ifelse(
  1290. panels %in% 7:8, 3, ifelse(panels > 3, floor(sqrt(panels)), 1)
  1291. )
  1292. data.table(
  1293. Panels = panels,
  1294. Rows = nrows,
  1295. Cols = ceiling(panels / nrows)
  1296. )
  1297. }) %>% rbindlist()
  1298. top.panel <- covar.plots[[1]]
  1299. bottom.panel <- covar.plots[[2]]
  1300. col.diff <- abs(diff(grid.data$Cols))
  1301. if (col.diff != 0) {
  1302. if (grid.data$Cols[1] < grid.data$Cols[2]) {
  1303. top.panel.list <- c(list(covar.plots[[1]]), as.list(rep("", col.diff)))
  1304. for (i in 2:(col.diff + 1)) {
  1305. top.panel.list[i] <- list(NULL)
  1306. }
  1307. top.panel <- plot_grid(
  1308. plotlist = top.panel.list,
  1309. nrow = 1,
  1310. rel_widths = c(max(c(grid.data$Cols[1], 1.2)), rep(1, col.diff))
  1311. )
  1312. } else {
  1313. bottom.panel.list <- top.panel.list <- c(
  1314. list(covar.plots[[2]]),
  1315. as.list(rep("", col.diff))
  1316. )
  1317. for (i in 2:(col.diff + 1)) {
  1318. bottom.panel.list[i] <- list(NULL)
  1319. }
  1320. bottom.panel <- plot_grid(
  1321. plotlist = bottom.panel.list,
  1322. nrow = 1,
  1323. rel_widths = c(max(c(grid.data$Cols[2], 1.2)), rep(1, col.diff))
  1324. )
  1325. }
  1326. }
  1327. rel.hts <- grid.data$Rows
  1328. rel.hts[rel.hts == 1] <- 1.2
  1329. fig.wd <- max(c(img.wd * max(grid.data$Cols) / 2, img.wd))
  1330. fig.ht <- max(c(img.ht * sum(grid.data$Rows) / 3), img.ht)
  1331. plot_grid(
  1332. top.panel,
  1333. bottom.panel,
  1334. ncol = 1,
  1335. rel_heights = rel.hts
  1336. ) %>%
  1337. ggsave(
  1338. filename = file.path(modelling.plotDir, paste0(covar, ".png")),
  1339. dpi = img.dpi,
  1340. width = fig.wd,
  1341. height = fig.ht
  1342. )
  1343. })
  1344. ```
  1345. As with diet treatment, we created a set of random forest models to predict spatial learning covariate scores from feature (KO or IGC) abundances. We then used the models to assess which features were significanly important. Using only these important features, we built regression models to assess whether feature abundance by diet interactions significantly predicted spatial learning covariate scores. As the table and figure below indicate, there were a number of IGCs and KOs that significantly associated with spatial learning covariates in a diet-dependent manner. For example, K21600 (csoR, ricR; CsoR family transcriptional regulator, copper-sensing transcriptional repressor) had a positive association with L_Vis1 scores in control and XN-supplemented mice, but a negative association with L_Vis1 scores in DXN- and TXN-supplmented mice, and K00566 (mnmA, trmU; tRNA-uridine 2-sulfurtransferase) had a negative association with L_Hid6 scores in control samples, but positive associations with L_Hi6 scores for all three supplemented samples.
  1346. This [CSV table](Plots/diet_by_covars_rf_sig_impt_features_table.csv) reports all significant associations between metagenomic functional features and behavioral covariate by diet interactions ([PNG version](Plots/diet_by_covars_rf_sig_impt_features_table.png))
  1347. All significant associations between spatial learning covariates and diet by KO/IGC abundance interactions can be found in [this directory](Plots/Diet_by_covar_rf_sig_impt_features_plots).
  1348. ## Diet and ceramide interactions
  1349. One possible contribution to the effects of HFDs on metabolic syndrome is the increased concentrations of sphingolipids (including ceramides) in the brain and liver. We measured ceramide concentrations in both of these tissues of the mouse samples, and determined whether there were significant associtation between these concentrations and metagenomic composition in a diet-dependent manner.
  1350. ### Differences in overall composition (beta-diversity)
  1351. *Same methodology as above*
  1352. ```{r diet-and-ceramide-dbrdas, include=FALSE}
  1353. ceramide.df <- as.data.frame(ceramide.dt) %>%
  1354. set_rownames(ceramide.dt$Sample)
  1355. ceramide.df$Sample <- NULL
  1356. ceramide.dist.lists <- lapply(annotation.sets, function(set) {
  1357. lapply(dist.lists[[set]], function(mat) {
  1358. usedist::dist_subset(mat, rownames(ceramide.df))
  1359. })
  1360. })
  1361. full.cer.dbrdas.file <- file.path(saveDir, "lists_full_dbRDAs_ceramide.rds")
  1362. dbrda.frm0 <- paste("dist ~", paste(ceramide.ids, collapse = " + "))
  1363. full.cer.dbrdas <- redo.if("diet.by.ceramide", full.cer.dbrdas.file, {
  1364. lapply(annotation.sets, function(set) {
  1365. par.dbrdas(
  1366. dist.mats = ceramide.dist.lists[[set]],
  1367. dbrda.frm = dbrda.frm0,
  1368. sample.data = ceramide.df,
  1369. nCores = nCores
  1370. ) %>% return()
  1371. })
  1372. })
  1373. select.cer.dbrdas.file <- file.path(saveDir, "lists_selected_dbRDAs_ceramide.rds")
  1374. select.cer.dbrdas <- redo.if("diet.by.ceramide", select.cer.dbrdas.file, {
  1375. lapply(annotation.sets, function(set) {
  1376. par.ordistep(
  1377. full.dbrdas = full.cer.dbrdas[[set]],
  1378. selectDirection = "both",
  1379. nCores = nCores
  1380. )
  1381. }) %>% return()
  1382. })
  1383. dbrda.cer.anovas.file <- file.path(saveDir, "lists_dbRDA_permanovas_ceramide.rds")
  1384. dbrda.cer.anovas <- redo.if("diet.by.ceramide", dbrda.cer.anovas.file, {
  1385. lapply(annotation.sets, function(set) {
  1386. par.anova.rda(
  1387. dbrdas =select.cer.dbrdas[[set]],
  1388. by.what = "margin",
  1389. nCores = nCores
  1390. )
  1391. })
  1392. })
  1393. # print.list(dbrda.cer.anovas) ###
  1394. selectTreat.cer.dbrdas.file <- file.path(
  1395. saveDir,
  1396. "list_selected_dbRDAs_with_dietTreatment_ceramide.rds"
  1397. )
  1398. selectTreat.cer.dbrdas <- redo.if("diet.by.ceramide", selectTreat.cer.dbrdas.file, {
  1399. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  1400. registerDoParallel(cl, nCores)
  1401. res.list <- lapply(annotation.sets, function(set) {
  1402. foreach(
  1403. n = names(select.cer.dbrdas[[set]]),
  1404. .final = function(x) setNames(x, names(select.cer.dbrdas[[set]])),
  1405. .verbose = TRUE
  1406. ) %dopar% {
  1407. dbrda.s <- select.cer.dbrdas[[set]][[n]]
  1408. dbrda.selectTreat <- update(dbrda.s, . ~ . + Diet)
  1409. return(dbrda.selectTreat)
  1410. }
  1411. })
  1412. stopCluster(cl)
  1413. res.list
  1414. })
  1415. dbrda.treat.cer.anovas.file <- file.path(
  1416. saveDir,
  1417. "list_dbRDA_permanovas_with_dietTreatment_ceramide.rds"
  1418. )
  1419. dbrda.treat.cer.anovas <- redo.if("diet.by.ceramide", dbrda.treat.cer.anovas.file, {
  1420. lapply(annotation.sets, function(set) {
  1421. par.anova.rda(
  1422. dbrdas = selectTreat.cer.dbrdas[[set]],
  1423. by.what = "margin",
  1424. nCores = nCores
  1425. )
  1426. })
  1427. })
  1428. # print.list(dbrda.treat.cer.anovas) ###
  1429. intrxn.full.cer.dbrdas.file <- file.path(saveDir, "list_full_interactions_dbRDAs_ceramide.rds")
  1430. dbrda.int0.frm <- paste(
  1431. "dist ~ Diet +",
  1432. paste(paste0("Diet:", ceramide.ids), collapse = " + ")
  1433. )
  1434. intrxn.full.cer.dbrdas <- redo.if("diet.by.ceramide", intrxn.full.cer.dbrdas.file, {
  1435. lapply(annotation.sets, function(set) {
  1436. par.dbrdas(
  1437. dist.mats = ceramide.dist.lists[[set]],
  1438. dbrda.frm = dbrda.int0.frm,
  1439. sample.data = ceramide.df,
  1440. nCores = nCores
  1441. )
  1442. })
  1443. })
  1444. intrxn.select.cer.dbrdas.file <- file.path(
  1445. saveDir, "list_selected_interactions_dbRDAs_ceramide.rds"
  1446. )
  1447. intrxn.select.cer.dbrdas <- redo.if("diet.by.ceramide", intrxn.select.cer.dbrdas.file, {
  1448. lapply(annotation.sets, function(set) {
  1449. par.ordistep(
  1450. full.dbrdas = intrxn.full.cer.dbrdas[[set]],
  1451. selectDirection = "both",
  1452. nCores = nCores
  1453. )
  1454. })
  1455. })
  1456. dbrda.intrxn.cer.anovas.file <- file.path(
  1457. saveDir,
  1458. "list_interaction_dbRDA_permanovas_ceramide.rds"
  1459. )
  1460. dbrda.intrxn.cer.anovas <- redo.if("diet.by.ceramide", dbrda.intrxn.cer.anovas.file, {
  1461. lapply(annotation.sets, function(set) {
  1462. par.anova.rda(
  1463. intrxn.select.cer.dbrdas[[set]],
  1464. by.what = "margin",
  1465. nCores = nCores
  1466. )
  1467. })
  1468. })
  1469. cap <- "PERMANOVA results for beta-diversity distances by diet treatment and ceramide concentration interactions for both KO and IGC annotations of mouse metagenomes."
  1470. dbrda.intrxn.cer.anova.tbl <- lapply(annotation.sets, function(set) {
  1471. lapply(names(dbrda.intrxn.cer.anovas[[set]]), function(beta) {
  1472. aov.dt <- dbrda.intrxn.cer.anovas[[set]][[beta]] %>%
  1473. tidy() %>%
  1474. as.data.table() %>%
  1475. suppressWarnings()
  1476. aov.dt[, `:=`(Set = set, Beta = beta)]
  1477. setcolorder(aov.dt, 6:7)
  1478. }) %>% rbindlist()
  1479. }) %>% rbindlist()
  1480. term.vars <- str_split(dbrda.intrxn.cer.anova.tbl$term, ":") %>%
  1481. sapply(tail, 1)
  1482. term.labs <- paste(
  1483. str_remove(ceramide.leg[term.vars]$Category, " sphingolipids| lipidomics"),
  1484. str_remove(ceramide.leg[term.vars]$Label, " ceramide"),
  1485. sep = "_"
  1486. )
  1487. term.labs <- term.labs[term.labs != "NA_NA"]
  1488. dbrda.intrxn.cer.anova.tbl[str_detect(term, "Diet:")]$term <- paste0(
  1489. "Diet:", term.labs
  1490. )
  1491. flextable(dbrda.intrxn.cer.anova.tbl) %>%
  1492. theme_box() %>%
  1493. set_caption(table.caption(cap)) %>%
  1494. merge_v(j = 1:2) %>%
  1495. align(j = 1:2, align = "center") %>%
  1496. align(j = 3, align = "right") %>%
  1497. colformat_double(j = 5:6, digits = 2) %>%
  1498. colformat_double(j = 7, digits = 3) %>%
  1499. autofit() %>%
  1500. save_as_image(
  1501. path = file.path(plotDir, "diet_by_ceramide_permanova_results.png")
  1502. )
  1503. ```
  1504. ```{r diet-and-ceramide-dbrda-plots}
  1505. beta <- "Bray-Curtis"
  1506. caption <- paste(
  1507. "dbRDA ordinations of", beta, "distances of IGC and KO composition for mouse microbiome samples. Circles represent individual samples; arrows indicate vectors of greatest change for the significant ceramide concentration (indicated by the panel label) by diet treatment interaction term from the PERMANOVA results. Both of these are colored by diet treatment. Percent variance in", beta, "distance explained is presented in parentheses in the axis labels."
  1508. )
  1509. set.tracking.nums(set.to = 5)
  1510. diet.ceramide.plots <- lapply(annotation.sets, function(set) {
  1511. dbrda.obj <- intrxn.select.cer.dbrdas[[set]][[beta]]
  1512. permanova.dt <- dbrda.intrxn.cer.anovas[[set]][[beta]] %>%
  1513. tidy() %>%
  1514. as.data.table() %>%
  1515. suppressWarnings()
  1516. sig.cer.vars <- str_split(permanova.dt[p.value <= 0.05]$term, ":") %>%
  1517. sapply(`[`, 2)
  1518. biplot.data <- get.biplot.data(
  1519. smpls = ps.list[[set]],
  1520. ord = dbrda.obj,
  1521. plot.axes = c(1, 2)
  1522. )
  1523. sample.coords <- melt(
  1524. biplot.data$sample.coords[ceramide.dt],
  1525. id.vars = c("Sample", "CAP1", "CAP2", "Diet"),
  1526. measure.vars = sig.cer.vars,
  1527. variable.name = "Ceramide.ID"
  1528. )
  1529. sample.coords[
  1530. , Ceramide.Lab := paste(
  1531. str_remove(
  1532. ceramide.leg[as.character(Ceramide.ID)]$Category,
  1533. " sphingolipids|lipidomics"
  1534. ),
  1535. str_remove(ceramide.leg[as.character(Ceramide.ID)]$Label, " ceramide")
  1536. )
  1537. ]
  1538. vector.coords <- biplot.data$vector.coords[
  1539. str_detect(Variable, paste(sig.cer.vars, collapse = "|"))
  1540. ]
  1541. vector.coords[, Ceramide.ID := sapply(str_split(Variable, ":"), `[`, 2)]
  1542. vector.coords[, Diet := str_remove(str_remove(Variable, "Diet"), ":.*")]
  1543. vector.coords[
  1544. , Ceramide.Lab := paste(
  1545. str_remove(
  1546. ceramide.leg[Ceramide.ID]$Category,
  1547. " sphingolipids|lipidomics"
  1548. ),
  1549. str_remove(ceramide.leg[Ceramide.ID]$Label, " ceramide")
  1550. )
  1551. ]
  1552. vector.coords[
  1553. , Vector.Lab := paste0(
  1554. str_remove(Variable, "var[0-9][0-9]*"),
  1555. Ceramide.Lab
  1556. )
  1557. ]
  1558. centroid.coords0 <- biplot.data$centroid.coords
  1559. centroid.coords0[, Diet := sub("Diet", "", Variable)]
  1560. centroid.coords <- lapply(sig.cer.vars, function(var) {
  1561. dt <- copy(centroid.coords0)
  1562. dt[, Ceramide.ID := var]
  1563. }) %>% rbindlist()
  1564. dbrda.plot <- ggplot(sample.coords, aes(x = CAP1, y = CAP2, color = Diet)) +
  1565. geom_point(shape = 19, size = 4) +
  1566. geom_point(
  1567. aes(fill = value),
  1568. shape = 21,
  1569. size = 2.5
  1570. ) +
  1571. geom_segment(
  1572. data = vector.coords,
  1573. x = 0, y = 0,
  1574. aes(xend = CAP1, yend = CAP2),
  1575. arrow = arrow(length = unit(0.03, "npc"))
  1576. ) +
  1577. labs(
  1578. title = set,
  1579. subtitle = beta,
  1580. x = biplot.data$axes.labs[1],
  1581. y = biplot.data$axes.labs[2]
  1582. ) +
  1583. facet_wrap(~ Ceramide.Lab) +
  1584. scale_color_brewer(palette = "Dark2") +
  1585. scale_fill_gradient(
  1586. name = "Normalized Ceramide Concentration",
  1587. low = "white",
  1588. high = "black"
  1589. ) +
  1590. theme(legend.position = "top")
  1591. if (set == "IGCs") {
  1592. dbrda.plot <- dbrda.plot +
  1593. gg_figure_caption(caption = caption, caption.width = 110)
  1594. }
  1595. return(dbrda.plot)
  1596. })
  1597. plot_grid(
  1598. plotlist = diet.ceramide.plots,
  1599. ncol = 1,
  1600. rel_heights = c(2, 1.3)
  1601. ) %>% ggsave(
  1602. filename = file.path(plotDir, "diet_by_ceramide_ordinations.png"),
  1603. dpi = img.dpi,
  1604. width = img.wd * 1.5,
  1605. height = img.ht * 2
  1606. )
  1607. ```
  1608. ![](Plots/diet_by_ceramide_ordinations.png)
  1609. ![](Plots/diet_by_ceramide_permanova_results.png)
  1610. The KOs dataset yielded the most significant results between metagenomic composition and ceramide concentration by diet treatment interactions (Figure 6 & Table 6). Specifically brain ceramides C20, C22, C22:1, and C24; and liver ceramides C16 and C22 exhibited significant associations with differences in KO composition between samples in a diet-dependent manner. Brain ceramides C20 and C22, and liver ceramide C16 showed significant associations with differences in IGC composition of the gut microbiome.
  1611. ### Associations with individual functional annotations
  1612. ```{r ceramide-modelling}
  1613. threshholds <- c(0.95, 0.8, 0.6, 0.4, 0.2, 0)
  1614. glm.cer.sig.dt.file <- file.path(
  1615. saveDir,
  1616. "dt_allCeramide_randForests_imptFeature_sig_interactions.rds"
  1617. )
  1618. glm.cer.sig.dt <- redo.if("ceramide.random.forest", glm.cer.sig.dt.file, {
  1619. cl <- makeCluster(nCores, type = "FORK", outfile = "")
  1620. registerDoParallel(cl, nCores)
  1621. res.dt <- lapply(annotation.sets, function(set) {
  1622. set <- "KOs"
  1623. ft <- str_remove(set, "s$")
  1624. rf.list <- gen.covar.random.forests(
  1625. covars = ceramide.ids,
  1626. threshholds = threshholds,
  1627. physeq = ps.cer.list[[set]],
  1628. feature.type = ft,
  1629. save.memory = { set == "IGCs" }
  1630. )
  1631. all.sig.impt.dt <- id.sig.important.features(
  1632. randForest.list = rf.list,
  1633. feature.type = ft
  1634. )
  1635. trans.and.cat.dt <- trans.and.cat.covars(
  1636. dt = copy(ceramide.dt),
  1637. covars = ceramide.ids
  1638. )
  1639. res <- covar.impt.feature.regressions(
  1640. covars = ceramide.ids,
  1641. sig.feature.dt = all.sig.impt.dt,
  1642. covar.dt = trans.and.cat.dt,
  1643. physeq = ps.cer.list[[set]],
  1644. feature.type = ft
  1645. )
  1646. names(res)[2] <- "Feature"
  1647. res[, Set := set]
  1648. setcolorder(res, 4)
  1649. saveRDS(
  1650. res,
  1651. file.path(saveDir, paste0("glm_cer_", set, "_dt.rds"))
  1652. )
  1653. return(res)
  1654. }) %>% rbindlist()
  1655. stopCluster(cl)
  1656. res.dt[Intrxn.pval < 0.05]
  1657. })
  1658. ```
  1659. ```{r ceramide-modelling-table}
  1660. names(igc.eggnog.map) <- c("Feature", "Name")
  1661. glms.sig.igc.dt <- igc.eggnog.map[glm.cer.sig.dt[Set == "IGCs"], on = "Feature"]
  1662. glms.sig.kos.dt <- map.tbl[
  1663. glm.cer.sig.dt[Set == "KOs" & Feature != "Diet"],
  1664. on = "Feature"
  1665. ]
  1666. all.names <- unique(c(names(glms.sig.igc.dt), names(glms.sig.kos.dt)))
  1667. names.ordered <- all.names[c(3, 1:2, 6:7, 4:5)]
  1668. for (col.name in names.ordered[!(names.ordered %in% names(glms.sig.igc.dt))]) {
  1669. glms.sig.igc.dt[[col.name]] <- NA
  1670. }
  1671. glms.sig.igc.dt <- glms.sig.igc.dt[, ..names.ordered]
  1672. print.glm.sig.dt <- rbind(glms.sig.igc.dt, glms.sig.kos.dt)
  1673. write.table(
  1674. print.glm.sig.dt[order(Set, Covar, Feature)],
  1675. file = file.path(plotDir, "diet_by_covars_rf_sig_impt_features_table.csv"),
  1676. row.names = FALSE,
  1677. sep = ","
  1678. )
  1679. ```
  1680. ```{r ceramide-modelling-plots}
  1681. modelling.plotDir <- "Plots/Diet_by_ceramide_rf_sig_impt_features_plots"
  1682. if (!dir.exists(modelling.plotDir)) { dir.create(modelling.plotDir) }
  1683. trans.and.cat.res <- lapply(annotation.sets, function(set) {
  1684. trans.and.cat.covars(
  1685. dt = sample.data.table(ps.cer.list[[set]]),
  1686. covars = ceramide.ids,
  1687. reference = T
  1688. ) %>% return()
  1689. })
  1690. sig.features.dt <- lapply(annotation.sets, function(set) {
  1691. if (set == "IGCs") {
  1692. res <- igc.eggnog.map[glm.cer.sig.dt[Set == "IGCs"], on = "Feature"]
  1693. names(res)[1] <- "Feature"
  1694. setcolorder(res, c(3:4, 1:2, 5))
  1695. } else {
  1696. res <- glm.cer.sig.dt[Set == "KOs" & Feature != "Diet"]
  1697. res[, Name := NA]
  1698. setcolorder(res, c(1:3, 5, 4))
  1699. }
  1700. return(res)
  1701. }) %>% rbindlist()
  1702. # covar <- covars[1]
  1703. # set <- "IGCs"
  1704. to.plot <- lapply(ceramide.ids, function(covar) {
  1705. covar.plots <- lapply(annotation.sets, function(set) {
  1706. linear.plot <- !trans.and.cat.res[[set]]$REF.DT[Covar == covar]$Categorized
  1707. if (linear.plot) {
  1708. plot.linear.interactions(
  1709. covar = covar,
  1710. covar.dt = trans.and.cat.res[[set]]$DT,
  1711. ref.dt = trans.and.cat.res[[set]]$REF.DT,
  1712. sig.features.dt = sig.features.dt[Set == set],
  1713. physeq = ps.cer.list[[set]],
  1714. feature.type = str_remove(set, "s$")
  1715. )
  1716. } else {
  1717. plot.logistic.interactions(
  1718. covar = covar,
  1719. covar.dt = trans.and.cat.res[[set]]$DT,
  1720. sig.features.dt = sig.features.dt[Set == set],
  1721. physeq = ps.cer.list[[set]],
  1722. feature.type = str_remove(set, "s$")
  1723. )
  1724. }
  1725. })
  1726. grid.data <- lapply(covar.plots, function(plot) {
  1727. panels <- ggplot_build(plot)$data[[1]]$PANEL %>%
  1728. as.numeric() %>%
  1729. max()
  1730. nrows <- ifelse(
  1731. panels %in% 7:8, 3, ifelse(panels > 3, floor(sqrt(panels)), 1)
  1732. )
  1733. data.table(
  1734. Panels = panels,
  1735. Rows = nrows,
  1736. Cols = ceiling(panels / nrows)
  1737. )
  1738. }) %>% rbindlist()
  1739. top.panel <- covar.plots[[1]]
  1740. bottom.panel <- covar.plots[[2]]
  1741. col.diff <- abs(diff(grid.data$Cols))
  1742. if (col.diff != 0) {
  1743. if (grid.data$Cols[1] < grid.data$Cols[2]) {
  1744. top.panel.list <- c(list(covar.plots[[1]]), as.list(rep("", col.diff)))
  1745. for (i in 2:(col.diff + 1)) {
  1746. top.panel.list[i] <- list(NULL)
  1747. }
  1748. top.panel <- plot_grid(
  1749. plotlist = top.panel.list,
  1750. nrow = 1,
  1751. rel_widths = c(max(c(grid.data$Cols[1], 1.2)), rep(1, col.diff))
  1752. )
  1753. } else {
  1754. bottom.panel.list <- top.panel.list <- c(
  1755. list(covar.plots[[2]]),
  1756. as.list(rep("", col.diff))
  1757. )
  1758. for (i in 2:(col.diff + 1)) {
  1759. bottom.panel.list[i] <- list(NULL)
  1760. }
  1761. bottom.panel <- plot_grid(
  1762. plotlist = bottom.panel.list,
  1763. nrow = 1,
  1764. rel_widths = c(max(c(grid.data$Cols[2], 1.2)), rep(1, col.diff))
  1765. )
  1766. }
  1767. }
  1768. rel.hts <- grid.data$Rows
  1769. rel.hts[rel.hts == 1] <- 1.2
  1770. fig.wd <- max(c(img.wd * max(grid.data$Cols) / 2, img.wd))
  1771. fig.ht <- max(c(img.ht * sum(grid.data$Rows) / 3), img.ht)
  1772. plot_grid(
  1773. top.panel,
  1774. bottom.panel,
  1775. ncol = 1,
  1776. rel_heights = rel.hts
  1777. ) %>%
  1778. ggsave(
  1779. filename = file.path(modelling.plotDir, paste0(covar, ".png")),
  1780. dpi = img.dpi,
  1781. width = fig.wd,
  1782. height = fig.ht
  1783. )
  1784. })
  1785. ```
  1786. ## Summary
  1787. Overall, we have discovered that supplementing a high fat diet with xanthohumol, or either of its derivatives that we examined here, affects the composition of both the potential functional capacity and taxonomy of the gut microbiome in mice. Diet supplementation has the greatest predictive power of any of the covariates we examined in this study (Supplemental Tables). Furthermore, we were able to identify associations between both spatial learning covariates and brain and liver ceramide concentrations and the abundances of specific functions (KOs and IGCs) in the gut metagenome. The associations we highlighted here may be of particular interest as they were dependent on the particular dietary supplement supplied to the mice, indicating that related molecules like XN, DXN, and TXN can have significanly different effects on the functional potential of gut microbiome as well as concentrations of biologically important compounds in host tissues.

README.Rmd at commit 182d547, no license · at the source

Overview

Authors: Alexandra Alexiev1,2, Keaton Stagaman1, Kristin Kasschau1,2, Yang Zhang3, Jacob Raber4, Adrian F. Gombart2,5, Claudia S. Maier2,6, Jan F. Stevens2,7, Thomas J. Sharpton1,2,8
  1. Department of Microbiology, Oregon State University, Corvallis, OR, United States
  2. Linus Pauling Institute, Oregon State University, Corvallis, OR, United States
  3. School of Biological and Population Health Sciences, Nutrition Program, Linus Pauling Institute, Oregon State University, Corvallis, OR, United States
  4. School of Medicine, Oregon Health and Science University, Portland, OR, United States
  5. Department of Biochemistry and Biophysics, Oregon State University, Corvallis, OR, United States
  6. Department of Chemistry, Oregon State University, Corvallis, OR, United States
  7. Department of Pharmaceutical Sciences, Oregon State University, Corvallis, OR, United States
  8. Department of Statistics, Oregon State University, Corvallis, OR, United States
Institutions: Oregon State University (United States); Oregon Health & Science University (United States)
Journal: Frontiers in physiology, volume 17, article 1886058
Dates: received 20 May 2026; accepted 17 July 2026; published online 5 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fphys.2026.1886058 · PMID 42620357 · PMCID PMC13485733 · OpenAlex W7172486853
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: mouse (organism), cognitive (subfield)
Methods: Statistics, Machine learning
Keywords: bile acid (BA) metabolism, ceramide metabolism, cognition, gut metagenome, high-fat diet, tetrahydroxanthohumol, xanthohumol (PubChemCID: 639665), α,β-dihydro-xanthohumol
Topic: Hops Chemistry and Applications (Pharmacology, Pharmacology, Toxicology and Pharmaceutics), according to OpenAlex
Funding: NCRR NIH HHS (S10 RR027878); NCCIH NIH HHS (R01 AT009168)
Citations: not cited yet (Europe PMC); 55 references in the paper

Abstract

Obesity-associated cognitive decline represents a growing public health concern, yet the mechanisms linking high-fat diet (HFD) to neurological impairment remain incompletely understood. Xanthohumol (XN) and its non-estrogenic derivatives, tetrahydroxanthohumol (TXN) and α,β-dihydro-xanthohumol (DXN), improve metabolic dysfunction and cognitive impairment associated with diet-induced obesity. The mechanisms underlying these cognitive benefits remain poorly defined, but all three compounds improve glucose tolerance, spatial learning and memory in obese C57BL/6J mice. We hypothesized that the gut-liver-brain axis associates with these effects through modulation of gut microbial functional capacity and host ceramide metabolism. To test this, we integrated shotgun metagenomes with lipidomic and behavioral data from male C57BL/6J mice fed a HFD supplemented with XN, TXN, or DXN to determine (1) whether supplementation differentially alters gut metagenome functional capacity, (2) whether variation in the gut metagenome links to cognitive outcomes, and (3) whether supplementation-induced variation in the gut metagenome is associated with alterations in ceramide and bile acid levels in the liver and hippocampus. We found that microbial gene abundance was associated with spatial learning outcomes across all treatment groups, including genes involved in tryptophan metabolism. Gut microbiome composition was also linked to ceramide levels in both hepatic and hippocampal tissues, with C22 ceramide emerging as a shared biomarker. TXN supplementation additionally reduced secondary bile acids HDCA and a DCA-isomer, extending prior 16S rRNA-based findings to the level of microbial gene function. Collectively, these results are consistent with a model in which XN and its derivatives act upon the gut-liver-brain axis to improve cognition in obese mice in association with changes to gut microbial functional capacity (most notably in bile acid and ceramide metabolism, with tryptophan metabolism as a secondary observation).

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

Repository

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

aalexiev/XanthohumolMicrobiome

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 182d547186501e81e4c0cff25a35ec1168c2dd7f, 6 July 2026
Languages: R (14)
Size: 213 files, 14 scripts
Software Heritage: not archived
Found in: the text, “Statistical approach”
Holds: README, 1 notebook
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: tidyverse (5 files), car (3 files), ggplot2 (3 files), broom (2 files), caret (2 files), data.table (2 files), cowplot (1 file), ggpubr (1 file), randomForest (1 file), reshape2 (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
15 files

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

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

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

Data availability statement

The datasets presented in this study can be found in online repositories. The names of the repository/repositories and accession number(s) can be found in the article/Supplementary Material.

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

Recorded: type, language, journal, volume, pages, dates, 9 authors, 8 keywords, 2 funders, 55 references.

Cite

This paper

Alexiev, A., Stagaman, K., Kasschau, K., Zhang, Y., Raber, J., Gombart, A. F., Maier, C. S., Stevens, J. F., & Sharpton, T. J. (2026). Xanthohumol and its non-estrogenic derivatives link to the gut-liver-brain axis to improve cognition in mice with diet-induced obesity. Frontiers in physiology, 17, 1886058. https://doi.org/10.3389/fphys.2026.1886058

BibTeX

@article{alexiev2026xanthohumol,
author = {Alexiev, Alexandra and Stagaman, Keaton and Kasschau, Kristin and Zhang, Yang and Raber, Jacob and Gombart, Adrian F. and Maier, Claudia S. and Stevens, Jan F. and Sharpton, Thomas J.},
title = {{Xanthohumol and its non-estrogenic derivatives link to the gut-liver-brain axis to improve cognition in mice with diet-induced obesity}},
journal = {Frontiers in physiology},
year = {2026},
month = aug,
volume = {17},
pages = {1886058},
publisher = {Frontiers Media SA},
issn = {1664-042X},
doi = {10.3389/fphys.2026.1886058},
url = {https://doi.org/10.3389/fphys.2026.1886058},
pmid = {42620357},
pmcid = {PMC13485733}
}

RIS

TY - JOUR
AU - Alexiev, Alexandra
AU - Stagaman, Keaton
AU - Kasschau, Kristin
AU - Zhang, Yang
AU - Raber, Jacob
AU - Gombart, Adrian F.
AU - Maier, Claudia S.
AU - Stevens, Jan F.
AU - Sharpton, Thomas J.
TI - Xanthohumol and its non-estrogenic derivatives link to the gut-liver-brain axis to improve cognition in mice with diet-induced obesity
T2 - Frontiers in physiology
J2 - Front Physiol
PY - 2026
DA - 2026/08/05
VL - 17
SP - 1886058
SN - 1664-042X
PB - Frontiers Media SA
DO - 10.3389/fphys.2026.1886058
UR - https://doi.org/10.3389/fphys.2026.1886058
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fphys.2026.1886058",
"type": "article-journal",
"title": "Xanthohumol and its non-estrogenic derivatives link to the gut-liver-brain axis to improve cognition in mice with diet-induced obesity",
"container-title": "Frontiers in physiology",
"author": [
{
"family": "Alexiev",
"given": "Alexandra"
},
{
"family": "Stagaman",
"given": "Keaton"
},
{
"family": "Kasschau",
"given": "Kristin"
},
{
"family": "Zhang",
"given": "Yang"
},
{
"family": "Raber",
"given": "Jacob"
},
{
"family": "Gombart",
"given": "Adrian F."
},
{
"family": "Maier",
"given": "Claudia S."
},
{
"family": "Stevens",
"given": "Jan F."
},
{
"family": "Sharpton",
"given": "Thomas J."
}
],
"container-title-short": "Front Physiol",
"volume": "17",
"page": "1886058",
"DOI": "10.3389/fphys.2026.1886058",
"PMID": "42620357",
"PMCID": "PMC13485733",
"ISSN": "1664-042X",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fphys.2026.1886058",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
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.1186/s40168-026-02342-8 [code]
Impacts of host genetics on gut microbiome composition in Alzheimer's disease.
Journal: Microbiome
In common: randomForest, caret, cowplot, 5 other tools, 5 references
[2] 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: randomForest, car, broom, 6 other tools
[3] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: randomForest, caret, broom, 5 other tools, mouse
[4] doi:10.1126/sciadv.aec9291 [code]
Computational mechanisms of perception in autism revealed using games inspired by rodent operant tasks.
Journal: Science advances
In common: caret, car, broom, 5 other tools, cognitive
[5] doi:10.3390/ijms27156925 [code]
XGBoost-SHAP Interpretable Modeling Identifies and Validates an Eight-Gene Biomarker for Hepatic Encephalopathy Risk Prediction in Cirrhosis.
Journal: International journal of molecular sciences
In common: randomForest, caret, cowplot, 5 other tools
[6] doi:10.1038/s41592-026-03211-w [code]
Spatial isoform sequencing at single-cell resolution reveals cell-type-specific spatial isoform variability in multiple brain cell types.
Journal: Nature methods
In common: caret, broom, cowplot, 5 other tools, mouse
[7] doi:10.1093/braincomms/fcag146 [code]
Convergent structural brain alterations in chronic pain: a multi-metric individual participant data meta-analysis.
Journal: Brain communications
In common: caret, car, broom, 5 other tools
[8] doi:10.1093/braincomms/fcag236 [code]
Dynamic, state-dependent characteristics of cognitive fluctuations in Lewy body dementia: a magnetoencephalography study.
Journal: Brain communications
In common: randomForest, caret, broom, 4 other tools
[9] doi:10.7717/peerj.21426 [code]
Integrated transcriptomic identification and validation reveal key autophagy-associated biomarkers in sleep deprivation.
Journal: PeerJ
In common: randomForest, caret, cowplot, 4 other tools, mouse
[10] 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 America
In common: car, broom, cowplot, 5 other tools

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.