RNA-seq表达矩阵归一化:从原理到实战,彻底搞懂RPKM、TPM与FPKM
刚拿到RNA-seq的原始计数矩阵,看着那一列列的数字,你是不是既兴奋又有点无从下手?兴奋的是,数据就在眼前,仿佛生命的奥秘触手可及;困惑的是,这些原始的“读数”真的能直接用来比较不同基因、不同样本间的表达高低吗?答案是否定的。这就好比比较两个城市的经济规模,你不能只看GDP总量,还得考虑人口基数。在RNA-seq分析中,归一化就是那个帮你剔除“人口基数”影响,让比较变得公平、科学的关键步骤。
对于生物信息学新手来说,RPKM、TPM、FPKM这几个缩写词就像三座绕不开的小山。网上资料不少,但要么过于理论,要么代码片段零散,看完还是不知道在自己的项目里到底该用哪个。这篇文章的目的,就是帮你把这三座小山踏平。我们不只讲公式,更会深入背后的计算逻辑,用R语言手把手带你实现转换,并聚焦于那个最实际的问题:在我的具体场景下,究竟该选择哪一种? 选错了,后续的差异分析、功能富集都可能建立在偏差之上,这个坑,我们一开始就要避开。
1. 为什么必须归一化?理解原始计数的局限性
在深入具体方法之前,我们必须先达成一个共识:直接从比对工具(如HTSeq、featureCounts)得到的原始计数(Raw Read Counts)本身是有“偏见”的。这种偏见主要来自两个方面,它们像是戴在数据上的两副有色眼镜,不摘掉就没法看清真相。
第一副眼镜:基因长度。 想象两个表达水平完全相同的基因A和B。基因A的转录本长度是2000个碱基,而基因B只有500个碱基。在测序过程中,较长的转录本会被随机打断成更多的片段,因此有更高的概率被捕获并测序。结果就是,基因A的原始计数会天然地比基因B高,但这并不代表基因A表达得更活跃。如果我们直接比较这两个基因的计数,就会严重高估长基因的表达量。
第二副眼镜:测序深度。 比较两个样本时,样本甲总共测了5000万条读段,样本乙只测了2500万条。即使两个样本中某个基因的真实表达量一模一样,样本甲中该基因的计数也大概率会是样本乙的两倍左右。这纯粹是测序投入量不同造成的技术差异,而非生物学差异。不矫正这一点,任何跨样本的比较都会失真。
所以,归一化的核心任务,就是设计一种数学方法,同时或依次摘掉这两副“眼镜”,让数据回归到反映真实生物学状态的尺度上。下面这个简单的R模拟数据,可以直观地展示这种影响:
# 模拟数据:两个基因,两个样本
gene_length <- c(2000, 500) # 基因长度
seq_depth <- c(50e6, 25e6) # 测序深度(单位:百万)
true_expression <- c(100, 100) # 假设真实表达水平相同
# 模拟原始计数(与长度和深度成正比)
raw_counts <- matrix(NA, nrow=2, ncol=2)
rownames(raw_counts) <- c("Gene_Long", "Gene_Short")
colnames(raw_counts) <- c("Sample_Deep", "Sample_Shallow")
for(i in 1:2){
for(j in 1:2){
raw_counts[i, j] <- round(true_expression[i] * (gene_length[i]/1000) * (seq_depth[j]/1e6))
}
}
print("模拟原始计数矩阵:")
print(raw_counts)
运行这段代码,你会发现Gene_Long的计数远高于Gene_Short,且深测序样本的计数也更高。这完美印证了直接使用原始计数的问题。
注意:归一化处理的是技术偏差,而不是生物学差异。它旨在为后续寻找真实的生物学差异铺平道路。
2. 三大主流方法深度拆解:RPKM、FPKM与TPM
了解了“为什么”,我们再来攻克“是什么”。RPKM、FPKM和TPM是三种最常被提及的归一化方法,它们公式相似,但计算顺序和内在逻辑的细微差别,导致了完全不同的适用场景。
2.1 RPKM:先深度,后长度
RPKM (Reads Per Kilobase per Million mapped reads) 的定义直白地体现在其名字里:每百万映射读段中,每千碱基转录本长度所对应的读段数。
它的计算分为清晰的两步:
- 矫正测序深度:用每个基因的原始计数除以该样本的总映射读段数(以百万计)。这步得到了RPM (Reads Per Million)。
- 矫正基因长度:将上一步的结果除以基因的长
312



被折叠的 条评论
为什么被折叠?



