AnnotationFilter
作者: Martin Morgan [aut], Johannes Rainer [aut], Joachim Bargsten [ctb], Daniel Van Twisk [ctb], Bioconductor Package Maintainer [cre]
最后修改:2019-10-29 16:35:48
编译: 2019年10月29日星期二22:30:11

1简介

在Bioconductor中有大量的注释资源。访问这些数据库甚至单个表的全部内容在计算上是昂贵的,在许多情况下并不是必需的,因为用户可能只想提取数据的子集,例如单个基因的基因组坐标。在这方面,在数据提取之前过滤注释资源对性能有重大影响,并增加了这种基因组规模数据库的可用性。

AnnotationFilter包因此被开发来提供基本的过滤器类,使Bioconductor注释资源的通用过滤框架成为可能。AnnotationFilter为注释数据库中一些最常用的特性定义筛选器类,例如象征genename.每个筛选器类都应该在单个数据库表列上工作,并便于对所提供的值进行筛选。这样的筛选器类使用户能够构建复杂的查询来检索特定的注释,而不需要知道列名或表名或底层数据库的布局。虽然最初被开发用于Organism.dplyr而且ensembldb包、过滤器类和相关的过滤概念也可以很容易地添加到其他注释包中。

2过滤器类

所有筛选器类都扩展了基本类AnnotationFilter上课并选修一门或多门和一个条件允许对单个数据库表列进行筛选。根据输入值的类型,过滤器类分为:

  • CharacterFilter:取字符长度>= 1,支持条件==! =startsWith而且endsWith.一个例子就是aGeneIdFilter可以过滤基因id。

  • IntegerFilter:取单整数作为输入并支持条件==! =><> =而且< =.一个例子就是aGeneStartFilter它过滤了基因(染色体)起始坐标的结果。

  • DoubleFilter:取单数字作为输入并支持条件==! =><> =而且< =

  • GRangesFilter:是一个特殊的过滤器,因为它需要一个农庄作为价值并对列的组合(即开始和结束坐标以及序列名称和链)执行过滤。保持一致findOverlaps方法。IRanges类的构造函数GRangesFilter过滤器需要一个类型参数来定义其条件。支持的值为“任何”(默认值),检索与农庄“开始”而且“结束”将所有特征分别匹配到相同的起始坐标和结束坐标,“在”匹配所有的特征属性定义的范围农庄而且“平等”返回的特征值等于农庄

筛选器类的名称是直观的,第一部分对应于数据库列名,每个字符后跟a_大写,后面跟着关键字过滤器.数据库表列的筛选器的名称gene_id因此被称为GeneIdFilter.筛选器的默认数据库列存储在其槽(访问通过方法)。

supportedFilters方法可用于获取定义的所有可用筛选器对象的概述AnnotationFilter

库(AnnotationFilter) supportedFilters ()
# #过滤器领域# # 16 CdsEndFilter cds_end # # 15 CdsStartFilter cds_start # # 6 EntrezFilter entrez # # 19 ExonEndFilter exon_end # # 1 ExonIdFilter exon_id # # 2 ExonNameFilter exon_name # # 18 ExonRankFilter exon_rank # # 17 ExonStartFilter exon_start 24 GRangesFilter农庄# # # # 5 GeneBiotypeFilter gene_biotype # # 21 GeneEndFilter gene_end # # 3 GeneIdFilter gene_id # # 4 GeneNameFilter gene_name # # 20 GeneStartFilter gene_start # # 11 ProteinIdFilter protein_id # # 13 SeqNameFilter seq_name # # 147符号过滤器符号## 10 TxBiotypeFilter tx_biotype ## 23 TxEndFilter tx_end ## 8 TxIdFilter tx_id ## 9 TxNameFilter tx_name ## 22 TxStartFilter tx_start ## 12 UniprotFilter uniprot

注意AnnotationFilter包只提供筛选器类,而不提供应用筛选的功能。这种功能依赖于注释资源和数据库布局,因此需要在提供对注释资源访问的包中实现。

3.使用

创建过滤器通过它们的专用构造函数,例如GeneIdFilter函数为GeneIdFilter类。由于这种简单而廉价的创建,过滤器类被认为是只读因此不提供setter方法来更改它们的槽值。除了构造函数之外,AnnotationFilter提供以下功能翻译将表达式查询到筛选器类中(参见下面的示例)。

下面我们创建一个SymbolFilter可用于筛选注释资源以检索与指定符号值相关的所有条目。

- SymbolFilter("BCL2"
符号过滤器##条件:== ##值:BCL2

这样的筛选器应该用于检索与数据库表列中名为象征匹配筛选器的值“BCL2”

使用“startsWith”条件:我们可以定义一个过滤器来检索所有以指定值开头的基因名称/符号的基因条目(例如:“BCL2”而且“BCL2L11”对于下面的例子。

smbl <- SymbolFilter("BCL2", condition = "startsWith"
##类:SymbolFilter ##条件:startwith ##值:BCL2

除了构造函数之外,AnnotationFilter提供以更自然和直观的方式创建筛选器实例的功能翻译筛选器表达式(编写为公式,即以a开头).

smbl <- AnnotationFilter(~ symbol == "BCL2"
符号过滤器##条件:== ##值:BCL2

个人AnnotationFilter对象可以组合在AnnotationFilterList.这个类扩展列表并提供了额外的logicOp ()这定义了它的各个过滤器应该如何组合。的长度logicOp ()必须比筛选器对象的数目小1。中的每个元素logicOp ()定义两个连续的过滤器应该如何组合。下面我们创建一个AnnotationFilterList包含两个要与逻辑组合的筛选器对象

flt <- AnnotationFilter(~ symbol == "BCL2" & tx_biotype == "protein_coding"
##符号== 'BCL2' & tx_biotype == 'protein_coding'

注意AnnotationFilter函数(目前)不支持转换嵌套表达式,例如(symbol == "BCL2L11" & tx_biotype == "nonsense_mediated_decay") | (symbol == "BCL2" & tx_biotype == "蛋白编码").然而,这样的查询可以通过嵌套来构建AnnotationFilterList类。

为第一对过滤器定义过滤器查询。afl1 <- AnnotationFilterList(SymbolFilter("BCL2L11"), TxBiotypeFilter("nonsense_mediated_decay")) ##在(括号应合并)中定义第二个过滤器对。afl2 <- AnnotationFilterList(SymbolFilter("BCL2"), TxBiotypeFilter("protein_coding")) ##现在将两者与逻辑OR结合afl <- AnnotationFilterList(afl1, afl2, logicOp = "|") afl
##长度为2的注释过滤器列表## (symbol == 'BCL2L11' & tx_biotype == 'nonsense_mediated_decay') | (symbol == 'BCL2' & tx_biotype == 'protein_coding')

AnnotationFilterList现在要为基因的所有转录本选择所有条目吗BCL2L11生物型nonsense_mediated_decay或者是该基因的所有蛋白质编码转录本BCL2

4使用AnnotationFilter在其他包装中

AnnotationFilter包只提供筛选类,但没有筛选功能。这必须在包中使用过滤器实现。在本节中,我们首先通过一个非常简单的示例演示如何操作AnnotationFilter类可用于筛选data.frame然后探索如何为基于SQL的注释资源实现一个简单的过滤器框架。

让我们首先定义一个简单的data.frame包含我们要筛选的数据。注意,这是一个子集data.frame使用AnnotationFilter显然不是最好的解决方案,但它应该有助于理解基本概念。

##定义一个简单的基因表基因<- data.frame(gene_id = 1:10, symbol = c(字母[1:9],"b"), seq_name = paste0("chr", c(1,4,4,8,1,2,5,3, "X", 4)), stringsAsFactors = FALSE)基因
##基因id符号seq_name ## 1 1 a chr1 ## 2 2 b chr4 ## 3 3 c chr4 ## 4 4 d chr8 ## 5 5 e chr1 ## 6 6 f chr2 ## 7 7 g chr5 ## 8 8 h chr3 ## 9 i chrX ## 10 10 b chr4

接下来我们生成一个SymbolFilter检查我们能从中提取什么信息。

smbl <- SymbolFilter("b")

我们可以访问过滤器条件使用条件方法

条件(smbl)
## [1] "=="

属性的筛选器的值价值方法

值(smbl)
##[1]“b”

最后(即数据表中的列)使用方法。

字段(smbl)
##[1]“符号”

有了这些信息,我们可以定义一个简单的函数,将数据表和过滤器作为输入并返回逻辑长度等于表的行数,真正的对于匹配筛选器的行。

doMatch <- function(x, filter) {do.call(condition(filter), list(x[, field(filter)], value(filter)))} ##应用此函数doMatch(gene, smbl)
##[1]假真假假假假假假假假真

注意,这个简单的函数不支持多个过滤器,也不支持条件“startsWith”“endsWith”.接下来定义第二个函数,从数据资源中提取相关数据。

doExtract <- function(x, filter) {x[doMatch(x, filter),]} ##应用于数据doExtract(gene, smbl)
##基因id符号seq_name ## 2 2 b chr4 ## 10 10 b chr4

我们甚至可以修改doMatch函数启用筛选器表达式。

doMatch <- function(x, filter) {if (is(filter, "formula")) filter <- AnnotationFilter(filter) do.call(condition(filter), list(x[, field(filter)], value(filter)))} doExtract(gene, ~ gene_id == '2')
##基因id符号seq_name ## 2 2 b chr4

对于这样简单的例子AnnotationFilter可能是多余的,因为使用标准的R操作也可以达到同样的效果(简单得多)。一个真实的案例AnnotationFilter变得有用的是基于sql的注释资源。因此,接下来我们将探索如何使用SQL资源进行筛选AnnotationFilter

我们使用的SQLite数据库org.Hs.eg.db为所有人类基因提供各种注释的包。使用包到数据库的连接,我们首先检查哪些数据库表可用,然后为我们的简单过滤示例选择一个。

我们使用EnsDb所使用的SQLite数据库ensembldb打包并实现简单的筛选函数,以从其中一个数据库表中提取特定数据。我们就这样负荷在下面EnsDb.Hsapiens.v75软件包,提供访问人类基因,转录本,外显子和蛋白质注释。使用它与数据库的连接,我们首先检查哪些数据库表可用,然后检查哪些数据库表可用字段(即列)基因表。

##加载所需的包库(org.Hs.eg.db)库(RSQLite) ##获取数据库连接dbcon <- org.Hs.eg_dbconn() ##我们有什么表?dbListTables (dbcon)
[1]“accessions”“alias”“chrlocations”##[4]“chromosome_locations”“chromosome_locations”“染色体”“cytogenetic_locations”##[7]“ec”“ensembl”“ensembl2ncbi”“gene_info”##[13]“基因”“去”“go_all”## b[16]“go_bp”“go_bp_all”“go_cc”##[19]“go_cc_all”“go_mf”“go_mf_all”##[25]“kegg”“map_counts”“map_metadata”##[25]“元数据”“ncbi2ensembl”“omim”##[31]“refseq”“sqlite_stat1”“sqlite_stat4”##[34]“ucsc”“unigene”“uniprot”

org.Hs.eg.db提供许多不同的表,每个标识符或注释资源对应一个表。我们将使用gene_info并确定字段(即列)。

gene_info表中有哪些字段?dbListFields (dbcon“gene_info”)
##[1]“_id”“gene_name”“symbol”

gene_info表中提供了正式的基因符号和基因名称。列象征匹配默认值的值SymbolFilter这列也一样gene_nameGeneNameFilter.属性的字段不匹配AnnotationFilter,我们必须实现一个函数,将过滤器对象的默认字段映射到数据库列。有关示例,请参见本节末尾。

我们接下来实现一个简单的doExtractGene函数中检索数据的gene_info表,并重用doFilter函数提取特定的数据。的参数x现在是数据库连接对象。

doExtractGene <- function(x, filter) {gene <- dbGetQuery(x, "select * from gene_info") doExtract(gene, filter)} ##提取BCL2的所有条目BCL2 <- doExtractGene(dbcon, SymbolFilter("BCL2")) BCL2
BCL2细胞凋亡调节因子BCL2

这是可行的,但不是真正有效的,因为函数首先获取完整的数据库表,然后才对其进行子集。一个更有效的解决方法是翻译AnnotationFilter类(es)到SQL在哪里条件,从而在数据库级别上执行筛选。这里我们必须做一些小的修改,因为不是所有的条件值都可以在SQL调用中1:1使用。的条件“= =”比如有什么可以转化成“=”“startsWith”变成SQL“喜欢”通过添加一个“%”通配符到筛选器的值。我们还需要处理过滤器价值长度为> 1。一个SymbolFilter与一个价值c(“BCL2”、“BCL2L11”)例如,必须转换为SQL调用"符号在('BCL2','BCL2L11')".在这里,我们跳过这些特殊情况,并定义一个简单的函数来转换anAnnotationFilter到一个在哪里条件被包含到SQL调用中。这取决于筛选器是否扩展CharacterFilterIntegerFilter价值也必须被引用。

##定义一个简单的函数,它涵盖了一些条件转换conditionForSQL <- function(x) {switch(x, "==" =" =", x)} ##定义一个函数,将过滤器转换为SQL where条件。##字符值必须加引号。where <- function(x) {if (is(x, "CharacterFilter")) value <- paste0("'", value(x), "'") else value <- value(x) paste0(field(x), conditionForSQL(condition(x)), value)} ##现在"翻译"过滤器使用这个函数where(SeqNameFilter("Y"))
## [1] "seq_name='Y'"

接下来,我们实现一个新函数,该函数将过滤器集成到SQL调用中,让数据库服务器负责过滤。

##定义一个函数doExtractGene2 <- function(x, filter) {if (is(filter, "formula")) filter <- AnnotationFilter(filter) query <- paste0("select * from gene_info where ", where(filter)) dbGetQuery(x, query)} bcl2 <- doExtractGene2(dbcon, ~ symbol == " bcl2 ") bcl2
基因符号## 1 486 BCL2凋亡调节因子BCL2

下面我们比较两种方法的性能。

系统。time(doExtractGene(dbcon, ~ symbol == "BCL2"))
##用户系统运行## 0.156 0.000 0.156
系统。time(doExtractGene2(dbcon, ~ symbol == "BCL2"))
##用户系统运行时间## 0.02 0.00 0.02

毫不奇怪,第二种方法要快得多。

请注意,这里显示的示例仅用于说明目的。在现实世界中,还需要考虑其他因素,如过滤器的组合、要连接哪些数据库表、要返回哪些列等。

如果要筛选的数据库列不匹配一个AnnotatioFilter?例如,如果数据库列被命名hgnc_symbol而不是象征例如,我们可以在package-internal覆盖默认值方法SymbolFilter为数据库列返回正确的字段。

##注释过滤器的默认方法:field(SymbolFilter("a"))
##[1]“符号”
覆盖默认方法。setMethod("field", "SymbolFilter", function(object,…)##调用字段现在返回“正确的”数据库列字段(SymbolFilter("a"))
## [1] "hgnc_symbol"

5会话信息

sessionInfo ()
## R版本3.6.1(2019-07-05)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 18.04.3 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.10-bioc/R/lib/libRblas。所以## LAPACK: /home/biocbuild/bbs-3.10-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_US。UTF-8 LC_COLLATE= c# # [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_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基础包:## [1]parallel stats4 stats graphics grDevices utils datasets ##[8]方法基础## ##其他附加包:## [1]RSQLite_2.1.2 org.Hs.eg.db_3.10.0 AnnotationDbi_1.48.0 ## [4] IRanges_2.20.0 S4Vectors_0.24.0 Biobase_2.46.0 ## [7] BiocGenerics_0.32.0 AnnotationFilter_1.10.0 BiocStyle_2.14.0 ## ##通过命名空间加载(且未附加):[1] Rcpp_1.0.2 pillar_1.4.2 compiler_3.6.1 ## [4] BiocManager_1.30.9 GenomeInfoDb_1.22.0 XVector_0.26.0 ## [7] bitops_1.0-6 tools_3.6.1 zlibbioc_1.32.0 ## [13] memoise_1.1.0 evaluate_0.14 tibble_2.1.3 ## [16] pkgconfig_2.0.3 rlang_0.4.1 DBI_1.0.0 ## [19] yaml_2.2.0 xfun_0.10 GenomeInfoDbData_1.2.2 ## [22] string_1 .4.0 knitr_1.25 vctrs_0.2.0 ## [28] blob_1.2.0 magrittr_1. 1.5 backports_1.1.5 ## [31]htmltools_0.4.0 GenomicRanges_1.38.0 stringi_1.4.3 ## [34] RCurl_1.95-4.12 lazyeval_0.2.2 crayon_1.3.4