---
title: "OmniCorr: Salmon multi-omics integration workflow"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{OmniCorr – Salmon Workflow}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---



## Overview

This vignette demonstrates the **core OmniCorr workflow** using the salmon multi-omics dataset  
(which serves as the main example in the
OmniCorr manuscript).

Main steps shown in this document:

- Loading processed example data  
- Checking & fixing sample alignment  
- Computing cross-omics correlations  
- Visualizing results using aligned heatmaps

All preprocessing steps (from raw sequencing → processed data)  
are provided separately in the `raw-data/` directory of the repository.

### Data provenance & preprocessing

The example datasets distributed with **OmniCorr** were generated from:

- Transcriptomics  
- Metagenomics  
- Metatranscriptomics

Complete preprocessing workflows (normalization, filtering,
WGCNA-based feature clustering, etc.) are documented in:

raw-data/ ├── transcriptomics/ │ └── Transcriptomics_preprocessing.Rmd ├── metagenomics/ │ └── Metagenomics_preprocessing.Rmd └── metatranscriptomics/ └── Metatranscriptomics_preprocessing.Rmd


The final processed objects are saved as `.rda` files and shipped with the package.

## Load OmniCorr + example data


``` r
library(OmniCorr)

data(Transcriptomics)
data(Metagenomics)
data(Metatranscriptomics)
data(metadata)

Each dataset contains:

  • rows = samples
  • columns = features / modules / hubs / taxa / …

Very important: Sample alignment (required!)

All omics layers must contain exactly the same samples in the same order.

# Quick check
all(
  rownames(Transcriptomics) == rownames(Metagenomics) &
  rownames(Transcriptomics) == rownames(Metatranscriptomics)
)
#> [1] TRUE

If order is wrong / samples are missing → use the helper function:

df_list <- CheckSampleOrder(Transcriptomics, Metagenomics)
#> Sample order aligned successfully.

Transcriptomics <- df_list$df1
Metagenomics <- df_list$df2

df_list <- CheckSampleOrder(Transcriptomics, Metatranscriptomics)
#> Sample order aligned successfully.

Transcriptomics <- df_list$df1
Metatranscriptomics <- df_list$df2

Workflow steps

Step 1 – Feature clustering (using reference layer = Transcriptomics)

library(WGCNA)
#> Loading required package: dynamicTreeCut
#> Loading required package: fastcluster
#> 
#> Attaching package: 'fastcluster'
#> The following object is masked from 'package:stats':
#> 
#>     hclust
#> 
#> Attaching package: 'WGCNA'
#> The following object is masked from 'package:stats':
#> 
#>     cor

dendro <- hclust(
  d = as.dist(1 - bicor(Transcriptomics, maxPOutliers = 0.05)),
  method = "ward.D2"
)

Step 2 – Transcriptomics reference heatmap

library(pheatmap)

tx_heatmap <- pheatmap(
  t(Transcriptomics),
  cluster_rows = dendro,
  cluster_cols  = FALSE,
  show_rownames = FALSE,
  main          = "Transcriptomics"
)

→ This heatmap will serve as structural backbone for all following plots

Step 3 – Cross-omics correlation analysis

# Transcriptomics ↔ Metagenomics
corr_mg <- calculate_correlations(
  df1 = Transcriptomics,
  df2 = Metagenomics,
  show_significance = "stars"
)

# Transcriptomics ↔ Metatranscriptomics
corr_mt <- calculate_correlations(
  df1 = Transcriptomics,
  df2 = Metatranscriptomics,
  show_significance = "stars"
)

Each result contains:

  • $correlation
  • $p_value
  • $p_value_adj
  • $signif_matrix (the stars/symbols matrix)

Step 4 – Beautiful aligned correlation heatmaps

library(RColorBrewer)

heatmap_colors <- colorRampPalette(rev(brewer.pal(11, "RdBu")))(51)


# Metagenomics correlations
hm_mg <- pheatmap(
  corr_mg$correlation,
  color         = heatmap_colors,
  cluster_rows  = dendro,
  display_numbers = corr_mg$signif_matrix,
  breaks        = seq(-1, 1, length.out = 51),
  show_rownames = FALSE,
  legend        = FALSE,
  main          = "Metagenomics"
)



# Metatranscriptomics correlations
hm_mt <- pheatmap(
  corr_mt$correlation,
  color         = heatmap_colors,
  cluster_rows  = dendro,
  display_numbers = corr_mt$signif_matrix,
  breaks        = seq(-1, 1, length.out = 51),
  show_rownames = TRUE,
  legend        = TRUE,
  main          = "Metatranscriptomics"
)

Bonus: Correlation with metadata

corr_meta <- calculate_correlations(
  df1 = Transcriptomics,
  df2 = metadata,
  use = "pairwise.complete.obs",
  show_significance = "stars"
)

pheatmap(
  corr_meta$correlation,
  color         = heatmap_colors,
  cluster_rows  = dendro,
  display_numbers = corr_meta$signif_matrix,
  breaks        = seq(-1, 1, length.out = 51),
  show_rownames = TRUE,
  main          = "Environmental variables / Metadata"
)

Summary

This vignette shows the core OmniCorr workflow using the salmon multi-omics example.

Where to look next:

  • Full preprocessing → raw-data/ folder
  • All processed example data → inside the package (data())
  • Other case studies → look for Case_Study_2 (cattle)

Good luck with your multi-omics integration projects! 🐟

sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] cowplot_1.2.0         RColorBrewer_1.1-3    pheatmap_1.0.13      
#> [4] WGCNA_1.74            fastcluster_1.3.0     dynamicTreeCut_1.63-1
#> [7] OmniCorr_0.99.0       rmarkdown_2.32       
#> 
#> loaded via a namespace (and not attached):
#>  [1] impute_1.87.0         gtable_0.3.6          circlize_0.4.18      
#>  [4] shape_1.4.6.1         rjson_0.2.23          xfun_0.61            
#>  [7] bslib_0.12.0          ggplot2_4.0.3         htmlwidgets_1.6.4    
#> [10] GlobalOptions_0.1.4   lattice_0.23-1        vctrs_0.7.3          
#> [13] tools_4.6.1           generics_0.1.4        stats4_4.6.1         
#> [16] parallel_4.6.1        cluster_2.1.8.3       Matrix_1.7-6         
#> [19] data.table_1.18.6.1   checkmate_2.3.4       S7_0.2.2             
#> [22] S4Vectors_0.51.10     lifecycle_1.0.5       stringr_1.6.0        
#> [25] compiler_4.6.1        farver_2.1.2          codetools_0.2-20     
#> [28] ComplexHeatmap_2.29.0 clue_0.3-68           htmltools_0.5.9      
#> [31] sys_3.4.3             buildtools_1.0.0      sass_0.4.10          
#> [34] yaml_2.3.12           preprocessCore_1.75.1 htmlTable_2.5.0      
#> [37] Formula_1.2-6         crayon_1.5.3          jquerylib_0.1.4      
#> [40] cachem_1.1.0          Hmisc_5.3-0           iterators_1.0.14     
#> [43] rpart_4.1.27          foreach_1.5.2         digest_0.6.39        
#> [46] stringi_1.8.9         maketools_1.3.2       splines_4.6.1        
#> [49] fastmap_1.2.0         grid_4.6.1            colorspace_2.1-3     
#> [52] cli_3.6.6             magrittr_2.0.5        base64enc_0.1-6      
#> [55] survival_3.8-12       withr_3.0.3           foreign_0.8-91       
#> [58] scales_1.4.0          backports_1.5.1       matrixStats_1.5.0    
#> [61] otel_0.2.0            nnet_7.3-21           gridExtra_2.3.1      
#> [64] png_0.1-9             GetoptLong_1.1.1      evaluate_1.0.5       
#> [67] knitr_1.52            IRanges_2.47.5        doParallel_1.0.17    
#> [70] rlang_1.3.0           Rcpp_1.1.2            glue_1.8.1           
#> [73] BiocGenerics_0.59.12  rstudioapi_0.19.0     jsonlite_2.0.0       
#> [76] R6_2.6.1