质控指标设计:基因数与UMI阈值设置实践指南 - 第1节
为什么基因数与UMI阈值这么重要
做单细胞测序分析这些年,我见过太多人一上来就急着跑聚类、找marker。结果呢?下游画出来的UMAP图看着挺漂亮,可回头一看——基因数只有200,UMI不到500。这样的数据,说白了就是噪声里掺了点信号。
基因数和UMI阈值不是随便拍脑袋定的。它们直接决定了你的细胞过滤是否靠谱。我刚开始做单细胞时踩过这个坑:一次公共数据集分析,因为用了默认的500基因阈值,把一批真实但低表达的中性粒细胞全滤掉了。后来重跑,才发现丢了整整一个细胞群。
阈值设置的两大困境
你拿到一个10X样本,跑完Cell Ranger,barcode矩阵出来了。然后呢?是直接拿1000基因、5000UMI卡?还是用双峰分布自动找拐点?
困境一:不同组织差异巨大。免疫细胞基因数普遍偏低(500-1500),上皮细胞轻松上3000。用一个固定值,就像拿同一把尺去量大象和蚂蚁。
困境二:噪声和真实信号混在一起。空滴(empty droplet)常常带着几十个UMI,而真正的细胞有时UMI也很低(比如细胞周期静息期)。怎么区分?阈值就是那个分界线。
我在一个肿瘤单细胞项目中遇到过:样本里有一群凋亡细胞,基因数和UMI都骤降。如果按常规阈值砍掉,就会漏掉肿瘤微环境里的关键凋亡信号。后来我改用了双阈值 + 基因数-UMI散点图人工校验,才算保住了这群细胞。
课程能帮你解决什么
这门课不讲虚的。我们直接从数据出发,手把手带你把阈值设置这件事做扎实。
- 理解原理:为什么基因数和UMI的分布是双峰?空滴、死细胞、双细胞在图中长什么样?
- 学会选阈值的方法:从经验法则到统计模型(如mixture model、knee point检测),再到自动化工具。
- 掌握避坑技巧:什么时候该放松阈值?什么情况必须收紧?我自己的血泪教训会穿插在每章。
- 实战练手:用真实10X数据走一遍完整的质控流程,包括代码和参数调优。
学习路径概览
整个课程分为四个模块,按“原理→方法→实战→进阶”递进。你不需要一次性读完,但建议按顺序来,因为后面的章节会用到前面的结论。
下面这张图是我梳理的完整学习路径——
模块拆解
| 模块 | 章节范围 | 核心内容 | 你需要什么基础 |
|---|---|---|---|
| 基础铺垫 | 1-5 | 单细胞数据产生、barcode矩阵结构、基因数与UMI的统计含义 | 基础R/Python即可 |
| 噪声识别 | 6-12 | 空滴、死细胞、双胞、线粒体污染……每种噪声在基因数-UMI图上的特征 | 了解散点图、密度图 |
| 阈值方法 | 13-22 | 手动选点、mixture model、kneedle、inflection、CellBender对比 | 会运行R/Python脚本 |
| 实战与汇报 | 23-30 | 完整pipeline实战、批量样本质控、结果可视化与报告输出 | 能独立写简单分析脚本 |
你将会用到的工具
课程里我主要集中在两个生态:Seurat (R) 和 Scanpy (Python)。为什么?因为绝大部分单细胞质控都是在这两个框架里做的。
另外还会用到几个辅助工具:
- EmptyDrops (DropletUtils) —— 专门用来区分空滴和细胞的统计包
- mixtools / flexmix —— 拟合双峰分布,自动找阈值
- Kneedle —— 找拐点的经典算法
- CellBender —— 深度学习方法去除空滴噪声
这些工具的安装和基本用法我会在各章给出。你不需要提前装好,跟着做就行。
# 举个例子:R里用DropletUtils计算空滴得分
library(DropletUtils)
sce <- read10xCounts("path/to/filtered_feature_bc_matrix")
e.out <- emptyDrops(counts(sce))
is.cell <- e.out$FDR <= 0.01
# 这个FDR就是我们后续要讲的核心阈值之一
一点个人建议
学质控阈值,最忌讳的是「抄作业」。我看到很多人直接拿别人的代码改个路径就跑,完全不去看散点图长什么样。你想想看,每个样本的基因数分布都不一样,别人的阈值凭什么适用你的数据?
所以我建议你:每学一种方法,就在你自己的数据上画一张图。把基因数、UMI、线粒体比例、核糖体比例都画出来。相信我,眼睛往往比统计检验更敏感。
嗯,关于介绍就到这里。下一大章我们会从barcode矩阵的结构开始,一步步把数据切片看清楚。准备好了吗?