Diferenças entre TPM, FPKM e RPFM - lmigueel/Bioinformatica GitHub Wiki
1. Sobre
Em análises de RNA-Seq, você relatava seus resultados em RPKM (reads por milhões de base) ou FPKM (fragmentos por milhões de base). No entanto, o TPM (Transcripts Per Kilobase Million) está se tornando bastante popular.
Essas três métricas tentam normalizar a profundidade do sequenciamento e o comprimento do gene. Veja como você faz isso para RPKM:
- Conte o total de reads em uma amostra e divida esse número por 1.000.000 - este é o nosso fator de escala “por milhão”.
- Divida as contagens de reads pelo fator de escala “por milhão”. Isso normaliza a profundidade de sequenciamento, fornecendo leituras por milhão (RPM)
- Divida os valores de RPM pelo comprimento do gene, em quilobases. Isso dá a você RPKM.
=======================================================
FPKM é muito semelhante ao RPKM. RPKM foi feito para reads single-end RNA-Seq, onde cada read correspondia a um único fragmento que foi sequenciado. FPKM foi feito para reads paied-end de RNA-Seq. Com os reads paired-end de RNA-Seq, dois reads podem corresponder a um único fragmento ou, se um dos reads do par não mapear, um read pode corresponder a um único fragmento. A única diferença entre RPKM e FPKM é que o FPKM leva em consideração que dois reads podem ser mapeadas para um fragmento (e, portanto, não conta este fragmento duas vezes).
===================================================
TPM é muito semelhante a RPKM e FPKM. A única diferença é a ordem das operações. Veja como você calcula o TPM:
1.Divida as contagens de reads pelo comprimento de cada gene em quilobases. Isso fornece reads por quilobase (RPK).
2.Conte todos os valores RPK em uma amostra e divida esse número por 1.000.000. Este é o seu fator de escala “por milhão”.
3.Divida os valores RPK pelo fator de escala “por milhão”. Isso dá a você o TPM.
Então você vê, ao calcular o TPM, a única diferença é que você normaliza primeiro para o comprimento do gene e depois normaliza para a profundidade de sequenciamento. No entanto, os efeitos dessa diferença são bastante profundos.
Quando você usa o TPM, a soma de todos os TPMs em cada amostra é a mesma. Isso torna mais fácil comparar a proporção de reads mapeadas para um gene em cada amostra. Em contraste, com RPKM e FPKM, a soma dos reads normalizados em cada amostra pode ser diferente, e isso torna mais difícil comparar as amostras diretamente. NÃO COMPARE GENES EM FPKM/RPKM.
Acesse esse ótimo video explicativo da diferença causada na comparação entre FPKM, RPKM e TPM.
2. Conversões
Neste post AQUI existe uma explicação rápida de como converter FPKM para TPM e as fórmulas matemáticas dos cálculos. O script em R, realizado por Harold Pimentel, do mesmo blog citado, está logo abaixo:
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)
}
################################################################################
# An example
################################################################################
cnts <- c(4250, 3300, 200, 1750, 50, 0)
lens <- c(900, 1020, 2000, 770, 3000, 1777)
countDf <- data.frame(count = cnts, length = lens)
# assume a mean(FLD) = 203.7
countDf$effLength <- countDf$length - 203.7 + 1
countDf$tpm <- with(countDf, countToTpm(count, effLength))
countDf$fpkm <- with(countDf, countToFpkm(count, effLength))
with(countDf, all.equal(tpm, fpkmToTpm(fpkm)))
countDf$effCounts <- with(countDf, countToEffCounts(count, length, effLength))
Citação
https://www.rna-seqblog.com/rpkm-fpkm-and-tpm-clearly-explained/