RNA-Seq的Counts和FPKM数据如何转换成TPM?

时间:2022-07-22
本文章向大家介绍RNA-Seq的Counts和FPKM数据如何转换成TPM?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们做转录组分析,得到的数据通常是raw counts 的数据,raw counts 的数据有很多R包进行归一化。在TCGA数据库中下载的RNA-Seq的数据就有2种形式,raw counts 和FPKM,尽管有很多文章是直接利用FPKM进行分析的,但是FPKM存在不准确性,通常我们会使用TPM。关于什么是FPKM?什么是TPM?我在前面的文章中就有介绍:RNA-seq的counts,RPM, RPKM, FPK值到底有什么区别?。如果从原始的下机数据开始分析,那就根据自己需要进行转换,但通常我们大多数拿到的是raw counts数据,一般送测序,也会要求返回raw counts的数据,从数据库下载的数据我们通常也是选择raw counts数据或者FPKM的数据。那么我们如何将这些数据进行转换成TPM的数据呢?read count和FPKM结果都可以转成TPM,但是因为FPKM跟TPM的计算都考虑了基因长度,所以从FPKM转TPM最方便快捷。只需要按照下面公式就可以计算:

具体可参考前面的文章:RNA-seq的counts,RPM, RPKM, FPK值到底有什么区别?,这里提供的是R代码。

首先我们得有FPKM的数据,这里我以之前TCGA数据库的数据为例。数据可在文章【TCGA数据库33个Project的RNA-Seq转录组数据为你整理打包好了】中下载。

load("F:/TCGA/HTSeq-FPKM/Rdata/data/TCGA-COAD-Exp.Rdata")
exp <- transomeData[["proteinCodingExpData"]][["Exp"]]

之前上传的数据是字符串,需要转换成数值。

library(dplyr)
exp <- exp %>% data.matrix() %>% as.data.frame()
head(exp)[,1:2]

首先,我们定义个函数,也就是上面的公式。

FPKM2TPM <- function(fpkm){
  exp(log(fpkm) - log(sum(fpkm)) + log(1e6))
}

然后我们利用apply函数进行遍历,就可以转换啦。

TPMs <- apply(exp,2,FPKM2TPM)

除了FPKM转换成TPM外,其他的数据也可以进行转换。

  • Counts转TPM
Counts2TPM <- function(counts, effLen){
  rate <- log(counts) - log(effLen)
  denom <- log(sum(exp(rate)))
  exp(rate - denom + log(1e6))
}
  • Counts转FPKM

Counts2FPKM <- function(counts, effLen){
  N <- sum(counts)
  exp( log(counts) + log(1e9) - log(effLen) - log(N) )
}
  • Counts转Effective counts
Counts2EffCounts <- function(counts, len, effLen){
  counts * (len / effLen)
}

参考:https://haroldpimentel.wordpress.com/2014/05/08/what-the-fpkm-a-review-rna-seq-expression-units/