knitr::opts_chunk$set(echo = TRUE)
Quantitative stable isotope probing (qSIP) is the combination of stable isotope probing – a foundational technique in the study of ecosystems – with targeted amplicon sequencing data of microbial communities. In conventional stable isotope probing (SIP) experiments, identification of the amount of isotopic enrichment of nucleic acids was done qualitatively – through visual identification and categorization of nucleic acids into either "heavy" or "light" regions. The qSIP approach is to divide a single sample into many different fractions (without a priori categorization) along a gradient of increasing densities, and to estimate the shift in density of an individual microbial taxon's nucleic acids based on it's abundance across the many fractions [@Hungate2015]. Further details on the qSIP methodology may be found in @Purcell2019. The core calculation produces estimates of every microbial taxon's proportion of enrichment which are often used as stand-ins for growth. However, qsip can also estimate population per-capita rates of growth and death [@Koch2018].
The qsip package is built on the data structures of the phyloseq package. Phyloseq uses S4 object classification to organize different aspects of microbial sequencing data into a single object (see Data Preparation, below). The purpose of phyloseq is to minimize the code necessary to perform common operations on microbial community datasets such as filtering out, or retaining, certain taxonomic lineages or groups of samples.
The qsip package supports stable isotope experiments using ^18^O, ^13^C, and ^15^N [@Morrissey2018]. It is also agnostic towards the amplicon being sequenced. It will support 16S, 18S, ITS, or other amplicon sequencing data.
Conducting a qSIP experiment is, in many ways, an exercise in data organization. In an amplicon sequencing study, a single sequencing sample is usually produced from DNA extracted from a single point of collection (unless samples are pooled, in which case many points of collection yield one sequencing sample). In a qSIP experiment, DNA from each sample is divided into usually more than a dozen fractions which must all be sequenced separately. Because of this, as well as to make this package as easy to use as possible, consistent terminology should be applied to any qSIP experiment.
qsip is not currently on CRAN. The only way to install qsip is through Github. See here if you encounter issues installing phyloseq.
# install devtools and BiocManager install.packages('devtools') install.packages('BiocManager') # install phyloseq and qsip using the utilities on devtools and BiocManagerK BiocManager::install('phyloseq') devtools::install_github('bramstone/qsip') library(phyloseq) library(qsip)
Here, go into how to organize and prepare experimental data, the feature table, and taxonomic data for phyloseq combination. Spend the most time on experimental data.
Feature tables must be combined with taxonomic and experimental data into a single phyloseq object.
dat <- specify_qsip(dat, density='Density.g.ml', abund='avg_16S_g_soil', rep_id='sampleID', rep_group='ecosystem', iso='18O', iso_trt='isotope', timepoint='timepoint') # high-level qSIP-related data will display upon printing dat
One of the first diagnostic plots that should be generated from an enrichment experiment is the enrichment curve. Often, this is done even before sequencing efforts begin. The basic idea of the enrichment curve is to plot the change in density of DNA due to the incorporation of stable isotopes.
With qsip, enrichment curves may be plotted from phyloseq, phylosip, or basic data.frame objects. Because phylosip objects already have replicates, fractions, densities, and qPCR abundances specified, no other information is necessary. Using phyloseq or data.frame objects requires the specification of this information.
# plot from phylosip object plot_curve(dat) # plot from phyloseq object plot_curve(phlyo_dat, density='density_column', abund='qPCR_column', iso_trt='isotope_treatment_column') # plot from data.frame object plot_curve(exper_dat, density='density_column', abund='qPCR_column', iso_trt='isotope_treatment_column')
dat@qsip@filter_levels <- create_filters(2, 5, soft=1)
# atom excess fraction (AEF) or atom percent excess (APE) dat <- calc_excess(dat, separate_label=T, filter=T, correction=T) # per-capita growth dat <- calc_pop(dat, separate_label=T, filter=T, correction=T, growth_model='exponential') # show new data has been added dat names(dat@qsip)
# extract data related to isotopic "excess" and measures from "label"-ed samples qsip_enrich <- qsmelt(dat, include='excess|label', regex=T) head(qsip_enrich) # extract data related to birth and death qsip_growth <- qsmelt(dat, include='birth|death', abundance=T, regex=T) head(qsip_growth)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.