跳转至

Salmon 转录本定量

Salmon 是一款超快速的 RNA-seq 转录本定量工具,不需要传统比对步骤就能直接估算基因/转录本表达量,内置多种偏差校正模型,是目前最主流的轻量级定量方案之一。

核心知识点

知识点说明
工具定位RNA-seq 转录本水平表达定量工具
最新版本v1.11.4(基于 SSHash 索引)
开发团队COMBINE-lab(Rob Patro 实验室)
核心优势不需要全基因组比对,直接用转录组建索引定量,极快
定量算法选择性比对(Selective Alignment)+ 变分推断
偏差校正内置 GC 含量偏差、位置偏差、序列偏差校正
输出格式TPM、NumReads 等定量结果,可直接导入 DESeq2/edgeR
注意事项v1.11.x 重构了索引格式,旧索引必须重建

安装配置

方法一:Conda 安装(推荐)

# 创建 RNA 定量环境
conda create -n quant python=3.10  # 创建环境
conda activate quant               # 激活

# 安装 Salmon
conda install -c bioconda salmon    # 安装 salmon
salmon --version                    # 验证,应显示 1.11.x

方法二:预编译二进制

# 从 GitHub 下载预编译版本
wget https://github.com/COMBINE-lab/salmon/releases/download/v1.11.4/salmon-1.11.4_linux_x86_64.tar.gz
tar -xzf salmon-1.11.4_linux_x86_64.tar.gz  # 解压
export PATH=$PWD/salmon-1.11.4/bin:$PATH     # 添加到 PATH
salmon --version                              # 验证

基本使用

1. 构建转录组索引

# 方式 A:仅用转录组(基础用法)
salmon index \
  -t transcripts.fa \          # 转录组 FASTA 文件(如 Ensembl 的 cdna.all.fa)
  -i salmon_index \            # 索引输出目录
  -p 8                         # 线程数

# 方式 B:加 decoy 序列(推荐,更准确)
# 先准备 decoy 序列(用整个基因组作为 decoy)
grep "^>" ref_genome.fa | cut -d " " -f 1 | sed 's/>//' > decoys.txt  # 提取染色体名
cat transcripts.fa ref_genome.fa > gentrome.fa  # 合并转录组和基因组

salmon index \
  -t gentrome.fa \             # 合并后的 FASTA
  -d decoys.txt \              # decoy 序列名列表
  -i salmon_index_decoy \      # 索引目录
  -p 16                        # 线程数

2. 双端数据定量

# 标准双端 RNA-seq 定量
salmon quant \
  -i salmon_index \              # 索引目录
  -l A \                          # 自动检测文库类型(A = auto)
  -1 sample_R1.fq.gz \           # 正向读长
  -2 sample_R2.fq.gz \           # 反向读长
  -p 16 \                        # 线程数
  --validateMappings \            # 启用选择性比对(更准确)
  --gcBias \                      # 校正 GC 含量偏差
  --seqBias \                     # 校正序列偏差
  -o sample_quant                 # 输出目录

# 输出文件:
# sample_quant/quant.sf          主要结果(每个转录本的定量)
# sample_quant/aux_info/         辅助信息
# sample_quant/lib_format_counts.json  文库类型检测结果

3. 查看定量结果

# 查看 quant.sf 文件前几行
head sample_quant/quant.sf

# 列说明:
# Name        转录本名称
# Length      转录本长度
# EffectiveLength  有效长度(考虑了偏差校正)
# TPM         每百万转录本中的比例(Transcripts Per Million)
# NumReads    估算的读长数

4. 批量定量脚本

#!/bin/bash
# batch_salmon.sh - 批量 Salmon 定量

INDEX="salmon_index"          # 索引目录
THREADS=16                    # 线程数
OUTDIR="salmon_results"       # 输出根目录

mkdir -p $OUTDIR

for R1 in raw_data/*_R1.fq.gz; do
    SAMPLE=$(basename $R1 _R1.fq.gz)  # 提取样本名
    R2=${R1/_R1/_R2}                    # 推断 R2 文件

    echo "定量中: $SAMPLE"

    salmon quant \
      -i $INDEX \
      -l A \                            # 自动检测文库类型
      -1 $R1 \
      -2 $R2 \
      -p $THREADS \
      --validateMappings \
      --gcBias \
      -o ${OUTDIR}/${SAMPLE}            # 每个样本一个输出目录
done

echo "全部定量完成"

高级用法

1. 基于比对的定量模式

# 如果你已经用 STAR 比对了,可以用 Salmon 的比对模式
# 先用 STAR 输出转录组 BAM
STAR --quantMode TranscriptomeSAM ...

# 再用 Salmon 的 alignment-based 模式
salmon quant \
  -t transcripts.fa \              # 转录组 FASTA
  -l A \                            # 自动检测文库类型
  -a Aligned.toTranscriptome.out.bam \  # STAR 的转录组 BAM
  -o salmon_align_quant             # 输出目录

2. 用 tximeta 导入 R 做差异分析

# 在 R 中用 tximeta 导入 Salmon 结果
library(tximeta)  # 加载 tximeta 包

# 准备样本信息表
samples <- data.frame(
  names = c("ctrl1", "ctrl2", "treat1", "treat2"),  # 样本名
  files = c(                                          # quant.sf 路径
    "salmon_results/ctrl1/quant.sf",
    "salmon_results/ctrl2/quant.sf",
    "salmon_results/treat1/quant.sf",
    "salmon_results/treat2/quant.sf"
  ),
  condition = c("ctrl", "ctrl", "treat", "treat")     # 分组信息
)

# 导入 Salmon 结果(自动识别基因组版本)
se <- tximeta(samples)           # 导入为 SummarizedExperiment 对象

# 汇总到基因水平
gse <- summarizeToGene(se)       # 从转录本水平汇总到基因水平

# 传给 DESeq2 做差异分析
library(DESeq2)
dds <- DESeqDataSet(gse, design = ~condition)  # 构建 DESeq2 对象
dds <- DESeq(dds)                               # 运行差异分析
res <- results(dds)                             # 提取结果

3. 文库类型说明

# -l 参数指定文库类型,常用值:
# A   自动检测(推荐,适用于大多数情况)
# ISR Illumina stranded (dUTP) - 正向链特异
# ISF 正向链特异
# IU  非链特异
# U   单端非链特异

# 如何判断文库类型?
# 看 Salmon 输出的 lib_format_counts.json
cat sample_quant/lib_format_counts.json  # 查看自动检测的文库类型

常见报错与解决

报错信息原因解决方法
Index is out of date用旧版 Salmon 建的索引用新版 Salmon 重建索引
Could not find index索引路径错误检查 -i 路径是否正确
[quant] total 0 reads文件读取失败或文件为空检查输入文件是否存在且非空
文库类型检测不对自动检测偶尔不准手动指定 -l ISR-l IU
TPM 全是 0转录组与读长物种不匹配确认转录组 FASTA 和测序数据是同一物种
内存不足大量转录本索引时减少线程数或增加内存

速查表

# ===== Salmon 速查表 =====

# 安装
conda install -c bioconda salmon        # conda 安装

# 建索引
salmon index -t transcripts.fa -i idx -p 8

# 带 decoy 的索引(推荐)
grep "^>" genome.fa | cut -d" " -f1 | sed 's/>//' > decoys.txt
cat transcripts.fa genome.fa > gentrome.fa
salmon index -t gentrome.fa -d decoys.txt -i idx_decoy -p 16

# 双端定量
salmon quant -i idx -l A \
  -1 R1.fq.gz -2 R2.fq.gz \
  -p 16 --validateMappings --gcBias \
  -o output/

# 单端定量
salmon quant -i idx -l A \
  -r reads.fq.gz \
  -p 16 --validateMappings \
  -o output/

# 基于比对的定量
salmon quant -t transcripts.fa -l A \
  -a aligned.bam -o output/

# 输出文件
# quant.sf              转录本定量结果
# quant.genes.sf        基因水平定量(需要 --geneMap)
# aux_info/             辅助信息
# lib_format_counts.json  文库类型

# 结果列含义
# TPM       标准化表达量(跨样本可比)
# NumReads  估算读长数(用于差异分析)