单细胞注释实操指南:从标记基因到人工判群的全流程
发布时间:2026/10/2 1:00:36来源:尧图网络
做单细胞注释这活儿说难不难说简单也真不简单。很多人拿到一个聚类结果丢给SingleR或者CellTypist跑一遍就完事结果回来一看某个CD8T群里赫然表达着MZB1某群巨噬细胞里CD3D高得离谱逻辑上根本说不通。我自己的感受是自动化注释只是辅助真正能拍板、能写进文章里让审稿人挑不出毛病的还得靠人工逐群判型。这篇就把我从标记基因筛选、UMAP判群到功能分析的完整流程捋一遍全是实际操作中验证过的东西。这篇文章适合谁刚入门、手上有一批Seurat对象不知道怎么下手的新手以及已经会用自动化注释但总觉得结果不可靠、想系统建立人工注释思路的朋友。我会把每个环节的为什么这么做也讲清楚不光是给代码。1. 为什么自动化注释不能全信先搞懂人工注释在解决什么问题1.1 自动化注释的两个先天缺陷自动化注释工具SingleR、CellTypist、scCATCH等的原理本质上是用一个参考数据集给每个细胞打分然后取最相似的标签。这个思路听起来没问题但它有两个绕不开的缺陷。第一参考数据集的偏见。市面上大部分参考集来自血液、肿瘤或正常组织的公开数据里面不同细胞类型的比例、测序深度、批次效应都存在。如果你的样本是某种罕见组织或者经过特殊处理的细胞参考集里根本没有对应的细胞类型工具就会强行给一个最相似但实际上错误的标签。我见过某工具的注释结果把一群肝星状细胞标注成了平滑肌细胞就因为它俩转录谱确实像但在功能上天差地别。第二它会掩盖聚类本身的错误。注释本质上是在给已有的cluster做分类但如果聚类时就出了问题——比如两个细胞类型靠得太近没分开或者一个群里混进了双细胞——自动化注释不会告诉你这些它只会给整个cluster一个平均意义上的标签。而这些聚类层面的问题恰恰只有人眼看着FeaturePlot、看着标记基因的共表达情况才能发现。1.2 人工注释的真实定位人工注释不是不用工具而是把工具当成线索来源而不是判决依据。正确的工作流是先用自动化注释给个初判节省时间然后逐群用手动检查关键标记基因的表达模式对有争议的群结合文献和功能分析做最终裁定。这么做还有一个额外好处手动过一遍所有cluster之后你会对自己数据里的细胞组成、组织微环境特征有非常具体的认知。比如你会发现某个病人来源的样本里T细胞比例异常高或者某个cluster的线粒体基因表达普遍偏高——这些信息在你后续做差异分析、解读生物学意义的时候帮助非常大。我自己每次拿到新数据无论要不要做人工注释都会手动把主要细胞谱系的经典标记物画一遍FeaturePlot就当作是体检。2. 标记基因筛选从哪里找、怎么验证、用什么标准判断可靠2.1 建立你的标记基因弹药库人工注释的底气来自标记基因。没有一套靠谱的标记基因清单后面全是空中楼阁。推荐按这几个渠道去建清单。第一是经典文献和数据库。CellMarker 2.0http://xteam.xbio.top/CellMarker/和PanglaoDBhttps://panglaodb.se/是两颗最常用的钉子户。CellMarker按物种、组织、细胞类型三个维度收录了标记基因还区分了强证据和弱证据PanglaoDB则是基于大量scRNA-seq文章汇总的数据库。用的时候注意看每条记录的来源文献和证据等级别看到列表里有就直接抄。第二是同领域的近期文章。特别是和你研究组织相近的单细胞文章它们的supplementary表格里往往有详细的marker基因列表直接拿来用比自己从零开始筛选效率高得多。注意优先近两年的文章因为单细胞领域的marker定义一直在更新——比如以前大家都用FCGR3A标记单核细胞后来发现它在NK细胞亚群上也有表达这类翻车信息在最新文献里才会有。第三是你自己数据里筛出来的差异表达基因。这个放在后面第3节讲但简单说数据库里的marker是通用描述你样本里的marker必须结合自身数据验证两者对得上才能用。2.2 判断标记基因靠谱程度的四个维度有了候选基因清单不能直接拿来用得先筛一遍。我一般从四个维度去评价一个标记基因靠不靠谱特异性specificity这个基因是不是只在目标细胞群里表达在其他群里基本不表达比如CD3D在T细胞里高表达在NK细胞里可能有一点点微弱表达但在B细胞和髓系里几乎没有——这种就是高特异性。而有些基因比如CD24在很多上皮来源的肿瘤细胞里都表达特异性就差只能当辅助证据。灵敏度sensitivity目标细胞群里有多少比例的细胞表达这个基因如果一个cluster里只有20%的细胞表达某个所谓标记基因那这个cluster的纯净度可能有问题或者这个marker只标记了它内部的一个亚群。理想情况是目标cluster里80%以上的细胞都检测到该基因而且表达水平明显高于其他cluster。表达量expression level基因的平均表达量最好在较高水平这样可视化时信号清晰统计检验也更有说服力。有些marker虽然特异但表达量太低了比如CD8B它的mRNA丰度不高在Drop-seq这类敏感度较低的平台上可能检测不到这时就要依赖CD8A、GZMB等信号更强的辅助marker来共同判定。功能合理性biological plausibility这个经常被忽略但极其重要。标记基因的地位不是投票选出来的背后得有功能支撑。比如GZMB不仅是NK细胞的marker它本身就是颗粒酶B是细胞毒性功能的执行分子——用这类基因做标记不仅告诉你这是什么细胞还暗示了它可能在干什么。反过来如果一个marker在功能上和这种细胞类型八竿子打不着反而要怀疑是不是注释错了。2.3 常见组织场景的经典marker组合参考表下面这张表是我在不同组织数据里反复验证过、最常用的基础marker组合覆盖了绝大多数组织的共性细胞类型。拿到新数据时我一般先从这张表开始再结合具体组织加特异性marker。细胞类型经典标记基因高可信辅助标记基因备注T细胞CD3D, CD3ECD2, TRAC重点关注CD3D几乎所有T细胞亚群都表达CD4 TIL7R, CD4LEF1, CCR7注意CD4 mRNA在某些巨噬细胞上也有弱表达CD8 TCD8A, CD8BGZMB, PRF1CD8B敏感度低需结合CD8A判断NK细胞NKG7, KLRD1, GNLYNCAM1(CD56), KLRC1和CD8 T容易混淆需确认CD3阴性B细胞CD79A, MS4A1(CD20)CD19, BANK1MS4A1在浆细胞阶段会下调浆细胞MZB1, JCHAINXBP1, SDC1CD79A低表达或不表达注意和B细胞区分单核/巨噬细胞CD14, LYZCD68, CSF1R, FCGR3A单核细胞CD14高巨噬细胞CD68/CSF1R特征更明显树突状细胞CLEC9A, FCER1AITGAX(CD11c), CD1C浆样DC看LILRA4, CLEC4C中性粒细胞FCGR3B, S100A8S100A9, CSF3R一般只在新鲜样本中比较多内皮细胞PECAM1(CD31), VWFCLDN5, FLT1淋巴内皮看PDPN, LYVE1成纤维细胞COL1A1, DCNLUM, PDGFRA注意和间充质干细胞区分上皮细胞EPCAM, KRT8KRT18, KRT19肿瘤样本中EPCAM阳性集群要特别小心增殖细胞MKI67, TOP2APCNA一般出现在多个cluster里通常独立成群这张表里的基因不是死的尤其是在人和小鼠之间有部分marker表达模式不完全一致。比如小鼠中性粒细胞高表达S100A8/S100A9人外周血中性粒细胞则更依赖FCGR3B和CSF3R。分析前千万确认一下自己数据是哪个物种拿人的marker注释小鼠数据肯定是要出问题的。3. 标记基因到手之后先画图看全局再定注释策略3.1 拿到Seurat对象后的第一步不是跑函数而是画全局图不管是自己跑完的聚类结果还是拿到别人给的rds文件我建议先执行这四行代码把全局情况摸一遍# 假设已经有一个经过标准流程处理的Seurat对象包含UMAP和cluster信息 p1 - DimPlot(seu, reduction umap, label TRUE, group.by seurat_clusters) p2 - FeaturePlot(seu, features c(CD3D, CD79A, LYZ, PECAM1, COL1A1, EPCAM), cols c(lightgrey, red), ncol 3) p1 p2注意几个细节。DimPlot里的labelTRUE能直接在每个cluster中心显示编号后面逐个注释的时候对号入座非常方便。FeaturePlot的背景色我习惯用浅灰色高表达信号用红色对比度高容易识别。如果你有多个样本来源用split.by参数按样本拆分看一遍UMAP能快速发现批次效应——如果同一细胞类型在UMAP上没有聚在一起而是按样本分散成好几块那就是典型的批次效应需要先处理再进行注释。3.2 用DotPlot做跨群marker矩阵一眼锁定大体谱系FeaturePlot一张张翻虽然直观但几十个marker翻起来效率太低。我更喜欢先用一个DotPlot把所有候选marker × 所有cluster的表达矩阵拉出来全局扫一遍再决定细看谁。markers_all - c(CD3D, CD3E, CD8A, CD8B, IL7R, NKG7, GNLY, CD79A, MS4A1, MZB1, LYZ, CD14, FCGR3A, CLEC9A, LILRA4, S100A8, PECAM1, VWF, COL1A1, EPCAM, MKI67) DotPlot(seu, features markers_all, group.by seurat_clusters) theme(axis.text.x element_text(angle 45, hjust 1))DotPlot里每个点的大小代表该群中表达该基因的细胞比例颜色深浅代表平均表达量。这两个维度其实就是我在第2.2节说的灵敏度和表达量一张图全看完了。通常来说一个健康的cluster会呈现一个主要谱系marker强阳性 其余谱系marker阴性的干净模式。首次扫描我只看大结构把cluster粗分为淋巴系髓系基质/上皮三大类。具体怎么快速定看这几个关键基因就行CD3D/CD79A/NKG7确定是淋巴细胞再看具体亚群LYZ/CD14/FCGR3A/CLEC9A确定是髓系细胞PECAM1/VWF血管内皮COL1A1/DCN成纤维或间质EPCAM/KRT上皮来源肿瘤样本里要重点盯3.3 根据数据复杂程度决定注释策略一步到位还是分级注释全局图看完之后注释策略基本就清楚了。如果样本是外周血或脾脏这类相对简单的组织主要细胞类型就那十来个可以直接给每个cluster定标签。但如果是肿瘤组织、肠道黏膜或者脑组织细胞组成极其复杂一步到位很容易翻车——这种我建议做分级注释先粗分到谱系水平T细胞、B细胞、髓系、基质然后提取每个谱系的细胞子集重新聚类在子集内部做精细亚群注释。比如肿瘤组织的髓系细胞直接看全局聚类可能只有两三个群但里面可能混着单核细胞、肿瘤相关巨噬细胞TAM的多个极化状态、cDC1/cDC2、pDC等多种细胞。只有把它们单独拎出来重新聚类才有分辨力。分级注释的好处是每一步的判型难度都降低了容错率高坏处是工作量大——但做人工注释就别怕这个耐心是基本功。4. 逐群判型实操从候选marker到最终标签的完整决策链4.1 每个cluster都要走的五个判断步骤我逐群判型时有一套固定的流程每群都按这五步走效率高且不容易漏。第一步看这个群的位置。UMAP上是否孤立成团和哪些群相邻通常转录谱相似的细胞类型在UMAP上距离也近——CD4 T和CD8 T挨着、单核和DC挨着如果出现本该相关性很弱的两类细胞抱在一起的情况比如T细胞和内皮细胞紧挨着多半说明其中一个群的注释有问题或者聚类参数不合适。第二步看这个群的marker表达矩阵。用上面那张DotPlot定位到具体行确认主marker的阳性情况记录高表达什么、低表达什么、不表达什么。注意不只是看该群自己还要看它和其他群的对比——一个基因如果全图都有表达那它对判型的参考价值就很低。第三步看特异marker的FeaturePlot细部表达。DotPlot看大概FeaturePlot看细节。我会重点检查那些应该互补的marker组合比如CD3DT和CD79AB在同一个cluster里绝对不能共高表达。如果存在共高表达这个群极有可能是双细胞doublet要标记出来在过滤阶段处理掉。第四步查看这个群的top差异表达基因。用FindAllMarkers或FindMarkers跑一遍拿到每个cluster的差异基因列表看top位置的基因能反映什么功能。这一步经常能带来意外发现——比如某群被初步判定为T细胞但top差异基因里出现了大量的核糖体蛋白基因RPS/RPL说明这群细胞可能处于高翻译活性状态可能是在活跃增殖的效应T也可能是应激反应导致的假象需要结合MKI67等增殖marker辅助确认。第五步给一个确切的标签并记录判断依据。我的习惯是把每个cluster的标签、主要marker、以及判断依据比如CD3DIL7RCD8A阴性接近幼稚/中央记忆CD4 T特征记在一个Excel表或者Markdown文档里后面写方法学部分的时候直接抄进去审稿人问起也能拿出证据。4.2 最容易卡住的边界情况T/NK、单核/DC、B/浆细胞实际注释中总有那么几个群怎么都对不上号我挑三个最高频的边界场景说一下我的处理方式。T细胞和NK细胞的区分是经典难题因为二者共享很多杀伤功能的基因比如NKG7、GZMB、PRF1在活化的CD8 T里也高表达。核心的判别逻辑是T细胞必须有CD3D/CD3E表达NK细胞CD3阴性。哪怕CD3D表达量很低只要检测到就更倾向于是T。反过来如果一群细胞NKG7/KLRD1/GNLY全部强阳性但CD3D几乎测不到那是NK。还有一种CD3D弱阳性 NK marker强阳性的群可能是NKT样细胞或者活化的CD8T被误判了这种情况我建议把它单独提取出来重新聚类看能否分开实在分不开就标成CD3NK样细胞并按最低分辨率处理。单核细胞和树突状细胞的边界同样让人头疼。经典教科书说单核细胞CD14高、DC表达CD1C/CLEC9A但真实数据里很多DC也表达CD14。我的处理办法是综合看CD16FCGR3A、HLA-DRA和CD1C三者的关系经典单核细胞主要是CD14高、HLA-DRA中等、CD1C阴性cDC2则是CD1C阳性、HLA-DRA高、CD14低或弱阳。如果一群细胞在单核和DC之间摇摆再加一个CD86或FCER1A看是否偏向DC成熟状态一般能定下来。B细胞和浆细胞是从未缺席的送分题变送命题。B细胞的marker是CD79A/MS4A1但浆细胞已经走向终末分化B细胞marker会下调甚至关闭转而高表达MZB1、JCHAIN和XBP1。如果只看CD79A阳性就标B细胞很容易把浆细胞群漏掉。反过来有些肿瘤相关B细胞会异常表达CD79A但MS4A1很低这类细胞就是常说的肿瘤浸润B细胞中的非经典表型不能简单归为普通B细胞。4.3 遇到四不像cluster怎么处理三种可落地的处置方案确实会有某些cluster把所有已知marker都过了一遍还是找不到合适的身份或者同时表达了多种谱系marker。这时候我的处置方案按优先级排列方案一判断是否为双细胞。最简单的方法是看这个群的marker共表达情况再用DoubletFinder这类工具核对一遍。如果确认是双细胞就用subset把它从数据中剔除在方法学里注明即可。方案二尝试更细的聚类参数。有时候四不像是因为分辨率太粗把几个稀有的小亚群憋进了一个群。把FindClusters的resolution从0.5提高到0.8或1.0重新聚类看看这个群能否拆开。拆开之后每个子群往往就有对应的身份了。这个操作简单却经常能解决大部分疑难杂症。方案三标记为未知/混合细胞群并如实报告。如果上面两种方案都试过还是悬而未决那就诚实地标注为Unknown或者用最客观的描述性标签比如高表达X/Y/Z的细胞群。为了勉强给它按一个身份、硬套一个细胞类型反而会在后续差异分析和功能富集阶段引入系统性偏差。一两个未知群对整体结论的影响很小但错误注释对结论的杀伤力却很大——两害相权取其轻。5. 人工注释完成之后丰度差异、功能富集、细胞通讯三层递进分析5.1 先做细胞比例分析注释标签的第一块试金石注释完成后第一件事不是急着跑富集而是看一下各细胞类型在不同样本/组别间的比例变化。这一步既是最直观的结果展示也是对注释质量的又一次校验——如果某个细胞类型在一个组别里占比出现极端异常先别高兴检查一下是不是注释错误导致的。# 计算每个样本中各细胞类型的比例 prop_df - as.data.frame(prop.table(table(seu$sample_id, seu$celltype), margin 1)) colnames(prop_df) - c(Sample, CellType, Proportion)比例数据拿到后用ggpubr的stat_compare_means做组间检验或者直接画堆叠条形图看各组分布。注意两组样本量特别小n3的时候比例差异的统计学意义很弱这时候只能做描述性展示不能下结论。5.2 差异表达后做GO/KEGG富集用clusterProfiler一次跑完细胞比例之外更常见也更重要的一步是对目标细胞类型做组间差异表达然后对差异基因做功能富集回答这类细胞在疾病组里到底发生了什么变化。library(clusterProfiler) library(org.Hs.eg.db) # 以某个细胞类型为例比较疾病组和对照组 Idents(seu) - celltype markers - FindMarkers(seu, ident.1 Disease, ident.2 Control, group.by condition, subset.ident CD8T) # 筛选显著差异基因并转换ID deg - markers[markers$p_val_adj 0.05 abs(markers$avg_log2FC) 0.58, ] eg - bitr(rownames(deg), fromType SYMBOL, toType ENTREZID, OrgDb org.Hs.eg.db) # GO富集 go_res - enrichGO(gene eg$ENTREZID, OrgDb org.Hs.eg.db, keyType ENTREZID, ont BP, pAdjustMethod BH, pvalueCutoff 0.05, qvalueCutoff 0.05) # KEGG富集 kegg_res - enrichKEGG(gene eg$ENTREZID, organism hsa, pvalueCutoff 0.05, qvalueCutoff 0.05) dotplot(go_res, showCategory 15)判断富集结果怎么读数先看富集条目的p.adjust再看GeneRatio和Count。如果富集到的通路全是核糖体合成氧化磷酸化这种过于基础的通路先别急着解读生物学意义——这很可能是差异基因里混入了大量增殖或代谢相关的通用基因需要先过滤掉MKI67、RPS/RPL这类泛表达基因再重新分析。我踩过这个坑最早跑出来的富集结果全是核糖体相关后来把这批基因去掉之后才看到真正的免疫应答相关通路。5.3 GSEA补充不设阈值看整体趋势GO/KEGG富集要求先选出差异基因等于预先设了一道筛选门槛容易漏掉单个基因变化不大但整个通路协同变化的信号。GSEA基因集富集分析的好处是不需要设差异基因阈值直接用全部基因的表达变化排序做富集能捕捉到更微弱的通路倾向。GSEA实现我用fgsea包较多配合MSigDB的Hallmark基因集或者直接用clusterProfiler里的gseGO和gseKEGG。排序指标我用avg_log2FC而不是p值——用p值排序会把低表达基因的噪声也放进来。# 按log2FC排序全部基因 gene_list - markers$avg_log2FC names(gene_list) - rownames(markers) gene_list - sort(gene_list, decreasing TRUE) # 用fgsea跑Hallmark基因集 library(fgsea) hallmark - gmtPathways(h.all.v2023.2.Hs.symbols.gmt) fgsea_res - fgsea(pathways hallmark, stats gene_list, minSize 15, maxSize 500)5.4 细胞通讯分析CellChat把注释的价值放大如果说富集分析是单细胞视角细胞通讯分析就是群体视角——它基于配体-受体数据库推断不同细胞类型之间的通信网络。这一步骤强烈依赖前期的注释质量注释错一个细胞类型通讯网络里就可能多出一堆幽灵信号。library(CellChat) data.input - GetAssayData(seu, assay RNA, slot data) meta - data.frame(labels seu$celltype, row.names colnames(seu)) cellchat - createCellChat(object data.input, meta meta, group.by labels) cellchat - addMeta(cellchat, meta meta) cellchatDB - CellChatDB.human cellchat - subsetData(cellchat) cellchat - identifyOverExpressedGenes(cellchat) cellchat - identifyOverExpressedInteractions(cellchat)跑完之后最该看的是netVisual_circle的整体通讯图以及重点通路比如肿瘤里的MIF、MHC-I、GALECTIN通路在不同组间的强度差异。注意一点CellChat对输入数据中的dropout率很敏感如果你的数据测序深度较低、检出基因少通讯信号会被人为低估这种情况建议先用scRNAtools或seqSend等方案做表达矩阵的平滑处理后再进入CellChat。6. 注释可靠性自查与常见报错、翻车场景复盘6.1 注释完成后必须做的五个自查项注释完成了不能直接拿去画图写文章先过一遍自查清单。我是把这五个问题全部跑一遍确认没问题才敢用这批注释结果。全局marker矩阵再审一遍每个标签对应的主marker是否在对应群中一致高表达有没有跨谱系的串味UMAP目视复查相同标签的群是否分散成多个孤岛如果同一标签出现在UMAP上两个完全分离的区域说明要么是亚群没有被区分开要么是其中一块注释错了。样本分布检查特定细胞类型是否只在某一个样本中出现理论上这可能是有意义的生物学发现但更可能是某个样本的批次效应导致的假象。用percent.by.sample确认一下。已知金标准对照如果这个组织有大量历史文献或公开数据拿已知的细胞类型比例和marker特征做对比。比如正常外周血中T细胞占比约60-70%如果你注释出来的T细胞只有20%要么是样本特殊要么是注释出了问题。功能分析交叉验证第5节里的富集分析结果反过来可以验证注释。比如一群被注释为CD8 T的细胞如果富集出来的通路全是B细胞受体信号那这个注释大概率有问题。6.2 我在实际项目里踩过的三个坑第一个坑Cluster编号和细胞类型不是一一对应的。同一细胞类型可能分散在多个cluster里一个cluster里也可能混了两种类型。我刚做注释时犯过一个cluster一个标签的错误导致后续分析到处都是bug。正确做法是先看UMAP上cluster之间的距离远近把距离近的cluster合并或拆分后再注释或者用FindClusters调分辨率重新聚类。第二个坑肿瘤微环境里EPCAM阳性不等于上皮癌细胞。有些正常上皮细胞、或者循环肿瘤细胞周围的基质细胞也可能出现低水平的EPCAM表达。在肿瘤组织里判断是不是癌细胞除了EPCAM还应该看拷贝数变异inferCNV、已知驱动基因突变表达等。仅靠EPCAM标记就把整个cluster定为癌细胞是很多新手容易踩的坑。第三个坑不要把marker基因的低表达直接当成不表达。scRNA-seq存在大量dropout基因漏检现象一个基因在某群中只有20%的细胞检测到不代表这群细胞真的不表达它可能只是表达水平低于检测阈值。这时候如果仅凭某marker阴性就排除某种细胞类型很容易误判。稳妥的做法是用AverageExpression算一下该群的表达均值并结合权威文献的流式或免疫组化证据综合判断。6.3 报错信息应对速查表最后列一下我在手动注释流程中频率最高的几个报错和应对方式都是实战中反复验证过的。报错/问题常见原因处理办法Error in FindAllMarkers(): No cells foundIdents(seu)与group.by设置不一致检查Idents(seu)是否已切换为想要的分组变量FeaturePlot里某个基因全灰基因名大小写不匹配或该基因在当前assay中不存在执行rownames(seu)查看实际基因名注意人和小鼠大小写规则不同Could not find marker X该基因在原始表达矩阵中被过滤掉了回到CreateSeuratObject时的min.cells/min.features设置必要时降低过滤阈值重新建对象DotPlot中某些cluster无点该cluster细胞数太少或基因表达普遍为零确认该cluster细胞数是否少于10考虑合并进邻近cluster保存/加载rds后注释丢失Seurat对象版本不一致使用saveRDS和readRDS保持版本一致或在R会话开始时确认Seurat版本UMAP上两个cluster重叠严重聚类分辨率不足或批次效应未校正先用Harmony或CCA校正批次再尝试提高聚类分辨率重新聚类这些坑看起来都是小问题但在注释流程中每卡一次就得停下来查半天浪费的时间加起来非常可观。我把它们整理出来就是希望大家能一步跨过去把精力花在真正值得花的地方——理解数据读懂细胞。7. 一个完整的小例子从Seurat对象到注释完成前几节把各个环节拆开了讲这一节我用一个简化但完整的例子把这些步骤串起来方便直接照着跑。假设有一份来自人外周血单个核细胞PBMC的10x数据已经拿到了包含UMAP的Seurat对象。# 示例假设seu是已经做过QC、标准化、PCA、聚类、UMAP的Seurat对象 # 查看当前聚类结果 table(seu$seurat_clusters) # 第一步全局DotPlot标记基因矩阵扫描 markers_pbmc - c(CD3D, CD8A, CD8B, IL7R, NKG7, GNLY, CD79A, MS4A1, MZB1, LYZ, CD14, FCGR3A, CLEC9A, LILRA4, S100A8, FCGR3B) DotPlot(seu, features markers_pbmc) coord_flip() # 第二步根据DotPlot把cluster粗分类 # 假设看到cluster 0, 2, 4 CD3D阳性 - T细胞 # cluster 1 CD79A/MS4A1阳性 - B细胞 # cluster 3 LYZ/CD14阳性 - 单核细胞 # cluster 5 NKG7/GNLY阳性且CD3D阴性 - NK细胞 # cluster 6 MZB1/JCHAIN阳性 - 浆细胞 # 第三步针对存疑的cluster 7CD3D弱阳性NKG7中等 # 提取出来单独看marker特征 markers_cl7 - FindMarkers(seu, ident.1 7, only.pos TRUE) head(markers_cl7, 20) # 第四步确认后统一设置注释标签 new_labels - c(CD4_T, CD8_T, B_cell, Monocyte, CD4_T, NK_cell, Plasma, NK_like) names(new_labels) - levels(seu$seurat_clusters) seu$celltype - plyr::revalue(seu$seurat_clusters, new_labels) # 第五步检查结果 DimPlot(seu, group.by celltype, label TRUE)这个例子里steps画得很快但实际项目中每个cluster的判断都需要反复查看marker表达和文献对照。建议运行完第五步后把每一个celltype都单独做一个FeaturePlot叠加图核对一遍确认没有明显的错误标注。8. 关于注释粒度的一点个人建议不要为了细分而细分到文章最后我想专门聊聊注释的粒度这是很多人容易走极端的地方。有些人的注释只分到T细胞B细胞巨噬细胞这种大类结果信息量太浅后面的分析基本做不出什么有意义的结论。另一些人则恨不得把每个cluster都分成某种naive CD4T细胞亚群的某个状态结果注释了一大堆但很多子群之间根本没有可靠的marker区分硬分出来的结果在别人看来就是过度解读。我个人的经验是注释的粒度要匹配两件事——你的数据质量和你在回答的科学问题。如果你的数据每个cluster的分离度一般、marker表达存在明显渗漏就不要强行划分到太细的亚群如果你的科学问题恰好就是CD4T细胞内部不同功能状态的转变那么就必须在CD4T细胞内部做子聚类和更细的注释。还有一点注释的命名尽量保守而可复现。用CD4_T_naive而不是CD4_T_naive_like这类模棱两可的标签用Macrophage_APOE这种细胞类型特征基因的格式也比单纯叫Macrophage_1Macrophage_2更有信息量——前提是这个特征基因确实特异于这一群。审稿人看到Macrophage_APOE立刻就能明白这群细胞的特征而Macrophage_1则完全没有信息量还要回去查marker才知道它是什么。我自己在项目中一直保留着一份注释决策记录文档里面记了每一个cluster的判断依据和存疑点。后来整理文章方法学部分或者回答审稿人关于为什么这群被注释为XX的质疑时这份记录就是最有力的原始证据。好的注释工作不仅是给细胞贴上标签更是记录下你是如何一步步得出这些判断的——这套方法学上的严谨性会在后面很长一段时间里帮你省下无数麻烦。
网站建设高端定制企业官网