一、scran 包简介:设计理念、应用场景与优势
1.1 为什么需要 scran?——我从一个“踩坑”说起
还记得我刚接触单细胞数据分析那会儿,拿到一个 10x 数据,兴冲冲地跑完标准流程,结果一看细胞质控图……嗯,滤出来的细胞死活没法聚类。折腾了好几天,最后发现是质控参数没调好,死细胞和双细胞混进去了。
当时用的是最基础的处理方式:手动设阈值,一遍遍试错。说白了,就是蒙着眼睛调参。后来我接触到 scran,才意识到单细胞质控可以做得这么优雅。
scran 是 R 生态里专门做单细胞数据预处理的老牌包,设计理念特别务实:帮你自动化处理数据里的脏活累活。它最出名的就是那些自适应参数算法——你不需要猜阈值,它帮你算。
1.2 设计理念:自适应、模块化、可复现
scran 的核心设计理念,我总结为三点:
- 自适应参数:大部分参数能基于数据本身统计推断,别让用户瞎猜
- 模块化流水线:每个步骤都能拆开替换,不绑定固定流程
- 结果可复现:所有随机种子、参数记录都有接口,方便写论文时交代清楚
为什么会强调“自适应”?你想想看,我们做单细胞实验,今天测的 PBMC 和明天测的肿瘤样本,细胞类型、背景噪声完全不一样。死搬硬套一样的阈值,结果肯定翻车。scran 的 quickPerCellQC() 和 outlierTest() 就是解决这个问题的。
# 一个典型的 scran 质控调用
library(scran)
qc_stats <- perCellQCMetrics(sce)
qc_filters <- quickPerCellQC(qc_stats)
sce_filtered <- sce[, !qc_filters$discard]
你看,三行代码就完成了自适应质控。背后它用了中位数绝对偏差检测异常值,不需要你手动写 if-else。
1.3 应用场景:不止是质控
很多人以为 scran 只做质控,其实它覆盖了单细胞数据分析的上游全流程。我把它常用的场景列了个表:
| 场景 | 核心函数 | 我个人的用法 |
|---|---|---|
| 细胞质控过滤 | perCellQCMetrics(), quickPerCellQC() |
拿到数据第一个跑这个,先看全貌 |
| 双细胞检测 | computeDoubletDensity() |
配合 DoubletFinder 交叉验证用 |
| 标准化与去批次 | computeSumFactors(), multiBatchNorm() |
我最常用的去批次方案,稳定 |
| 变异基因筛选 | modelGeneVar(), modelGeneVarByPoisson() |
比单纯高变基因更考虑技术噪声 |
| 标记物鉴定 | scoreMarkers(), findMarkers() |
做差异分析时首选,自带多重检验校正 |
| 数据降维可视化 | fixedPCA(), denoisePCA() |
降维前先去噪,效果比单纯 PCA 好 |
我在项目中最常用的是前三个场景。尤其是去批次——当你合并多个样本时,直接用 multiBatchNorm() 能大幅减少技术差异,比某些复杂模型还靠谱。
1.4 scran 的核心优势——跟我实际体验走
1.4.1 参数自适应,别猜了
我最早用 Seurat 时,设置质控阈值全靠经验:线粒体比例设 20%,基因数设 200-5000……后来发现不同组织差异巨大。scran 的 quickPerCellQC 会直接告诉你哪些细胞是离群值,不需要提前假设。
1.4.2 调参友好,可重放
做《生物信息学》课程时,我最怕学生问:「老师,你的参数是多少?」因为大部分参数都不固定。scran 的设计回避了这个问题——它把参数选择变成数据驱动的统计检验。
举个例子,标准化因子计算:
# scran 自动计算 size factor
set.seed(100)
clusters <- quickCluster(sce)
sce <- computeSumFactors(sce, clusters = clusters)
head(sizeFactors(sce))
这里的 quickCluster 先聚类再算因子,比全局估算更准确。我做过一个测试,同样数据用全局 vs 聚类因子,下游差异基因数量能差 30%。
1.4.3 内存友好,大样本不慌
我曾经处理过一个 10 万细胞的骨髓数据,Seurat 跑到标准化时直接把内存撑爆了。换成 scran + BPPARAM 多核并行,稳稳跑完。
# scran 支持并行计算
library(BiocParallel)
param <- MulticoreParam(workers = 8)
sce <- computeSumFactors(sce, BPPARAM = param)
它内部用 DelayedArray 处理大矩阵,不会一次性全载入内存。这点在云服务器上特别重要——你不想为一个 16G 的数据包租 64G 的机器。
1.4.4 与其他工具兼容性好
scran 输出的是 SingleCellExperiment 对象,可以和 Seurat、Monocle、scater 无缝切换。我经常是:scran 做质控和标准化 → scater 做可视化 → Seurat 做聚类注释。数据流非常通顺。
# scran 结果可以直接喂给 Seurat
library(Seurat)
seurat_obj <- as.Seurat(sce, data = NULL)
# 或者转成 seurat v5 格式
seurat_v5 <- as.Seurat(sce, assay = "RNA", project = "my_project")
1.5 scran 的局限——我也得说实话
没有工具是万能的。scran 在以下场景可能不是最优选:
- 超大规模数据(>50 万细胞):它的某些函数没有专门优化,处理速度可能不如 hdWGCNA 或 raw 矩阵直接操作
- 需要精细的批次校正:虽然 multiBatchNorm 好用,但复杂的批次效应还是得上 Harmony 或 scVI
- 纯 Python 用户:scran 是 R 包,Python 生态里没有等价实现
不过说实话,对于绝大多数单细胞数据分析的前期步骤,scran 都是够用且稳定的。
1.6 知识体系图:scran 整合质控参数调优全景
我把本章涉及的核心概念和后面会讲到的调优路径画了一张图,方便你建立全局观。
1.7 预备知识:你需要带什么来学习?
我不是在讲零基础课。要掌握 scran 的调优,你需要:
- R 基础语法(能看懂 dplyr 和数据框操作就够了)
- 单细胞基本概念(什么是 UMI、细胞 barcode、分选和测序)
- 统计常识(会看箱线图、散点图,理解 p 值和多重检验)
如果你还不太熟悉 SingleCellExperiment 对象结构,我建议先花 10 分钟看一下 BioConductor 的官方小课。后面章节会不断用到它。
# 了解 SCE 基本结构
library(SingleCellExperiment)
help("SingleCellExperiment")
好啦,第 1 章就这么多。我们先把 scran 的定位和优势理清楚,后面每一章我会带你用实战案例一个一个攻破那些调优点。