基因的counts矩阵转换为RPKM矩阵
为什么要做这个计算
大家都知道在真核生物里面,一个基因有多个转录本,每个转录组又是由不同的外显子组合而成,以前老旧的RNA-seq分析流程比较喜欢用RPKM值来量化表达量。大家很容易可以搜索到RPKM的公式,里面考虑到了基因长度。
而公式里面的基因长度并不是基因在染色体的起始终止坐标的差值,而通常是该基因的最长的转录本的外显子的长度之和。
所以计算起来就比较复杂,但是作为一个合格的生物信息学工程师,这种个性化分析需求要能hold住哈。
下面我就简单给出一个解决方案:
下载CCDS数据库文件
这里我们拿小鼠做例子
很容易谷歌得到CCDS的下载链接,下载查看文件格式如下:
wget ftp://ftp.ncbi.nlm.nih.gov/pub/CCDS/current_mouse/CCDS.current.txt head CCDS.current.txt #chromosome nc_accession gene gene_id ccds_id ccds_status cds_strand cds_from cds_to cds_locations match_type 1 NC_000067.6 Xkr4 497097 CCDS14803.1 Public - 3216021 3671347 [3216021-3216967, 3421701-3421900, 3670551-3671347] Identical 1 NC_000067.6 Rp1 19888 CCDS14804.1 Public - 4344599 4352824 [4344599-4350090, 4351909-4352080, 4352201-4352824] Identical 1 NC_000067.6 Sox17 20671 CCDS14805.1 Public - 4491715 4493405 [4491715-4492667, 4493099-4493405] Identical
第三列是基因名,第十列的中括号里面的是一个个外显子的起始终止坐标。这就是我们计算的依据。
perl单行命令处理
代码如下:
grep -v '^#' CCDS.current.txt | perl -alne '{/\[(.*?)\]/;$len=0;foreach(split/,/,$1){@tmp=split/-/;$len+=($tmp[1]-$tmp[0])};$h{$F[2]}=$len if $len >$h{$F[2]}} END{print "$_\t$h{$_}" foreach sort keys %h}' >mm10_ccds_length.txt
简单解释一下这个命令吧:
首先把以#开头的注释信息去除
grep -v '^#'
然后用正则匹配抓取中括号里面的信息
/\[(.*?)\]/
接着对中括号里面的信息依据逗号进行分割成数组
split/,/,$1
再接着对数组里面的外显子进行循环取长度并累加
@tmp=split/-/;$len+=($tmp[1]-$tmp[0])
然后判断该转录本的外显子长度之和是否大于记录到该转录本对应的基因记录的长度,如果大于,就重新记录下来,因为我们要取最长转录本。
$h{$F[2]}=$len if $len >$h{$F[2]}
最后把记录好的基因对应的最长转录本的外显子长度之和打印出来即可
print "$_\t$h{$_}" foreach sort keys %h}'
得到的结果如下:
tail mm10_ccds_length.txt Zwilch 1773 Zwint 752 Zxdb 2621 Zxdc 2567 Zyg11a 2107 Zyg11b 2221 Zyx 1686 Zzef1 8621 Zzz3 2722 a 393
小鼠里面居然有一个基因名字就是a
,真搞笑。
是不是很简单呀,赶快练习一下吧!
也欢迎大家去我们论坛留言讨论。
http://www.biotrainee.com/thread-1791-1-1.html
RPKM的公式难点就是这个基因的长度的求取,后面的没什么好讲的了。