定量工具对比:Salmon/Kallisto/featureCounts
一句话概述:Salmon和Kallisto通过伪比对实现极速转录本定量(分钟级),featureCounts通过BAM文件做基因级计数(稳定可靠),RSEM兼顾准确度和转录本定量——选择取决于你需要基因级还是转录本级结果。
核心知识点速查表
| 概念 | 说明 |
|---|
| Salmon | 基于准比对的快速转录本定量(白话:不用完整比对就能数每个基因的表达量) |
| Kallisto | 基于k-mer伪比对的极速定量(与Salmon类似但算法不同) |
| featureCounts | 基于BAM文件的基因级计数(需先比对) |
| RSEM | 基于EM算法的转录本精确定量(比对+定量一体化) |
| TPM | 每百万转录本(标准化后的表达量单位) |
| 伪比对 | 不做碱基级比对,只判断读段来自哪个转录本 |
一、四大工具全面对比
| 特性 | Salmon | Kallisto | featureCounts | RSEM |
|---|
| 类型 | 伪比对 | 伪比对 | 比对后计数 | 比对+定量 |
| 速度 | 非常快(~5min) | 极快(~3min) | 快(依赖BAM) | 慢(~1h) |
| 需要比对? | 否 | 否 | 是(BAM) | 否(自带) |
| 基因级 | 是 | 是 | 是(★主要) | 是 |
| 转录本级 | 是(★优势) | 是(★优势) | 差 | 是(★优势) |
| 内存 | ~4GB | ~4GB | ~2GB | ~8GB |
| 偏差校正 | 有(GC/position) | 无 | 无 | 有 |
| 推荐场景 | 通用RNA-seq | 快速初筛 | 基因级计数 | 精确转录本 |
二、安装与使用
2.1 Salmon(推荐首选)
# === 安装 ===
conda install -c bioconda salmon
# === 第1步:建索引(只需一次) ===
# 下载转录组参考序列
wget ftp://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz
# 建Salmon索引
salmon index \
-t Homo_sapiens.GRCh38.cdna.all.fa.gz \ # 转录组fasta
-i salmon_index \ # 索引输出目录
-k 31 # k-mer大小(默认31)
# === 第2步:定量 ===
salmon quant \
-i salmon_index \ # 索引目录
-l A \ # 自动检测文库类型
-1 sample_R1.fq.gz \ # 正向读段
-2 sample_R2.fq.gz \ # 反向读段
-o salmon_output \ # 输出目录
--validateMappings \ # 验证比对(更准确)
--gcBias \ # GC偏差校正
--seqBias \ # 序列偏差校正
-p 8 # 线程数
# 输出文件: salmon_output/quant.sf
# 列: Name | Length | EffectiveLength | TPM | NumReads
2.2 Kallisto(极速定量)
# === 安装 ===
conda install -c bioconda kallisto
# === 建索引 ===
kallisto index \
-i kallisto_index \ # 索引文件名
transcripts.fa.gz # 转录组fasta
# === 定量 ===
kallisto quant \
-i kallisto_index \ # 索引
-o kallisto_output \ # 输出目录
-t 8 \ # 线程数
sample_R1.fq.gz sample_R2.fq.gz # 双端读段
# 输出文件: kallisto_output/abundance.tsv
# 列: target_id | length | eff_length | est_counts | tpm
2.3 featureCounts(基因级计数)
# === 安装 ===
conda install -c bioconda subread # featureCounts在subread包中
# === 基因级计数(需要先比对得到BAM) ===
featureCounts \
-a genes.gtf \ # 基因注释文件(GTF格式)
-o gene_counts.txt \ # 输出文件
-T 8 \ # 线程数
-p --countReadPairs \ # 双端测序:按片段计数
-s 2 \ # 链特异性:0=无/1=正/2=反(根据建库方式)
-t exon \ # 特征类型(外显子)
-g gene_id \ # 汇总属性(基因ID)
aligned_1.bam aligned_2.bam aligned_3.bam # 多个BAM文件
# 输出: gene_counts.txt(矩阵:基因×样本)
# 输出: gene_counts.txt.summary(比对统计)
2.4 RSEM(精确转录本定量)
# === 安装 ===
conda install -c bioconda rsem
# === 准备参考 ===
rsem-prepare-reference \
--gtf genes.gtf \ # 基因注释
ref.fa \ # 参考基因组
rsem_ref/ref # 参考前缀
# === 定量(RSEM自带比对,用STAR或Bowtie2) ===
rsem-calculate-expression \
--paired-end \ # 双端测序
--star \ # 用STAR做比对(推荐)
-p 8 \ # 线程数
sample_R1.fq.gz sample_R2.fq.gz \ # 输入文件
rsem_ref/ref \ # 参考前缀
sample_rsem # 输出前缀
# 输出: sample_rsem.genes.results(基因级)
# 输出: sample_rsem.isoforms.results(转录本级)
三、R语言读取定量结果
# === 用tximport汇总Salmon/Kallisto结果到基因级 ===
library(tximport)
# 准备文件列表
files <- c("sample1/quant.sf", "sample2/quant.sf", "sample3/quant.sf")
names(files) <- c("sample1", "sample2", "sample3")
# 需要转录本到基因的映射表
tx2gene <- read.csv("tx2gene.csv") # 两列: TXNAME, GENEID
# 或者从GTF提取:
# library(GenomicFeatures)
# txdb <- makeTxDbFromGFF("genes.gtf")
# tx2gene <- select(txdb, keys(txdb, "TXNAME"), "GENEID", "TXNAME")
# 导入Salmon结果(用于DESeq2)
txi <- tximport(
files,
type = "salmon", # 或"kallisto"
tx2gene = tx2gene, # 转录本→基因映射
countsFromAbundance = "no" # 使用原始计数
)
# 用于DESeq2
library(DESeq2)
dds <- DESeqDataSetFromTximport(
txi, # tximport对象
colData = sample_info, # 样本信息
design = ~ condition # 实验设计
)
# === 读取featureCounts结果 ===
counts <- read.table("gene_counts.txt",
header=TRUE, row.names=1, skip=1) # 跳过命令行
counts <- counts[, 6:ncol(counts)] # 只保留计数列
colnames(counts) <- gsub(".bam", "", colnames(counts)) # 清理列名
四、面试高频考点
Q1: 伪比对(pseudo-alignment)是什么原理?
- 传统比对:将每个读段的每个碱基对齐到基因组(碱基级比对)
- 伪比对:只判断读段来自哪个转录本,不关心具体位置
- Kallisto用k-mer散列,Salmon用准比对(quasi-mapping)
- 白话:传统比对像精确GPS定位每个点,伪比对像只确认你在哪个房间
Q2: Salmon vs Kallisto怎么选?
- Salmon:有GC偏差校正和序列偏差校正(更准确),推荐首选
- Kallisto:速度最快,适合快速初筛
- 实际差异很小,两者相关性>0.99
Q3: featureCounts的-s参数怎么选?
-s 0:非链特异性文库(老的建库方式)-s 1:正链特异性(dUTP第一链,如TruSeq)-s 2:反链特异性(dUTP第二链,最常见)- 不确定:用
infer_experiment.py(RSeQC)检查
Q4: 为什么推荐tximport而不是直接用Salmon的计数?
- tximport能正确汇总转录本级到基因级
- 保留长度偏差校正信息(直接加和会丢失)
- DESeq2的
DESeqDataSetFromTximport能利用这些校正
五、常见报错
| 报错 | 原因 | 解决 |
|---|
Salmon: index is incompatible | 索引版本不匹配 | 重新建索引 |
featureCounts: unrecognized strand | -s参数错误 | 用infer_experiment.py检查 |
Assigned rate 0% | GTF与基因组版本不匹配 | 确认GTF和参考来源一致 |
kallisto: incompatible indices | 版本升级后索引不兼容 | 重新建索引 |
| tximport报错 | tx2gene映射不匹配 | 确认转录本ID格式一致 |
速查表
# === 定量工具速查 ===
# Salmon(推荐)
salmon index -t transcripts.fa -i idx -k 31
salmon quant -i idx -l A -1 R1.fq.gz -2 R2.fq.gz -o out --validateMappings --gcBias
# Kallisto
kallisto index -i idx transcripts.fa
kallisto quant -i idx -o out R1.fq.gz R2.fq.gz
# featureCounts(需BAM)
featureCounts -a genes.gtf -o counts.txt -T 8 -p --countReadPairs -s 2 *.bam
# RSEM
rsem-prepare-reference --gtf genes.gtf ref.fa rsem_ref/ref
rsem-calculate-expression --paired-end --star -p 8 R1.fq.gz R2.fq.gz rsem_ref/ref out
# R导入: tximport(files, type="salmon", tx2gene=tx2gene)