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 标准流程,大概是什么样的?

  1. 数据预处理(QC、标准化、寻找高变基因)
  2. 降维与聚类(PCA、UMAP、FindNeighbors、FindClusters)
  3. 找标记基因(FindAllMarkers)
  4. 细胞注释(手动或自动)

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 知识体系定位 数据预处理 降维·聚类 FindAllMarkers 差异表达分析 细胞类型注释 核心产出:标记基因数据框 • 每一行是一个基因-簇组合 • 包含:p_val, avg_log2FC, pct.1, pct.2, p_val_adj, cluster, gene • 用于后续:手动注释、富集分析、可视化验证

从这个图你能看到,FindAllMarkers 是个承上启下的关键环节。前期所有工作都是为了给它喂一个“干净的聚类结果”,而它吐出来的标记基因,又直接决定了你的注释质量。

我个人建议:拿到一个新数据集,先跑一遍默认参数。看看结果再决定要不要调参数。别一开始就纠结用哪种检验方法。

1.7 小结

好啦,这一章我们搞清楚了三件事:

  • 是什么:一个自动找每个 cluster 标记基因的函数。
  • 返回什么:一个包含 7 列信息的数据框。
  • 在哪用:在聚类之后、注释之前。