MOAL: Multi Omic Analysis at Lab

Workflow summary:

Install moal and test omic() function workflow:

# -----
# Paris-Saclay - GPL3 - https://github.com/fdumbioinfo/moal
# title: 1 - moal omic() demo
# date: 10-10-2026
# -----
#
# Install moal
if(!require("moal",quietly=TRUE)){source("https://raw.githubusercontent.com/fdumbioinfo/rtools/main/moal-demo/0-moal-install-r-universe.r")}
if(!require("curl",quietly=TRUE)){install.packages("curl")}
#
# Test omic() 
library(moal)
??moal::omic
# create output directory
if(!dir.exists("1-omic-outputdata")){"1-omic-outputdata" %>% dir.create}
#
# data
# normalized gene expression matrix
"https://raw.githubusercontent.com/fdumbioinfo/rtools/main/moal-demo/inputdata/GSE65055_datanorm_22_23786.tsv" -> url
url %>% curl::curl_download("GSE65055_datanorm_22_23786.tsv",handle=curl::new_handle())
"GSE65055_datanorm_22_23786.tsv" %>% input -> dat
dat %>% head
# sample information file
"https://raw.githubusercontent.com/fdumbioinfo/rtools/main/moal-demo/inputdata/GSE65055_metadata_4_22.tsv" -> url
url %>% curl::curl_download("GSE65055_metadata_4_22.tsv",handle=curl::new_handle())
"GSE65055_metadata_4_22.tsv" %>% input -> sif
sif %>% head
# Ordering factors levels for fold-changes
sif$ANEUPLOIDY %>% ordered(c("Control","T13","T18","T21")) -> sif$ANEUPLOIDY
sif$TISSUE %>% as.factor -> sif$TISSUE
# gene annotation
dat$rowID %>% annotdb(species = "hs", idtype = "GENE", dboutput = "ncbi") -> annot
annot %>% head
annot %>% dplyr::select(GeneID,Symbol) -> annot
annot %>% head
#
# omic workflow : anova and GSEA functional analysis
"1-omic-outputdata" -> path
"GSE65055" -> dirname
NULL -> sample
T -> doena
parallel::detectCores() %>% "/"(2) -> nbcore
# NULL -> nbcore # use all core
#
omic(
  #
  # input
  dat = dat , sif = sif,
  annot = annot, species = "hs",
  #
  # anova model
  model = "ANEUPLOIDY", padj = "none", anovafc = "anovafc",
  batch = "TISSUE", 
  # paired = NULL,
  #
  # anova filters
  # threshold = c(1, 2, 3, 4, 9, 10, 11, 12),
  dovenn = T, docluster = T, dopattern = T,
  #
  # plot
  doheatmap = T, dovolcanoplot = T, dolineplot = T, doboxplotrow = T,
  #
  # functional analysis doena for GSEA and doenaora for ORA significant feature lists
  doena = doena, doenaora = F, gmtfiles = NULL,
  dotopheatmap = T, dotopgenesetheatmap = T, dogmtgenesetheatmap = F, 
  dotopnetwork = T, dotopgenesetnetwork = F, dogmtgenesetnetwork = F, 
  # 
  # output
  path = path, dirname = dirname, sample = sample,
  # parallelisation
  dopar = T, nbcore = nbcore, libloc = NULL, savehistory = T )
#

Test other examples for functional analysis, volcanoplot, heatmap...

UMS IPSIT BIOINFO at Paris Saclay University: https://www.ipsit.universite-paris-saclay.fr/?-bioinfo-

r-universe: https://fdumbioinfo.r-universe.dev/moal

bioRxiv preprint: https://doi.org/10.1101/2023.10.17.562686

Zenodo repository: https://zenodo.org/records/15309968

Release updates:

1.2.3

Add replacena function to replace NA or 0 value matrix by background noise distribution

Add normalization method to norm function : TMM, TMMwsp, RLE, upperquartile from EdgeR

Add omic function available without input data to simulate random H0 analysis using normal distribution accross factor levels

Change annot function name to annotdb

1.2.2

Update annotation packages and functional analysis available for Pan troglodytes, Bos taurus, Drosophila melanogaster, Caenorhabditis elegans

Automatically annot when dat matrix first column contains Ensembl gene or NCBI gene ID

Automatically join data and annotation tables (so could have different row numbers)

1.2.1

Fix bug for unbalanced design case using anova model with interaction. choose gsea rank Add three factors interaction design

1.2.0

Display improvements on graphics.

Improve omic() function workflow time computing.

Improve omic() output directory browsing and volume.

Enrichment function gsneain():