想象你继承了祖辈传下来的一本「身体相册」。相册里不是普通照片,而是几十万个细胞的自拍:每个细胞都用分子语言记录了自己活过的证据——它读过哪些基因、说过哪些话、来自哪块组织。问题是这些自拍全都挤在一起,有的模糊、有的过曝、有的甚至两张脸叠在一起。你要做的是把它们一张张扫描进电脑,剔除废片,统一曝光,然后按「谁和谁长得像」分堆归类,最后给每堆贴上一张身份标签:谁是守门员,谁是巡逻兵,谁是干活的工人。这就是单细胞 RNA 测序(scRNA-seq)与降维聚类要解决的事。把每个环节对应成相册整理步骤,你就能明白实验室里那一堆矩阵、曲线和散点图,到底在替细胞讲什么故事。

岗位关联

掌握 scRNA-seq 与降维聚类,你就能在单细胞水平解码组织异质性,为疾病分型、靶点发现和器官图谱绘制提供关键证据。

目录
  1. 可视化演示
  2. 1. 测序原理:细胞合影与单人特写
  3. 2. 数据质控:清理模糊照片
  4. 3. 归一化校正:统一曝光和底片
  5. 4. 降维方法:把高维相册摊上地板
  6. 5. 聚类算法:照片自己围成小圈子
  7. 6. 细胞注释:给每堆照片贴标签
  8. 7. 实操流程:一套完整的相册整理清单
  9. 8. 应用与挑战:从个人相册到全人类档案
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示单细胞RNA测序数据经UMAP降维形成细胞簇、PCA方差解释与Marker基因表达热图。

本节配有交互动效(进入视口后自动加载,约 3KB)。

UMAP降维 6簇2D分离 n=15,d=0.3 保留局部结构揭示全局分布

1. 测序原理:细胞合影与单人特写

家里的相册页上,成百上千张细胞自拍挤成一团。想看清谁是谁,第一步必须把它们分开,再一张张单独扫描。scRNA-seq 干的就是这件事:把一块组织剪碎、消化,制成单细胞悬液,再用微流控芯片让每个细胞掉进独立的小液滴,仿佛把挤在一起的照片分装进一个个透明小袋子。

每个小液滴里除了细胞,还有一颗带条形码的微珠。这颗微珠像给每张照片加盖「主人编号」的印章,细胞里所有被捕获的 mRNA 都带上这个条码,之后把几万个液滴混在一起高通量测序,依然能靠条码把数据对回各自的主人。原始表达矩阵就是一个长表格:每一行是一个基因,每一列是一个细胞,格子里的数字表示该基因在这个细胞中检出多少条转录本。

这里的核心技巧是 UMI(唯一分子标识)。PCR 扩增会让同一条 mRNA 被复制很多遍,计数容易虚高。UMI 就像每张底片自带的唯一编号,测序时只统计「出现过哪些编号」,从而把技术噪声压下去。

可以这样想:只有扫描清晰、编号完整的底片,才能保证后面所有整理动作不会张冠李戴。测序这一步,就是给整本相册定下数据地基。

countsg,c∼Poisson(λg×sc)\displaystyle \text{counts}_{g,c} \sim \text{Poisson}(\lambda_g \times s_c)
这一公式说明:在细胞 c 中基因 g 的实测 UMI 计数,是基因真实丰度 \(\lambda_g\) 与细胞测序深度 \(s_c\) 共同作用下的随机采样结果。
  1. 实测计数左侧 counts 是表达矩阵里那个整数,表示基因 g 在细胞 c 中被 UMI 标记到的转录本数量。
    countsg,c\displaystyle \text{counts}_{g,c}
  2. 泊松采样转录本被捕获、逆转录、建库的过程近似随机抽样,所以服从泊松分布。
    ∼Poisson(λg×sc)\displaystyle \sim \text{Poisson}(\lambda_g \times s_c)
  3. 基因丰度与深度乘积基因本身表达越强,或这个细胞被测到越深,观察到的计数就越高,二者必须分开处理。
    λg×sc\displaystyle \lambda_g \times s_c

2. 数据质控:清理模糊照片

整理相册时,你会先把模糊的、过曝的、两张脸叠在一起的照片挑出来扔掉。scRNA-seq 数据分析的第一步——质量控制(QC),做的就是这件事。你面对的是几万个细胞,里面混杂着破损的死细胞、空液滴、双细胞,还有测序质量太差的样本。

判断「照片是否清晰」有三个常用指标。第一,总 UMI 数过低:说明这个细胞几乎没有测到几条转录本,像一张全黑的废片。第二,检出基因数过少:说明细胞状态不好或捕获失败,画面内容太少。第三,线粒体基因比例过高:正常活细胞的细胞膜完整,mRNA 大多来自细胞核;细胞一旦破损,细胞质里的 mRNA 流失,只留下线粒体里的转录本,线粒体比例就会飙升。

双细胞则更隐蔽:两个细胞被包进同一个液滴,条码相同,测序结果像两个人脸重叠在一张照片上。它们会伪装成「基因数超高的细胞」,在聚类时形成诡异的中间簇,必须用算法或阈值剔除。

清理完废片,相册里剩下的都是状态良好的「正面照」,后续的曝光统一才有意义。省掉质控,就等于让一堆糊照片污染整本相册。

mitoctotalc>0.2⇒discard\displaystyle \frac{\text{mito}_c}{\text{total}_c} > 0.2 \Rightarrow \text{discard}
当线粒体计数占总 UMI 计数的比例超过 20%,该细胞极可能已经破膜濒死,应在后续分析中剔除。
  1. 分子,线粒体转录本mito 是该细胞中定位到线粒体基因组的 UMI 总数,代表残存的细胞质 mRNA 信号。
    mitoc\displaystyle \text{mito}_c
  2. 分母,全部转录本total 是该细胞所有检测到的 UMI 总和,作为比例的基准。
    totalc\displaystyle \text{total}_c
  3. 阈值判断超过 20% 视为破损细胞,执行丢弃操作。
    >0.2⇒discard\displaystyle > 0.2 \Rightarrow \text{discard}

3. 归一化校正:统一曝光和底片

不同的照片拍摄于不同时间、不同灯光,有的偏暗有的偏亮。如果不统一曝光,你很难分辨「两个人肤色差异」是真的,还是仅仅因为一张照片欠曝、另一张过曝。单细胞数据同样如此:每个细胞的测序深度差异巨大,有的细胞被测了五万条转录本,有的只有一万条,原始计数不可直接比较。

最经典的归一化是 CPM 法。先把每个基因的计数除以该细胞的总计数,得到比例,再乘上一个统一系数(如一百万),最后取对数。这样每个细胞都站在同一条「曝光基准线」上。归一化之后还要挑选高变基因:就像从几千个画面特征中,只留下那些最能区分照片的颜色、构图和光线,而不是背景墙纸的纹路。

批次效应是更麻烦的「色偏」:同一批组织分两天上机,可能因为试剂批次、仪器状态不同而产生系统性差异。如果不校正,聚类时你会以为两天的细胞是两种细胞类型。常见做法是使用批次整合算法(简单说,就是把不同批次的数据对齐到同一个基准空间)或把批次信息作为协变量建模。

所有照片都在同一曝光标准下,才能公平地比较谁亮谁暗、谁高谁低。归一化不是可选项,而是让不同细胞、不同批次成为「同一本相册」的前提。

logCPMg,c=log⁡2(countsg,c∑g′countsg′,c×106+1)\displaystyle \text{logCPM}_{g,c} = \log_2\left( \frac{\text{counts}_{g,c}}{\sum_{g'}\text{counts}_{g',c}} \times 10^6 + 1 \right)
logCPM 将每个细胞的基因表达量换算成每百万条转录本中的相对丰度,再取对数,使强表达基因和弱表达基因处于更均衡的尺度。
  1. 分母,细胞总计数对每个细胞求和,得到该细胞的测序深度,相当于整张照片的曝光总量。
    ∑g′countsg′,c\displaystyle \sum_{g'}\text{counts}_{g',c}
  2. 缩放因子乘以 10^6,把比例换算成「每百万转录本中的条数」,便于不同细胞间比较。
    ×106\displaystyle \times 10^6
  3. 对数变换log2 并加 1 防止零取对数无定义,压缩表达量动态范围。
    log⁡2(…+1)\displaystyle \log_2(\ldots + 1)

4. 降维方法:把高维相册摊上地板

修好照片后,每张照片身上挂着上千个特征:几千个基因的表达量。你不可能在三维世界里逐一查看这样的「高维相册」,必须在地上铺一张二维地图,把相似的照片摆得近、不同的摆得远。这就是降维可视化。

降维分成两步。第一步是 PCA(主成分分析):它像一名构图师,先找到数据中方差最大的方向,称为第一主成分;再找与之正交的第二方向;依次类推。PCA 不追求完美还原所有细节,只抓住「最能区分细胞」的大线索,同时还能去掉噪声。实际操作中,大家通常保留前 10~30 个主成分,而不是末尾那些几乎没什么信号的成分。

第二步是 t-SNE 或 UMAP。它们把主成分空间进一步「摊」到二维平面上。t-SNE 擅长把相似细胞拉得更近,但对全局结构不敏感;UMAP 则保留更多全局拓扑信息,速度更快,已成为主流。可以这样理解:PCA 是先按身材高矮站队,UMAP 是最终在客厅地板上给每个人安排位置,让熟人都能聚在一起聊天。

摊在地板上的二维布局只是「地图」,不是真实尺寸。你看地图上两个人离得远,只能说他们的转录状态差异大,不能说他们之间没有任何关系。降维,永远是方便观察的投影工具。

max⁡w1w1⊤Σw1s.t. ∥w1∥=1\displaystyle \max_{\mathbf{w}_1} \mathbf{w}_1^\top \mathbf{\Sigma} \mathbf{w}_1 \quad \text{s.t.}\ \|\mathbf{w}_1\|=1
第一主成分就是在单位长度约束下,使数据投影方差最大的那个方向向量,其中 \(\mathbf{\Sigma}\) 是基因表达矩阵的协方差矩阵。
  1. 协方差矩阵Σ 描述基因与基因之间表达变化的协同关系,是 PCA 的输入材料。
    Σ\displaystyle \mathbf{\Sigma}
  2. 二次型投影方差将方向向量 w1 代入二次型,得到数据沿该方向投影后的方差。
    w1⊤Σw1\displaystyle \mathbf{w}_1^\top \mathbf{\Sigma} \mathbf{w}_1
  3. 单位向量约束限制 w1 长度为 1,防止通过放大向量来作弊,保证方向唯一。
    ∥w1∥=1\displaystyle \|\mathbf{w}_1\|=1

5. 聚类算法:照片自己围成小圈子

地图画好之后,谁来给照片分组?人工一张张分看不完,正确做法是让照片自己「找朋友」。首先为每个细胞构建 K 近邻图:把每个细胞看作一个节点,找到它在低维空间里最近的 K 个邻居,连上一条边。这样,整个数据集变成一张巨大的社交关系网,谁的圈子紧密、谁和谁只是点头之交,一目了然。

接下来用社区发现算法在这张网络里找「小圈子」。Louvain 和 Leiden 是两种最常用的算法。它们通过优化模块度来切分网络:模块度衡量的是「圈子内部的连接密度」比「随机情况下预期密度」高出多少。Leiden 在 Louvain 基础上修正了社区划分的连通性问题,结果更稳定。

还有一个重要旋钮叫分辨率参数。它决定你分得粗还是分得细:低分辨率会得到几个大簇,相当于只分「长辈辈」和「小孩辈」;高分辨率会得到更多小簇,相当于把每个小家庭都拆出来。没有绝对正确的分辨率,一般要结合后续注释的生物学可解释性来选。

聚类算法的产出,就是地板上一个个围坐成团的小圈子。它们没有名字,只有编号——真正的身份还要靠下一步来确定。

Q=12m∑i,j[Aij−kikj2m]δ(ci,cj)\displaystyle Q = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)
模块度 Q 越大,说明社区内部连接紧密程度越高于随机期望,聚类结果越可信。
  1. 邻接矩阵A 的元素表示节点 i 与 j 是否有边相连,有权图则为边的权重。
    Aij\displaystyle A_{ij}
  2. 随机期望边数ki、kj 分别是两个节点的度,乘积除以 2m 给出随机连接下的期望边数。
    kikj2m\displaystyle \frac{k_i k_j}{2m}
  3. 同簇判断δ 函数只在 i、j 属于同一簇时取 1,所以只有圈内连接才会计入模块度。
    δ(ci,cj)\displaystyle \delta(c_i, c_j)

6. 细胞注释:给每堆照片贴标签

聚类得到一堆编号(cluster 0、cluster 1……),就像你在客厅里摆了几堆没有名字的照片。细胞注释就是给每堆照片贴上身份标签:这是 T 细胞,那是 B 细胞,还有一群成纤维细胞。标签的依据,是 marker 基因——每种细胞类型都有一组「职业标牌」基因,只有它才高表达。

识别 marker 基因要靠差异表达检验:把某个簇的细胞和其余所有细胞比较,看哪些基因在簇内显著高表达,再结合「特异性」判断——真正的 marker 应该只在这个簇里高表达,而不是在所有簇里都高。常用的检验方法包括 t 检验、Wilcoxon 秩和检验等。

拿到候选 marker 后,可以走自动注释:把簇的平均表达谱与已知细胞类型的参考数据库比对,让算法推荐最可能的身份。但数据库并不完美,最后一步必须人工验证:查看经典的 marker 基因是否高表达、在 UMAP 图上是否呈现合理的空间分布,必要时还要回到原始病理切片上确认。

给每堆照片贴上「职业标签」后,整本相册才算真正归档完成。一个簇能不能被命名,取决于标记基因站不站得住脚,而不是你希望它是什么。

t=xˉA−xˉBsA2nA+sB2nB\displaystyle t = \frac{\bar{x}_A - \bar{x}_B}{\sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}}}
这是两样本 t 检验的统计量:分子是两个簇的均值差,分母是合并标准误,用来判断差异是否足够显著。
  1. 均值差xA 与 xB 分别是目标簇与背景细胞的平均表达量,差值越大,差异信号越强。
    xˉA−xˉB\displaystyle \bar{x}_A - \bar{x}_B
  2. 方差贡献每个簇的方差除以样本量,衡量均值估计的不确定性。
    sA2nA+sB2nB\displaystyle \frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}
  3. 标准化检验量差值越大、波动越小,t 值越大,越有把握认为该基因是真实上调的 marker。
    t=……\displaystyle t = \frac{\ldots}{\sqrt{\ldots}}

7. 实操流程:一套完整的相册整理清单

前面讲的是理论,实际工作中你不会从零写算法,而是用成熟工具把整个流程串起来。Seurat 是 R 语言里最流行的单细胞分析包,Scanpy 是 Python 生态的首选,两者都内置了从读取矩阵、质控、归一化、降维、聚类到注释的一整套管道。

跑通流程只是第一步,真正花功夫的是参数调优。比如质控阈值该定多严?高变基因选 2000 个还是 5000 个?PCA 保留多少主成分?聚类分辨率调到 0.5 还是 1.0?这些参数互相影响,需要通过诊断图反复调试:质控阶段的 violin plot、归一化后的线性关系图、聚类后的 marker 热图,都在帮你判断「这一步有没有做歪」。

最终输出是一份「相册整理报告」,通常包含每个簇的细胞占比、代表性 marker 基因列表、降维图、关键诊断图,以及每个簇的注释结论。这些结果会直接交给下游分析,比如细胞类型差异、发育轨迹或疾病相关亚群分析。

把手册串成流水线,就相当于家里装了一台自动分拣机:照片进去,贴上分类标签的相册出来。但不管工具多方便,每一步选择的依据仍然来自你对生物问题的理解。

pc=ncNcells\displaystyle p_c = \frac{n_c}{N_{\text{cells}}}
簇 c 的细胞占全部细胞的比例,是所有报告中必备的基础统计量。
  1. 簇内细胞数nc 是第 c 个簇中被分配进来的细胞数量。
    nc\displaystyle n_c
  2. 总细胞数N 是经过质控后保留下来的全体细胞,作为百分比的基数。
    Ncells\displaystyle N_{\text{cells}}
  3. 比例计算两者相除即得占比,用于快速判断簇的规模与稀有程度。
    pc=ncNcells\displaystyle p_c = \frac{n_c}{N_{\text{cells}}}

8. 应用与挑战:从个人相册到全人类档案

把单个组织的细胞整理明白后,更大的目标是把所有器官的「细胞全家福」汇总成人体细胞图谱,让医生在诊断时能对照参考。更进一步,通过比较不同发育时间点的细胞状态,可以推断细胞分化轨迹——就像把宝宝从小到大的照片按时间排序,看出他是怎么一步步长成大人的。空间组学技术则能把细胞放回组织原位,让相册里的每张照片标注「拍摄地点」。

这些应用同时带来巨大挑战。单细胞数据稀疏且噪声大,基因丢失率高,弱表达基因常常测得 0;不同实验室之间的批次差异也难以完全消除;测序成本虽在下降,但超大样本仍然昂贵。在发表结论前,你总要问一句:这个差异是真实的生物学信号,还是技术噪声、批次效应和随机波动造成的错觉?

评估聚类与注释质量时,常用 AUC 作为量化指标。它衡量一个得分(例如 marker 基因的表达强度)能否把正负样本(目标细胞与其他细胞)正确区分开。

相册整理得越规范,医学决策就越可靠。从个人相册到全人类档案,scRNA-seq 打开的是一条通往单细胞分辨率精准医学的路。

AUC=1n+n−∑i∈+∑j∈−I(si>sj)\displaystyle \text{AUC} = \frac{1}{n_+ n_-} \sum_{i \in +} \sum_{j \in -} \mathbb{I}(s_i > s_j)
AUC 表示随机抽取一对正负样本,模型给出的得分把正样本排在负样本之前的概率,0.5 等于乱猜,1.0 等于完美区分。
  1. 正负样本配对n+ 与 n− 分别代表目标簇与其他细胞数量,枚举所有正负配对。
    n+n−\displaystyle n_+ n_-
  2. 得分比较对每个正样本 i 和负样本 j,比较得分 si 与 sj。
    si>sj\displaystyle s_i > s_j
  3. 指示函数满足不等式的配对计 1,否则计 0,最后求平均得到 AUC。
    I(si>sj)\displaystyle \mathbb{I}(s_i > s_j)

AI 应用场景

场景一:人体细胞图谱构建

阶段:数据处理与降维聚类、细胞类型注释

解决的问题:传统病理学只能通过形态粗略区分细胞,无法在组织内同时识别数十种细胞亚型。AI 结合 scRNA-seq 与降维聚类,可以把组织中的每种细胞自动归类并贴上分子标签,构建标准化的人体细胞图谱。

具体案例:在「人类细胞图谱」计划中,研究者对肺、肝、肠等多个器官的正常组织进行单细胞测序,经过质控、归一化、UMAP 可视化与 Leiden 聚类,再与参考数据库比对,最终标定出数十种细胞类型及其空间位置,为后续疾病对照提供基线。

场景二:肿瘤微环境异质性分析

阶段:聚类分群、稀有亚群识别、marker 注释

解决的问题:肿瘤内部并非铁板一块,耐药细胞往往只占少数。传统测序把整个肿瘤磨碎平均,会稀释稀有亚群的信号。单细胞聚类能像在相册里找出一个藏在角落的小团体一样,把低占比但决定预后的耐药亚群单独挑出来。

具体案例:在乳腺癌样本中,研究者对肿瘤组织进行 scRNA-seq,聚类后发现一个表达特定耐药基因的稀有细胞簇,进一步分析其 marker 通路,为靶向联合用药方案提供了新线索。

场景三:发育与分化轨迹推断

阶段:时间序列聚类、细胞状态排序

解决的问题:发育过程中存在大量难以捕获的中间态细胞,传统方法只能看到起点和终点,看不到过渡路径。单细胞数据相当于拍下了不同时间点的细胞自拍,聚类后按表达连续性排序,就能还原分化轨迹。

具体案例:在研究造血干细胞分化时,对骨髓中不同阶段细胞进行聚类与轨迹推断,识别出从干细胞到各血系祖细胞的连续过渡状态,锁定新的调控开关基因。

Python 演示

python54 行
import numpy as npfrom sklearn.decomposition import PCAfrom sklearn.cluster import KMeans  class SimplifiedScRNASeq:    def __init__(self, n_cells=120, n_genes=60, seed=42):        rng = np.random.RandomState(seed)        self.counts = rng.poisson(lam=2.0, size=(n_cells, n_genes)).astype(float)        for i in range(n_cells // 3):            self.counts[i, 0:10] += rng.poisson(lam=8.0, size=10)        for i in range(n_cells // 3, 2 * n_cells // 3):            self.counts[i, 10:20] += rng.poisson(lam=8.0, size=10)        for i in range(2 * n_cells // 3, n_cells):            self.counts[i, 20:30] += rng.poisson(lam=8.0, size=10)        self.matrix = None        self.pcs = None        self.labels = None     def filter_cells(self, min_genes=5):        keep = (self.counts > 0).sum(axis=1) >= min_genes        self.counts = self.counts[keep]     def normalize(self, target=1e4):        depth = self.counts.sum(axis=1, keepdims=True)        depth[depth == 0] = 1.0        self.matrix = np.log1p(self.counts / depth * target)     def pca_reduce(self, n_components=10):        pca = PCA(n_components=n_components)        self.pcs = pca.fit_transform(self.matrix)     def cluster(self, n_clusters=3):        km = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)        self.labels = km.fit_predict(self.pcs)     def report(self):        for c in range(3):            mask = self.labels == c            mean_expr = self.matrix[mask].mean(axis=0)            top = np.argsort(mean_expr)[-3:]            print("cluster %d: %d cells, top genes %s" % (c, int(mask.sum()), top.tolist()))     def run_pipeline(self):        self.filter_cells()        self.normalize()        self.pca_reduce()        self.cluster()        self.report()  if __name__ == "__main__":    demo = SimplifiedScRNASeq()    demo.run_pipeline()
目的:用 120 个模拟细胞跑通「质控 → 归一化 → PCA 降维 → KMeans 聚类 → marker 基因报告」的简化单细胞分析流程,直观理解每一步在做什么。
  1. self.counts = rng.poisson(lam=2.0, size=(n_cells, n_genes)).astype(float)模拟测序仪输出的原始 UMI 计数矩阵:行是细胞,列是基因。
  2. (self.counts > 0).sum(axis=1) >= min_genes统计每个细胞至少检出几个基因,不达标的当「废照片」过滤掉。
  3. depth = self.counts.sum(axis=1, keepdims=True)求每个细胞的总表达量,相当于算出每张照片的曝光总量。
  4. np.log1p(self.counts / depth * target)先用总深度缩放,再取对数,等价于把每张照片统一到同一曝光标准。
  5. pca = PCA(n_components=n_components)在主成分空间里提取最重要的差异方向,把高维特征压成少量主成分。
  6. km = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)在低维主成分坐标上把细胞分成若干堆,完成无监督聚类。
  7. mask = self.labels == c按聚类结果取出某堆细胞的索引,准备分析它的表达特征。
  8. mean_expr = self.matrix[mask].mean(axis=0)计算该簇每个基因的平均表达量,找排名靠前的作为候选 marker。

常见误区

误区很多初学者拿到表达矩阵后,第一件事就是归一化、跑 PCA、画 UMAP,觉得质控只是「可选的前处理」,被前面的教程演示数据骗了。

正解质控是整座分析大楼的地基。如果把低质量细胞、双细胞和破损细胞混进去,归一化会把它们的噪声放大,聚类时就会出现一堆既不属于任何真实类型、又解释不了的中间簇。这就像把糊掉、重影的照片强行统一曝光后放进相册,整本相册都会失去可信度。正确做法是先看总 UMI、检出基因数和线粒体比例的分布,设定合理阈值后再进入下游。

为何常见:公开数据集通常已经过清洗,演示代码直接跳过了质控步骤,让人误以为质控只是锦上添花。

误区看到 UMAP 图上两个点隔得很远,就断言「它们差别很大」;看到两个点挨得很近,就觉得「它们一定同属一种细胞」。

正解UMAP 为了在二维平面展示,会刻意拉近局部邻居、压缩甚至扭曲全局空间关系,坐标轴没有任何生物学单位。换一组随机种子或调一下 min_dist,点的相对位置就会变化。要判断细胞间差异,应该回到 PCA 空间或直接做差异表达分析,而不是盯着可视化图上的远近下结论。就像客厅地板上的人为摆位,不能反映两个人真实关系的亲疏。

为何常见:UMAP 图颜色鲜艳、形状直观,是论文里最显眼的图,视觉冲击力让人下意识把「距离」当真。

误区把分辨率一直往上调,直到得到几十个簇,觉得「我又发现了许多新的细胞类型」,兴奋地准备写论文。

正解过度细分只是在把同一个家庭按拍照姿势拆成好几堆。分辨率越高,越容易制造出没有稳定 marker 基因支撑的假阳性亚群。正确做法是结合聚类稳定性、差异表达检验和已知 marker 基因判断每个簇是否值得保留,宁可少分几簇,也不要编造不存在的细胞类型。

为何常见:高分辨率总能输出更精细的图,给人一种「分析很深入」的错觉,掩盖了结果缺乏生物学依据的问题。

误区差异表达结果出来后,专挑 P 值最小的基因当 marker,认为 P 值越小越可靠。

正解P 值受样本量和表达量影响,细胞数量多时微小的表达差异也会显著;一个基因 P 值极小,不代表它在目标簇里真的高表达,更不代表它有特异性。真正的 marker 要同时满足:平均表达量明显高于其他簇、非零细胞比例高、在其他簇中几乎沉默,并有文献或数据库支持。可以理解为考试分数高不代表他真的适合这份工作,还得看技能是否匹配。

为何常见:统计软件默认优先展示 P 值,初学者容易被这个数字牵着走。

误区认为归一化之后所有样本都可比,把两个不同时间、不同试剂批次跑出来的数据直接合并成一张矩阵做聚类。

正解归一化只消除测序深度差异,不能消除批次效应。不同批次间的试剂、仪器、操作者差异会形成系统性偏移,直接合并会产生以批次为边界的假簇,与生物学无关。要用批次整合算法把不同批次对齐到同一基准,或把批次信息作为协变量建模后再聚类。就像两台色温不同的相机拍同一家人,不调色就放进同一本相册,你会误以为每个人的肤色都变了。

为何常见:模块名字叫「normalize」,让人误以为归一化已经处理了所有技术差异,实际上批次校正是独立且必不可少的一步。

面试题

Q1. 在 scRNA-seq 中,UMI 的主要作用是什么?

单选题 · easy

  • A.降低测序成本
  • B.标记同源转录本← 正确答案
  • C.延长基因片段
  • D.替换细胞条码

答案:B。UMI 是每个转录本分子的唯一编号,测序时通过统计不同编号来消除 PCR 扩增造成的重复计数偏差。它不降低成本、不延长片段,也不能替代区分细胞来源的细胞条形码,所以选 B。

Q2. 某个细胞线粒体基因比例显著升高,通常提示什么?

单选题 · easy

  • A.细胞正在分裂旺盛
  • B.细胞膜破损濒临死亡← 正确答案
  • C.测序深度明显偏低
  • D.文库出现交叉污染

答案:B。正常活细胞的 mRNA 大多来自细胞核,细胞膜破损后细胞质 mRNA 流失,线粒体转录本占比被动升高,因此高线粒体比例是低质量细胞的标志,应过滤。

Q3. 单细胞数据归一化的核心目的是什么?

单选题 · easy

  • A.消除批次标签
  • B.平衡测序深度差异← 正确答案
  • C.增加基因检出数
  • D.滤除双细胞污染

答案:B。不同细胞测到的总转录本数差异很大,归一化把表达量换算到统一尺度,使细胞间可比。批次校正是后续独立步骤,归一化不会消除标签,也不负责增加基因或过滤双细胞。

Q4. PCA 中第一主成分的本质是什么?

单选题 · mid

  • A.方差最大的方向← 正确答案
  • B.均值所在的位置
  • C.细胞数量最多的簇
  • D.基因表达最高的轴

答案:A。第一主成分是数据投影后方差最大、也就是信息损失最小的方向,不是均值、簇大小或基因表达高低。它从协方差矩阵的特征向量中求得,是降维的起点。

Q5. 相比 t-SNE,UMAP 的主要优势是什么?

单选题 · mid

  • A.不需要表达归一化
  • B.能更好地保留全局结构← 正确答案
  • C.可以处理任意缺失值
  • D.输出结果永远相同

答案:B。UMAP 在保持局部邻居的同时保留更多全局拓扑信息,且速度更快,因此成为主流可视化工具。它仍需要归一化输入,不能处理任意缺失值,结果也会因随机种子变化。

Q6. scRNA-seq 聚类最常用的社区发现算法是哪类?

单选题 · mid

  • A.随机森林法
  • B.Louvain 算法← 正确答案
  • C.K 近邻法
  • D.谱聚类法

答案:B。scRNA-seq 通常先构建 K 近邻图,再用 Louvain 或 Leiden 做社区发现。随机森林是监督学习,K 近邻本身不是聚类法,谱聚类虽有应用但并非主流社区发现算法。

Q7. 识别 marker 基因时,下列哪些思路是合理的?

多选题 · mid

  • A.看簇间差异表达← 正确答案
  • B.只看最大均值表达
  • C.检查特异高表达占比← 正确答案
  • D.比较非零细胞比例← 正确答案

答案:ACD。marker 基因需在目标簇中显著高表达并在其他簇中低表达,因此要看簇间差异、特异高表达占比和非零细胞比例。只看全局最大均值会选到普遍高表达但无特异性的基因,不可取。

Q8. 下列哪些因素可能引入批次效应?

多选题 · hard

  • A.不同建库时间批次← 正确答案
  • B.试剂批次更换差异← 正确答案
  • C.测序仪器型号不同← 正确答案
  • D.细胞发育阶段差异

答案:ABC。批次效应来自技术因素:建库时间、试剂批次和仪器型号都会造成系统性偏差。细胞发育阶段差异是真实的生物学信号,不是批次效应,需要保留而不是校正掉。

Q9. 调整 Leiden 聚类的分辨率参数,主要影响什么?

单选题 · hard

  • A.簇的数目和颗粒度← 正确答案
  • B.基因的排序和长度
  • C.归一化的缩放强度
  • D.测序深度的中位数

答案:A。分辨率控制社区发现的敏感度:越大,网络被切分得越细,簇数越多。它不改变基因顺序、归一化方式或测序深度统计指标。

Q10. 为什么 UMAP 坐标不能直接解读为细胞间的真实转录距离?

多选题 · extreme

  • A.布局强调局部邻居← 正确答案
  • B.坐标受全局拓扑影响← 正确答案
  • C.高维信息被显著压缩← 正确答案
  • D.基因数越多距离越准

答案:ABC。UMAP 的布局通过交叉熵同时优化局部与全局结构,但为了二维展示必须压缩高维信息,坐标没有绝对意义,也不随基因数增多而变准。判断差异应回到 PCA 空间或差异表达检验。