☰
单细胞测序t-SNE聚类与marker基因筛选实战指南
2026/10/5 4:44:11 网站建设 项目流程

做单细胞测序分析的朋友,走到t-SNE聚类分析这一步,多半已经熬过了前面最枯燥的流程:从FASTQ比对、定量,到创建Seurat对象,再到质控、标准化、高变基因筛选。你以为接下来就是跑两行代码出张图的事?我第一次做的时候也是这么想的,结果图是出来了,但分群乱得像一锅粥,marker基因怎么找都对不上已知的细胞类型。后来一步步排查才发现,问题出在降维参数的选取和聚类分辨率上。这篇就把我这几年跑单细胞测序流程(五)的经验整理出来,从t-SNE聚类的底层逻辑讲到marker基因筛选的完整链路,顺便把踩过的坑也一并交代清楚。

1. 走到t-SNE这一步之前,你的数据应该长什么样

1.1 前置流程做没做扎实,直接决定聚类质量

很多人上来就跳过中间步骤,把原始count矩阵直接扔进RunTSNE(),这基本等于拿毛坯房当精装房住。单细胞测序流程走到t-SNE这一步,至少需要完成下面这条链路:CreateSeuratObject→NormalizeData→FindVariableFeatures→ScaleData→RunPCA→FindNeighbors→FindClusters→RunTSNE。每条命令都在做一件不可替代的事,缺一步后面的结果都会变形。

我把这些步骤的作用和常见陷阱整理成了下面这张表,方便你在跑之前对照检查自己的数据:

步骤核心作用常见错误
NormalizeData消除测序深度差异,把每个细胞的count归一化到可比尺度不归一化直接聚类,高表达基因会主导分群
FindVariableFeatures挑选在细胞间变异最大的2000个基因,用于后续降维选了太多或太少基因,导致降维捕捉的是技术噪声
ScaleData基因表达量标准化到均值为0、方差为1,避免高表达基因权重过大忘记设置features只缩放高变基因,内存暴涨
RunPCA将高维表达矩阵压缩到几十个主成分,去掉冗余和噪声PCA维度数没有根据拐点图或方差贡献率合理选择
FindNeighbors基于PCA结果构建KNN图和SNN图,定义细胞之间的"邻居关系"使用的PCA维度数和后续不一致,导致图形结构错位
FindClusters用Louvain/Leiden算法在图结构上找社区,得到初步细胞群resolution设置不会调,分群过粗或过碎
RunTSNE把高维结构投影到二维,供人眼视觉检查整体分群格局没设seed导致每次跑图结果不一样,或perplexity不合适

记住一点:t-SNE聚类分析中的"聚类"结果,实际上在FindClusters()这一步就已经确定了,t-SNE只是把已经分好的群"画"出来给你看。很多人在这一步犯迷糊,后面我专门用一节讲清楚这个关系。

1.2 质控不合格的数据,t-SNE会给你"加倍奉还"

如果你的数据里有大量低质量细胞——比如线粒体基因占比超过20%的濒死细胞、或者双细胞(doublet)混在其中——t-SNE并不会好心地把它们单独挑出来变成一"群",而是会硬塞进某些群或者形成一团无法解释的"过渡态"细胞。最典型的表现是:聚类热图上几个群之间的marker表达差异模模糊糊,或者某个cluster里同时出现两种完全不同的细胞类型的marker。

所以我强烈建议,在跑进t-SNE之前,先用subset()把不符合条件的细胞剔除干净。我的常用阈值是:nFeature_RNA > 200(排除空液滴和碎片)、nFeature_RNA < 6000(排除双细胞或高复杂度异常值,具体上限根据建库方式调整)、percent.mt < 20(小鼠和人的经验值不太一样,脑组织可以适当放宽到25%)。做这一步时可以用VlnPlot()先看一下分布再定阈值,不要无脑套参数。质控这关省下的时间,会在后面找marker时十倍地还给你。

2. 先分清一件事:t-SNE是可视化方法,不是聚类算法本身

2.1 为什么说"t-SNE聚类"这个叫法不太严谨

你会在各种教程里看到"t-SNE聚类分析"这种说法,包括很多高分文章的methods部分也这么写,但严格来讲,这个叫法是有问题的。聚类(clustering)指的是把细胞划分到不同群里的计算过程,这个任务在Seurat标准流程里由FindClusters()完成,它用的是基于图的社区发现算法(Louvain或Leiden),跟t-SNE没有关系。

t-SNE(t-distributed Stochastic Neighbor Embedding)做的事情,是把高维空间中细胞与细胞之间的相似性映射到二维或三维坐标上,让相似的细胞在图上靠得近、不相似的细胞离得远,本质是一个非线性降维可视化工具。它在单细胞流程中的作用是"展示",不是"划分"。

那为什么大家习惯叫"t-SNE聚类"?因为实际项目里这套动作是连在一起做的:聚类算法先算好cluster标签,再用t-SNE画图观察整体格局,整个过程对使用者来说是一气呵成的,所以口语上经常合并叫。这个可以理解,但你在理解结果、排查问题的时候,头脑里一定要有这根弦——如果分群不清楚,问题可能出在FindClusters()的输入图结构上;而如果只是图不好看、但群标签是合理的,那问题可能出在t-SNE的投影参数上。这两类问题的修法完全不同。

2.2 t-SNE和UMAP,到底选哪个

现在单细胞领域早就不是t-SNE一枝独秀了,UMAP在绝大多数新文章里反而更常见。两者的核心区别在于对全局结构的保留程度:t-SNE倾向于只保留局部结构,距离远近在图上会失真,群与群之间的"间隙"大小没有实际意义;而UMAP在保留局部结构的同时还会尽量维持群与群之间的相对距离,全局关系更可靠。

我用一个生活化的类比来帮助你理解:t-SNE更像一张"地铁线路图",站与站之间的相对顺序是准的,但实际距离全被扭曲了;UMAP更像一张"普通地图",整体比例尺更接近真实距离。

具体到实际项目的选择,我给的建议是:

  • 如果为了审稿人、合作方或老板能一眼看清分离效果,用UMAP做主图,t-SNE作为补充图展示。现在大多数期刊对UMAP的接受度更高,而t-SNE在部分审稿人眼里已经有点"老派"了。
  • 如果要做精细亚群的视觉判断(比如同一个T细胞亚群内不同状态的过渡),t-SNE在部分数据集上会把过渡态压缩得更明显,看起来更"干净";UMAP有时会把这类过渡细胞拉成一条连续的"桥",反而更真实但不够美观。
  • 两个都跑一遍不丢人。我在实际项目中通常把两者都跑出来,发现结论不一致时,优先相信UMAP的全局结构,再去检查t-SNE是否因为perplexity设置不当导致局部失真。

另外要强调一点:无论选哪个,真正决定分群的是聚类步骤,不是降维结果。所以每次调整完FindClusters()的分辨率后,记得重新画一次降维图,不要只在旧图上加标签。

3. 实操:Seurat从PCA到t-SNE聚类的完整参数调优

3.1 PCA维度的选择,决定下游聚类的"输入质量"

RunPCA()跑完之后,紧接的FindNeighbors()需要指定dims参数,也就是使用多少个主成分(PC)。这个参数对聚类结果的影响非常大,却常常被人忽视。

选择PCA维度的核心逻辑是:保留真实生物学变异,去掉噪声维度。如果PC选太少,会丢失微弱但真实的亚群信号;选太多,等于把噪声也喂给了聚类算法,分群边界会被"糊掉"。

实际操作中我会用两种方式交叉验证:

第一种,看ElbowPlot()的拐点。这个图会展示每个PC解释的方差百分比,通常前面几个PC方差占比很高,之后迅速下降并趋于平缓,你的目标是在"下降变缓"的位置附近取一个值。但我必须提醒你,这个拐点在真实数据里往往没有那么锐利,肉眼判断常会有5~10个维度的浮动空间。

第二种,直接看多个dims下的聚类结果对比。我习惯把dims从10、15、20、30依次跑一遍,用DimPlot()看一下分群是否稳定。如果某个dims值下出现一群细胞从"聚在一起"变成"散成一团",说明这个维度下噪声已经开始干扰聚类,需要退回更保守的值。这个方法的缺点是耗时,因为每次都要重新算FindNeighbors和FindClusters,但换来的是分群可靠性,非常值。

有一个经验值供参考:对于10X平台约5000~10000个细胞、2000个高变基因的数据集,dims取20~30是比较常见的区间。如果你的数据集更复杂(比如有多个样本合并、或来自肿瘤微环境这样高度异质的样本),dims可以适当取高一点。但记住,堆太多PC不会让结果"更细",只会让聚类失去稳健性。

3.2 FindClusters的分辨率参数,掌握好"粗与细"的分寸

FindClusters()里的resolution参数,决定了聚类算法会把细胞切得多细。我把这个参数理解为一把"分辨率旋钮":调大,每个群的内部差异会被进一步挖掘,产生更多亚群;调小,亚群会被合并成大群,更容易看出大的细胞类别。

这个参数没有绝对正确值,它取决于你的生物学问题。如果你想回答的问题是"这个组织里都有哪些免疫细胞类型",那resolution设0.1~0.5就足够了;如果你想找的是"CD8阳性T细胞里是否存在一个衰竭亚群",那至少需要0.8~1.5,甚至更高。

我常用的探查法是这样:从resolution = 0.1开始,逐步往上加(0.2、0.5、0.8、1.0、1.5),每跑一次都配合FindAllMarkers()看新增的cluster有没有可靠的marker支持。如果增加resolution之后出现的"新群"无法用已知marker解释,那多半是过拟合了噪声,应该回到更低的resolution。如果继续增加分辨率后marker仍然特异,说明这个亚群可能是真实存在的。

这里有一个我在实际项目中反复体会到的点:cell type(细胞类型)和cell state(细胞状态)是两个不同层次的东西。低分辨率下聚出来的群,往往对应真正的细胞类型——比如T细胞、B细胞、巨噬细胞;高分辨率下细分出来的子群,有时候不是新的细胞类型,而是同一类细胞的不同状态(比如静息态、活化态、耗竭态)。在注释结果时,一定要区分这两种情况,否则会把同一个细胞类型拆成多个"新细胞类型",给下游分析埋雷。

3.3 RunTSNE的关键参数与稳定性问题

在聚类完成后,就该把结果投影到t-SNE图上了。Seurat里的核心命令是:

sce <- RunTSNE(sce, dims = 1:20, perplexity = 30, seed.use = 42) DimPlot(sce, reduction = "tsne", label = TRUE, pt.size = 0.5)

dims参数必须和你前面FindNeighbors()里用的保持一致,这是很容易犯的低级错误,但后果很严重——如果前后不一致,图上的分群格局会和你实际定义的cluster标签完全不同步。

perplexity参数(困惑度)控制的是t-SNE在计算邻居关系时"看多远",可以把它理解为"每个点在计算相似度时,要考虑附近多少个邻居"。这个值的推荐范围是5~50,Seurat默认30。数据量越大,perplexity通常可以适当调大一点;但如果你发现t-SNE图上出现大量细胞被挤成"一根根细丝"或者群内出现明显的小空洞,很可能是perplexity过低。反过来,如果所有细胞糊成一团分不开,而UMAP上明明分得很清楚,可以试试把perplexity调低到10左右。

还有一个特别实用的细节:t-SNE算法带有随机性,每次运行结果会有差异。所以你一定要设置seed.use参数,并且在论文或报告中注明,保证结果的可重复性。我见过不止一次,同一位研究者隔天跑同一个脚本,发现图变了,最后才发现是忘了固定种子。

3.4 分群结果不理想,先别急着调参数

这个我放到这一节稍微提一下,详细排查链路在后面的实战踩坑笔记里再展开。当你看到分群图一团乱、群与群之间没有清晰边界时,第一反应不应该是无限调perplexity或resolution。你首先要检查的是源头——数据本身干不干净。

我排查的标准顺序是:

  1. 打开FeaturePlot看几个已知的重要marker基因,看它们的表达模式是否具有空间连续性。如果某个已知marker在所有细胞里都是均匀弱表达,先警惕数据质量。
  2. 查看percent.mt、nCount_RNA、nFeature_RNA在t-SNE图上的分布。如果发现某一群细胞恰好对应于高线粒体比例或极低的基因数,那这群细胞很可能不是真正的细胞亚群,而是濒死细胞聚成一团。
  3. 检查是否存在明显的样本来源标签结构——如果两个样本混合后,t-SNE图上细胞严格按样本来源分成左右两团,而不是按生物学类型混合分布,那大概率是批次效应,需要用数据整合方法处理,这属于另一套流程。

4. 找marker基因:命令只是一步,看懂结果才是关键

4.1 FindAllMarkers背后的统计逻辑

分群完成后,下一个重头戏就是寻找每个cluster的marker基因。Seurat里的核心命令是:

markers <- FindAllMarkers(sce, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

拆开来看,FindAllMarkers实际上是对每个cluster,都把它和所有其他cluster的细胞做一次差异表达检验(默认是Wilcoxon秩和检验),找出在该cluster中显著高表达的基因。only.pos = TRUE意味着只返回上调基因,对于找marker来说通常够用了,因为我们要找的是"标记这个群的特征基因",而不是这个群里下调的基因。

这里三个参数的含义很容易被忽略,我逐个说一下:

  • min.pct:基因必须在多大比例的细胞中被检测到。默认0.1,我常用0.25。如果设得太低,你会得到一堆只在极少数细胞里表达、却在统计上"显著"的基因,它们往往是噪声。
  • logfc.threshold:只保留log2倍数变化大于该值的基因。如果不设这个阈值,Wilcoxon检验可能会把表达量差0.1倍的基因也判定为显著,但生物学家看了只想打人。
  • only.pos:只返回该群中高表达的基因。如果设为FALSE,你会同时拿到一堆下调基因,对找marker来说往往会造成干扰。

跑完之后,我通常会给结果加上一行筛选逻辑:

top_markers <- markers %>% filter(p_val_adj < 0.05, avg_log2FC > 1) %>% group_by(cluster) %>% slice_max(n = 10, order_by = avg_log2FC)

p_val_adj是校正后的p值,因为你要对成千上万个基因做几千次检验,不做多重假设校正,假阳性会非常严重。avg_log2FC > 1意味着该基因在目标群中的平均表达量是其他群的2倍以上,这是一个比较保守的筛选线,如果你发现筛选完没有足够的marker,可以放宽到0.58(相当于1.5倍)。

4.2 怎么判断一个marker基因是否"真的能用"

很多初学者拿到FindAllMarkers输出的表格之后,第一反应是把每个cluster的top基因拿去做GO富集,结果发现一堆看不太懂的通路名。我个人建议,在富集分析之前,先做一步更朴素但更关键的事——逐个用可视化确认marker的特异性。

我判断一个marker基因是否"可用"的标准有三个:

第一,表达特异性。这个基因在这个cluster里高表达,在其他cluster里低表达或几乎不表达。用FeaturePlot()看它在t-SNE/UMAP图上的分布,应该呈现出"只在某个区域内亮起来"的模式,而不是全局扩散。

第二,阳性细胞比例。看结果中的pct.1(该群中表达此基因的细胞占比)和pct.2(其他群中表达此基因的细胞占比)。我的习惯是要求pct.1明显高于pct.2,比如70%对10%。如果pct.1只有30%而pct.2有25%,即使p值显著,这个基因也只能算"弱marker",不适合作为群身份的决定性证据。

第三,生物学常识。marker基因最终要服务于细胞身份注释,因此它一定要对应已知的细胞生物学功能或文献报道。比如你用Cd3d标记T细胞、用Cd79a标记B细胞、用Lyz2标记巨噬细胞,这些是教科书级别的marker。如果一个全新基因在统计上高度显著,但你在文献里查不到它的谱系关联,那它更适合描述为"该亚群的潜在标志物",而不是直接作为注释依据。

4.3 热图和小提琴图:marker验证的标准动作

选出一批候选marker后,我会按照以下流程做最终确认。

首先生成每个cluster的top marker热图:

top10 <- markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC) DoHeatmap(sce, features = top10$gene) + NoLegend()

热图应该呈现明显的"方块化"结构:每个cluster对应一块独立的高表达区域。如果热图上不同cluster之间你中有我、我中有你,界限不清,说明你选的marker不够特异,或者前面的聚类本身就有问题。

然后再对每个关键的marker做VlnPlot():

VlnPlot(sce, features = c("Cd3d", "Cd79a", "Lyz2"), pt.size = 0)

这一步看的是marker在每个群中的表达量分布。理想情况下,某个群的表达量分布应该整体上移,而不是只有少数离群点拉高均值。用pt.size = 0可以让小提琴图更干净,不会被几万个点糊满。

这一步做完,你手里的marker列表才真正可以用来做细胞类型注释。我见过太多人只跑了一句FindAllMarkers就拿着结果开始注释,结果把一个cluster因为Gapdh高表达注释成"代谢活跃细胞",这种错误完全可以通过热图和小提琴图避免。

5. 单细胞聚类实战中的高频翻车场景与排查链路

5.1 翻车现场一:t-SNE图上所有细胞糊成一团

先交代一下背景:我处理过一批某疾病模型的组织样本,建库质量不算差,QC的时候各项指标也都正常,但跑完t-SNE之后,整张图上所有细胞挤成一大坨,几乎看不到任何分群结构。一开始我还以为是perplexity设太低了,换来换去都不见好转;后来才意识到问题出在PCA维度选择上——我在上一步保守地只取了前10个PC,结果把真正用于区分细胞类型的信号给丢掉了许多。

排查链路是:先看多个dims(20、30)下的聚类结果变化,再看高变基因分析是否合理,最后回到标准化那一步检查是不是用了错误的SCT和LogNormalize混用。

从这个坑里得到的教训是:如果你在UMAP和t-SNE上都看不到任何分群,优先怀疑输入信号不足,而不是降维参数的问题。我现在的做法是,先用一个宽松的dims(比如30)快速跑一遍,看能否推出大致格局;如果不行,再回过头检查上游的高变基因数和样本异质性。

5.2 翻车现场二:批次效应让分群按样本而不是按细胞类型走

单细胞项目很少有只跑一个样本的,一旦合并多个样本,批次效应就是绕不开的坎。最典型的症状是:t-SNE图上细胞不按"T细胞聚在一起、B细胞聚在一起"分布,而是"样本A的所有细胞都在这边、样本B的所有细胞都在那边"。

如果你在FeaturePlot里用样本ID给细胞上色(把样本信息存在metadata里,DimPlot(sce, group.by = "sample_id")),发现颜色严格分区,几乎可以断定是批次效应。这时候不要指望调聚类参数能解决,应该回到数据整合环节。目前主流的解法是Harmony,也可以在Seurat里用SCTransform配合IntegrateData做整合。

Harmony的使用逻辑很简单:RunHarmony替代RunPCA之后的FindNeighbors步骤,让聚类基于去批次后的嵌入坐标进行。整合后,t-SNE图上细胞应该按生物学类型混合分布,这才是可以继续往下走的信号。有一个细节值得提醒你:做完整合后,后面所有降维和找marker都要基于整合后的对象进行,不要再回退到整合前的PCA结果上。

5.3 翻车现场三:某个cluster同时表达两个谱系的marker

这个场景在我第一次处理肿瘤样本时遇到过:某一个cluster的top marker里,既有T细胞标志物Cd3d,又有髓系标志物Lyz2。当时我第一反应是聚类分辨率不够,把两种不同细胞硬分到一个群里了,于是把resolution一路上调,结果分出来的子群依然同时表达两个谱系的marker。

之后我意识到问题不在聚类,而是数据分析前就混入了双细胞(doublet)——一个液滴里同时包裹了一个T细胞和一个巨噬细胞,测到的"基因表达谱"天然就是两者叠加。双细胞在单细胞数据里造成的假象非常隐蔽,不加处理的情况下,它们会形成一个"不伦不类"的中间群,或者被硬挤进已有的群导致marker信号被稀释。

解决办法是提前使用DoubletFinder或scDblFinder预测并过滤双细胞。跑完降维聚类后,再看一眼每个cluster里的双细胞预测比例——如果某个群的双细胞比例远高于平均水平,那这个群的marker需要格外谨慎地解读,最好把它排除后再重新聚类。

5.4 翻车现场四:细胞周期效应把细胞按"正在分裂"分组

这类问题在增殖活跃的组织(比如发育中的大脑、肿瘤)中特别常见。它的特征是:你本来想分细胞类型,结果t-SNE图上分成两三个巨大的"阴阳"格局——一大群细胞表达高水平的G2/M期marker(如Mki67、Top2a),另一大群表达G1/S期marker(如Ube2c),第三种是G1期细胞。这时候细胞类型的信息反而被淹没了。

一个快速验证方法:用CellCycleScoring()给每个细胞打周期分数,再用DimPlot按周期分数上色。如果分群方向刚好沿着周期的梯度分布,那就是周期效应。

处理方式有两种思路。一种是如果细胞周期变异与你的研究问题无关,直接通过ScaleData回归掉周期分数的影响;另一种是如果周期相关基因本身是研究对象(比如肿瘤增殖),就不要简单回归,而是在注释时区分"增殖型亚群"和"静息型亚群"。

5.5 排查链路总结:按顺序来,不要跳步

把上面几个场景的排查顺序整理成一张决策链,方便你在实际项目中照着走:

  1. 先确认QC阈值是否合理,低质量细胞有没有干扰聚类;
  2. 检查是否存在明显批次效应,必要时做数据整合;
  3. 验证双细胞比例,排除中间状态造成的虚假cluster;
  4. 评估细胞周期效应是否主导了分群方向;
  5. 再回到dims、resolution、perplexity这些参数,逐个检查是否设置得合理;
  6. 最后才用marker的生物学意义来验证分群的解释力。

我一直认为,单细胞分析中90%的"聚类效果差"都不是调参能解决的,真正要做的是回到数据源头找原因。这条链路我在每个新项目里都会完整走一遍,虽然费时间,但能帮你省下后面注释时的无数烦恼。

6. marker基因的生物学验证:从统计显著到真凭实据

6.1 注释细胞类型时用哪些数据库和工具

当你拿到每个cluster的top marker之后,下一步就是把它们对应到已知的细胞类型上。这一步我用到的工具包括:

  • SingleR:基于参考转录组数据集自动注释。优点是快速、省力,适合对细胞大类做初步判断;缺点是参考数据的选择会影响结果,而不同来源的参考集对同一群细胞的注释可能不同。我通常把它当"助手"而不是"裁判"。
  • CellMarker、PanglaoDB、CellTypist:这些数据库中存有文献中验证过的细胞类型marker基因列表。你可以在里面搜索自己的top marker是否有已知的细胞类型关联。
  • 人工查阅文献:这是绕不开的最终王道。尤其在做新亚群注释时,自动化工具的准确度往往不够,最后还是要回到原始文献中确认这群细胞的表型特征。

我在实际中倾向于先跑一遍SingleR做初步判断,再用已知的经典marker做人工验证。比如我预期某个cluster是CD8阳性T细胞,就会看Cd8a、Cd3d、Gzmb等经典marker是否在这个cluster中高表达,并且要求多个marker同时支持同一结论。如果只有单个marker支持,我会把它标记为"待验证",不会直接拍板。

6.2 区分"marker基因"与"差异表达基因"

很多初学者把FindAllMarkers输出的所有基因都当作"marker基因",这是一个很需要纠正的误解。差异表达基因(DEG)和marker基因之间是包含关系:所有的marker基因都是差异表达基因,但不是所有差异表达基因都能作为marker。

marker基因强调的是"类别的指示标志":它在目标群中高表达,在其他所有群中不表达或低表达,且这个模式具有稳定性。而DEG只强调"不同群之间有统计差异"——一个基因如果在A群中表达量是10,在B群中是2,它已经算差异了,但作为marker远不够。

所以我在筛选marker时会刻意提高阈值。除了前面提到的p_val_adj < 0.05和avg_log2FC > 1,还会特别关注pct.1和pct.2之间的差距。一个真正的marker,pct.1通常要接近0.8或更高,而pct.2应该低于0.2。如果两者都在0.5附近,我会怀疑这个基因只是"普遍高表达",不能用来定义细胞身份。

6.3 热图验证时的几个细节

最后再补几个DoHeatmap使用中的实操细节。

第一,DoHeatmap默认显示每个身份类最多50个细胞,如果你的cluster细胞数量特别多,热图看起来会很"拥挤"。可以通过DoHeatmap(sce, features = top10$gene, size = 4)调整字体大小,或者先对数据subset成每类细胞抽样再画。

第二,热图上的表达值默认经过ScaleData标准化,所以Z值的正负只能说明相对表达高低,不能直接当作绝对表达量理解。

第三,如果在同一张热图里画了几十上百个基因,图像会变得过密难读。更推荐的做法是:先选20~30个核心marker基因画一张精简热图,再对重点关注的具体基因单独用VlnPlot和FeaturePlot做深入可视化和验证。精简热图给审稿人看全局格局,单独feature plot给自己确认细节,两不误。

写在最后,一些操作性很强的建议

如果你现在正准备跑单细胞测序流程(五),我的建议是把注意力放在数据质量和参数的因果关系上,而不是机械地执行脚本。梳理一下本篇文章中个人最想强调的几点:第一,t-SNE只是可视化工具,真正决定聚类的是FindNeighbors和FindClusters,它们各自依赖的PCA维度、resolution参数永远值得你先想清楚其生物学意义再跑;第二,找marker不只是跑一句FindAllMarkers,要结合热图、小提琴图和生物学常识做交叉验证,宁可多花半天验证,也不要急着出图发表;第三,数据质量问题(双细胞、批次效应、周期效应)如果要靠降维聚类参数修复,那一定修不好。

最后分享一个我在实际项目中体会很深的小技巧:每次调参后我都会把当时的t-SNE/UMAP图、聚类resolution、PCA维度Marker基因列表存档在同一份运行笔记里。这样即使一个月后回头复查,也能回忆起当时的画面为何长这样,以及改参数后结果是如何演变的。单细胞分析的迭代次数非常多,没有这份记录,你很容易在调参迷宫里彻底迷失方向。祝你聚类顺利,marker一找一个准。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询