ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

单细胞转录组数据分析全流程指南:从Cell Ranger到细胞注释

2026/10/1 19:35:50 拓冰建站 浏览量
单细胞转录组数据分析全流程指南:从Cell Ranger到细胞注释 做单细胞数据分析这几年最常被新入门的朋友问到的一句话是“我拿到了10x的数据然后呢”每次听到这个问题我都能想起自己第一次跑完Cell Ranger却对着Seurat界面发呆的场面。单细胞数据分析不是一条笔直的流水线它更像是拼图从reads到表达矩阵从聚类到细胞身份每一步都有选择每个选择都在影响最终结论。这篇笔记是我把散落在各个项目里的经验重新梳理了一遍的产物力求把从原始测序数据到生物学结论的完整路径讲清楚包括每个环节在做什么、为什么这么做、参数怎么调、以及最常见的坑在哪里。内容适合刚接触单细胞转录组scRNA-seq的入门者也适合已经跑通流程但总感觉结果“不够干净”的进阶用户。1. 单细胞数据分析第一步认清你要处理的数据长什么样1.1 从fastq到表达矩阵上游比对和定量是怎么回事凡是做过普通转录组的人最开始接触单细胞数据时最容易忽略的一件事情是单细胞转录组的RAW数据并不是直接给你一张“细胞×基因”的表格而是三条分开的文件——barcodes.tsv、features.tsv和matrix.mtx。这三件套在10x Genomics的输出文件夹里几乎算是标配。barcodes.tsv一列细胞条形码代表每一个被捕获的液滴样本。features.tsv一列基因名通常是两列一列Ensembl ID一列Symbol代表基因。matrix.mtx稀疏矩阵记录某个barcode里某个基因的UMI计数。搞懂这三者的关系是迈入单细胞分析的第一道门槛。上游工具最重要的就是Cell Ranger这个软件它负责把fastq比对到参考基因组然后统计UMI生成上面说的三件套。实际项目里我习惯在拿到测序下机数据后先跑一遍cellranger count而不是直接跳到Seurat或者Scanpy因为Cell Ranger输出的web_summary.html里的指标能帮你快速判断这次建库测序是否成功。比如每个细胞的中位UMI数、检测到的基因中位数、细胞数是否达到预期等都是后续分析能不能进行的基准线。注意Cell Ranger这套流程我第一次跑的时候觉得它就是个黑盒子但后来进出不同项目发现黑盒子其实有自己的脾气。参考基因组版本选择不对、细胞捕获效率不高、测序饱和度偏低都可能让上游输出质量变差。如果排除了样本本身的问题数据还是显示细胞数严重偏少一定要回头检查是不是建库或者上机环节出了问题千万不要指望下游分析能“救回来”。1.2 拿到表达矩阵之后第一件事不是跑聚类把Cell Ranger的输出读进去之后很多新手会直接按教程往下走创建Seurat对象、归一化、找高变基因、PCA、UMAP一气呵成。这样做不是不行但我吃了不少亏之后现在都会在进入正式工作流之前花几分钟检查几个基本指标细胞总数是否和Cell Ranger报告一致基因数nFeature_RNA、UMI数nCount_RNA、线粒体基因比例等降维前的基本统计范围是否有明显的批次效应或者样本混合问题。简单来说这一步就是“体检”。单细胞实验的变异来源很多组织解离方法、建库批次、测序深度都会在数据里留下影子。如果你连体检报告都没看就急着上项目后期排查问题会非常痛苦。以基因为例如果一个细胞的基因数只有两三百个大概率是一个空液滴或者破细胞这种异常值会直接影响聚类结构。小窍门是先用VlnPlot把nFeature_RNA、nCount_RNA、percent.mt画出来用眼睛扫一遍整体分布看到明显的双峰或者拉长尾巴就该考虑是不是样品本身有问题。2. 标准化与特征选择为什么默认参数不一定适合你的数据2.1 NormalizeData和ScaleData的作用不能混为一谈Seurat的标准流程里NormalizeData用的是LogNormalize方法它会先把每个细胞的UMI总数归一化到同一尺度默认scale.factor10000再做log1p变换。这样做的目的是消除测序深度差异带来的偏差——毕竟一个细胞测到了5万UMI另一个只测到了5000不代表前者基因表达量真的高10倍。这个环节看起来简单但有一个基础且关键的原则先归一化再缩放。接下来ScaleData这一步是把每个基因的表达量在所有细胞中做标准化变换使其均值为0、方差为1。这一步是为了让后续PCA不受到基因表达量绝对值的干扰——高表达基因和低表达基因需要处在同一比较尺度上。我自己在实际操作中发现很多人会把ScaleData理解成“归一化”其实不是一回事。NormalizeData解决的是细胞间测序深度差异ScaleData解决的是基因间的数量级差异。如果把两者混为一谈后面找高变基因、做PCA的结果都会受影响。还有一点ScaleData默认会回归掉nUMI的影响vars.to.regress参数这在处理测序深度不均匀的数据时很有帮助但如果你的数据质量本身很好也可以不回归否则可能把真实的生物学信号也一起滤掉了。实操细节用正则表达式处理基因名的时候如果数据里混入了线粒体基因MT-开头、核糖体基因RPS/RPL开头最好在找高变基因之前就决定是保留还是过滤。我一般不会一上来就全部删掉因为部分核糖体基因在特定细胞类型里是有生物学意义的但在聚类时如果线粒体或核糖体基因占比太高会主导主成分导致聚类结果被技术因素绑架。折中方案是先做一轮质控过滤再在ScaleData时通过vars.to.regress把percent.mt的影响回归掉既保住了基因信息又不让杂质干扰主成分分析。2.2 找高变基因时2000个是起点而不是唯一答案FindVariableFeatures这个函数默认选2000个高变基因。这个数字是经验值但不是所有数据都适用。高变基因的意义在于找出在细胞间表达差异最显著的基因它们包含了绝大部分区分细胞类型的信息。我自己的经验是如果项目里的细胞类型非常复杂比如包含了多种免疫细胞亚群2000个高变基因不一定够。可以试着提高到3000甚至5000同时看下游聚类结果是否有明显改善。不要盲目加因为基因多了噪声也会增加而且计算量成倍上涨。关于高变基因的展示我会用VariableFeaturePlot去看一眼“均值-方差”的分布情况。如果看到高变基因清单里有一堆线粒体基因或者核糖体基因就说明前面的质控没有到位或者样本里有大量死亡细胞。这种情况先去解决数据质量问题比调参数更有效。另外一个容易踩的坑如果做整合分析比如合并多个样本高变基因要基于合并后的对象来找而不是分别找完再合并。Seurat的FindIntegrationAnchors就是靠高变基因来锚定跨样本的细胞如果每个样本的高变基因来自不同基因集合锚定的基础就不稳后面的整合效果可想而知。2.3 PCA维度选择肘部图只是一个参考不是铁律跑完ScaleData后进入PCA很多人用ElbowPlot看图选出拐点确定维度。这个方法没有错但我个人的习惯是用更保守的方式先看ElbowPlot然后结合下游聚类效果验证。用的是PC选择一致的策略——先保守选一个维度数比如10-15跑一遍FindNeighbors和FindClusters看UMAP分布再增加维度对比聚类结果的变化。单细胞数据本质是高维的但信息主要集中在少数主成分里。选太少维度会丢失稀有细胞类型的信息选太多维度会把技术噪声也学进去。有个比较粗糙但实用的判断方法选完维度后看每个PC里排名靠前的基因是否有明确的生物学意义。如果前五个PC加载的基因都是线粒体或核糖体基因说明数据里技术因素占主导得回去看质控了如果PCA结果里能看到若干已知细胞类型marker基因被拆到不同的PC里那这个维度选择就相对靠谱。3. 聚类与细胞注释从“分堆”到“认亲”的关键一跃3.1 FindClusters的分辨率参数决定了你想看多大的“显微镜倍数”聚类这一步大家普遍最关心的就是resolution分辨率参数。默认resolution0.8是被大多数教程推荐的起点但实际项目里我几乎每次都会调。分辨率可以理解为“显微镜的放大倍数”调小细胞群少看的都是大类调大细胞群多可以把亚群拆出来。举个实例在分析肿瘤浸润免疫细胞时resolution0.3时T细胞可能只有一个群resolution0.8时T细胞能分出CD4和CD8resolution1.5以上甚至能看到耗竭性T细胞亚群。具体取什么值取决于你的生物学问题——是想看大类还是想挖亚群。我在第一次跑一个项目时过度追求高分辨率把同一个细胞类型硬切成了好几个群检查marker时发现它们高表达的基因基本一致纯粹是图谱太细碎。所以现在我的策略是在0.5到1.2之间至少尝试3个值然后结合marker基因表达来决定最终聚类粒度。提示判断聚类好坏不只看UMAP上的分离度更重要的是看每一群的marker基因是否具有生物学一致性。一个通过marker基因能清晰解释的聚类结果即使UMAP图上有些群靠得很近也比一个UMAP虽然分开但marker表达混乱的结果更可信。3.2 细胞注释自动注释可以做但不要盲信当聚类尘埃落定接下来就是单细胞分析中最耗时、也最让新手焦头烂额的一步给每个cluster鉴定细胞类型。现在的工具生态已经比几年前好太多了SingleR、Garnett、scCATCH、CellTypist甚至还有基于大模型的注释工具初次接触的人很容易产生“跑一下就行”的错觉。我的建议是把自动注释当成“第一意见”而不是“最终诊断”。以SingleR为例它是通过参考转录组数据集给每个聚类打分输出最相似的细胞类型。但参考数据集本身有局限性对于疾病状态、组织特异性、物种差异都比较敏感。我在一个肝癌单细胞数据里用SingleR注释结果一部分巨噬细胞被注释成了单核细胞——因为参考数据集里的巨噬细胞和单核细胞表达谱实在太接近了。手动检查marker之后发现这些细胞的CD68和C1QC表达都很高明显应该是巨噬细胞。所以更稳妥的工作流是先靠自动注释给出一个大方向然后手动验证每个cluster的关键marker基因必要时人工修改注释。手动注释依赖的是积累的marker基因知识。比如T细胞看CD3D、CD3EB细胞看MS4A1、CD79ANK细胞看NKG7、GNLY巨噬细胞看CD68、LYZ。为了提升效率我一般会先把已知细胞类型的经典marker基因列成一个清单然后用DotPlot批量检查再逐个cluster核对。3.3 marker基因验证是注释的生命线很多人问我“怎么才能确定这个cluster是CD8 T细胞而不是NK细胞”光靠一两个marker往往是不够的。CD8A是CD8 T细胞的标志但部分NK细胞也会表达CD8A。这时候要组合多个marker一起看CD3D和CD8A双阳性是CD8 T细胞NKG7和GNLY双高但CD3D为阴性是NK细胞。单个基因容易误判组合marker才能提高注释的可靠性。实际操作中我是这样验证的先选一个cluster把它的高表达基因找出来用FindMarkers跑一遍然后对照已知marker清单看是否有匹配。如果有多个候选类型就画FeaturePlot和VlnPlot用已知的marker验证。这里需要注意有些基因虽然在文献里被描述为某种细胞类型的marker但在你的数据集里可能因为物种、组织、状态的不同表达模式并不典型。所以marker清单一定要结合自己的研究背景来定最好查阅相关领域的最新文献积累自己的marker列表而不是完全依赖教程里的通用清单。4. 差异表达分析实操从FindMarkers到可视化输出4.1 FindMarkers的几种典型用法以及检验的误区差异表达分析是回答“不同细胞状态或不同分组之间的分子差异”的核心手段。Seurat的FindMarkers函数有几个常用场景比较某个cluster和其余所有细胞默认ident.1某个clusterident.2NULL——用于找这个群的marker基因。比较两个指定细胞群——常用于亚群间差异分析。比较同一个细胞类型在不同条件如对照组与处理组下的差异。这里有个非常常见的误区有的用户把“找marker基因”和“找差异表达基因”混为一谈。找marker基因是默认情况找的是“群内相对于群体中其他细胞的高表达特征基因”这反映的是细胞类型特征。而回答“药物处理后某个细胞亚群中哪些基因表达发生了显著变化”这类问题时需要明确指定ident.1和ident.2为不同样本分组下的同一细胞类型。如果这两者混用分析结果会失去针对性。在用FindMarkers做组间差异分析的时候推荐把logfc.threshold设小一点比如0.25因为很多有生物学意义的差异基因表达变化的幅度并不大。P值的校正方面Seurat默认用的是Wilcoxon秩和检验结合Bonferroni校正这个方法对单细胞数据来说相对稳健但当细胞数量很多时很小的表达差异也会显示为显著需要结合|log2FC|的阈值来过滤生物学相关的变化。4.2 结果表格里哪些列最值得关注FindMarkers的输出表通常包含p_val、avg_log2FC、pct.1、pct.2、p_val_adj等列。新手最容易犯的错误是只盯着p_val看觉得“p值越小差异越显著”。实际上在单细胞数据里pct.1和pct.2这两列信息量很大它们分别表示基因在目标群体和背景群体中被检测到的细胞比例。如果一个基因的p值很小但pct.1只有5%说明它只在极少数细胞中表达这种情况未必是你关心的真正标记。我会习惯加上min.pct0.1和logfc.threshold0.25的参数先过滤掉表达过于稀少的基因再跑检验既能减少多重检验校正的压力也能让结果更聚焦。如果是第一次看自己的差异基因表格建议抽几个高显著性基因回UMAP或FeaturePlot上看表达分布。如果某个基因在UMAP上并没有明显的空间聚集模式但统计上差异显著要考虑是少数极端细胞驱动的结果还是真实但微弱的差异。这个过程虽然耗时但能帮你鉴别出很多假阳性信号。4.3 可视化的三个层次点图、小提琴图和feature图单细胞分析的可视化大体可以分为三个层次FeaturePlot特征图用于在降维空间展示单个基因的表达模式适合快速判断基因的表达分布。VlnPlot小提琴图适合展示单个基因在不同细胞亚群中的表达分布。DotPlot点图适合用一组marker基因批量检查多个细胞亚群的表达特征我做细胞注释时最常使用。在出图时有个小技巧FeaturePlot的默认配色是从灰色到深蓝但在投影图上如果背景细胞太多很难看清表达信号。我会调整cols参数用更柔和的渐变色或者加pt.size调整点的大小甚至用split.by把不同分组分开画便于比较。而DotPlot的size和color分别对应表达比例和平均表达强度适合在一张图里快速比较多基因、多细胞群的表达模式。实操心得如果打算写论文或者做报告展示建议用统一的物种基因命名、统一的大小写风格。有些基因在不同数据库里比如Ensembl ID和Symbol会混用在FeaturePlot和DotPlot阶段问题不大但如果涉及多个数据集合并或者跨平台验证基因名的统一和确认就必须做在前面。我曾经因为基因名大小写问题在整合外部数据集时花了一整天排查这种教训能省则省。4.4 两种常见的差异分析拓展拟时序分析与模块打分当主聚类和细胞注释都稳定之后经常需要进一步回答动态变化或者功能富集类问题。两个我经常会用到的拓展分析是拟时序分析Pseudotime/trajectory analysis用monocle3或Slingshot等工具重建细胞从一种状态到另一种状态的连续变化路径。这类分析常用于发育生物学研究、细胞分化过程、以及肿瘤免疫中的T细胞耗竭轨迹等场景。切入点往往是某一群细胞在UMAP上呈现出连续过渡的形态而不是离散的几个cluster。AddModuleScore打分把一组基因比如某个通路、某个签名基因集作为一个整体给每个细胞一个“功能打分”。例如要评估T细胞的杀伤功能可以把GZMB、PRF1、IFNG等基因汇总打分快速比较不同细胞亚群之间的功能状态差异。这两种分析本质上都是在“看趋势”拟时序把离散的聚类还原成连续的过程基因模块打分则把单基因的变化整合成通路层面的变化。两个方法在解读时都需要注意不要过度推断。拟时序分析的“时间”方向并不一定等同于真实的发育或分化方向方向的选择必须结合生物学知识和marker基因的表达变化来判定模块打分也只是相对值跨数据集的绝对比较没有太大意义。5. 工具选型与代码工作流建议5.1 Seurat和Scanpy以及如何选择你的第一套工具R和Python两大生态在单细胞分析里各有拥趸。Seurat几乎是R生态的“事实标准”从QC到聚类、到可视化、到多样本整合一条龙服务。Scanpy则是Python生态里的主流选择优势在于和Python机器学习生态整合方便在处理超大数据集例如百万级细胞时是基于anndata的内存效率通常优于R。如果你刚开始学我的建议是先选一门语言把一套流程吃透不要两套一起抓。我自己本科毕业论文时期是R和Python一起用——用R做Seurat主流程用Python跑一些自定义的机器学习模型过程比较痛苦因为两种语言的数据结构和对象类型在衔接上反复折腾。后来习惯了一个固定套路主流程用Seurat遇到Scanpy生态里才有的工具时用sceasy或者SeuratDisk把数据格式转成h5ad再切到Python环境。5.2 代码工作流用R Project管理你的单细胞项目单细胞分析的项目管理看起来是小事但对分析的可复现性影响很大。我强烈建议在项目开始时就用RStudio的Project功能建一个根目录下面放几个固定文件夹raw_data原始数据尽量只读、results表型与差异分析结果、figures图片输出、scripts脚本备份、cache中间文件缓存。这样每个阶段保存一下回头想找某一次分析的参数设置直接翻脚本就行比对着运行日志猜参数靠谱得多。脚本命名也用固定格式比如“01_qc_filter.R”“02_normalize_pca.R”“03_cluster_annotation.R”。按顺序编号的好处是即使你三个月后再打开这个项目也清楚哪一步在前哪一步在后。我还习惯在脚本开头写一段注释记录数据来源、分析日期、关键参数和主要坑点比写论文的Methods部分还要仔细。毕竟论文的Methods太简略自己复现都要猜半天那才是最痛苦的事。5.3 硬性与软性的资源规划内存、时间和心態单细胞分析对资源的要求并不算夸张但也不是一台普通办公电脑就能轻松跑完的。如果数据量在几万细胞级别16GB内存勉强能走通Seurat主流程但跑到整合和差异分析时还是会卡。我的建议是至少32GB内存起步如果是混合样本或者数据量在十万级细胞以上建议直接上64GB或者更高。计算时间方面UMAP和聚类一般不会太久但FindAllMarkers在细胞类型多、细胞量大的情况下会比较耗时。可以考虑用多线程版本的findmarkers或者用subset拆分任务并行跑。心态上我一直提醒自己做单细胞分析不要指望一次跑通。光是一个样本的QC阈值调整就可能需要好几轮。把分析当成迭代的过程每轮只改一个关键参数、记录前后变化慢慢就能培养出“手感”。6. 常见报错与排查技巧实录6.1 创建Seurat对象时的常见报错报错1Error: Duplicate row names are not allowed这个通常是因为表达矩阵里有重复基因名。我自己遇到过好几次原因很可能是上游定量时注释文件没有去重。解决办法很简单在创建对象之前对表达矩阵做一次聚合把重复基因的计数加总或取最大值。报错2Error in validObject(.Object)invalid class “Seurat” object这种泛泛的错误信息最常见的原因是读取的矩阵格式不对。比如用read.table读了一个没有正确转置的矩阵导致行为基因、列为细胞而CreateSeuratObject默认接受“基因×细胞”的矩阵。我一般会用Read10X读取10x格式因为它是专门为单细胞设计的格式标准可以规避很多低级错误。6.2 聚类结果异常的排查顺序如果UMAP画出来所有细胞都混成一团完全看不清分群第一反应不是去调resolution或者换算法而是检查上游流程检查QC看看是否有太多低质量细胞或双细胞留在数据里检查ScaleData是否有某个基因的表达量异常高影响PCA检查PCA前几个主成分的方差解释率是不是过低检查整合步骤如果是多批次数据检查是否有批次效应不同样本的细胞各自聚成一团。这个流程走下来大部分聚类异常问题都能找到线索。有一次我做完UMAP发现出现了明显的“样本分堆”现象也就是样本来源的细胞各自成群而不是按细胞类型聚到一起。这种就是典型的批次效应当时用Harmony做了整合效果立竿见影。整合算法不是万能的但它确实是处理批次效应最常用的手段之一。6.3 双细胞过滤一个容易被忽略的质控细节双细胞Doublets指的是两个或多个细胞被包在同一个液滴里形成一个测序文库。它们在数据里会表现出“同时表达两种不同类型细胞marker”的特征如果不去除很容易形成一个独立的假cluster或者把某个中间状态的细胞类型“污染”掉。目前常用的工具是DoubletFinder它通过模拟双细胞来打分然后用阈值区分。实际项目中我一般会在QC环节加一步DoubletFinder虽然它本身需要消耗一些计算资源但对下游注释和差异分析的准确性帮助很大。有一个实用技巧DoubletFinder的pK参数选择非常影响结果建议用其自带的参数优化方法paramSweep和summarizeSweep来选出最优pK而不是直接按默认值跑。我在自己项目中遇到过不调参时双细胞比例明显偏高的情况调整pK之后结果合理了很多。6.4 细胞注释时的“无法命名的clusters”该怎么办有时候总有几个cluster的marker基因是“杂合”的既像A类型又像B类型有可能的原因包括未去除干净的双细胞细胞状态变化比如细胞周期、应激反应导致的转录组变化技术噪声解离过程引入的伪差。我的建议是先把这些cluster单独提取出来仔细看它们的基因表达谱。如果高表达的都是热休克蛋白基因HSPA1A、HSPH1等很可能是解离过程中的应激伪迹如果鉴定出来是双细胞就直接过滤掉如果既不是双细胞、又有明确生物学意义比如一群“过渡态细胞”那就保留并在注释里明确体现不要去强行匹配到某个已知类型。6.5 不同样本间的批次效应Harmony还是Seurat整合关于批次效应处理我之前用过Seurat的整合流程FindIntegrationAnchors IntegrateData也用过Harmony总的感觉是数据量比较小或者样本间差异比较大的时候Seurat的整合效果更好数据量大、样本数多的时候Harmony速度更快也相对不那么容易被过拟合。具体选择上如果样本来自同一个实验中心、建库条件一致可以优先用Harmony因为它的原理是做低维空间的校正速度很快如果整合的样本来自不同的测序平台或者不同解离条件数据间的技术差异较大我会至少对比一下两种方法的结果看哪种得到的UMAP更符合已知的细胞分群标签。这里没有绝对的对错关键是“整合后结果是否能通过生物学验证”。7. 一次真实项目复盘从数据到结论的全流程为了让你更直观地理解前面说的这些内容我拿一个典型的血液PBMC数据分析项目作为示例梳理一遍从上游到下游的实际操作流程。这个项目当时用的是10x Genomics的3‘转录组样本来自6个不同供体共12个测序文库。拿到Cell Ranger输出后我先用Seurat创建了对象用百分比线粒体阈值percent.mt 20%和基因数范围nFeature_RNA为200-5000过滤了低质量细胞再用DoubletFinder去掉了大约2.4%的双细胞最终保留了约7万个细胞。归一化之后我用FindVariableFeatures选出了3000个高变基因做了PCA发现前15个主成分的累积方差解释率已经能覆盖大部分信息就先用15维跑聚类。第一次聚类跑了resolution0.6得到18个cluster。然后我做了第一批经典marker检查发现有的cluster的CD3D和CD8A双高有的CD3D和CD4高有的高表达CD19是B细胞有的高表达NKG7和GNLY是NK细胞。到这里大类都能分清楚但是有一个cluster很尴尬CD68和LYZ阳性很高但同时也在低水平表达CD3D这让我犹豫了。于是我用FindMarkers跑了一遍差异基因看到这组细胞还在高表达FCGR3ACD16就明白了——这是CD16单核细胞属于单核细胞的一个亚群。CD3D的那点低水平表达更可能是双细胞残留或者背景污染不是真正的T细胞表达。修正注释后我又把免疫细胞各亚群单独提取出来做了一次二级聚类比如把T细胞重新分成CD4T细胞、CD8T细胞、TregFOXP3、γδT细胞等。这里先用的是常见的基因集合比如CD4、CD8A、FOXP3、TRDC等。每次聚类后我都用DotPlot批量验证marker的表达模式有问题就调整聚类参数或者分辨率直到每一类细胞都能用已知marker解释通顺。最后的差异分析里我们对比了不同供体的T细胞亚群组成差异和关键基因表达差异这个阶段的结论需要统计学和生物学双重验证。整个流程跑下来从拿到数据到完成注释和初步差异分析大概花了三周其中一半以上的时间是在做QC调节和亚群注释的验证。单细胞分析从来不是“跑个流程就行”的快餐它需要耐心需要反复验证也需要一定的运气——好在我运气不算差这段经历让我积累了足够的鲁棒性意识后来遇到更复杂的数据也心里有底了。最后再分享一个小经验每次做单细胞分析时可以把所有关键的参数选择QC阈值、高变基因数、PCA维度、分辨率、整合方法记录在一个单独的分析日志里。不需要多复杂一个Markdown文件就行但坚持下来你会发现这些记录在项目总结和写论文时是最宝贵的参考资料。数据分析本身也许有标准答案但每个数据集都有它自己的脾气能记录下这些细节的人才真正掌握了单细胞数据分析的心法。