Clean up the environment

rm(list = ls())

Load required libraries for data reading, plotting, and data manipulation

library(readxl)       # For reading Excel files
library(ggpubr)       # For creating publication-ready plots
library(dplyr)        # For data manipulation
library(rstatix)      # For statistical tests and adding significance markers
library(knitr)        # For displaying tibbles in a nice table format
library(kableExtra)   # For enhancing table formatting

Load data

# Load targeted serum, liver, brain and urine data
Serum <- read_excel("Data/Data.xlsx", sheet = "Nec_serum_targeted")
Liver <- read_excel("Data/Data.xlsx", sheet = "Liver_targeted")
Brain <- read_excel("Data/Data.xlsx", sheet = "Brain_targeted")
Urine <- read_excel("Data/Data.xlsx", sheet = "Nec_urine_NMR")

# Load group information and necropsy metadata
PigInfo <- read_excel("Data/Data.xlsx", sheet = "PigInfo")
Nec_metadata <- read_excel("Data/Data.xlsx", sheet = "Nec_metadata")

Data organization

# Define the list of metabolites for each tissue/biofluid type
ls.serum.metabolites <- c("Tryptophan", "Kynurenine", "Quinolinate", "Niacinamide", "Serotonin")
ls.liver.metabolites <- c("Tryptophan", "Kynurenine", "Niacinamide", "NAD+", "Serotonin")
ls.brain.metabolites <- c("Tryptophan", "Kynurenine", "Serotonin")
ls.urine.metabolites <- c("Tryptophan", "Quinolinate", "Niacinamide", "1-Methylnicotinamide", "3-Indoxylsulfate", "N-Methyl-2-pyridone-5-carboxamide")
Data.serum <- Serum %>% 
                select(PigID, all_of(ls.serum.metabolites)) %>%
                rename_with(~ paste0("Serum_", .), all_of(ls.serum.metabolites))

Data.liver <- Liver %>% 
                select(PigID, all_of(ls.liver.metabolites)) %>%
                rename_with(~ paste0("Liver_", .), all_of(ls.liver.metabolites))


Data.hippocampus <- Brain %>% 
                      filter(Region == "Hippocampus") %>%
                      select(PigID, all_of(ls.brain.metabolites)) %>%
                      rename_with(~ paste0("Hippocampus_", .), all_of(ls.brain.metabolites))


Data.hypothalamus <- Brain %>% 
                        filter(Region == "Hypothalamus") %>%
                        select(PigID, all_of(ls.brain.metabolites)) %>%
                        rename_with(~ paste0("Hypothalamus_", .), all_of(ls.brain.metabolites))

Data.PFC <- Brain %>% 
              filter(Region == "PFC") %>%
              select(PigID, all_of(ls.brain.metabolites)) %>%
              rename_with(~ paste0("PFC_", .), all_of(ls.brain.metabolites))


Data.striatum <- Brain %>% 
                    filter(Region == "Striatum") %>%
                    select(PigID, all_of(ls.brain.metabolites)) %>%
                    rename_with(~ paste0("Striatum_", .), all_of(ls.brain.metabolites))


#Calculate effective osmolality
Effective.Osmolality <- Urine$`Urine osmolality` - (Urine$Urea/1000)

Data.urine <- Urine %>% mutate(across(everything(), ~ .x / Effective.Osmolality * 100)) %>% # Adjust metabolite concentrations based on effective osmolality
                          mutate(PigID = Urine$PigID) %>%  # Adding PigID to Data.urine0
                          select(PigID, all_of(ls.urine.metabolites)) %>%
                          rename_with(~ paste0("Urine_", .), all_of(ls.urine.metabolites))
Data.all <- inner_join(Data.serum, Data.liver, by = "PigID") %>%
              inner_join(Data.hippocampus, by = "PigID") %>%
              inner_join(Data.hypothalamus, by = "PigID") %>%
              inner_join(Data.PFC, by = "PigID") %>%
              inner_join(Data.striatum, by = "PigID") %>%
              inner_join(Data.urine, by = "PigID")

Calcualte spearman correlation between tryptophan and its metabolism products

Overall.cor <- Data.all %>% select(-PigID) %>% cor_test(method = "spearman")

# Define pairs of variables for which correlation is of interest
pairs_to_keep <- data.frame(
                    # relationship between serum trp and trp in tissue and urine:
                    var1 = "Serum_Tryptophan", var2 = "Liver_Tryptophan") %>%
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "Hippocampus_Tryptophan")) %>%
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "Hypothalamus_Tryptophan")) %>%
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "PFC_Tryptophan")) %>%
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "Striatum_Tryptophan")) %>%
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "Urine_Tryptophan")) %>%
                    # relationship between serum trp, indole and urine 3-indoxylsulfate
                    bind_rows(c(var1 = "Serum_Tryptophan", var2 = "Urine_3-Indoxylsulfate")) %>%
                    # relationship between brain trp and brain serotonin
                    bind_rows(c(var1 = "Hippocampus_Tryptophan", var2 = "Hippocampus_Serotonin")) %>%
                    bind_rows(c(var1 = "Hypothalamus_Tryptophan", var2 = "Hypothalamus_Serotonin")) %>%
                    bind_rows(c(var1 = "PFC_Tryptophan", var2 = "PFC_Serotonin")) %>%
                    bind_rows(c(var1 = "Striatum_Tryptophan", var2 = "Striatum_Serotonin")) %>%
                    # relationship between brain serotonin and serum serotonin
                    bind_rows(c(var1 = "Hippocampus_Serotonin", var2 = "Serum_Serotonin")) %>%
                    bind_rows(c(var1 = "Hypothalamus_Serotonin", var2 = "Serum_Serotonin")) %>%
                    bind_rows(c(var1 = "PFC_Serotonin", var2 = "Serum_Serotonin")) %>%
                    bind_rows(c(var1 = "Striatum_Serotonin", var2 = "Serum_Serotonin")) %>%
  
                    # relationships relate to kynurenine pathway in brain:
                    bind_rows(c(var1 = "Hippocampus_Tryptophan", var2 = "Hippocampus_Kynurenine")) %>%
                    bind_rows(c(var1 = "Hypothalamus_Tryptophan", var2 = "Hypothalamus_Kynurenine")) %>%
                    bind_rows(c(var1 = "PFC_Tryptophan", var2 = "PFC_Kynurenine")) %>%
                    bind_rows(c(var1 = "Striatum_Tryptophan", var2 = "Striatum_Kynurenine")) %>%

                    # relationships relate to kynurenine pathway in liver:
                    bind_rows(c(var1 = "Liver_Tryptophan", var2 = "Liver_Kynurenine")) %>%
                    bind_rows(c(var1 = "Liver_Kynurenine", var2 = "Liver_NAD+")) %>%
  
                    # relationship between NAD+ and urine tryptophan metabolites
                    bind_rows(c(var1 = "Liver_NAD+", var2 = "Urine_1-Methylnicotinamide")) %>%
                    bind_rows(c(var1 = "Liver_NAD+", var2 = "Urine_N-Methyl-2-pyridone-5-carboxamide")) %>%

                    # relationships relate to brain kynurenine and serum kynurenine
                    bind_rows(c(var1 = "Hippocampus_Kynurenine", var2 = "Serum_Kynurenine")) %>%
                    bind_rows(c(var1 = "Hypothalamus_Kynurenine", var2 = "Serum_Kynurenine")) %>%
                    bind_rows(c(var1 = "PFC_Kynurenine", var2 = "Serum_Kynurenine")) %>%
                    bind_rows(c(var1 = "Striatum_Kynurenine", var2 = "Serum_Kynurenine")) %>%
  
                    # relationships relate to serum kynurenine and liver kynurenine
                    bind_rows(c(var1 = "Serum_Kynurenine", var2 = "Liver_Kynurenine")) %>%

                    # relationships relate to serum quinolinate and  urine quinolinate
                    bind_rows(c(var1 = "Serum_Quinolinate", var2 = "Urine_Quinolinate")) 
                    
  
subset.cor <- Overall.cor %>% semi_join(pairs_to_keep, by = c("var1", "var2")) %>% 
                add_significance()
subset.cor %>% filter(p.signif != "ns") %>%
            kable() %>% # Print the tibble in a nice table format
            kable_styling(bootstrap_options = c("striped", "hover")) # Enhance table formatting
var1 var2 cor statistic p method p.signif
Serum_Tryptophan Liver_Tryptophan 0.50 1154.0000 0.014200 Spearman
Serum_Tryptophan Hippocampus_Tryptophan 0.58 960.0000 0.003340 Spearman **
Serum_Tryptophan Hypothalamus_Tryptophan 0.41 1362.0000 0.049000 Spearman
Serum_Tryptophan PFC_Tryptophan 0.65 796.0000 0.000711 Spearman ***
Serum_Tryptophan Striatum_Tryptophan 0.59 946.0000 0.002960 Spearman **
Serum_Tryptophan Urine_Tryptophan 0.41 1360.0000 0.048500 Spearman
Serum_Tryptophan Urine_3-Indoxylsulfate -0.43 3282.0000 0.038600 Spearman
Serum_Quinolinate Urine_Quinolinate 0.63 849.1063 0.000950 Spearman ***
Liver_NAD+ Urine_1-Methylnicotinamide 0.63 860.0000 0.001360 Spearman **
Liver_NAD+ Urine_N-Methyl-2-pyridone-5-carboxamide 0.50 1154.0000 0.014200 Spearman
sessionInfo()
## R version 4.2.2 (2022-10-31)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] kableExtra_1.3.4 knitr_1.45       rstatix_0.7.2    dplyr_1.1.3     
## [5] ggpubr_0.6.0     ggplot2_3.5.1    readxl_1.4.3    
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.0  xfun_0.40         bslib_0.5.1       purrr_1.0.2      
##  [5] carData_3.0-5     colorspace_2.1-0  vctrs_0.6.5       generics_0.1.3   
##  [9] viridisLite_0.4.2 htmltools_0.5.6.1 yaml_2.3.7        utf8_1.2.4       
## [13] rlang_1.1.2       jquerylib_0.1.4   pillar_1.9.0      glue_1.6.2       
## [17] withr_3.0.1       lifecycle_1.0.4   stringr_1.5.1     munsell_0.5.1    
## [21] ggsignif_0.6.4    gtable_0.3.5      cellranger_1.1.0  rvest_1.0.3      
## [25] evaluate_1.0.1    fastmap_1.1.1     fansi_1.0.6       highr_0.10       
## [29] broom_1.0.5       scales_1.3.0      backports_1.4.1   cachem_1.0.8     
## [33] webshot_0.5.5     jsonlite_1.8.8    abind_1.4-5       systemfonts_1.0.5
## [37] digest_0.6.33     stringi_1.7.12    grid_4.2.2        cli_3.6.2        
## [41] tools_4.2.2       magrittr_2.0.3    sass_0.4.7        tibble_3.2.1     
## [45] tidyr_1.3.0       car_3.1-2         pkgconfig_2.0.3   xml2_1.3.5       
## [49] rmarkdown_2.28    svglite_2.1.2     httr_1.4.7        rstudioapi_0.15.0
## [53] R6_2.5.1          compiler_4.2.2