生信从湿到干 · 交互式动画教程
⭑ 试用 OmicOne
第 6 章数据分析

质控:哪些细胞值得留下

Cell Ranger 判定为“细胞”的条形码,并不都是好细胞:有的是破损细胞,有的是漏网的空液滴,有的是双细胞。质控用每个细胞的三个数字来识别它们:UMI 总数、检测到的基因数和线粒体比例。每个数字都能追溯到一个湿实验步骤。

三个指标,三个湿实验来源

指标 偏低时提示 偏高时提示 湿实验来源
nCount_RNA 破损细胞、空液滴 双细胞,或本来就大的细胞 解离损伤(第 1 章)、上样(第 2 章)、深度(第 4 章)
nFeature_RNA 同上;UMI 不低而基因很少,说明被少数基因占据 双细胞 同上,并反映文库复杂度(第 3 章)
percent.mt — 膜破损、濒死细胞 解离、冻融、等待(第 1 章)

在 Seurat 里,线粒体比例这样计算(人类基因以 MT- 开头,小鼠为 mt-):

obj[["percent.mt"]] <- PercentageFeatureSet(obj, pattern = "^MT-")

三个指标要一起看。破损细胞的典型组合是 UMI 少、线粒体比例高;只是线粒体比例偏高而 UMI 正常的细胞,可能是代谢旺盛的真实细胞类型。还可以加看核糖体蛋白比例、血红蛋白比例和第 2 章的双细胞得分。

在 pbmc3k 上拖动阈值

在 pbmc3k 上拖动 QC 阈值真实数据
正在加载数据…

组件里是 pbmc3k 的全部 2,700 个细胞。左图横轴是 UMI 数、纵轴是线粒体比例,右图是基因数对 UMI 数,虚线是当前阈值。先点“Seurat 教程阈值”:保留基因数 200–2,500、线粒体比例低于 5% 的细胞,剩下 2,638 个。看看被去掉的细胞落在散点图的哪里。

obj <- subset(obj, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

固定阈值简单,但它是为这一份数据定的。另一种做法是 MAD 自适应阈值:在对数尺度上取中位数,把偏离中位数超过若干个 MAD(中位数绝对偏差)的细胞标为离群。它随数据自动调整,适合不同组织、不同深度的样本。OmicOne 的默认设置是:对 UMI 数和基因数(对数尺度)用 5 个 MAD,对线粒体比例只看高端、用 3 个 MAD。在组件里切换两种模式,比较它们去掉的细胞有什么不同。

常见误区

  • 把 200–2,500 和 5% 套到别的数据上。 pbmc3k 是 v1 化学,每个细胞检测到的基因少;新化学版本的数据里,2,500 这个上限会删掉大量正常细胞。
  • 下限定得过高。 血小板、静息淋巴细胞等 RNA 含量低的细胞天然 UMI 少,硬下限会把整个类型删掉。
  • 只看阈值,不看被删的是谁。 聚类之后回头检查:被去掉或离群的细胞是否集中在某一个簇。
  • 以为质控能去掉环境 RNA。 过滤去掉的是坏细胞;留下来的细胞身上的背景污染要用 SoupX、CellBender 等工具处理。