STARsolo真比cellranger快10倍?

· 6 min read · Analysis Notes

STARsolo真比cellranger快10倍?

STARsolo真比cellranger快10倍?

如果你正在做单细胞 RNA 测序分析,大概率听说过 CellRanger。如果你还恰好做过bulk RNA-seq的上游,那你肯定也知道著名的比对软件STAR。

但你可能不知道,STAR还自带一个专门用于单细胞定量分析的模块STARsolo,它比cellranger更轻量、更灵活、开箱即用,也没有操作系统的限制,在笔记本上进行单细胞上游定量也不是幻想!本期教程就手把手带大家用STARsolo实现单细胞上游定量。

source: STAR manual

安装

⚠️已经安装过STAR的朋友们不用再次安装,STARsolo和STAR是同一个软件!

图省事的家人们可以直接使用conda安装:

conda install bioconda::star
# or
conda install -c bioconda star

注意,M芯片的Mac需要一些特殊的安装技巧,详见 Github Issue #2142 以及之前的推文。如果觉得太复杂,也可以用docker版本(大约会有10%-20%的性能流失)。小编也帮你们编译好了一个mac上完美运行的binary,整理在本期的代码包中。

基因组索引

如果之前已经构建过参考基因组的索引,可以直接使用,一般与bulk RNA-seq通用。

自己重新构建索引的示例代码如下(老鼠GRCm39基因组):

⚠️ 注意:这一步最好上服务器,需要大约30-50GB内存。取决于机器性能,大约需要十几分钟--几个小时不等。

STAR --runThreadN 16 \
     --runMode genomeGenerate \
     --genomeDir GRCm39 \
     --genomeFastaFiles GRCm39.primary_assembly.genome.fa \
     --sjdbGTFfile gencode.vM36.basic.annotation.gtf \
     --sjdbOverhang 100

这里的GRCm39.primary_assembly.genome.fa(基因组fasta)和gencode.vM36.basic.annotation.gtf (基因组注释)文件需要自己下载。我使用的是GENCODE数据库的版本。

如果不知道怎么构建或者没有资源,不用担心,文末代码包也给你们附赠了完整的索引。

⚠️再注意:如果想用cellranger的索引文件(如refdata-gex-GRCm39-2024-A/star),需要降级STAR到2.7.2a,本文未测试。

条形码白名单(可选)

你可能已经知道,在单细胞实验中,每个细胞由独特的短核苷酸序列“条形码”(barcode)标识。白名单就是所有“合法”条形码的清单,比如10x就有自己的白名单。

如果自己下载过cellranger的安装包,可以查看cellranger-x.y.z/lib/python/cellranger/barcodes/这个目录下就是各种条形码白名单文件啦。

即使没有白名单文件,STARsolo也可以正常运行,不过白名单文件提供了多一层质量保证,可以将无效的UMI先过滤掉。

实战

本文使用小鼠脑细胞数据集作为示例(已包含在本文代码包),来源见文末参考文献。测试平台是MacOS 26.0.1。

# 设置最多打开文件数(很重要!不设置star容易报错)
ulimit -n 2048

# 获取当前所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 样本名
SAMPLE="Mouse_brain"
# 数据目录
DATA_DIR="${SCRIPT_DIR}/data"
# 索引目录
STAR_INDEX="${SCRIPT_DIR}/reference/GRCm39_2.7.11b"
# 白名单目录(10x v2)
WHITELIST="${SCRIPT_DIR}/whitelist/737K-august-2016.txt"
# 输出目录
OUTPUT_DIR="${SCRIPT_DIR}/results/${SAMPLE}"
# star二进制目录
STAR_BIN="${SCRIPT_DIR}/bin/STAR"

# 创建输出目录
mkdir -p "${OUTPUT_DIR}"

# 运行STARsolo(cellranger类似结果优化版)
"${STAR_BIN}" --runThreadN 8 \ # 线程数
  --genomeDir "${STAR_INDEX}" \
  --readFilesIn "${DATA_DIR}"/SRR8599150_S1_L001_R2_001.fastq.gz "${DATA_DIR}"/SRR8599150_S1_L001_R1_001.fastq.gz \
  --readFilesCommand "gunzip -c" \
  --outFileNamePrefix "${OUTPUT_DIR}/${SAMPLE}_" \
  --outSAMtype None \
  --soloType CB_UMI_Simple \
  --soloCBwhitelist "${WHITELIST}" \
  --soloCBstart 1 \
  --soloCBlen 16 \
  --soloUMIstart 17 \
  --soloUMIlen 10 \
  --soloBarcodeReadLength 0 \
  --soloStrand Forward \
  --soloFeatures GeneFull \ # 包含内含子,符合cellranger >v7
  --soloUMIdedup 1MM_CR \
  --soloUMIfiltering MultiGeneUMI_CR \
  --soloCellFilter EmptyDrops_CR

⚠️注意:--readFilesIn 后面先 R2 后 R1!这是最容易搞错的地方。

在不创建BAM文件的前提下,STARsolo只用了54s就完成了,表现相当不错。相比之下,cellranger(docker版, v9.0.1)用了7分钟。(如果不进行二次分析,估计大概5分钟左右)

来看看输出目录的结构:

Mouse_brain_Solo.out/
├── Barcodes.stats              # 细胞条形码质量和过滤统计
├── GeneFull/                   # 基因定量结果(外显子 + 内含子)
│   ├── Summary.csv            # 主要指标摘要(细胞数、UMI、比对统计)
│   ├── UMIperCellSorted.txt   # 每个条形码的UMI计数(已排序,用于细胞识别)
│   ├── Features.stats         # 每个基因的统计(UMI计数、检测到的细胞数)
│   ├── filtered/              # 仅包含细胞的液滴(过滤后)
│   │   ├── barcodes.tsv      # 细胞条形码(EmptyDrops_CR过滤)
│   │   ├── features.tsv      # 基因ID和名称
│   │   └── matrix.mtx        # 稀疏UMI计数矩阵(细胞 × 基因)
│   └── raw/                   # 所有条形码(过滤前)
│       ├── barcodes.tsv      # 白名单中的所有条形码
│       ├── features.tsv      # 与filtered/相同的基因注释
│       └── matrix.mtx        # 未过滤的UMI计数矩阵(所有条形码)

其中,filtered/文件夹里就是我们熟悉的三个文件啦,可以加载进R或者python进行下游分析。 如果想用cellbender等软件进行进一步去污染的话,可以使用raw/文件夹下的三个文件。

那么,细胞、基因和UMI数量跟cellranger对比如何呢?

指标 CellRanger STARsolo 差异
估计细胞数 4,308 4,291 -17 (-0.4%)
条形码重叠率 4,308 (100%) 4,279 (99.3%) -29个细胞
中位UMI/细胞 739 659 -80 (-10.8%)
中位基因数/细胞 472 441 -31 (-6.6%)
检测到的总基因数 17,742 24,216 +6,474 (+36.5%)

可以看到,细胞层面基本上是一致的,但在中位UMI/中位细胞数上,STARsolo略低,而检测到的总基因数量偏高。这可能是因为参考索引的不同,以及算法上的差异。

测序质量相关指标也非常相似:

指标 CellRanger STARsolo 差异
总reads数 8,860,361 8,860,361 0
有效条形码率 84.5% 84.5% 0%
Q30 CB+UMI 91.2% 91.3% +0.1%
Q30 RNA读段 56.7% 56.7% 0%
测序饱和度 10.6% 10.9% +0.3%
比对到基因组的reads 56.4% 55.3% -1.1%
细胞中reads占比 90.3% 90.5% +0.2%

进阶:RNA速率

STARsolo还有一个优势:它集成了RNA速率的功能,也就是说,它可以在定量的同时一步到位生成spliced/unspliced数据直接用于下游RNA速率分析。需要改的地方有两个:

  1. 将--soloFeatures参数改为GeneFull Gene Velocyto ,也就是同时加上Gene(外显子级别定量)和Velocyto。
  2. 将--outSAMtype改为BAM SortedByCoordinate,也就是生成bam文件。

你就可以同时获得基因定量和RNA速率定量了。

核心参数速查表

参数类别 参数名 默认值 选项 用途
单细胞类型 --soloType - CB_UMI_Simple / CB_UMI_Complex / SmartSeq 定义单细胞协议类型
条形码位置 --soloCBstart 1 数字 条形码起始位置(bp)

| --soloCBlen| 16| 16 (10x) / 12 (Seqwell)| 条形码长度
UMI位置| --soloUMIstart| 17| 17 (10x v3) / 17 (10x v2)| UMI起始位置

| --soloUMIlen| 12| 12 (v3) / 10 (v2) / 8 (其他)| UMI长度
白名单| --soloCBwhitelist| -| 文件路径 / None| 条形码白名单
链方向| --soloStrand| Forward| Forward / Reverse / Unstranded| 测序链方向
定量特征| --soloFeatures| Gene| Gene / GeneFull / Velocyto| 定量什么区域
UMI去重| --soloUMIdedup| 1MM_All| 1MM_All / 1MM_CR / Exact| UMI去重算法
细胞过滤| --soloCellFilter| EmptyDrops_CR| EmptyDrops_CR / TopCells / None| 细胞识别算法
UMI过滤| --soloUMIfiltering| -| MultiGeneUMI_CR / -| 多基因UMI过滤
输出类型| --outSAMtype| None| BAM SortedByCoordinate / None| 是否输出BAM

本文所用代码与示例数据,可后台回复starsolo获取,包括:

  • STAR小鼠基因组索引(GRCm39,版本2.7.4a,STAR>2.7.4a)
  • STAR二进制文件,修复了M芯片Mac索引读取以及无法输出reads的问题(其他平台没有测试过)
  • STARsolo脚本,包含标准流程和RNA速率两个版本
  • 小鼠大脑示例数据fastq文件
  • 10x v2和v3的条形码白名单
  • starsolo结果以及cellranger结果
  • 示例scanpy和scvelo流程

所有脚本和数据都已调试好,开箱即用~

参考文献:

  1. 10X Genomics关于白名单的说明:https://kb.10xgenomics.com/s/article/115004506263-What-is-a-barcode-inclusion-list-formerly-barcode-whitelist
  2. 关于STAR在mac上的问题:https://github.com/alexdobin/STAR/issues/2142
  3. 示例数据:https://github.com/BUStools/getting_started/releases

Single Cell Upstream Cell Ranger