生信分析避坑指南:FPKM、TPM、RPKM等核心名词深度解析与实操

发布时间:2026/10/9 21:52:14
生信分析避坑指南:FPKM、TPM、RPKM等核心名词深度解析与实操
1. 生信名词解释项目的整体设计思路1.1 为什么我要做这个名词解释项目刚入行做生信分析那会儿最头疼的不是写代码也不是跑流程而是读文献和跟同行交流时满屏的缩写和术语。FPKM、TPM、RPKM这三个到底有什么区别为什么有人用这个有人用那个FPKM和TPM到底哪个更合理再比如FPKM和TPM到底能不能跨样本比较这些问题在教科书里往往一笔带过但在实际项目里选错了指标可能直接导致下游分析结论翻车。我做这个名词解释项目的初衷很简单把生信领域高频出现的名词按照实际使用场景分类整理每个词条不仅给出定义还要说清楚它在什么场景下用、怎么计算、有什么坑、和相近术语的区别在哪里。这不是一本词典而是一份“生信人日常避坑手册”。这个项目适合三类人一是刚转行做生信的分析师需要快速建立术语体系二是做湿实验但需要看懂生信报告的科研人员想弄明白报告里那些数字到底怎么来的三是已经有一定经验但想系统梳理知识体系的从业者查漏补缺。不管你属于哪一类这份名词解释都能让你在遇到生信术语时不再一头雾水。1.2 名词解释项目的分类框架生信名词浩如烟海如果只是按字母顺序排列查起来效率极低。我按照实际工作流把名词分成六大类每一类对应生信分析的一个核心环节测序与原始数据类FASTQ、FASTA、Phred质量值、Q20/Q30、Read、Pair-end、Insert size等比对与注释类SAM/BAM、CIGAR、MAPQ、Reference genome、GTF/GFF、CDS、UTR等定量与标准化类FPKM、TPM、RPKM、Counts、CPM、DESeq2归一化、TMM等差异分析与统计类P-value、FDR、Fold Change、Log2FC、Wald test、Likelihood ratio test等富集与功能类GO、KEGG、GSEA、ORA、NES、Leading edge等单细胞与空间组学类UMI、Barcode、Doublet、HVG、PCA/UMAP/tSNE、Leiden/Louvain等这个分类框架的好处是当你遇到一个不认识的词先判断它属于哪个环节然后在这个环节里找相近术语对比理解起来会快很多。比如你看到FPKM知道它属于定量标准化类自然会去对比TPM和RPKM而不是孤立地记一个定义。1.3 每个词条的编写原则我给自己定了几条规矩确保每个词条都有实际参考价值第一定义要短。一句话说清楚是什么不绕弯子。比如FPKM就是“每百万比对片段中每千碱基外显子长度的片段数”一句话讲完。第二公式要全。涉及计算的词条必须给出完整公式并且解释每个变量的含义。公式不是摆设是让你理解这个指标到底在衡量什么。第三场景要具体。说清楚这个指标在什么分析步骤里出现什么工具会输出它什么情况下该用它、什么情况下不该用。第四坑要标出来。这是最有价值的部分。比如FPKM不能跨样本比较TPM可以比如Counts数据直接做PCA会受测序深度影响必须先归一化比如单细胞里的UMI不是Read不能混为一谈。第五对比要清晰。相近术语必须做对比表格把差异点列出来一目了然。2. 核心名词深度解析与实操要点2.1 定量标准化三兄弟FPKM、TPM、RPKM到底怎么选这三个词是生信里被问得最多的没有之一。我先给结论现在做RNA-seq分析优先用TPM其次FPKMRPKM基本可以淘汰了。为什么往下看。RPKM的全称是Reads Per Kilobase per Million mapped reads公式是RPKM (某基因的Read Count) / (该基因长度/1000) / (总比对Read数/10^6)FPKM是Fragments Per Kilobase per Million mapped fragments和RPKM几乎一样区别在于RPKM用于单端测序FPKM用于双端测序。双端测序里一个Fragment对应两条Read所以用Fragment数而不是Read数。TPM是Transcripts Per Million公式分两步第一步Rate Read Count / (基因长度/1000) 第二步TPM Rate / sum(所有基因的Rate) * 10^6关键差异在哪里RPKM和FPKM是先除以总Read数再除以基因长度TPM是先除以基因长度再除以所有基因Rate的总和。这个顺序差异导致了一个重要结果TPM的每个样本总和都是10^6而FPKM/RPKM的总和不是固定的。这意味着什么TPM可以直接跨样本比较因为每个样本都归一化到同一个尺度。FPKM不行因为不同样本的FPKM总和不同你没法说样本A的FPKM 10一定比样本B的FPKM 8表达量高。我实测过一个数据集同一个基因在样本A的FPKM是12.5样本B是10.8看起来A更高。但算TPM后发现A是8.2B是9.1实际B更高。原因就是两个样本的FPKM总和差了将近20%。这种坑在差异分析里如果没注意结论可能完全反过来。注意如果你用的是DESeq2或edgeR做差异分析不要用FPKM/TPM作为输入这两个工具需要原始Counts。FPKM/TPM只适合做样本内表达量展示或样本间粗略比较。2.2 比对质量值MAPQ和Phred到底在说什么MAPQ是Mapping Quality的缩写表示一条Read比对到参考基因组某个位置的置信度。它的计算方式是Phred-scaleMAPQ -10 * log10(P_mapping_wrong)如果MAPQ30意味着这条Read比对错误的概率是10^(-30/10)0.001即千分之一。MAPQ0表示这条Read在参考基因组上有多个同样好的比对位置工具无法确定它到底来自哪里。这类Read在后续分析里通常要过滤掉否则会造成假阳性。Phred质量值则是测序仪给出的碱基识别置信度公式一样Q -10 * log10(P_error)Q20表示错误率1%Q30表示错误率0.1%。FASTQ文件里每个碱基对应一个ASCII字符字符转数字就是Q值。比如字符!对应Q0I对应Q40。实操中我一般这样设置过滤阈值MAPQ30碱基Q20。对于SNP callingMAPQ要求更高通常40。对于ChIP-seq peak callingMAPQ30就够了。这些阈值不是绝对的要根据数据质量和分析目的调整。实操心得如果你发现比对率很高但MAPQ普遍偏低先检查参考基因组版本是否匹配再检查Read长度和比对工具参数。很多时候是参考基因组选错了不是数据本身的问题。2.3 差异分析核心指标P-value、FDR、Fold Change的关系做差异分析这三个指标必须一起看单独看任何一个都可能被误导。P-value衡量的是“差异由随机误差导致的概率”。P0.05意味着如果两组没有真实差异观察到当前或更极端差异的概率小于5%。但问题是当你同时检验20000个基因时即使所有基因都没有真实差异按P0.05的标准也会得到大约1000个假阳性。FDRFalse Discovery Rate就是来解决这个问题的。它是对P-value做多重检验校正后的结果控制的是“所有被判为显著的基因中假阳性所占的比例”。常用的校正方法有BHBenjamini-Hochberg和Bonferroni。BH更常用因为它控制FDR的同时保留更多真阳性。Fold Change是两组表达量的比值通常取Log2。Log2FC1表示表达量翻倍Log2FC-1表示减半。但Fold Change大不代表显著因为如果表达量本身很低且波动大FC可能很大但P-value不显著。我一般这样筛选差异基因|Log2FC| 1 且 FDR 0.05。这个组合既控制了假阳性又保证了差异幅度有生物学意义。如果做的是临床样本FDR可以放宽到0.1因为样本异质性大严格阈值可能漏掉真实信号。指标含义常用阈值注意事项P-value差异由随机误差导致的概率0.05多重检验时假阳性高FDR显著结果中假阳性的比例0.05或0.1BH校正最常用Log2FC表达量变化的倍数取Log2|Log2FC|1低表达基因FC波动大2.4 单细胞核心概念UMI、Barcode、Doublet单细胞测序和Bulk RNA-seq最大的区别在于单细胞里每个细胞、每条转录本都需要被标记和追踪。UMI和Barcode就是干这个的。Barcode是细胞标签每一颗微珠上有一段特定的核酸序列同一个微珠捕获的所有转录本都带相同的Barcode。测序后根据Barcode把Reads分配到不同细胞。但Barcode不是完美的会有错配和背景噪音所以需要做Barcode过滤和校正。UMIUnique Molecular Identifier是分子标签每一条原始mRNA分子在反转录时被标记一个随机序列。这样即使一条mRNA被PCR扩增了很多次最终计数时只算一个UMI而不是算Read数。这解决了PCR扩增偏差的问题。Doublet是指一个液滴里包裹了两个细胞导致这个Barcode对应的表达谱是两个细胞的混合。Doublet不处理会严重影响聚类结果因为混合表达谱可能形成假的中间态细胞群。常用的Doublet检测工具有Scrublet、DoubletFinder等原理是模拟双细胞表达谱看哪些Barcode的表达谱与模拟结果相似。注意UMI和Read不是一回事。一个UMI可能对应多条Read计数时要去重。如果你直接用Read Count做单细胞分析高表达基因会被PCR扩增偏差严重扭曲。3. 实操过程与核心环节实现3.1 从FASTQ到Counts矩阵的完整流程这一节我把从原始数据到定量矩阵的完整流程走一遍每个环节涉及的名词我都会标注出来。第一步质控。拿到FASTQ文件后先用FastQC看质量分布。重点看Per base sequence quality碱基质量、Per sequence quality scoresRead整体质量、Adapter content接头污染。如果Q30比例低于80%或者接头含量高需要用Trimmomatic或fastp做修剪。第二步比对。用HISAT2或STAR把Reads比对到参考基因组。HISAT2适合RNA-seqSTAR速度更快但内存消耗大。比对后得到SAM文件用samtools转成BAM并排序。这一步要关注比对率通常70%合格和MAPQ分布。第三步定量。用featureCounts或HTSeq-count根据GTF注释文件统计每个基因的Read Count。featureCounts速度更快支持多线程。注意要设置-p参数如果是双端数据-s参数根据链特异性选择0非链特异、1正向、2反向。第四步生成Counts矩阵。把所有样本的Count结果合并成一个矩阵行是基因列是样本。这个矩阵就是后续差异分析的输入。# 示例featureCounts定量命令 featureCounts -T 8 -p -s 2 -a annotation.gtf -o counts.txt sample1.bam sample2.bam sample3.bam第五步标准化与差异分析。用DESeq2或edgeR读入Counts矩阵做归一化和差异检验。DESeq2的DESeqDataSetFromMatrix函数需要指定设计公式比如~ condition。# 示例DESeq2差异分析 library(DESeq2) dds - DESeqDataSetFromMatrix(countData counts, colData coldata, design ~ condition) dds - DESeq(dds) res - results(dds, contrast c(condition, treatment, control))3.2 参数选择背后的计算逻辑为什么featureCounts的-s参数要设2这涉及链特异性文库的构建方式。dUTP法建库时第二条cDNA链被降解所以Read1的方向与转录本方向相反。如果设错了定量结果会完全错乱。怎么判断看试剂盒说明书或者用infer_experiment.pyRSeQC工具推断。为什么DESeq2要用原始Counts而不是FPKM因为DESeq2的统计模型基于负二项分布它需要整数Counts来估计离散度dispersion。FPKM是连续值不满足模型假设。如果你非要用FPKM可以用limma-trend或limma-voom它们对输入数据的分布假设不同。为什么差异分析前要做独立过滤DESeq2的results函数有一个independentFiltering参数默认TRUE。它会根据基因的平均表达量自动过滤低表达基因因为这些基因的P-value分布不均匀会干扰FDR校正。手动过滤的话一般保留至少在N个样本中Counts10的基因N取决于你的样本量。3.3 富集分析的名词与实操差异基因拿到后下一步通常是富集分析。这里涉及的名词有GO、KEGG、GSEA、ORA、NES等。GOGene Ontology分三个分支BP生物过程、MF分子功能、CC细胞组分。做GO富集时三个分支要分开做不要混在一起。KEGG是通路数据库比GO更聚焦于代谢和信号通路。KEGG富集的结果通常用气泡图展示横轴是Gene Ratio纵轴是通路名称点的大小是基因数颜色是P-value或FDR。ORAOver-Representation Analysis是传统的富集方法输入是差异基因列表和背景基因列表用超几何检验计算每个通路的富集显著性。缺点是只用了差异基因忽略了那些变化不大但协同作用的基因。GSEAGene Set Enrichment Analysis不需要设定差异阈值它用所有基因的排序列表通常按Log2FC或信号强度排序计算每个基因集在列表中的分布是否偏向顶部或底部。NESNormalized Enrichment Score是GSEA的核心输出正值表示基因集在实验组中富集负值表示在对照组中富集。我一般两种方法都做ORA快速看显著通路GSEA看整体趋势。如果两者结果一致可信度高如果不一致需要深入检查是阈值设置问题还是生物学真实差异。4. 常见问题与排查技巧实录4.1 名词理解常见误区速查表误区正确理解实际影响FPKM可以跨样本比较FPKM总和不定不能直接跨样本比较差异分析结论可能反转UMI等于Read一个UMI可能对应多条Read单细胞定量偏高P-value越小差异越大P-value衡量显著性Fold Change衡量幅度低表达基因P小但FC小MAPQ0的Read可以保留MAPQ0表示多比对位置不确定造成假阳性Counts可以直接做PCACounts受测序深度影响样本聚类受批次影响GO和KEGG是一回事GO是本体论KEGG是通路数据库富集结果解读错误Doublet不影响聚类Doublet形成假中间态聚类群数偏多TPM和FPKM可以互换计算顺序不同总和性质不同跨样本比较出错4.2 实操中踩过的坑与解决方案坑一参考基因组版本不匹配。有一次做小鼠RNA-seq比对率只有60%远低于预期的85%。排查后发现GTF用的是mm10但FASTA用的是mm39。版本不匹配导致大量Reads无法正确比对。解决方案从同一个数据库下载FASTA和GTF确保版本一致。坑二链特异性参数设错。做链特异性文库时featureCounts的-s参数设成了0结果反义链的基因也被计数了。表现为某些基因的Counts异常高但实际表达量没那么高。解决方案用RSeQC的infer_experiment.py先推断链特异性再设置参数。坑三批次效应未校正。两个批次的数据合并分析PCA显示样本按批次聚类而不是按处理组聚类。解决方案用ComBat或limma的removeBatchEffect校正或者在DESeq2设计公式里加入批次因子~ batch condition。坑四FDR阈值过严导致漏检。临床样本异质性大FDR0.05只找到几个差异基因。放宽到FDR0.1后找到几十个且GSEA结果一致。解决方案根据样本类型调整阈值临床样本可适当放宽。坑五单细胞Doublet未过滤。聚类后发现一个群同时表达两个细胞类型的marker以为是新亚群。用DoubletFinder检测后发现这个群大部分是Doublet。解决方案单细胞分析第一步就做Doublet检测和过滤。独家技巧遇到不确定的名词或参数先查工具官方文档的FAQ部分那里往往有最直接的答案。其次看工具原始论文的方法部分比教程更准确。最后在社区搜索时用英文关键词加“difference”或“vs”比如“FPKM vs TPM”能找到很多高质量讨论。4.3 名词学习与记忆的实用方法生信名词多且杂死记硬背效率低。我的方法是按流程串联记忆把名词放进一个完整的分析流程里理解它在哪个步骤出现、解决什么问题、和上下游名词什么关系。比如从FASTQ到Counts你会依次遇到Phred、Adapter、MAPQ、CIGAR、GTF、Counts每个名词都有明确的上下文比孤立记忆牢固得多。另一个方法是对比记忆把相近名词做成对比表每次遇到就补充一行。比如FPKM/TPM/RPKM对比表UMI/Read/Barcode对比表P-value/FDR/Fold Change对比表。表格越用越厚理解也越来越深。最后是输出倒逼输入把你理解的名词讲给别人听或者写成笔记。讲不清楚的地方就是你没真正理解的地方。我很多名词的深入理解都是在给别人解释的过程中完成的。这个名词解释项目我会持续更新每遇到一个新名词或新坑就补充进去。生信领域发展快新方法新术语层出不穷保持学习和记录的习惯比记住多少名词更重要。