跳转至

定量工具对比:Salmon/Kallisto/featureCounts

一句话概述:Salmon和Kallisto通过伪比对实现极速转录本定量(分钟级),featureCounts通过BAM文件做基因级计数(稳定可靠),RSEM兼顾准确度和转录本定量——选择取决于你需要基因级还是转录本级结果。

核心知识点速查表

概念说明
Salmon基于准比对的快速转录本定量(白话:不用完整比对就能数每个基因的表达量)
Kallisto基于k-mer伪比对的极速定量(与Salmon类似但算法不同)
featureCounts基于BAM文件的基因级计数(需先比对)
RSEM基于EM算法的转录本精确定量(比对+定量一体化)
TPM每百万转录本(标准化后的表达量单位)
伪比对不做碱基级比对,只判断读段来自哪个转录本

一、四大工具全面对比

特性SalmonKallistofeatureCountsRSEM
类型伪比对伪比对比对后计数比对+定量
速度非常快(~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)