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文件