一、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 会直接告诉你哪些细胞是离群值,不需要提前假设。

我的习惯:先用 scran 跑一遍自适应质控,看自动标记的异常细胞合不合理。如果样本很脏,再手动微调阈值。这样做比从头猜快得多。

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")
避坑提醒:我曾经在大数据框转换时遇到过行列名不一致的问题。解决方案是转换前先检查 sce 的 colnames 是否为空。

1.5 scran 的局限——我也得说实话

没有工具是万能的。scran 在以下场景可能不是最优选:

  • 超大规模数据(>50 万细胞):它的某些函数没有专门优化,处理速度可能不如 hdWGCNA 或 raw 矩阵直接操作
  • 需要精细的批次校正:虽然 multiBatchNorm 好用,但复杂的批次效应还是得上 Harmony 或 scVI
  • 纯 Python 用户:scran 是 R 包,Python 生态里没有等价实现

不过说实话,对于绝大多数单细胞数据分析的前期步骤,scran 都是够用且稳定的。

1.6 知识体系图:scran 整合质控参数调优全景

我把本章涉及的核心概念和后面会讲到的调优路径画了一张图,方便你建立全局观。

scran 整合质控参数调优知识体系 scran 包:核心能力层 数据输入与质控 标准化与去批次 变异基因与降维 标记物与差异 自适应质控检测 size factor 计算 HVG + 去噪 PCA 多重检验校正 双细胞百分比调优 批次效应评估 PCA 组分选择 聚类辅助鉴定 调优核心:参数自适应 → 可视化验证 → 迭代调整 每个步骤都可以通过 quickPerCellQC / modelGeneVar 等函数自动评估 本课程将围绕这四个模块深入讲解每个参数的调优策略与实战案例 质控 标准化 降维 差异

1.7 预备知识:你需要带什么来学习?

我不是在讲零基础课。要掌握 scran 的调优,你需要:

  • R 基础语法(能看懂 dplyr 和数据框操作就够了)
  • 单细胞基本概念(什么是 UMI、细胞 barcode、分选和测序)
  • 统计常识(会看箱线图、散点图,理解 p 值和多重检验)

如果你还不太熟悉 SingleCellExperiment 对象结构,我建议先花 10 分钟看一下 BioConductor 的官方小课。后面章节会不断用到它。

# 了解 SCE 基本结构
library(SingleCellExperiment)
help("SingleCellExperiment")

好啦,第 1 章就这么多。我们先把 scran 的定位和优势理清楚,后面每一章我会带你用实战案例一个一个攻破那些调优点。