:AnnotationFilter
作者:马丁•摩根(aut)约翰Rainer (aut),约阿希姆Bargsten[所有],丹尼尔·范Twisk[所有],Bioconductor包维护者(cre)
最后修改:2019-10-29 16:35:48
编译:2019年10月29日22:30:11星期二

1介绍

各种各样的注释在Bioconductor资源可用。访问这些数据库的全部内容,甚至单表计算昂贵,而且在许多情况下不是必需的,因为用户可能想要提取只有录制的数据如基因组单个基因的坐标。在这方面,过滤注释资源数据提取前对性能有重大影响,增加这些公司数据库的可用性。

AnnotationFilter包因此发展提供基本的过滤器类,以实现一个共同的过滤框架Bioconductor注释资源。AnnotationFilter定义了一些最常用的过滤器类功能注释数据库,如象征genename。每个过滤器类应该是工作在一个数据库表列和促进过滤所提供的值。这种过滤器类允许用户来构建复杂的查询检索特定的注释,而不需要知道列或表名或底层数据库的布局。虽然最初被开发使用的Organism.dplyrensembldb包,过滤器类和相关滤波的概念可以很容易地添加到其他注释包。

2过滤器类

所有过滤器类扩展的基本AnnotationFilter类和一个或多个和一个条件允许过滤在单个数据库表列。根据输入值的类型,过滤器类分为:

  • CharacterFilter:需要一个字符值的长度> = 1和支持条件= =,! =,startsWithendsWith。一个将是一个例子GeneIdFilterIDs允许筛选基因。

  • IntegerFilter:需要一个整数作为输入,并支持条件= =,! =,>,<,> =< =。一个将是一个例子GeneStartFilter过滤结果(染色体)启动基因的坐标。

  • DoubleFilter:需要一个数字作为输入,并支持条件= =,! =,>,<,> =< =

  • GRangesFilter:是一种特殊的滤波器,如需要农庄作为价值并执行过滤列的组合(即开始和结束坐标以及序列名称和链)。是一致的findOverlaps方法从IRanges包的构造函数GRangesFilter过滤了类型参数来定义它的条件。支持的值“任何”(默认),检索所有条目重叠农庄,“开始”“结束”匹配所有功能相同的开始和结束坐标分别为“在”相匹配的所有功能定义的范围农庄“平等”等于返回功能农庄

过滤器类的名称直观,第一部分对应于数据库列名与每个字符之后_被资本化,紧随其后的是关键字过滤器。一个过滤器的名称为一个数据库表列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 # # 14 SeqStrandFilter seq_strand # # 7 # # SymbolFilter象征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可以用来过滤注释资源检索所有相关条目指定的符号价值。

库(AnnotationFilter) smbl < - SymbolFilter smbl (“BCL2”)
# # # #类:SymbolFilter条件:= = # #值:BCL2

这样一个过滤器应该是用于检索所有条目相关联的特性值在数据库表列象征匹配滤波器的价值“BCL2”

使用“startsWith”条件我们可以定义一个过滤器检索所有基因与基因的条目名称/标志从指定的值(如开始。“BCL2”“BCL2L11”下面的例子。

smbl < - SymbolFilter (“BCL2”,条件=“startsWith”) smbl
# # # #类:SymbolFilter条件:startsWith # #值:BCL2

除了构造函数,AnnotationFilter提供了一个功能创建过滤器实例在一个更自然和直观的方式翻译筛选器表达式(写成公式,即从一开始~)。

smbl < - AnnotationFilter(~ = =象征“BCL2”) smbl
# # # #类:SymbolFilter条件:= = # #值:BCL2

个人AnnotationFilter可以合并在一个对象AnnotationFilterList。这个类继承了列表并提供一个额外的logicOp ()定义如何应该结合其个人过滤器。的长度logicOp ()必须是1小于过滤器对象的数量。中的每个元素logicOp ()定义应该如何结合连续两个过滤器。下面我们创建一个AnnotationFilterList包含两个过滤器对象结合逻辑

对费< - AnnotationFilter (~ = =“BCL2”象征& tx_biotype = =“protein_coding”)外语教学
# # AnnotationFilterList长度2 # #符号= =‘BCL2 & tx_biotype = =“protein_coding”

请注意,AnnotationFilter函数(还)不支持嵌套表达式的翻译,等(符号= = " BCL2L11 " & tx_biotype = =“nonsense_mediated_decay”) |(符号= =“BCL2”& tx_biotype = =“protein_coding”)。然而这样的查询可以被嵌套构建AnnotationFilterList类。

# #定义过滤器的过滤查询第一对。afl1 < - AnnotationFilterList (SymbolFilter (“BCL2L11”), TxBiotypeFilter (“nonsense_mediated_decay”)) # #(括号定义第二个过滤器对应该的总和。afl2 < - AnnotationFilterList (SymbolFilter (“BCL2”), TxBiotypeFilter (“protein_coding”)) # #现在结合逻辑或afl < - AnnotationFilterList (afl1、afl2 logicOp =“|”) afl
长度2 # # # # AnnotationFilterList(符号= =‘BCL2L11 & tx_biotype = = nonsense_mediated_decay) |(符号= =‘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,象征= c(字母[1:9],“b”), seq_name = paste0(“空空”,c (1、4、4、8、1、2、5、3、“X”, 4)), stringsAsFactors = FALSE)基因
1 # # 1 # # gene_id象征seq_name 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 9我chrX # # 10 10 b chr4

接下来,我们生成一个SymbolFilter并检查我们可以提取什么信息。

smbl < - SymbolFilter (“b”)

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

条件(smbl)
# # [1]“= =”

过滤器使用的价值价值方法

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

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

字段(smbl)
# #[1]“象征”

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

doMatch < -函数(x,过滤器){do.call(条件(过滤),列表(x[、字段(过滤器)]值(过滤器)))}# #应用这个函数doMatch(基因,smbl)
# #[1]假假假假假假假假真

注意,这个简单的函数不支持多个过滤器和也没有条件“startsWith”“endsWith”。接下来,我们定义一个函数,提取相关数据从数据资源。

doExtract < -函数(x,过滤器){x [doMatch (x,过滤器)]}# #应用数据doExtract(基因,smbl)
# # gene_id象征seq_name # # 2 2 b chr4 # # 10 10 b chr4

我们甚至可以修改doMatch功能,使筛选器表达式。

doMatch < -函数(x,过滤器){如果((过滤器,“公式”))过滤器< - AnnotationFilter(过滤器)do.call(条件(过滤),列表(x[、字段(过滤器)]值(过滤器)))}doExtract(基因~ gene_id = = ' 2 ')
# # gene_id seq_name # # 2 2 b chr4象征

对于这样的简单的例子AnnotationFilter可能是一个过度一样能够达到使用标准R操作(简单得多)。一个真实场景中AnnotationFilter成为有用的资源是基于sql的注释。我们将探讨下如何过滤使用SQL资源AnnotationFilter

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

我们使用一个EnsDbSQLite数据库使用的ensembldb包和实现简单的过滤函数提取特定的数据从一个数据库表。我们因此负载下EnsDb.Hsapiens.v75包,提供人类基因,转录,外显子和蛋白质注释。利用其数据库连接我们首先检查数据库表是可用的,然后什么什么字段(即列)基因表。

# #负载所需的包库(org.Hs.eg.db)库(RSQLite) # #获得数据库连接dbcon <——org.Hs.eg_dbconn() # #什么表呢?dbListTables (dbcon)
# #[1]“到达”“别名”“chrlengths”# # [4]“chromosome_locations”“染色体”“cytogenetic_locations”# #[7]“欧共体”“运用”“ensembl2ncbi”# # [10]“ensembl_prot”“ensembl_trans”“gene_info”# #[13]“基因”“走”“go_all”# # [16]“go_bp”“go_bp_all”“go_cc”# # [19]“go_cc_all”“go_mf”“go_mf_all”# # [22]“kegg”“map_counts”“map_metadata”# #[25]“元数据”“ncbi2ensembl”“人类”# #[28]“包含”“prosite”“pubmed”# # [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”“象征”

gene_info表提供了官方基因符号和名称。列象征默认匹配的价值SymbolFilter一样的列gene_nameGeneNameFilter。如果数据库中的列不匹配的字段AnnotationFilter,我们要实现一个函数,默认的过滤器对象的字段映射到数据库的列。看到部分的最后一个例子。

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

doExtractGene < -函数(x,过滤器){基因< - dbGetQuery (x,“select * from gene_info”) doExtract(基因,过滤器)}# #提取所有条目BCL2 BCL2 < - doExtractGene (dbcon, SymbolFilter (“BCL2”)) BCL2
# # # # _id gene_name象征486 486 BCL2凋亡调节阀BCL2

这个工作,但不是很有效,因为函数首先获取完整的数据库表,然后只子集。一个更有效的解决方案是翻译AnnotationFilter一个SQL类(es)在哪里条件,因此在数据库级别上执行过滤。我们要做一些小的修改,因为并不是所有的条件值可以使用1:1在SQL调用。的条件“= =”例如被转换成“=”“startsWith”到一个SQL“喜欢”通过添加也“%”通配符的过滤器。我们还必须处理一个过滤器价值长度> 1。一个SymbolFilter与一个价值c (“BCL2”、“BCL2L11”)例如会转换为SQL调用“符号(“BCL2”、“BCL2L11”)”。这里我们跳过这些特殊情况,定义一个简单的函数,将一个AnnotationFilter到一个在哪里条件列入SQL调用。这取决于过滤器扩展CharacterFilterIntegerFilter价值也被引用。

# #定义一个简单的函数,包括一些条件转换conditionForSQL < -功能(x){开关(x,“= =”=“=”, x)} # #定义一个函数将一个过滤器转化为一个SQL条件的地方。# #字符值必须引用。< -函数(x) {((x,“CharacterFilter”))值< - paste0(“”、价值(x)、“的”)其他价值< -价值(x) paste0(字段(x), conditionForSQL(条件(x))值)}# #现在“翻译”一个过滤器使用此函数(SeqNameFilter (" Y "))
# # [1]“seq_name = Y”

接下来,我们实现一个新的函数集过滤到SQL调用数据库服务器让照顾过滤。

# #定义一个函数,doExtractGene2 < -函数(x,过滤器){如果((过滤器,“公式”))过滤器< - AnnotationFilter(过滤器)查询< - paste0 (“select *从gene_info”,(过滤器))dbGetQuery (x,查询)}bcl2 < - doExtractGene2 (dbcon ~符号= =“bcl2”) bcl2
# # # # _id gene_name象征486 BCL2凋亡调节阀BCL2

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

系统。时间(doExtractGene (dbcon ~ = =象征“BCL2”))
用户系统运行# # # # 0.156 0.000 0.156
系统。时间(doExtractGene2 (dbcon ~ = =象征“BCL2”))
用户系统运行# # # # 0.02 0.00 0.02

不出意料,第二种方法要快得多。

注意,这里显示的例子只是出于演示目的。在现实世界的情况下额外的因素,如组合过滤器,数据库表加入,列返回等也是必须考虑的。

如果我们想要的数据库列过滤器不匹配一个AnnotatioFilter吗?如果数据库列命名为例hgnc_symbol而不是象征我们可以例如package-internally覆盖默认值方法SymbolFilter为数据库列返回正确的字段。

# #默认方法从AnnotationFilter:字段(SymbolFilter (“a”))
# #[1]“象征”
# #覆盖默认的方法。setMethod(“场”、“SymbolFilter”,函数(对象,…)“hgnc_symbol”) # #调用字段返回现在的“正确”数据库列字段(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 # # # #矩阵产品:默认# #布拉斯特区:/home/biocbuild/bbs - 3.10 - bioc / R / lib / libRblas。所以# # LAPACK: /home/biocbuild/bbs - 3.10 - bioc / R / lib / libRlapack。# # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C # #[3]而= 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 = C LC_TELEPHONE = # # [11] LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # #[1]平行stats4统计图形grDevices跑龙套数据集# #[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 # # [10] zeallot_0.1.0 digest_0.6.22 bit_1.1-14 # # [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] stringr_1.4.0 knitr_1.25 vctrs_0.2.0 # # [25] bit64_0.9-7 rmarkdown_1.16 bookdown_0.14 # # [28] blob_1.2.0 magrittr_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