参考:
由公式可知,知道了featurecount count 矩阵,同时有基因长度信息,可以计算RPKM.
FPKM= read counts / (mapped reads (Millions) * exon length(KB))
目前最关键是如何计算基因长度
,以及如何衡量基因长度。
我们就能理解目前主流定义基因长度
的几种方式。
- 挑选基因的最长转录本
- 选取多个转录本长度的平均值
- 非冗余外显子(EXON)长度之和
- 非冗余 CDS(Coding DNA Sequence) 长度之和
实践
下面列举的是 非冗余外显子(EXON)长度之和
计算方法
其他尝试
1.TPM FPKM 计算公式R
- 群主解答
- TPM ,RPKM计算,首先需要求得count 数,再用R函数转换。
countToTpm <- function(counts, effLen)
{
rate <- log(counts) - log(effLen)
denom <- log(sum(exp(rate)))
exp(rate - denom + log(1e6))
}
countToFpkm <- function(counts, effLen)
{
N <- sum(counts)
exp( log(counts) + log(1e9) - log(effLen) - log(N) )
}
fpkmToTpm <- function(fpkm)
{
exp(log(fpkm) - log(sum(fpkm)) + log(1e6))
}
countToEffCounts <- function(counts, len, effLen)
{
counts * (len / effLen)
}
2. python 可能代码
import numpy as np
import pandas as pd
A=pd.DataFrame({"gene_length":[2,4,1,10],
"sample1":[10,20,5,0],
"sample2":[12,25,8,0],
"sample3":[30,60,15,1]})
A.index=np.array(["A","B","C","D"])
#apply 列作为变量
def count_fpkm(A):
B=A[["sample1","sample2","sample3"]].apply(lambda x:x/sum(x))
C=B.div(A["gene_length"].values,axis=0).applymap(lambda x:"{:.2f}".format(x))
return C
def count_TPM(A):
B=A[["sample1","sample2","sample3"]].div(A["gene_length"].values,axis=0)
C=B.apply(lambda x:x/sum(x))
return C
3.gtftools 工具计算基因长度
http://genomespot.blogspot.com/2019/01/using-gtf-tools-to-get-gene-lengths.html
gtftools工具使用
wget http://www.genemine.org/codes/GTFtools_0.6.9.zip
-
计算结果
image.png
思考:
- 当初以为gene length 就是gtf 第三列标注为gene的那个长度,而没有考虑内含子区域,最近才明白需要计算外显子之和。
- 目前计算gene length 已经有好多工具
- TPM,RPKM 直接定量工具也很多,比如
cufflink
【rpkm】,stringtie
【rpkm,TPM】.需要注意的是:
1.hisat2
需要添加特定参数进行比对,才可以与cufflink
进行配套使用,否则会报错;
- stringtie 可以方便计算TPM,但是每一次计算的gene数目不一样,比如有时候20001,20005 不等,需要手动过滤一些不相关的gene
- 有时候
cufflink
和featurecount
计算方式不一样,导致两者分别计算rpkm结果会有偏差。
😊欢迎评论留言~
网友评论