引言

在转录组学的机器学习任务中,counts 值(即原始读取数)通常不适合作为输入数据,而每百万缩放因子长度(TPM, Transcripts Per Million)更适合作为特征。

而我们在实际使用的时候,很多 geo 的数据并不会提供 tpm 数据或原始 fastq 数据,因此,弄清楚 geo 数据集的 counts 转换为 tpm 的方法是有必要的。

事实上,互联网上有很多人提供了 counts 转换为 tpm 的教程[1-3], 一般的流程是:

  1. 通过 GTF 文件或基因长度文件获取外显子长度文件
  2. 构建带有对应基因长度的表达矩阵
  3. 计算 TPM
    1. 目标基因的外显子长度之和除以 1000
    2. 基于 counts 计算每千碱基 reads 长度标准化 (RPK, Reads Per Kilobase)
    3. 基于 RPK 计算 TPM

但是按照这个流程会出现一个问题,那就是计算 RPK 的过程中需要使用 Ensembl ID, 而 TPM 的过程中需要计算一次单样本所有表达量之和,所以如果按照这个流程就会造成两种可能:

  1. 无法计算 (无法 ID 转换或无法获得基因长度)
  2. 数据失真 (只计算部分基因之和或获得了错误的基因长度)

一开始我打算借助 CPM(Counts Per Million) 进行计算,但是发现 tpm 是有本质区别的还是算了。因为 counts 本质是 fragments 或 reads, 所以没办法在不借助基因长度的情况下转换。

过程

counts 直接计算 TPM(Transcripts Per Million)需要考虑基因的表达量和基因长度。具体公式如下:

公式步骤

  1. 计算 RPK(Reads Per Kilobase)
    对于每个基因,先计算每个基因的 RPK 值。RPK 是指每千碱基的 reads 数:
    [
    \text{RPK}{i} = \frac{\text{counts}{i}}{\text{efflen}_{i} / 1000}
    ]
    其中:

    • ( \text{counts}_{i} ):基因 ( i ) 的原始 counts 值
    • ( \text{efflen}_{i} ):基因 ( i ) 的有效长度,以碱基数为单位
    • ( 1000 ) 将基因长度转化为千碱基单位
  2. 计算每个样本中所有基因的 RPK 总和
    对于每个样本,计算所有基因的 RPK 总和:
    [
    \text{sum_RPK} = \sum_{i} \text{RPK}_{i}
    ]

  3. 计算每个基因的 TPM
    最后,将每个基因的 RPK 除以总 RPK 并乘以 1,000,000,标准化得到 TPM:
    [
    \text{TPM}{i} = \frac{\text{RPK}{i}}{\text{sum_RPK}} \times 10^6
    ]

总结的公式

[
\text{TPM}{i} = \frac{\left( \frac{\text{counts}{i}}{\text{efflen}{i} / 1000} \right)}{\sum{j} \frac{\text{counts}{j}}{\text{efflen}{j} / 1000}} \times 10^6
]

R 代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# counts_matrix 是你的表达矩阵,行是基因,列是样本
# gene_lengths 是每个基因的有效长度向量,与 counts_matrix 的行对应

# 1. 计算 RPK
rpk_matrix <- sweep(counts_matrix, 1, gene_lengths / 1000, FUN = "/")

# 2. 计算每个样本的 RPK 总和
sum_rpk <- colSums(rpk_matrix)

# 3. 计算 TPM
tpm_matrix <- sweep(rpk_matrix, 2, sum_rpk, FUN = "/") * 1e6

# 查看结果
head(tpm_matrix)

结论

篇外

转录组学的机器学习任务中选择 tpm 值原因

在转录组学的机器学习任务中,counts 值(即原始读取数)通常不适合作为输入数据,而 TPM(Transcripts Per Million) 更适合作为特征,主要有以下几个原因:

  1. 测序深度和基因长度的影响

    • Counts 值直接反映了测序获得的某个基因的原始读数数量,但这个数量会受到测序深度(即测序的总读取数)和基因长度的影响。即使是同一基因在不同的样本中表达水平相同,测序深度不同的样本中的 counts 值可能会有显著差异。
    • TPM 是一种标准化的表达量,考虑了基因长度和测序深度的差异,消除了这些因素对表达量的影响,使得不同样本之间的基因表达量可以更好地进行比较。
  2. 数据的可比性

    • 由于 counts 值在不同的样本中没有标准化,直接使用它们会导致样本之间的数据不具有可比性,尤其是当测序深度不同的情况下。
    • TPM 标准化了每个样本的基因表达量,将基因表达水平表示为每百万个转录本中某个基因的转录本数量,从而在不同样本之间具有可比性。
  3. 机器学习模型的输入要求

    • 机器学习算法通常假设输入数据在不同特征之间是可比的、归一化的,以避免某些特征因为数值范围过大或过小对模型产生不平衡的影响。
    • TPM 通过标准化 counts 值,缩小了数值范围,并使数据分布更加符合模型的要求,从而提高模型的稳定性和性能。
  4. 避免稀疏性和噪声问题

    • 原始的 counts 值在很多基因上会非常稀疏,尤其是低表达基因的 counts 值可能为零或非常低,这些零值或极小的值会在机器学习模型中引入不必要的噪声。
    • TPM 通过标准化表达数据,可以减小这些稀疏性问题,使得表达值更平滑、更连续,有助于模型更好地提取特征。

因此,TPM 更适合作为转录组学机器学习的输入数据,因为它通过标准化表达量,提升了数据的可比性、模型的性能以及分析的准确性。

引用

  1. 关于 Count,FPKM,TPM,RPKM 等表达量的计算_计算 fpkm readscount-CSDN 博客
  2. 生信小白教程之 Count 转 TPM,FPKM - 简书
  3. featureCounts 得到的 counts 计算 cpm、tpm、FPKM - 简书