vlambda博客
学习文章列表

R语言实战:counts如何转化为TPM和FPKM, TPM和FPKM相互转化

read_counts, FPKM, TPM定义理解参考:

http://www.360doc.com/content/18/0112/02/50153987_721216719.shtml

在RNA-Seq的分析中,对基因或者转录本的reads count数目进行标准化是一个很重要的步骤,因为落在一个基因区域内的read数目取决于基因长度和测序深度。基因越长read数目越多,测序深度越高,则一个基因对应的read数目也相对越多。所以必须要标准化,而标准化的两个关键因素就是基因长度与测序深度。

FPKM先对测序深度进行标准化,然后再对基因长度进行标准化。

TPM先对再对基因长度进行标准化,然后测序深度进行标准化。

不管是计算FPKM、RPKM,还是计算TPM,我们都要先得到一个ReadCount的矩阵(行为基因,列为样本)。在计算FPKM和RPKM时,都是先按列(也就是这个样本的总read数)进行标化,之后再对对个基因的长度进行标准化。而TPM是先对基因长度进行标准化,之后再对列(这个时候就不再是这个样本的总read数了)进行标化。这样使得最终的TPM矩阵的每列都相同(列和都等于1),也就是说每个样本中的TPM的和都是一样的。这样就会使得我们更容易去比较同一个基因在不同样本中所占的read数的比例。而RPKM/FPKM由于最终的表达值矩阵的列和不同,故而不能直接比较同一个基因在不同样本中所占的read数的比例。


#载入数据

mycounts<-read.csv("2020武汉加油.csv")
head(mycounts)
rownames(mycounts)<-mycounts[,1]
mycounts<-mycounts[,-1]
head(mycounts)

#TPM计算

kb <- mycounts$Length / 1000
kb
countdata <- mycounts[,1:9]
rpk <- countdata / kb
rpk
tpm <- t(t(rpk)/colSums(rpk) * 1000000)
head(tpm)
write.table(tpm,file="2020武汉加油_tpm.xls",sep="\t",quote=F)

#FPKM计算

fpkm <- t(t(rpk)/colSums(countdata) * 10^9)
head(fpkm)
write.table(fpkm,file="2020武汉加油_fpkm.xls",sep="\t",quote=F)

#FPKM转化为TPM

fpkm_to_tpm = t(t(fpkm)/colSums(fpkm))*10^6
head(fpkm_to_tpm)
当然,已知所有基因的FPKM情况下,可以通过上述公式直接在excel里计算相应基因的TPM值。

电脑端欢迎关注我的简书号:酷睿_1991https://www.jianshu.com/u/8aa07e48e0ae