suppressPackageStartupMessages({ library(BiocStyle) library(TFutils) library(org.Hs.eg.db) library(GenomicFiles) library(GO.db) library(data.table) library(knitr) library(ggplot2) library(data.table) library(SummarizedExperiment) library(BiocParallel) data(fimoMap) })
A central concern of genome biology is improving understanding of gene transcription. In simple terms, transcription factors (TFs) are proteins that bind to DNA, typically near gene promoter regions. The role of TFs in gene expression variation is of great interest. Progress in deciphering genetic and epigenetic processes that affect TF abundance and function will be essential in clarifying and interpreting gene expression variation patterns and their effects on phenotype. Difficulties of identifying TFs, and opportunities for doing so in systems biology contexts, are reviewed in @Weirauch2014.
This paper describes an R/Bioconductor package called TFutils, which assembles various resources intended to clarify and unify approaches to working with TF concepts in bioinformatic analysis. Computations described in this paper can be carried out with Bioconductor version 3.6. The package can be installed with
library(BiocInstaller) # use source("http://www.bioconductor.org/biocLite.R") if not available biocLite("TFutils")
In the next section we describe the basic concepts of enumerating and classifying TFs, enumerating their targets, and representing genome-wide quantification of TF binding affinity. This is followed by a review of the key data structures and functions provided in the package, and an example in cancer infomatics.
Given the importance of the topic, it is not surprising that a number of bioinformatic research groups have published catalogs of transcription factors along with metadata about their features. Standard nomenclature for TFs has yet to be established. Gene symbols, motif sequences, and position-weight matrix catalog entries have all been used as TF identifiers.
In TFutils we have gathered information from four
widely used resources: Gene Ontology (GO, @Ashburner2000,
in which GO:0003700 is the tag for the molecular
function concept "DNA binding transcription factor activity"),
CISBP (@Weirauch2014), HOCOMOCO (@Kulakovskiy2018),
and MSigDb (@Subramanian15545).
Figure \@ref(fig:lkupset) depicts
the sizes of these
catalogs, measured using counts
of unique HGNC gene symbols.
The enumeration for GO uses Bioconductor's
r Biocpkg("org.Hs.eg.db")
package to
find direct associations from GO:0003700
to HGNC symbols. The enumeration for
MSigDb is heuristic
and involves parsing the gene set identifiers
used in MSigDb
for exact or close matches to HGNC symbols.
For CISBP and HOCOMOCO, the associated web
servers provide easily parsed tabular catalogs.
library(TFutils) library(AnnotationDbi) suppressMessages({ tfdf = select(org.Hs.eg.db::org.Hs.eg.db, keys="GO:0003700", keytype="GO", columns=c("ENTREZID", "SYMBOL")) }) tfdf = tfdf[, c("ENTREZID", "SYMBOL")] TFs_GO = TFCatalog(name="GO.0003700", nativeIds=tfdf$ENTREZID, HGNCmap=tfdf) data(tftColl) data(tftCollMap) TFs_MSIG = TFCatalog(name="MsigDb.TFT", nativeIds=names(tftColl), HGNCmap=data.frame(tftCollMap,stringsAsFactors=FALSE)) data(cisbpTFcat) TFs_CISBP = TFCatalog(name="CISBP.info", nativeIds=cisbpTFcat[,1], HGNCmap = cisbpTFcat) data(hocomoco.mono) TFs_HOCO = TFCatalog(name="hocomoco11", nativeIds=hocomoco.mono[,1], HGNCmap=hocomoco.mono)
suppressPackageStartupMessages({library(UpSetR)}) allhg = keys(org.Hs.eg.db::org.Hs.eg.db, keytype="SYMBOL") #activesym = unique(unlist(list(TFs_GO@HGNCmap[,2], TFs_HOCO@HGNCmap[,2], TFs_MSIG@HGNCmap[,2], TFs_CISBP@HGNCmap[,2]))) activesym = unique(unlist(list(HGNCmap(TFs_GO)[,2], HGNCmap(TFs_HOCO)[,2], HGNCmap(TFs_MSIG)[,2], HGNCmap(TFs_CISBP)[,2]))) use = intersect(allhg, activesym) mymat = matrix(0, nr=length(use), nc=4) rownames(mymat) = use iu = function(x) intersect(x,use) mymat[na.omit(iu(HGNCmap(TFs_GO)[,2])),1] = 1 mymat[na.omit(iu(HGNCmap(TFs_MSIG)[,2])),2] = 1 mymat[na.omit(iu(HGNCmap(TFs_HOCO)[,2])),3] = 1 mymat[na.omit(iu(HGNCmap(TFs_CISBP)[,2])),4] = 1 colnames(mymat) = c("GO", "MSigDb", "HOCO", "CISBP") upset(data.frame(mymat),nsets=4,sets=c("MSigDb", "HOCO", "GO", "CISBP"), keep.order=TRUE, order.by="degree" )
As noted by @Weirauch2014, interpretation of the "function and evolution of DNA sequences" is dependent on the analysis of sequence-specific DNA binding domains. These domains are dynamic and cell-type specific (@Gertz2013). Classifying TFs according to features of the binding domain is an ongoing process of increasing intricacy. Figure \@ref(fig:TFclass) shows excerpts of hierarchies of terms related to TF type derived from GO (on the left) and TFclass (@Wingender2018). There is a disagreement between our enumeration of TFs based on GO in Figure \@ref(fig:lkupset) and the 1919 shown in AmiGO, as the latter includes a broader collection of receptor activities.
knitr::include_graphics('AMIGOplus.png')
Table \@ref(tab:classtab) provides examples of frequently encountered TF classifications in the CISBP and HOCOMOCO catalogs. The numerical components of the HOCOMOCO classes correspond to TFClass subfamilies (@Wingender2018).
Table: (#tab:classtab) Most frequently represented TF classes in CISBP and HOCOMOCO. Entries in columns Nc (Nh) are numbers of distinct TFs annotated to classes in columns CISBP (HOCOMOCO) respectively.
library(knitr) cismap = HGNCmap(TFs_CISBP) scis = split(cismap, cismap$HGNC) uf = vapply(scis, function(x) x$Family_Name[1],"character") CISTOP = sort(table(uf),decreasing=TRUE)[1:10] hoc = HGNCmap(TFs_HOCO) shoc = split(hoc, hoc$HGNC) sfam = vapply(shoc, function(x)x$`TF family`[1], "character") HOTOP = sort(table(sfam),decreasing=TRUE)[1:10] kable(data.frame(CISBP=names(CISTOP), Nc=as.numeric(CISTOP), HOCOMOCO=names(HOTOP), Nh=as.numeric(HOTOP)), format="markdown")
The Broad Institute MSigDb (@Subramanian15545) includes
a gene set collection devoted to cataloging TF targets.
We have used Bioconductor's r Biocpkg("GSEABase")
package
to import and serialize the gmt
representation of this
collection.
TFutils::tftColl
Names of TFs for which target sets are assembled are encoded in a systematic way, with underscores separating substrings describing motifs, genes, and versions. Some peculiarity in nomenclature in the MSigDb labels can be observed:
grep("NFK", names(TFutils::tftColl), value=TRUE)
Manual curation will be needed to improve the precision with which MSigDb TF target sets can used.
The MSigDb collection is provided primarily for the purpose
of defining gene sets in terms of TF targets. We use the
r Biocpkg("GSEABase")
package GeneSetCollection
class
to manage these sets.
The FIMO algorithm of the MEME suite (@Grant2011) was used
to score the human reference genome for TF binding
affinity for r nrow(fimoMap)
motif matrices
to which genes are associated. Sixteen (16)
tabix-indexed BED files are lodged in an AWS S3
bucket for illustration purposes.
library(GenomicFiles) data(fimo16) fimo16 head(colData(fimo16))
We harvest scores in a genomic interval of interest
(bound to fimo16
in the rowRanges
assignment
below) using reduceByFile
.
This yields a list with one element per file. Each such
element holds a list of scanTabix
results, one per query range.
library(BiocParallel) register(SerialParam()) # important for macosx? rowRanges(fimo16) = GRanges("chr17", IRanges(38.077e6, 38.084e6)) rr = GenomicFiles::reduceByFile(fimo16, MAP=function(r,f) scanTabix(f, param=r))
scanTabix produces a list of vectors of text strings, which we parse
with data.table::fread
. The resulting tables are then
reduced to a genomic location and -log10 of the p-value derived
from the binding affinity statistic of FIMO in the vicinity
of that location.
asdf = function(x) data.table::fread(paste0(x, collapse="\n"), header=FALSE) gg = lapply(rr, function(x) { tmp = asdf(x[[1]][[1]]) data.frame(loc=tmp$V2, score=-log10(tmp$V7)) }) for (i in 1:length(gg)) gg[[i]]$tf = colData(fimo16)[i,2]
It turns out there are too many distinct TFs to display individually, so let's also label the scores with the TF families as defined in CISBP.
matchcis = match(colData(fimo16)[,2], cisbpTFcat[,2]) famn = cisbpTFcat[matchcis,]$Family_Name for (i in 1:length(gg)) gg[[i]]$tffam = famn[i] nn = do.call(rbind, gg)
A simple display of predicted TF binding affinity in a genomic region is then
library(ggplot2) ggplot(nn, aes(x=loc,y=score,group=tffam, colour=tffam)) + geom_point()
We have compared enumerations of human transcription factors
by different projects, provided access to two forms of
binding domain classification, and illustrated the use
of cloud-resident genome-wide binding predictions.
In the next section we review selected details of data structures
and methods of the r Biocpkg("TFutils")
package.
TFCatalog
classA number of relatively small reference
data(tftColl) data(tftCollMap) data(cisbpTFcat) TFs_MSIG = TFCatalog(name="MsigDb.TFT", nativeIds=names(tftColl), HGNCmap=data.frame(tftCollMap,stringsAsFactors=FALSE)) TFs_CISBP = TFCatalog(name="CISBP.info", nativeIds=cisbpTFcat[,1], HGNCmap = cisbpTFcat) TFs_MSIG TFs_CISBP
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.