根据比对后的bam文件来计算外显子的RPKM

bam2rpkm by bedtools

比对好的bam文件一般需要根据gtf文件来根据 genomic features 进行计数,但是htseq-counts或者featureCounts这样的软件一般都是做到计数,并没有计算rpkm值。

虽然RPKM是一个需要抛弃的概念,见参考文献"Measurement of mRNA abundance using RNA-seq data: RPKM measure is inconsistent among samples". Wagner GP, Kin K, Lynch VJ. Theory Biosci. 2012. PubMed  但是它实在是太出名了,值得玩一玩。

首先制作非冗余的外显子坐标bed文件

去CCDS官网下载CCDS.20160908.txt文件后,写脚本格式化:

cat CCDS.20160908.txt |perl -alne '{/\[(.*?)\]/;next unless $1;$gene=$F[2];$exons=$1;$exons=~s/\s//g;$exons=~s/-/\t/g;print "$F[0]\t$_\t$gene" foreach split/,/,$exons;}'|sort -u |bedtools sort -i >exon_probe.hg38.gene.bed
head exon_probe.hg38.gene.bed

得到的结果如下:

chr1    69090   70007   OR4F5
chr1    450739  451677  OR4F29
chr1    685715  686653  OR4F16
chr1    925941  926012  SAMD11
chr1    930154  930335  SAMD11
chr1    931038  931088  SAMD11
chr1    935771  935895  SAMD11
chr1    939039  939128  SAMD11
chr1    939274  939459  SAMD11
chr1    941143  941305  SAMD11

批量转换bam文件并且计算RPKM值

这里针对每个外显子分开计数,外显子长度,文库大小,外显子上面的reads数量。

C = Number of reads mapped to a gene

N = Total mapped reads in the experiment

L = exon length in base-pairs for a gene

Equation = RPKM = (10^9 * C)/(N * L)

bed=exon_probe.hg38.gene.bed
for bam in  /home/project/*.bam
do
file=$(basename $bam )
sample=${file%%.*}
echo $sample
export total_reads=$(samtools idxstats  $bam|awk -F '\t' '{s+=$3}END{print s}')
echo The number of reads is $total_reads
bedtools multicov -bams  $bam -bed $bed |perl -alne '{$len=$F[2]-$F[1];if($len <1 ){print "$.\t$F[4]\t0" }else{$rpkm=(1000000000*$F[4]/($len* $ENV{total_reads}));print "$.\t$F[4]\t$rpkm"}}' >$sample.rpkm.txt
done

这里之所以写这个脚本是为了弥补conifer这个软件的bug,所以按照了conifer的output格式来输出的,输出3列,第一列就是纯粹的递增行数,对应于exon_probe.hg38.gene.bed 文件的每一行,第二列是该对应的外显子上面的覆盖的reads,第三列就是算出的rpkm值啦,这里并没有输出该外显子长度。

head blood.rpkm.txt
1   3538    40.5143632023362
2   1756    19.6581297588076
3   1793    20.0723386432472
4   102 15.0855916359498
5   75  4.35114155895529
6   24  5.04036238189381
7   97  8.21430025275033
8   132 15.5741534272
9   81  4.59762784834908
10  66  4.27808535500246

后记

这里计算的是基于外显子的RPKM值,如果要计算基于基因的,要稍微修改一下。

其实我以前也写过 基因的counts矩阵转换为RPKM矩阵

(0)

相关推荐