跳转至

STAR RNA 比对器

STAR(Spliced Transcripts Alignment to a Reference)是目前最主流的 RNA-seq 比对工具,能超快速地将 RNA 测序读长比对到参考基因组,自动识别剪接位点,是 ENCODE 项目的官方比对工具。

核心知识点

知识点说明
工具定位RNA-seq 专用比对工具,能识别剪接位点(splice junction)
最新版本v2.7.11b(2024.01,GPLv3 许可证)
开发者Alexander Dobin(Cold Spring Harbor 实验室)
核心特点超快速(比 TopHat2 快 50 倍以上)、高准确率
内存需求人类基因组约需 30-40 GB 内存(这是 STAR 最大的缺点)
输出格式SAM/BAM,支持直接输出排序 BAM
扩展功能STARsolo(单细胞 RNA-seq)、STAR-Fusion(融合基因检测)
适用数据Illumina 短读 RNA-seq、单细胞 RNA-seq

安装配置

方法一:Conda 安装(推荐)

# 创建 RNA-seq 分析环境
conda create -n rnaseq python=3.10  # 创建环境
conda activate rnaseq               # 激活

# 安装 STAR
conda install -c bioconda star       # 安装 STAR
STAR --version                       # 验证,应显示 2.7.11b

方法二:从源码编译

# 下载源码
wget https://github.com/alexdobin/STAR/archive/2.7.11b.tar.gz  # 下载
tar -xzf 2.7.11b.tar.gz              # 解压
cd STAR-2.7.11b/source                # 进入源码目录

# 编译
make STAR                             # 编译 STAR

# 安装
sudo cp STAR /usr/local/bin/          # 复制到系统路径

基本使用

1. 构建基因组索引(第一步,只做一次)

# 构建 STAR 索引(人类基因组约需 30GB 内存,耗时约 30 分钟)
STAR --runMode genomeGenerate \
  --runThreadN 16 \                   # 使用 16 个线程
  --genomeDir star_index/ \           # 索引输出目录(需提前创建)
  --genomeFastaFiles ref_genome.fa \  # 参考基因组 FASTA 文件
  --sjdbGTFfile genes.gtf \           # 基因注释文件(GTF 格式)
  --sjdbOverhang 149                  # 读长长度 - 1(150bp 读长填 149)

# 说明:--sjdbOverhang 理想值 = 读长长度 - 1
# 如果你的读长是 150bp,就填 149;如果是 100bp,就填 99

2. 标准比对

# 双端 RNA-seq 比对
STAR --runMode alignReads \
  --runThreadN 16 \                   # 线程数
  --genomeDir star_index/ \           # 索引目录
  --readFilesIn \
    sample_R1.fq.gz \                 # 正向读长
    sample_R2.fq.gz \                 # 反向读长
  --readFilesCommand zcat \           # 处理 gzip 压缩文件
  --outSAMtype BAM SortedByCoordinate \  # 直接输出排序 BAM
  --outFileNamePrefix sample_         # 输出文件前缀

# 输出文件:
# sample_Aligned.sortedByCoord.out.bam  排序后的 BAM
# sample_Log.final.out                   比对统计报告
# sample_SJ.out.tab                      剪接位点信息

3. 查看比对统计

# 查看 STAR 的比对统计报告
cat sample_Log.final.out  # 里面有比对率、多重比对率等关键信息

# 关键指标:
# Uniquely mapped reads % → 唯一比对率,一般应 > 70%
# % of reads mapped to multiple loci → 多重比对率
# % of reads unmapped → 未比对率

高级用法

1. 两步比对法(Two-pass mode)

# 两步法能发现更多新的剪接位点,提高比对准确率
STAR --runMode alignReads \
  --runThreadN 16 \
  --genomeDir star_index/ \
  --readFilesIn R1.fq.gz R2.fq.gz \
  --readFilesCommand zcat \
  --outSAMtype BAM SortedByCoordinate \
  --twopassMode Basic \               # 启用两步比对模式
  --outFileNamePrefix twopass_

# 原理:第一遍扫描发现新的剪接位点
# 第二遍用发现的剪接位点重新建索引再比对
# 虽然慢一点,但结果更准确

2. 输出定量信息

# STAR 可以同时输出基因定量(类似 HTSeq-count)
STAR --runMode alignReads \
  --runThreadN 16 \
  --genomeDir star_index/ \
  --readFilesIn R1.fq.gz R2.fq.gz \
  --readFilesCommand zcat \
  --outSAMtype BAM SortedByCoordinate \
  --quantMode GeneCounts \             # 同时输出基因计数
  --outFileNamePrefix quant_

# 输出文件:quant_ReadsPerGene.out.tab
# 包含无链特异性、正链、反链三种计数

3. 用于 RSEM/Salmon 的转录组比对

# 输出转录组坐标的 BAM(给 RSEM 或 Salmon 用)
STAR --runMode alignReads \
  --runThreadN 16 \
  --genomeDir star_index/ \
  --readFilesIn R1.fq.gz R2.fq.gz \
  --readFilesCommand zcat \
  --outSAMtype BAM SortedByCoordinate \
  --quantMode TranscriptomeSAM \       # 输出转录组坐标 BAM
  --outFileNamePrefix rsem_

# 输出:rsem_Aligned.toTranscriptome.out.bam
# 可直接作为 RSEM 的输入

4. STARsolo 单细胞 RNA-seq

# 类似 Cell Ranger 的单细胞分析
STAR --runMode alignReads \
  --runThreadN 32 \
  --genomeDir star_index/ \
  --readFilesIn R2.fq.gz R1.fq.gz \   # 注意:R2 在前(含 cDNA),R1 在后(含 barcode)
  --readFilesCommand zcat \
  --soloType CB_UMI_Simple \           # 10x Chromium 数据类型
  --soloCBwhitelist barcodes.txt \     # 细胞 barcode 白名单
  --soloCBstart 1 \                    # barcode 起始位置
  --soloCBlen 16 \                     # barcode 长度(10x v3 是 16)
  --soloUMIstart 17 \                  # UMI 起始位置
  --soloUMIlen 12 \                    # UMI 长度(10x v3 是 12)
  --outSAMtype BAM SortedByCoordinate \
  --outFileNamePrefix solo_

5. 批量比对脚本

#!/bin/bash
# batch_star.sh - 批量 STAR 比对

GENOME_DIR="star_index"        # STAR 索引目录
THREADS=16                      # 线程数
OUTDIR="star_results"          # 输出目录

mkdir -p $OUTDIR

for R1 in raw_data/*_R1.fq.gz; do
    SAMPLE=$(basename $R1 _R1.fq.gz)  # 提取样本名
    R2=${R1/_R1/_R2}                    # 推断 R2
    PREFIX="${OUTDIR}/${SAMPLE}_"       # 输出前缀

    echo "STAR 比对: $SAMPLE"

    STAR --runMode alignReads \
      --runThreadN $THREADS \
      --genomeDir $GENOME_DIR \
      --readFilesIn $R1 $R2 \
      --readFilesCommand zcat \
      --outSAMtype BAM SortedByCoordinate \
      --quantMode GeneCounts \           # 同时计数
      --twopassMode Basic \              # 两步法
      --outFileNamePrefix $PREFIX

    # 建 BAM 索引
    samtools index ${PREFIX}Aligned.sortedByCoord.out.bam
done

echo "全部完成"

常见报错与解决

报错信息原因解决方法
EXITING: FATAL INPUT ERROR: could not open genome索引目录不存在或没有索引文件先运行 --runMode genomeGenerate 建索引
Segmentation fault / Killed内存不足(人类基因组需 30GB+)减少线程或增加内存,用 --genomeSAindexNbases 调小
EXITING: could not create output file输出目录不存在提前创建输出目录
比对率低于 50%基因组版本不对或数据质量差检查基因组版本是否和注释文件匹配
WARNING: --genomeSAindexNbases is too large小基因组索引参数太大按提示减小该参数值
GTF 文件解析错误GTF 格式不规范用 Ensembl 或 GENCODE 的官方 GTF

速查表

# ===== STAR 速查表 =====

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

# 建索引(只做一次,约30分钟)
STAR --runMode genomeGenerate \
  --runThreadN 16 \
  --genomeDir star_index/ \
  --genomeFastaFiles ref.fa \
  --sjdbGTFfile genes.gtf \
  --sjdbOverhang 149                   # 读长-1

# 标准比对
STAR --runThreadN 16 \
  --genomeDir star_index/ \
  --readFilesIn R1.fq.gz R2.fq.gz \
  --readFilesCommand zcat \
  --outSAMtype BAM SortedByCoordinate

# 两步法 + 基因计数
STAR --runThreadN 16 \
  --genomeDir star_index/ \
  --readFilesIn R1.fq.gz R2.fq.gz \
  --readFilesCommand zcat \
  --outSAMtype BAM SortedByCoordinate \
  --twopassMode Basic \
  --quantMode GeneCounts

# 内存需求参考
# 人类基因组:~32 GB
# 小鼠基因组:~28 GB
# 果蝇基因组:~8 GB
# 细菌基因组:~2 GB

# 关键参数
# --runThreadN N              线程数
# --sjdbOverhang N            读长-1
# --twopassMode Basic         两步比对
# --quantMode GeneCounts      基因计数
# --outSAMtype BAM SortedByCoordinate  排序BAM输出
# --readFilesCommand zcat     处理gzip文件