查看原文
其他

讨厌的基因ID

基因学苑 基因学苑 2023-08-18

以前有人买我课程,会有一个淘宝ID和姓名,然后加QQ,有一个QQ号和QQ名,在之后加我微信,又有一个微信名,很多时候我就崩溃了,因为这三个ID完全不对应。现在微信已经超过10亿用户,作为实名社交软件,很多用户的ID也常常让人困惑,比如一些中老年人喜欢的人生如茶,大漠祥云,金色枫叶,花自芬芳,滴水穿石,沁水百合,闲云野鹤,上善若水,四季花开等,还有XX爸,XX妈,XX姥爷,XX奶奶的,可以看出对子女无尽的爱。但是希望你儿子是马云,王健林,马化腾,这样别人才知道你是谁,微信实名是对别人的尊重,尤其你的微信号是作为工作号使用的,今天我们要说的是基因的ID问题。

讨厌的序列ID

不仅基因ID,序列ID也是一个特别讨厌的问题,而且这个问题越演越烈,做生物信息分析,在这个事情上需要浪费很多的时间。同一条参考序列,被不同的数据库收录,就会有不同的ID。而且可能还有不同的版本。我们以人全基因组序列为例。人全基因组序列目前分别被多个国际组织的数据库收录,那么同一份数据,会有不同的名字,以hg19参考序列为例,
例如在NCBI中,称为GRCH37,UCSC称为hg19,EMBL称为ENSEMBL release_59等版本,千人基因组计划称为b37,具体转换如下所示:
hg18 =    GRCh36 = ENSEMBL release_52
hg19 =    GRCh37 = ENSEMBL release_59/61/64/68/69/75
hg38 =    GRCh38 = ENSEMBL  release_76/77/78/80/81/82
此外,EMBL定期发布一些新版本,还有其他序列一些小的升级版本,例如b37的升级版本hs37d5,让人非常迷惑。

讨厌的基因ID

除了序列的ID问题,基因ID更加棘手。同一个基因序列,需要被不同的库收录,每一个库都有单独的ID信息。而且在一些数据库中,会出现一对多,多对多的情况,举个例子,同一个基因可能属于不同的GO条目,同一个GO条目中会包括不同的基因。一个常见的基因,在NCB中的属名为EGFR基因,这个称为SYMBOL NAME,但是同一个EGFR可能测序出不同的序列,或者同一个基因在不同的哺乳动物中都存在,如果还用symbol就不容易区分,所以就需要ID信息,这个类似于姓名与身份证的关系。NCBI中为GI号,例如EGFR的GI号可能有1101020101,1100832916等多个,因为基因,外显子,转录本,核糖体RNA,物种分类号都使用数字,不容易区分,因此每个序列还有一个Access Number号,字母加数字的组合,例如NP_001333870.1,NP_001333827.1,这样一次就能看出来它是一个氨基酸的序列,NP中的P表示Protein。而在EMBL中,则为    ENSG00000146648。

基因ID与功能注释富集

理解了基因ID的内容之后,其实对于有已知基因ID的基因功能注释与富集分析,本质上就是ID匹配的过程,类似于查字典,根据已知ID,到数据库中基因型匹配。以EGFR基因为例:

这样我们就可以直接使用Q504U8这个ID去UniProt库中直接找这个基因的功能信息了,没错,基因功能注释就是这么简单。

基因ID转换

光吐槽是起不到任何作用了,吐槽完了,还是得了解如何进行序列ID的转换,其实基因ID的转换方法有很多,比如可以在DAVID网站进行转换,但是一个比较好的方法是使用R包,有很多R包都可以进行基因ID的相互转换,例如AnnotationDbi包中的mapIds函数,clusterProfiler包中的bitr函数等。其实基因ID转换,本质上是查找替换的过程,前提是必须有一个已知的基因ID的对应表,下面以AnnotationDbi包的使用为例。

> library("AnnotationDbi")
> library("org.Hs.eg.db")
#有这么多ID可供转换
> keytypes(org.Hs.eg.db)
 [1"ACCNUM"       "ALIAS"        "ENSEMBL"     
 [4"ENSEMBLPROT"  "ENSEMBLTRANS" "ENTREZID"    
 [7"ENZYME"       "EVIDENCE"     "EVIDENCEALL" 
[10"GENENAME"     "GO"           "GOALL"       
[13"IPI"          "MAP"          "OMIM"        
[16"ONTOLOGY"     "ONTOLOGYALL"  "PATH"        
[19"PFAM"         "PMID"         "PROSITE"     
[22"REFSEQ"       "SYMBOL"       "UCSCKG"      
[25"UNIGENE"      "UNIPROT"  
egfr <- "EGFR"
#将SYMBOL转换为ENSMBL
> mapIds(org.Hs.eg.db,keys = a,column = "ENSEMBL",keytype = "SYMBOL",multiVals = "first")
       EGFR 
"ENSG00000146648" 

使用clusterProfiler可以一次转换多个库

library(clusterProfiler)
> ids <- bitr(x, fromType="SYMBOL", toType=c("UNIPROT""ENSEMBL","ENTREZID","GO","ONTOLOGY"), OrgDb="org.Hs.eg.db")
'select()' returned 1:many mapping between keys and columns
> head(ids)
  SYMBOL UNIPROT         ENSEMBL ENTREZID         GO EVIDENCE ONTOLOGY
1   EGFR  Q504U8 ENSG00000146648     1956 GO:0000139      IEA       CC
2   EGFR  Q504U8 ENSG00000146648     1956 GO:0000165      TAS       BP
3   EGFR  Q504U8 ENSG00000146648     1956 GO:0000186      IEA       BP
4   EGFR  Q504U8 ENSG00000146648     1956 GO:0001503      NAS       BP
5   EGFR  Q504U8 ENSG00000146648     1956 GO:0001618      IEA       MF
6   EGFR  Q504U8 ENSG00000146648     1956 GO:0001892      IEA       BP

没有基因ID怎么办

如果是自己拼接与预测出来的基因,基因ID都是自动生成的,没有已知ID如何进行转换。这个时候就需要首先将得到的基因与NR数据库进行比对,NR是非冗余的氨基酸数据库,将预测得到的序列在数据库中找到它最近源的同源基因序列,那么他们具有相同的基因ID,NR数据库中现在采用的是Accession Number。这个Accession Number就对应的OrgDb包中的“ACCNUM”关键字,这样就可以利用bitr函数进行各种基因ID的转换了。

---------- END ----------

(更多精彩内容,欢迎关注公众号)



您可能还会感兴趣的

基因学苑2018年文章目录
手把手教你生信分析平台搭建专栏合集
生物信息重要资源站点合集
不会编程,如何进行批量操作
一个人全基因组完整数据分析脚本
一个细菌基因组完整分析脚本
如何在Linux下优雅的装X
2019,送给大家一份新年礼物
生物学才是终极学科


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存