OSCR

Phocaeicola vulgatus improves anxiety-like behavior by ameliorating amygdala neuroinflammation and the neurite impairment in IBS.

Code ↔ Paper

2 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 2 matches
  1. [1] § Materials and methods › Mendelian randomization ↔ R/format_mr_results2.R, lines 137–214 · score 0.65 · inverse variance weighted, weighted median, MR Egger, SNPs
  2. [2] § Materials and methods › Mendelian randomization ↔ R/mr.R, lines 882–921 · score 0.61 · instrumental variable, weighted median, modification, IVW, Mendelian, randomization

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 · 460 lines · 17 KB · other · 1 match

  1. #' Split outcome column
  2. #'
  3. #' This function takes the outcome column from the results generated by [mr()] and splits it into separate columns for 'outcome name' and 'id'.
  4. #'
  5. #' @param mr_res Results from [mr()].
  6. #'
  7. #' @export
  8. #' @return data frame
  9. split_outcome <- function(mr_res) {
  10. Pos <- grep("\\|\\|", mr_res$outcome) #the "||"" indicates that the outcome column was derived from summary data in MR-Base. Sometimes it won't look like this e.g. if the user has supplied their own outcomes
  11. if (sum(Pos) != 0) {
  12. Outcome <- as.character(mr_res$outcome[Pos])
  13. Vars <- strsplit(Outcome, split = "\\|\\|")
  14. Vars <- unlist(Vars)
  15. Vars <- trim(Vars)
  16. Trait <- Vars[seq(1, length(Vars), by = 2)]
  17. id <- Vars[seq(2, length(Vars), by = 2)]
  18. mr_res$outcome <- as.character(mr_res$outcome)
  19. mr_res$outcome[Pos] <- Trait
  20. }
  21. return(mr_res)
  22. }
  23. #' Split exposure column
  24. #'
  25. #' This function takes the exposure column from the results generated by [mr()] and splits it into separate columns for 'exposure name' and 'id'.
  26. #'
  27. #' @param mr_res Results from [mr()].
  28. #'
  29. #' @export
  30. #' @return data frame
  31. split_exposure <- function(mr_res) {
  32. Pos <- grep("\\|\\|", mr_res$exposure) #the "||"" indicates that the outcome column was derived from summary data in MR-Base. Sometimes it won't look like this e.g. if the user has supplied their own outcomes
  33. # Pos2<-grep("\\|\\|",mr_res$exposure,invert=T)
  34. # mr_res2 <-mr_res[Pos2,]
  35. # mr_res1<-mr_res[Pos,]
  36. if (sum(Pos) != 0) {
  37. Exposure <- as.character(mr_res$exposure[Pos])
  38. Vars <- strsplit(as.character(Exposure), split = "\\|\\|")
  39. Vars <- unlist(Vars)
  40. Vars <- trim(Vars)
  41. Trait <- Vars[seq(1, length(Vars), by = 2)]
  42. mr_res$exposure <- as.character(mr_res$exposure)
  43. mr_res$exposure[Pos] <- Trait
  44. }
  45. return(mr_res)
  46. }
  47. #' Generate odds ratios
  48. #'
  49. #' This function takes b and se from [mr()] and generates odds ratios and 95 percent confidence intervals.
  50. #'
  51. #' @param mr_res Results from [mr()].
  52. #'
  53. #' @export
  54. #' @return data frame
  55. generate_odds_ratios <- function(mr_res) {
  56. mr_res$lo_ci <- mr_res$b - 1.96 * mr_res$se
  57. mr_res$up_ci <- mr_res$b + 1.96 * mr_res$se
  58. mr_res$or <- exp(mr_res$b)
  59. mr_res$or_lci95 <- exp(mr_res$lo_ci)
  60. mr_res$or_uci95 <- exp(mr_res$up_ci)
  61. return(mr_res)
  62. }
  63. #' Subset MR-results on method
  64. #'
  65. #' This function takes MR results from [mr()] and restricts to a single method per exposure x disease combination.
  66. #'
  67. #' @param mr_res Results from [mr()].
  68. #' @param single_snp_method Which of the single SNP methods to use when only 1 SNP was used to estimate the causal effect? The default is `"Wald ratio"`.
  69. #' @param multi_snp_method Which of the multi-SNP methods to use when there was more than 1 SNPs used to estimate the causal effect? The default is `"Inverse variance weighted"`.
  70. #'
  71. #' @export
  72. #' @return data frame.
  73. subset_on_method <- function(
  74. mr_res,
  75. single_snp_method = "Wald ratio",
  76. multi_snp_method = "Inverse variance weighted"
  77. ) {
  78. dat <- subset(
  79. mr_res,
  80. (nsnp == 1 & method == single_snp_method) | (nsnp > 1 & method == multi_snp_method)
  81. )
  82. return(dat)
  83. }
  84. #' Combine all mr results
  85. #'
  86. #' This function combines results of [mr()], [mr_heterogeneity()], [mr_pleiotropy_test()] and [mr_singlesnp()] into a single data frame.
  87. #' It also merges the results with outcome study level characteristics in [available_outcomes()].
  88. #' If desired it also exponentiates results (e.g. if the user wants log odds ratio converted into odds ratios with 95 percent confidence intervals).
  89. #' The exposure and outcome columns from the output from [mr()] contain both the trait names and trait ids.
  90. #' The `combine_all_mrresults()` function splits these into separate columns by default.
  91. #'
  92. #' @param res Results from [mr()].
  93. #' @param het Results from [mr_heterogeneity()].
  94. #' @param plt Results from [mr_pleiotropy_test()].
  95. #' @param sin Results from [mr_singlesnp()].
  96. #' @param ao_slc Logical; if set to `TRUE` then outcome study level characteristics are retrieved from [available_outcomes()]. Default is `TRUE`.
  97. #' @param Exp Logical; if set to `TRUE` results are exponentiated. Useful if user wants log odds ratios expressed as odds ratios. Default is `FALSE`.
  98. #' @param split.exposure Logical; if set to `TRUE` the exposure column is split into separate columns for the exposure name and exposure ID. Default is `FALSE`.
  99. #' @param split.outcome Logical; if set to `TRUE` the outcome column is split into separate columns for the outcome name and outcome ID. Default is `FALSE`.
  100. #'
  101. #' @export
  102. #' @return data frame
  103. #
  104. # library(TwoSampleMR)
  105. # library(MRInstruments)
  106. # exp_dat <- extract_instruments(outcomes=c(2,300))
  107. # chd_out_dat <- extract_outcome_data(
  108. # snps = exp_dat$SNP,
  109. # outcomes = c(6,7,8,9)
  110. # )
  111. # dat <- harmonise_data(
  112. # exposure_dat = exp_dat,
  113. # outcome_dat = chd_out_dat
  114. # )
  115. # dat<-power.prune(dat,method.size=F)
  116. # Res<-mr(dat)
  117. # Het<-mr_heterogeneity(dat)
  118. # Plt<-mr_pleiotropy_test(dat)
  119. # Sin<-mr_singlesnp(dat)
  120. # All.res<-combine_all_mrresults(Res=Res,Het=Het,Plt=Plt,Sin=Sin)
  121. # All.res<-split_exposure(All.res)
  122. # All.res<-split_outcome(All.res)
  123. combine_all_mrresults <- function(
  124. res,
  125. het,
  126. plt,
  127. sin,
  128. ao_slc = TRUE,
  129. Exp = FALSE,
  130. split.exposure = FALSE,
  131. split.outcome = FALSE
  132. ) {
  133. het <- het[, c("id.exposure", "id.outcome", "method", "Q", "Q_df", "Q_pval")]
  134. # Convert all factors to character
  135. factors_to_character <- function(df) {
  136. df[] <- lapply(df, function(x) if (is.factor(x)) as.character(x) else x)
  137. df
  138. }
  139. res <- factors_to_character(res)
  140. het <- factors_to_character(het)
  141. sin <- factors_to_character(sin)
  142. sin <- sin[grep("[:0-9:]", sin$SNP), ]
  143. sin$method <- "Wald ratio"
  144. names(sin)[names(sin) == "p"] <- "pval"
  145. # Res<-Res[Res$method %in% c("MR Egger","Weighted median","Inverse variance weighted"),]
  146. #method is also the name of an argument in the method function. this prevents all.x argument from working. rename method column
  147. names(res)[names(res) == "method"] <- "Method"
  148. names(het)[names(het) == "method"] <- "Method"
  149. names(sin)[names(sin) == "method"] <- "Method"
  150. res <- merge(res, het, by = c("id.outcome", "id.exposure", "Method"), all.x = TRUE)
  151. res <- data.table::rbindlist(
  152. list(
  153. res,
  154. sin[, c(
  155. "exposure",
  156. "outcome",
  157. "id.exposure",
  158. "id.outcome",
  159. "SNP",
  160. "b",
  161. "se",
  162. "pval",
  163. "Method"
  164. )]
  165. ),
  166. fill = TRUE,
  167. use.names = TRUE
  168. )
  169. data.table::setDF(res)
  170. if (ao_slc) {
  171. ao <- available_outcomes()
  172. names(ao)[names(ao) == "nsnp"] <- "nsnps.outcome.array"
  173. res <- merge(
  174. res,
  175. ao[, !names(ao) %in% c("unit", "priority", "sd", "path", "note", "filename", "access", "mr")],
  176. by.x = "id.outcome",
  177. by.y = "id"
  178. )
  179. }
  180. res$nsnp[is.na(res$nsnp)] <- 1
  181. for (i in unique(res$id.outcome)) {
  182. wald_snps <- paste(
  183. res$SNP[res$id.outcome == i & res$Method == "Wald ratio"],
  184. collapse = "; "
  185. )
  186. res$SNP[res$id.outcome == i & res$Method != "Wald ratio"] <- wald_snps
  187. }
  188. if (Exp) {
  189. res$or <- exp(res$b)
  190. res$or_lci95 <- exp(res$b - res$se * 1.96)
  191. res$or_uci95 <- exp(res$b + res$se * 1.96)
  192. }
  193. # add intercept test from MR Egger
  194. plt <- plt[, c("id.outcome", "id.exposure", "egger_intercept", "se", "pval")]
  195. plt$Method <- "MR Egger"
  196. names(plt)[names(plt) == "egger_intercept"] <- "intercept"
  197. names(plt)[names(plt) == "se"] <- "intercept_se"
  198. names(plt)[names(plt) == "pval"] <- "intercept_pval"
  199. res <- merge(res, plt, by = c("id.outcome", "id.exposure", "Method"), all.x = TRUE)
  200. if (split.exposure) {
  201. res <- split_exposure(res)
  202. }
  203. if (split.outcome) {
  204. res <- split_outcome(res)
  205. }
  206. Cols <- c(
  207. "Method",
  208. "outcome",
  209. "exposure",
  210. "nsnp",
  211. "b",
  212. "se",
  213. "pval",
  214. "intercept",
  215. "intercept_se",
  216. "intercept_pval",
  217. "Q",
  218. "Q_df",
  219. "Q_pval",
  220. "consortium",
  221. "ncase",
  222. "ncontrol",
  223. "pmid",
  224. "population"
  225. )
  226. res <- res[, c(names(res)[names(res) %in% Cols], names(res)[which(!names(res) %in% Cols)])]
  227. # names(ResSNP)<-tolower(names(ResSNP))
  228. return(res)
  229. }
  230. #' Power prune
  231. #'
  232. #' When there are duplicate summary sets for a particular exposure-outcome combination, this function keeps the
  233. #' exposure-outcome summary set with the highest expected statistical power.
  234. #' This can be done by dropping the duplicate summary sets with the smaller sample sizes.
  235. #' Alternatively, the pruning procedure can take into account instrument strength and outcome sample size.
  236. #' The latter is useful, for example, when there is considerable variation in SNP coverage between duplicate summary sets
  237. #' (e.g. because some studies have used targeted or fine mapping arrays).
  238. #' If there are a large number of SNPs available to instrument an exposure,
  239. #' the outcome GWAS with the better SNP coverage may provide better power than the outcome GWAS with the larger sample size.
  240. #'
  241. #' @param dat Results from [harmonise_data()].
  242. #' @param method Should the duplicate summary sets be pruned on the basis of sample size alone (`method = 1`)
  243. #' or a combination of instrument strength and sample size (`method = 2`)? Default set to `1`.
  244. #' When set to 1, the duplicate summary sets are first dropped on the basis of the outcome sample size (smaller duplicates dropped).
  245. #' If duplicates are still present, remaining duplicates are dropped on the basis of the exposure sample size (smaller duplicates dropped).
  246. #' When method is set to `2`, duplicates are dropped on the basis of instrument strength
  247. #' (amount of variation explained in the exposure by the instrumental SNPs) and sample size,
  248. #' and assumes that the SNP-exposure effects correspond to a continuous trait with a normal distribution (i.e. exposure cannot be binary).
  249. #' The SNP-outcome effects can correspond to either a binary or continuous trait. If the exposure is binary then `method=1` should be used.
  250. #'
  251. #' @param dist.outcome The distribution of the outcome. Can either be `"binary"` or `"continuous"`. Default set to `"binary"`.
  252. #'
  253. #' @export
  254. #' @return data.frame with duplicate summary sets removed
  255. power_prune <- function(dat, method = 1, dist.outcome = "binary") {
  256. # dat[,c("eaf.exposure","beta.exposure","se.exposure","samplesize.outcome","ncase.outcome","ncontrol.outcome")]
  257. if (method == 1) {
  258. id.sets <- paste(split_exposure(dat)$exposure, split_outcome(dat)$outcome)
  259. id.set.unique <- unique(id.sets)
  260. dat$id.set <- as.numeric(factor(id.sets))
  261. L <- vector("list", length(id.set.unique))
  262. for (i in seq_along(id.set.unique)) {
  263. # print(i)
  264. print(paste(
  265. "finding summary set for --",
  266. id.set.unique[i],
  267. "-- with largest sample size",
  268. sep = ""
  269. ))
  270. dat1 <- dat[id.sets == id.set.unique[i], ]
  271. id.subset <- paste(dat1$exposure, dat1$id.exposure, dat1$outcome, dat1$id.outcome)
  272. id.subset.unique <- unique(id.subset)
  273. dat1$id.subset <- as.numeric(factor(id.subset))
  274. ncase <- dat1$ncase.outcome
  275. if (is.null(ncase)) {
  276. ncase <- NA
  277. }
  278. if (anyNA(ncase)) {
  279. ncase <- dat1$samplesize.outcome
  280. if (dist.outcome == "binary") {
  281. warning(paste(
  282. "dist.outcome set to binary but case sample size is missing. Will use total sample size instead but power pruning may be less accurate"
  283. ))
  284. }
  285. }
  286. if (anyNA(ncase)) {
  287. stop("sample size missing for at least 1 summary set")
  288. }
  289. # Permute dat1 and ncase identically; sort() would drop NA values and
  290. # misalign ncase from dat1's rows.
  291. ncase_ord <- order(ncase, decreasing = TRUE)
  292. dat1 <- dat1[ncase_ord, ]
  293. # id.expout<-paste(split_exposure(dat)$exposure,split_outcome(dat)$outcome)
  294. ncase <- ncase[ncase_ord]
  295. # dat1$power.prune.ncase<-"drop"
  296. # dat1$power.prune.ncase[ncase==ncase[1]]<-"keep"
  297. dat1 <- dat1[ncase == ncase[1], ]
  298. nexp <- dat1$samplesize.exposure
  299. nexp_ord <- order(nexp, decreasing = TRUE)
  300. dat1 <- dat1[nexp_ord, ]
  301. nexp <- nexp[nexp_ord]
  302. # dat1$power.prune.nexp<-"drop"
  303. # dat1$power.prune.nexp[nexp==nexp[1]]<-"keep"
  304. # dat1$power.prune<-"drop"
  305. # dat1$power.prune[dat1$power.prune.ncase=="keep" & dat1$power.prune.nexp == "keep"]<-"keep"
  306. # dat1<-dat1[,!names(dat1) %in% c("power.prune.ncase","power.prune.nexp")]
  307. # dat1[,c("samplesize.exposure","ncase.outcome","exposure","outcome")]
  308. dat1 <- dat1[nexp == nexp[1], ]
  309. L[[i]] <- dat1
  310. }
  311. dat <- data.table::rbindlist(L)
  312. dat <- dat[, !names(dat1) %in% c("id.set", "id.subset")]
  313. # if (drop.duplicates == T) {
  314. # dat<-dat[dat$power.prune=="keep",]
  315. # }
  316. return(dat)
  317. }
  318. if (method == 2) {
  319. id.sets <- paste(split_exposure(dat)$exposure, split_outcome(dat)$outcome)
  320. id.set.unique <- unique(id.sets)
  321. dat$id.set <- as.numeric(factor(id.sets))
  322. L <- vector("list", length(id.set.unique))
  323. for (i in seq_along(id.set.unique)) {
  324. dat1 <- dat[id.sets == id.set.unique[i], ]
  325. # unique(dat1[,c("exposure","outcome")])
  326. id.subset <- paste(dat1$exposure, dat1$id.exposure, dat1$outcome, dat1$id.outcome)
  327. id.subset.unique <- unique(id.subset)
  328. dat1$id.subset <- as.numeric(factor(id.subset))
  329. L1 <- vector("list", length(id.subset.unique))
  330. for (j in seq_along(id.subset.unique)) {
  331. # print(j)
  332. print(paste("identifying best powered summary set: ", id.subset.unique[j], sep = ""))
  333. dat2 <- dat1[id.subset == id.subset.unique[j], ]
  334. p <- dat2$eaf.exposure #effect allele frequency
  335. # b<-abs(dat2$beta.exposure) # effect of SNP on risk factor
  336. se <- dat2$se.exposure
  337. z <- dat2$beta.exposure / dat2$se.exposure
  338. n <- dat2$samplesize.exposure
  339. b <- z / sqrt(2 * p * (1 - p) * (n + z^2))
  340. if (anyNA(dat2$ncase.outcome)) {
  341. stop(paste("number of cases missing for summary set: ", id.subset.unique[j], sep = ""))
  342. }
  343. n.cas <- dat2$ncase.outcome
  344. n.con <- dat2$ncontrol.outcome
  345. var <- 1 # variance of risk factor assumed to be 1
  346. r2 <- 2 * b^2 * p * (1 - p) / var
  347. if (anyNA(r2)) {
  348. warning(
  349. "beta or allele frequency missing for some SNPs, which could affect accuracy of power pruning"
  350. )
  351. }
  352. r2 <- r2[!is.na(r2)]
  353. # k<-length(p[!is.na(p)]) #number of SNPs in the instrument / associated with the risk factor
  354. # n<-min(n) #sample size of the exposure/risk factor GWAS
  355. r2sum <- sum(r2) # sum of the r-squares for each SNP in the instrument
  356. # F<-r2sum*(n-1-k)/((1-r2sum*k )
  357. if (dist.outcome == "continuous") {
  358. iv.se <- 1 / sqrt(mean(dat2$samplesize.outcome, na.rm = TRUE) * r2sum) #standard error of the IV should be proportional to this
  359. }
  360. if (dist.outcome == "binary") {
  361. if (anyNA(n.cas) || anyNA(n.con)) {
  362. warning(
  363. "dist.outcome set to binary but number of cases or controls is missing. Will try using total sample size instead but power pruning will be less accurate"
  364. )
  365. iv.se <- 1 / sqrt(mean(dat2$samplesize.outcome, na.rm = TRUE) * r2sum)
  366. } else {
  367. iv.se <- 1 / sqrt(mean(n.cas, na.rm = TRUE) * mean(n.con, na.rm = TRUE) * r2sum) #standard error of the IV should be proportional to this
  368. }
  369. }
  370. # Power calculations to implement at some point
  371. # iv.se<-1/sqrt(unique(n.cas)*unique(n.con)*r2sum) #standard error of the IV should be proportional to this
  372. # n.outcome<-unique(n.con+n.cas)
  373. # ratio<-unique(n.cas/n.con)
  374. # sig<-alpha #alpha
  375. # b1=log(or) # assumed log odds ratio
  376. # power<-pnorm(sqrt(n.outcome*r2sum*(ratio/(1+ratio))*(1/(1+ratio)))*b1-qnorm(1-sig/2))
  377. dat2$iv.se <- iv.se
  378. # dat2$power<-power
  379. L1[[j]] <- dat2
  380. }
  381. L[[i]] <- data.table::rbindlist(L1)
  382. }
  383. dat2 <- data.table::rbindlist(L)
  384. dat2 <- dat2[order(dat2$id.set, dat2$iv.se), ]
  385. id.sets <- unique(dat2$id.set)
  386. id.keep <- vector("list", length(id.sets))
  387. for (i in seq_along(id.sets)) {
  388. # print(i)
  389. # print(id.sets[i])
  390. id.temp <- unique(dat2[dat2$id.set == id.sets[i], c("id.set", "id.subset")])
  391. id.keep[[i]] <- paste(id.temp$id.set, id.temp$id.subset)[1]
  392. }
  393. dat2$power.prune <- "drop"
  394. dat2$power.prune[paste(dat2$id.set, dat2$id.subset) %in% id.keep] <- "keep"
  395. # if (drop.duplicates == T) {
  396. dat2 <- dat2[dat2$power.prune == "keep", ]
  397. # }
  398. dat2 <- dat2[, !names(dat2) %in% c("iv.se", "power.prune", "id.set", "id.subset")]
  399. dat <- dat2
  400. # dat2[,c("exposure","outcome","iv.se","power","id.set","id.subset","power.prune")]
  401. # unique(dat2[order(dat2$id.set,dat2$id.subset),c("samplesize.exposure","ncase.outcome","exposure","outcome","iv.se","power","id.set","id.subset")])
  402. # dat2[dat2$id.set==1,c("iv.se","id.set","id.subset")]
  403. return(dat)
  404. }
  405. }
  406. #' Size prune
  407. #'
  408. #' Whens there are duplicate summary sets for a particular exposure-outcome combination,
  409. #' this function drops the duplicates with the smaller total sample size
  410. #' (for binary outcomes, the number of cases is used instead of total sample size).
  411. #'
  412. #' @param dat Results from [harmonise_data()].
  413. #'
  414. #' @export
  415. #' @return data frame
  416. size.prune <- function(dat) {
  417. dat$ncase[is.na(dat$ncase)] <- dat$samplesize[is.na(dat$ncase)]
  418. dat <- dat[order(dat$ncase, decreasing = TRUE), ]
  419. id.expout <- paste(dat$exposure, dat$outcome)
  420. id.keep <- id.expout[!duplicated(data.frame(dat$exposure, dat$originalname.outcome))]
  421. dat <- dat[id.expout %in% id.keep, ]
  422. }

format_mr_results2.R at commit d4df219, under other · at the source

Overview

Authors: Jiacheng Wu1, Jing He1, Kailu Zhang2, Xiaoming Liu2, Pengcheng Yang1, Dongke Wang1, Zhiyue Xu1, Wei Qian1, Lei Zhang1, Ziqiao Lei2, Xiaohua Hou1,3, Bai Tao1,4
ORCID iDs: Xiaoming Liu, Bai Tao
  1. Division of Gastroenterology, Union Hospital, Tongji Medical College, Huazhong University of Science and Technology, Wuhan, Hubei 430022 China
  2. Department of Radiology, Union Hospital, Tongji Medical College, Huazhong University of Science and Technology, Wuhan, 430022 China
  3. Department of Gastroenterology, The Central Hospital of Wuhan, Tongji Medical College, Huazhong University of Science and Technology, Wuhan, 430014 China
  4. Department of Gastroenterology, Tianyou Hospital, College of Medicine, Wuhan University of Science and Technology, Wuhan, 430064 China
Journal: Translational psychiatry, volume 16, issue 1, article 422
Dates: received 3 December 2025; accepted 22 May 2026; published online 15 June 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1038/s41398-026-04142-y · PMID 42289401 · PMCID PMC13493998 · OpenAlex W7164734559
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: fMRI (modality), human (organism), mouse (organism), other condition (population)
Methods: Statistics, Smoothing, state filtering, decompositions, Machine learning, Connectivity
Keywords: Biomarkers, Psychiatric disorders, Molecular neuroscience
MeSH: Amygdala*, Anxiety*, Irritable Bowel Syndrome*, Adult, Animals, Disease Models, Animal, Female, Gastrointestinal Microbiome, Humans, Magnetic Resonance Imaging, Male, Mice, Mice, Inbred C57BL (* major topic)
Topic: Gastrointestinal motility and disorders (Gastroenterology, Medicine), according to OpenAlex
Funding: Natural Science Foundation of Hubei Province (Hubei Provincial Natural Science Foundation) (2023AFB807); National Natural Science Foundation of China (National Science Foundation of China) (92268108, 81900477)
Citations: not cited yet (Europe PMC); 70 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

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

MRCIEU/TwoSampleMR

License: other
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: d4df21929fdabeb2f89686ffaad0db5f56973d64, 25 September 2026
Languages: R (68)
Size: 238 files, 68 scripts
Software Heritage: not archived
Found in: the text, “Mendelian randomization”
Holds: README, license file, CITATION.cff, environment (DESCRIPTION), tests, continuous integration, documentation, 8 notebooks
Tools: data.table (17 files), ggplot2 (10 files), tidyverse (5 files), cowplot (2 files), psych (2 files), car (1 file), glmnet (1 file), randomForest (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
71 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;
  • 68 scripts, each with its path and the digest of its content;
  • 2 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

Data links

Data availability statement

The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

  • it points to a dataset: NCBI

Read it in the paper: doi.org/10.1038/s41398-026-04142-y.

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, issue, pages, dates, 12 authors, 3 keywords, 13 MeSH terms, 2 funders, 68 references.

Cite

This paper

Wu, J., He, J., Zhang, K., Liu, X., Yang, P., Wang, D., Xu, Z., Qian, W., Zhang, L., Lei, Z., Hou, X., & Tao, B. (2026). Phocaeicola vulgatus improves anxiety-like behavior by ameliorating amygdala neuroinflammation and the neurite impairment in IBS. Translational psychiatry, 16(1), 422. https://doi.org/10.1038/s41398-026-04142-y

BibTeX

@article{wu2026phocaeicola,
author = {Wu, Jiacheng and He, Jing and Zhang, Kailu and Liu, Xiaoming and Yang, Pengcheng and Wang, Dongke and Xu, Zhiyue and Qian, Wei and Zhang, Lei and Lei, Ziqiao and Hou, Xiaohua and Tao, Bai},
title = {{Phocaeicola vulgatus improves anxiety-like behavior by ameliorating amygdala neuroinflammation and the neurite impairment in IBS}},
journal = {Translational psychiatry},
year = {2026},
month = jun,
volume = {16},
number = {1},
pages = {422},
publisher = {Nature Publishing Group},
issn = {2158-3188},
doi = {10.1038/s41398-026-04142-y},
url = {https://doi.org/10.1038/s41398-026-04142-y},
pmid = {42289401},
pmcid = {PMC13493998}
}

RIS

TY - JOUR
AU - Wu, Jiacheng
AU - He, Jing
AU - Zhang, Kailu
AU - Liu, Xiaoming
AU - Yang, Pengcheng
AU - Wang, Dongke
AU - Xu, Zhiyue
AU - Qian, Wei
AU - Zhang, Lei
AU - Lei, Ziqiao
AU - Hou, Xiaohua
AU - Tao, Bai
TI - Phocaeicola vulgatus improves anxiety-like behavior by ameliorating amygdala neuroinflammation and the neurite impairment in IBS
T2 - Translational psychiatry
J2 - Transl Psychiatry
PY - 2026
DA - 2026/06/15
VL - 16
IS - 1
SP - 422
SN - 2158-3188
PB - Nature Publishing Group
DO - 10.1038/s41398-026-04142-y
UR - https://doi.org/10.1038/s41398-026-04142-y
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41398-026-04142-y",
"type": "article-journal",
"title": "Phocaeicola vulgatus improves anxiety-like behavior by ameliorating amygdala neuroinflammation and the neurite impairment in IBS",
"container-title": "Translational psychiatry",
"author": [
{
"family": "Wu",
"given": "Jiacheng"
},
{
"family": "He",
"given": "Jing"
},
{
"family": "Zhang",
"given": "Kailu"
},
{
"family": "Liu",
"given": "Xiaoming"
},
{
"family": "Yang",
"given": "Pengcheng"
},
{
"family": "Wang",
"given": "Dongke"
},
{
"family": "Xu",
"given": "Zhiyue"
},
{
"family": "Qian",
"given": "Wei"
},
{
"family": "Zhang",
"given": "Lei"
},
{
"family": "Lei",
"given": "Ziqiao"
},
{
"family": "Hou",
"given": "Xiaohua"
},
{
"family": "Tao",
"given": "Bai"
}
],
"container-title-short": "Transl Psychiatry",
"volume": "16",
"issue": "1",
"page": "422",
"DOI": "10.1038/s41398-026-04142-y",
"PMID": "42289401",
"PMCID": "PMC13493998",
"ISSN": "2158-3188",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41398-026-04142-y",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
15
]
]
}
}

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/s12916-026-04869-x [code]
The tissue-specific effects of glucose-lowering drug targets on aging mediated through DNA methylation: a multi-omics genetic study.
Journal: BMC medicine
In common: randomForest, glmnet, psych, 5 other tools, other condition
[2] doi:10.1016/j.isci.2026.115657 [code]
Integration of machine learning to develop a disulfidptosis model for predicting glioma prognosis, immunotherapy response, and drug.
Journal: iScience
In common: glmnet, psych, car, 4 other tools, other condition
[3] 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, cowplot, 3 other tools, other condition, 1 reference
[4] 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, cowplot, data.table, 2 other tools, 2 references
[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, glmnet, cowplot, 3 other tools, other condition
[6] doi:10.7717/peerj.21426 [code]
Integrated transcriptomic identification and validation reveal key autophagy-associated biomarkers in sleep deprivation.
Journal: PeerJ
In common: randomForest, glmnet, cowplot, 3 other tools, mouse
[7] doi:10.3390/ijms27093997 [code]
Coordinated Multicellular Immune Programs and Drug Targets Revealed by Single-Cell Analysis in Driver-Mutated NSCLC.
Journal: International journal of molecular sciences
In common: glmnet, psych, cowplot, 3 other tools, other condition
[8] 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: glmnet, psych, car, 3 other tools
[9] 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: glmnet, psych, car, 3 other tools
[10] doi:10.3389/fphys.2026.1886058 [code]
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
In common: randomForest, car, cowplot, 3 other tools, mouse

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.