An Introduction to the OmicsLonDA Package

  collapse = TRUE,
  comment = "#>"

OmicsLonDA (Omics Longitudinal Differential Analysis) is a statistical framework that provides robust identification of time intervals where omics features are significantly different between groups. OmicsLonDA is based on 5 main steps:

  1. Adjust measurements based on each subject's specific baseline
  2. Global testing using linear mixed-effect model to select candidate features and covariates for time intervals analysis
  3. Fitting smoothing spline regression model
  4. Monte Carlo permutation to generate the empirical distribution of the test statistic
  5. Inference of significant time intervals of omics features.

Getting Started



Install the latest version of OmicsLonDA from Bioconductor:

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager", repos = "")



## Load 10 simulated features and metadata

The measurment matrix represents count/intensity of features from an omic experiment. Columns represent various samples from different subjects longitudinally. Rows represent various features. Here is an example:

omicslonda_data_example$ome_matrix[1:5, 1:5]

The metadata dataframe contains annotations for each sample. Most impotantly it should have at least: (a) "Subject": which denote from which subject this sample is coming from, (b) "Group": which represents which group this sample is from (eg., healthy, disease, etc), (c) "Time": which represents the collection time of the corresponding sample. Here is an example:


Create SummarizedExperiment object

se_ome_matrix = as.matrix(omicslonda_data_example$ome_matrix)
se_metadata = DataFrame(omicslonda_data_example$metadata)
omicslonda_se_object = SummarizedExperiment(assays=list(se_ome_matrix),
                                            colData = se_metadata)

Adjust for baseline using CLR

omicslonda_se_object_adjusted = adjustBaseline(se_object = omicslonda_se_object)

Measurments after baseline adjustment

assay(omicslonda_se_object_adjusted)[1:5, 1:5]

Visualize first feature

omicslonda_test_object = omicslonda_se_object_adjusted[1,]
visualizeFeature(se_object = omicslonda_test_object, text = "Feature_1",
                 unit = "days", ylabel = "Normalized Count", 
                 col = c("blue", "firebrick"), prefix = tempfile())

Visualize first feature{width=400px}

Specify interval bounds

points = seq(1, 500, length.out = 500)

Run OmicsLonDA on the first feature

res = omicslonda(se_object = omicslonda_test_object, n.perm = 10,
                 fit.method = "ssgaussian", points = points, text = "Feature_1",
                 parall = FALSE, pvalue.threshold = 0.05, 
                 adjust.method = "BH", time.unit = "days",
                 ylabel = "Normalized Count",
                 col = c("blue", "firebrick"), prefix = tempfile())

Visualize fitted spline of the first feature

visualizeFeatureSpline(se_object = omicslonda_test_object, omicslonda_object = res, fit.method = "ssgaussian",
                        text = "Feature_1", unit = "days",
                        ylabel = "Normalized Count", 
                        col = c("blue", "firebrick"),
                        prefix = "OmicsLonDA_example")

Fitted spline of the first feature{width=400px}

Visulaize null distribution of the first feature's statistic

visualizeTestStatHistogram(omicslonda_object = res, text = "Feature_1", 
                                fit.method = "ssgaussian", prefix = tempfile())

null distribution of the first feature's statistic{width=400px}

Visulize significant time intervals of first feature

visualizeArea(omicslonda_object = res, fit.method = "ssgaussian",
              text = "Feature_1", unit = "days", 
              ylabel = "Normalized Count", col =
                c("blue", "firebrick"), prefix = tempfile())

Significant time intervals of feature 1{width=400px}

Save OmicsLonDA results in RData file

prefix = tempfile()
if (!dir.exists(prefix)){

save(res, file = sprintf("%s/Feature_%s_results_%s.RData",
                        prefix = prefix, text = "Feature_1", 
                        fit.method = "ssgaussian"))

Save a summary of time intervals statistics in csv file

prefix = tempfile()
if (!dir.exists(prefix)){
feature.summary =, res$details),
                                stringsAsFactors = FALSE)

write.csv(feature.summary, file = sprintf("%s/Feature_%s_Summary_%s.csv",
                                          prefix = prefix, text = "Feature_1", 
                                          fit.method = "ssgaussian"), row.names = FALSE)

Bugs and Suggestions

OmicsLonDA is under active research development. Please report any bugs/suggestions to Ahmed Metwally (

Try the OmicsLonDA package in your browser

Any scripts or data that you put into this service are public.

OmicsLonDA documentation built on Nov. 8, 2020, 5:50 p.m.