4、质量控制(QC)指标与过滤技巧:UMI数、基因数、线粒体比例等阈值设置

说实话,拿到Visium数据后的第一件事,不是跑聚类,而是做质控。这一步做不好,后面再花哨的分析也是白搭。我自己就踩过这个坑——有次一个样本的淋巴瘤切片,因为没卡线粒体阈值,聚类结果硬是多出一群「假缺氧」的细胞团。

4.1 三个核心质控指标

Visium的质控,盯着三个数就够了。我习惯把它们看成「体检报告」的三项核心指标:

  • UMI数(Unique Molecular Identifiers):代表每个spot里捕获的mRNA分子总数。说白了,就是这个spot里「原材料」够不够多。
  • 基因数(Genes per spot):检测到的独特基因种类。代表这个spot的转录组复杂度。
  • 线粒体比例(Mitochondrial ratio):线粒体基因UMI占总UMI的百分比。这个值高了,往往意味着细胞受损或正在凋亡。

为什么要同时看这三个?听我慢慢讲。

我给你们画个流程图,看一眼就懂了:

▼ Visium空间质控过滤流程 原始Count矩阵 所有spot + 所有基因 Step 1 过滤低UMI数 排除空spot或破碎组织 阈值:500~1000 UMI/spot Step 2 过滤低基因数 排除组织边缘spot 阈值:200~500 基因/spot Step 3 过滤高线粒体 排除受损/凋亡细胞 阈值:20% 上限 可选:双细胞/异常高表达过滤 过滤UMI数 > 3×MAD 的spot 高质量过滤后的Count矩阵 保留空间组织结构 + 剔除噪声spot 💡 提示:三个阈值要联动调整。比如组织边缘,基因数少但线粒体不一定高。不能只看单个指标。

4.2 UMI数的阈值怎么定?

UMI数,是第一个要看的指标。

一般我设置的最低下限是 500 UMI/spot。但这不是死的。为什么?因为不同组织、不同捕获密度的芯片,UMI分布差异很大。

组织类型 推荐UMI下限 典型表现 常见问题
小鼠脑组织 500 - 800 皮质层UMI较高,白质较低 白质区容易把低信号spot误删
人类肿瘤组织 1000 - 1500 肿瘤核心区UMI极高,间质区偏低 肿瘤纯度高的区域要适当降低阈值
心脏/肌肉组织 300 - 500 整体表达量偏稀疏 用500以下阈值要谨慎

我的经验:先看整体分布直方图。取对数后如果呈双峰,那低峰对应的就是空spot或背景噪声。把阈值设在两峰之间的谷底附近,效果最好。

4.3 基因数的过滤逻辑

基因数这个指标,和UMI数强相关,但又不完全一样。我举个例子:

有的spot UMI数很高,但检测到的基因种类很少。这意味着什么呢?说明这个spot里可能只有一两种细胞类型占了主导。比如肿瘤细胞克隆扩增的区域,往往只有几百个基因,但UMI数能飙到几千。

所以我的阈值通常是:

  • 下限:200 ~ 500 基因/spot。低于这个值,要么是空spot,要么是组织边缘的残片。
  • 一般不设上限。除非你发现某个spot基因数异常高,高到离谱——比如超过所有spot的3倍中位数绝对偏差(MAD)。这时候通常意味着双细胞污染了。

⚠️ 特别提醒:千万不要把UMI数和基因数的阈值设成独立的两套。我建议先画一张散点图——横轴是UMI数,纵轴是基因数。那些落在左下角密密麻麻的点,才是真正要过滤掉的spot。

代码里我是这样做的:

# 基于双指标联合过滤
qc_df = sc.pp.calculate_qc_metrics(adata, percent_top=None, log1p=False, inplace=False)

# 联合判断:两个指标都低于阈值才过滤,还是任一低于就过滤?
# 我个人选择「任一低于就过滤」,更保守一些
mask_low_umi = qc_df['n_counts_by_counts'] < 500
mask_low_genes = qc_df['n_genes_by_counts'] < 200

# 保留:UMI数和基因数都达标的spot
adata = adata[~(mask_low_umi | mask_low_genes), :].copy()

4.4 线粒体比例——最容易忽略的坑

线粒体比例,我在刚开始做Visium的时候基本没管过。后来有一次分析一个肝纤维化的样本,发现有一大片区域的细胞表现出「应激状态」,所有代谢相关基因都上调了。折腾了两个月,才发现是组织切片边缘的细胞在切片过程中受损了,线粒体比例高达40%。

从那天起,我就把线粒体比例作为硬指标了。

一般推荐的阈值是:

  • 组织切片样本:< 20%
  • 新鲜冷冻样本:< 15%
  • 石蜡包埋样本:< 25%(但这个要特别小心,石蜡样本的线粒体比例本身就偏高)

为什么会这样?你想想看,组织在包埋、切片、透化过程中,细胞膜会受损。线粒体的mRNA相对稳定,不易降解,所以受损细胞的线粒体比例就会虚高。

避坑指南:千万别以为线粒体比例高就是细胞死亡了。我发现有的代谢旺盛的组织,比如棕色脂肪或者心肌,正常状态下的线粒体比例就能到15%左右。这时候盲目降阈值,会砍掉真正的生物学信号。

4.5 实战过滤策略总结

最后,我给大家整理一个我常用的阈值速查表。你可能觉得有些保守,但稳妥总比后期重跑分析要好。

过滤步骤 阈值设置 过滤对象 调整策略
Step 1: 低UMI UMI < 500 空spot、背景噪声 先看直方图,观察最低峰位置
Step 2: 低基因 基因数 < 200 组织边缘、破碎区域 结合空间位置判断,避免过度删除
Step 3: 高线粒体 线粒体比例 > 20% 受损细胞、凋亡区域 根据组织类型微调:肿瘤可放宽至25%
Step 4 (可选): 异常高 UMI数 > 均值+3×SD 双细胞、异常高表达区域 适用于纯度高、组织结构明确的样本

我个人的工作流:先用较严格的阈值跑一遍,看看丢弃的spot都分布在什么位置。如果一堆丢弃的spot恰好集中在组织的某个解剖结构上——比如说脑片的皮层——那说明阈值设得太狠了,要往回放一放。反之,如果丢弃的spot随机散布,那阈值就是合理的。

嗯,质控这块咱们就聊到这儿。记住一句话:宁可多留几个可疑的spot,也别把真有生物学意义的点误删了。后面我们做降维聚类的时候,还可以用更精细的过滤来修正。但现在,保持数据的完整性更重要。