2023-01-09 用GenomicFeatures包计算基因长度

本文包括内容:

1. 基因长度定义
2. 常用注释包简介
3. 基因长度计算:用GenomicFeatures包 计算TxDb.Hsapiens.UCSC.hg38.knownGene中四种不同定义的基因长度。
参考: 
https://blog.csdn.net/Candle_light/article/details/90598308
https://mp.weixin.qq.com/s?__biz=MzAxMDkxODM1Ng==&mid=2247488656&idx=1&sn=c2472cca80a0b0f8b831fbf5c69f2a34&chksm=9b48542bac3fdd3dd99474c42b2af092e462842007e21b28724936a3c9fc9f9c14625d355fd1&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzU4NjU4ODQ2MQ==&mid=2247490627&idx=1&sn=f23242af5baa6cd6c07ff3558d65c97b&chksm=fdf85401ca8fdd17017107413706c4c259c91385ddc17e0778539d327f2f1d49f0f5072ea688&scene=21#wechat_redirect

1. 基因长度定义

非冗余外显子(EXON)长度之和;
挑选基因的最长转录本 ;
选取多个转录本长度的平均值;
非冗余 CDS 长度之和

2. 常用注释包简介

2.1 TxDb包

包含位置信息。包里的注释内容,可以通过包名来判断。包名的格式是:TxDb.Species.Source.Build.Table
例如,TxDb.Hsapiens.UCSC.hg19.knownGene,代表:
物种是 Homo sapiens
来源于 UCSC genome browser
基因组版本是 hg19 (their version of GRCh37)
包含的注释内容是 knownGene table

1.2 EnsDb包

EnsDb和TxDb类似,只不过它是基于Ensembl数据库的
例如:EnsDb.Hsapiens.v79

3. GRanges,Ranges

Ranges 对象功能十分强大,可以让我们基于基因组位置信息轻松选取出相关数据。GRanges和GRangesLists对象,就类似于data.frame和List数据结构,我们可以使用[符号去选取子集。

3.1 GRanges

注释包比较常用的一个功能,是将注释包中的位置信息提取出来,添加到GRanges或者GRangesList对象中。

  • 将GRanges对象写成txt
exon_txdb=exons(txdb)
tmp=as.data.frame(exon_txdb)
write.table(tmp,"exon.pos",row.names=F)

genes_txdb=genes(txdb)
tmp=as.data.frame(genes_txdb)
write.table(tmp,"gene.pos",row.names=F)
  • 其他操作
seqnames(exon_txdb) 
ranges(exon_txdb) #返回外显子的起始终止位点,长度,以及其它信息
strand(exon_txdb)#返回外显子的正负链信息,要么在正链要么在负链
mcols(exon_txdb)#返回exon的id编号,1到724366个
seqlengths(exon_txdb)#返回每条染色体的长度信息 names,length
GRanges对象还有很多其它类型的操作,非常好玩的,split,shift,resize,flank,reduce,gaps,disjoin,coverage
其它求交集并集和都可以用,union,intersect,setdiff,pintersect,psetdiff

3.2 GRangesLists

以List形式呈现,每个基因所对应的转录本,在基因组上的坐标

3.3 其他

transcripts(), genes()函数选取位置信息, 编码区可以使用cds(),promoters(),exons()来选取

library(TxDb.Hsapiens.UCSC.hg38.knownGene)
txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene 
genes(txdb)#29794个基因
exons(txdb)#724366 个exon
transcripts(txdb)  #272352个转录本
cds(txdb)#306522个编码区
transcriptsBy(txdb,by="gene")#对象按照gene来对转录本分组
exonsBy,cdsBy来对它进行处理,都会返回Granges对象

4. 根据四种定义计算基因长度

目前了解到两种方法:1) 使用R包GenomicFeatures 2)使用R包 rtracklayer;

首先,载入txdb文件

##创建txdb文件
if(!require(GenomicFeatures))BiocManager::install("GenomicFeatures")
  library(GenomicFeatures)
  txdb <- makeTxDbFromGFF("gencode.v36.annotation.gtf.gz",format="gtf")
##或者下载
BiocManager::install("TxDb.Hsapiens.UCSC.hg38.knownGene")
library(TxDb.Hsapiens.UCSC.hg38.knownGene) 
txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene 
#### R包GenomicFeatures####
library(GenomicFeatures)
library(TxDb.Hsapiens.UCSC.hg38.knownGene) 
txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene 

##① 非冗余外显子(EXON)长度之和 
exons.list.per.gene <- exonsBy(txdb,by="gene")
head(as.data.frame(exons.list.per.gene))
  group group_name seqnames    start      end width strand exon_id
1     1          1    chr19 58345178 58347029  1852      -  603914
2     1          1    chr19 58345183 58347029  1847      -  603915
3     1          1    chr19 58346854 58347029   176      -  603916
4     1          1    chr19 58346858 58347029   172      -  603917
5     1          1    chr19 58346860 58347029   170      -  603918
6     1          1    chr19 58347353 58347634   282      -  603919
  exon_name
1      <NA>
2      <NA>
3      <NA>
4      <NA>
5      <NA>
6      <NA>
# 然后计算每个基因的非冗余外显子长度(widths)并加和。
exonic.gene.sizes <- sum(width(GenomicRanges::reduce(exons.list.per.gene)))
          exonic.gene.sizes
head(as.data.frame(exonic.gene.sizes))
1                      6528
10                     1834
100                   12177
1000                   8583
10000                 22459
100008586               693
gle <- data.frame(gene_id=names(exonic.gene.sizes),
                    length=exonic.gene.sizes) ##31456个基因
            gene_id length
1                 1   6528
10               10   1834
100             100  12177
1000           1000   8583
10000         10000  22459
100008586 100008586    693
##②非冗余cds长度之和
cds.list.per.gene <- cdsBy(txdb,by="gene")
head(as.data.frame(cds.list.per.gene))
  group group_name seqnames    start      end width strand cds_id
1     1          1    chr19 58347022 58347029     8      - 252822
2     1          1    chr19 58347353 58347640   288      - 252823
3     1          1    chr19 58350370 58350651   282      - 252824
4     1          1    chr19 58350594 58350651    58      - 252825
5     1          1    chr19 58351391 58351687   297      - 252826
6     1          1    chr19 58352098 58352184    87      - 252827
  cds_name
1     <NA>
2     <NA>
3     <NA>
4     <NA>
5     <NA>
6     <NA>

# 然后计算每个基因的非冗余外显子长度(widths)并加和。
cds.gene.sizes <- sum(width(GenomicRanges::reduce(cds.list.per.gene)))
head(as.data.frame(cds.gene.sizes))
          cds.gene.sizes
1                   1575
10                   873
100                 1979
1000                2978
10000               3296
100008586            354
glc <- data.frame(gene_id=names(cds.gene.sizes),
                  length=cds.gene.sizes)#19626个基因
            gene_id length
1                 1   1575
10               10    873
100             100   1979
1000           1000   2978
10000         10000   3296
100008586 100008586    354
##③挑选基因的最长转录本
t_l=transcriptLengths(txdb) #272352
t_l=na.omit(t_l)#229531
t_l=t_l[order(t_l$tx_len,decreasing = T),]# 这里把同样的基因的多个转录本长度排序了
head(t_l)
        tx_id            tx_name gene_id nexon tx_len
38851   38851  ENST00000589042.5    7273   363 109224
38852   38852  ENST00000591111.5    7273   313 104301
38849   38849 ENST00000342992.11    7273   312 101520
138913 138913  ENST00000597346.1   10984     1  91667
38850   38850  ENST00000460472.6    7273   191  82029
38853   38853 ENST00000342175.11    7273   191  81357
t_l=t_l[!duplicated(t_l$gene_id),]#去重,直接保留转录本最长的
t_l=t_l[order(t_l$gene_id,decreasing = F),]
glm=data.frame(gene_id=t_l$gene_id,length=t_l$tx_len)
head(glm)
    gene_id length
1         1   3382
2        10   1285
3       100   5965
4      1000   4016
5     10000   7950
6 100008586    585
##④ 选取多个转录本长度的平均值 
t_l=transcriptLengths(txdb) #272352
t_l=na.omit(t_l)#229531
t_l=t_l[order(t_l$gene_id,decreasing = T),]
gla <- t_l %>% group_by(gene_id) %>% 
summarise(tx_ave_len = round(mean(tx_len),0))#31456个基因
gla <-as.data.frame(gla)
head(gla)
    gene_id tx_ave_len
1         1       1842
2        10        850
3       100       1708
4      1000       2744
5     10000       2436
6 100008586        573

比较不同方法得到的基因长度:

a = gle %>% inner_join(glc,"gene_id") %>% 
  inner_join(glm,"gene_id") %>% 
  inner_join(gla,"gene_id")
colnames(a) = c("gene_id","exon","CDS","max","average") # 19626个基因
head(a)
    gene_id  exon  CDS  max average
1         1  6528 1575 3382    1842
2        10  1834  873 1285     850
3       100 12177 1979 5965    1708
4      1000  8583 2978 4016    2744
5     10000 22459 3296 7950    2436
6 100008586   693  354  585     573
boxplot(log2(a[,-1]),outline = F)
不同计算方法基因长度

gene_id 转换到symbol看下

library(org.Hs.eg.db)
s2g=toTable(org.Hs.egSYMBOL)
head(s2g)
aa =merge(s2g,a,by='gene_id') #19601个基因,比id转换前少了25个基因
head(aa)
    gene_id  symbol  exon  CDS  max average
1         1    A1BG  6528 1575 3382    1842
2        10    NAT2  1834  873 1285     850
3       100     ADA 12177 1979 5965    1708
4      1000    CDH2  8583 2978 4016    2744
5     10000    AKT3 22459 3296 7950    2436
6 100008586 GAGE12F   693  354  585     573

1.不同版本的注释文件,得到的长度不太一样,我的结果是来自TxDb.Hsapiens.UCSC.hg38.knownGene,小洁的结果是Homo_sapiens.GRCh38.103.chr.gtf.gz。 可以看到exon 和cds 的计算方式差别更小,最长转录本和平均转录本的计算方式差的比较多。


我的结果

小洁的结果

2. boxplot的结果和小洁的也不太一样? 我的看起来exon计算结果基因长度最长,小洁的是按最长转录本的方式,基因长度最长.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容