1. FindAllMarkers 函数概述
大家好,我是你们的讲师。从今天开始,我们要一起啃下 FindAllMarkers 这块硬骨头。这个函数,说白了就是单细胞分析里的“找茬专家”。你给 Seurat 对象一个聚类结果,它就能帮你找出每个 cluster 里那些“最特别”的基因——也就是我们常说的差异表达基因(DEGs)。
我刚开始做单细胞项目那会,总喜欢手动去写循环,逐个 cluster 跑差异分析。后来发现 FindAllMarkers 直接就把这活儿包了。嗯,真香。
1.1 函数的核心作用
FindAllMarkers 的任务非常明确:
- 对比差异:默认情况下,它会把某一个 cluster 跟剩下的所有细胞做对比。
- 输出结果:给你一张表格,列清楚每个基因在哪个 cluster 里高表达、表达比例如何、P值有多显著。
- 辅助注释:这些标记基因就是你给每个细胞群“贴标签”的线索。有了它们,你才能知道这群细胞是 T 细胞还是 B 细胞。
一句话:它是连接“无监督聚类”和“生物学注释”的桥梁。没有它,你手里的 UMAP 就是一堆没名字的点。
1.2 返回值类型
这个函数返回的是一个 数据框(data.frame)。我经常听到新手问:“老师,这返回的是一堆数字还是啥?”
咱们直接看个例子,你就明白了。假设你跑完了代码:
markers <- FindAllMarkers(seurat_obj)
head(markers)
输出结果长这样:
| p_val | avg_log2FC | pct.1 | pct.2 | p_val_adj | cluster | gene |
|---|---|---|---|---|---|---|
| 2.03e-120 | 1.89 | 0.95 | 0.04 | 3.45e-116 | 0 | MS4A1 |
| 1.56e-85 | 2.34 | 0.88 | 0.02 | 2.65e-81 | 0 | CD79A |
我来给你拆解一下每个列的意思:
p_val:原始 P 值。越小说明差异越显著。但别直接用这个,容易出错。avg_log2FC:平均 log2 倍数变化。正数代表在目标 cluster 里高表达,负数反之。我个人习惯看这个,直观。pct.1:该基因在目标 cluster(比如 cluster 0)中检测到的细胞比例。0.95 就是说 95% 的细胞都表达了它。pct.2:该基因在其余所有细胞中检测到的比例。p_val_adj:校正后的 P 值。Bonferroni 校正。这才是你筛选用的黄金标准。cluster:基因属于哪个 cluster。gene:基因名字。
避坑指南:我以前刚学的时候,直接拿 p_val 排序,结果发现好几个假阳性。记住,正式筛选一定用 p_val_adj 或者 avg_log2FC。
1.3 在 Seurat 流程中的定位
你想想看,一个完整的 Seurat 标准流程,大概是什么样的?
- 数据预处理(QC、标准化、寻找高变基因)
- 降维与聚类(PCA、UMAP、FindNeighbors、FindClusters)
- 找标记基因(
FindAllMarkers) - 细胞注释(手动或自动)
FindAllMarkers 就卡在第三步。它不参与降维,也不负责最后的注释。它干的事,就是给每一个已经算好的 cluster,做一个“内部盘点”。
我一直觉得这一步是整个流程里最需要谨慎的。降维和聚类可以靠机器,但筛选标记基因的好坏,直接决定了你注释的准确度。
注意:函数默认假定你的 Seurat 对象中已经存在 seurat_clusters 这一列。如果你改过 Idents,一定要确认清楚当前活跃的 ident 是什么,不然找出来的标记基因会驴头不对马嘴。
1.4 什么时候该用它?
- 刚跑完聚类:常规操作。每个新聚类结果,都要跑一次。
- 想对比两组细胞:如果你只想找 cluster 0 vs cluster 1 的差异,你应该用
FindMarkers,而不是它的“大哥”FindAllMarkers。 - 数据集比较大时:比如你有一万个细胞、几十个 cluster,用
FindAllMarkers能省不少事。
1.5 常用参数一览
我先给你列几个最核心的参数。后面我们会一章一章细讲:
| 参数名 | 默认值 | 作用 |
|---|---|---|
test.use |
"wilcox" | 选择差异检验方法。可选 "bimod", "t", "roc", "poisson" 等。 |
only.pos |
FALSE | 是否只返回正向标记基因(在目标簇里高表达的基因)。 |
logfc.threshold |
0.25 | 筛选的 logFC 阈值,低于这个值的基因会被过滤掉。 |
min.pct |
0.1 | 基因必须在至少这个比例的细胞中表达,才会被纳入分析。 |
我个人习惯把 only.pos 设为 TRUE。为什么呢?因为我们在注释时,通常只关心某个 cluster 高表达哪些基因。负向标记基因虽然也有用,但容易干扰判断。
1.6 一张图看懂全貌
下面是这个章节对应的知识体系图。它展示了 FindAllMarkers 在单细胞分析流程中的位置和核心产出。
从这个图你能看到,FindAllMarkers 是个承上启下的关键环节。前期所有工作都是为了给它喂一个“干净的聚类结果”,而它吐出来的标记基因,又直接决定了你的注释质量。
我个人建议:拿到一个新数据集,先跑一遍默认参数。看看结果再决定要不要调参数。别一开始就纠结用哪种检验方法。
1.7 小结
好啦,这一章我们搞清楚了三件事:
- 是什么:一个自动找每个 cluster 标记基因的函数。
- 返回什么:一个包含 7 列信息的数据框。
- 在哪用:在聚类之后、注释之前。