资讯动态

单细胞转录组上游分析全流程详解:从fastq到count矩阵的实操指南

发布时间:2026/10/21 5:20:34 来源:尧图企业网站定制
单细胞转录组上游分析这个坑我踩了快三年才勉强算趟平。从最开始拿着fastq文件手足无措到能一口气跑完从原始数据到count矩阵的全流程中间翻过的车、查过的文档、试过的错攒了满满一肚子经验。前两天还有个刚入行的师弟问我说网上教程五花八门到底哪个流程才算“完整”。我想了想决定干脆把整套上游分析流程从头到尾捋一遍把我自己的实操细节、参数取舍、踩坑记录全写出来。这篇东西适合刚接触单细胞转录组、准备自己跑上游分析的同学也适合那些已经跑过Cell Ranger但没弄明白每一步在干什么的人。我会从最基础的原理讲到最终产出矩阵尽量把每个“为什么这么做”都讲清楚。1. 上游分析到底在做什么从原始测序数据到基因表达矩阵很多人第一次接触单细胞转录组上游分析都会被一堆名词吓住fastq、barcode、UMI、Cell Ranger、STARsolo、count matrix……其实拆开了看上游分析就干三件事把测序仪吐出来的原始序列数据整理成“每个细胞里每个基因有多少条RNA分子”的计数表格。听起来简单但中间涉及到的每一步都有不少门道。我们先理清一个核心概念单细胞转录组测序scRNA-seq和普通转录组测序bulk RNA-seq最大的区别在于它给每条RNA片段都加了“细胞标签”和“分子标签”。细胞标签barcode用来标记这条序列来自哪个细胞分子标签UMI用来标记这条序列来自哪个RNA分子。测序仪读出来的每一对read其实都包含三段信息barcode序列、UMI序列、以及来自基因的转录本序列。![测序读段结构示意]上游分析的第一步就是把混合在一起的所有read按barcode分回各个细胞这一过程叫demultiplexing再按UMI区分同一个基因的多个拷贝这一过程叫UMI去重最后把序列比对到参考基因组上统计每个基因被检测到的独特UMI数量形成一个“基因×细胞”的表达矩阵。这个矩阵就是所有下游分析——降维聚类、细胞类型注释、差异表达分析——的起点。当前学术界和工业界用得最多的上游分析工具是10x Genomics出品的Cell Ranger它把整个流程封装成了几条命令。虽然各家平台也推出了自己的分析流程但核心逻辑基本都沿袭Cell Ranger的思路。我个人的建议是初学阶段先从Cell Ranger入手先把整个流程跑通理解每一步在做什么、产出了什么文件再去探索更灵活的开源方案比如STARsolo或kallisto|bus。因为Cell Ranger的封装程度高、文档全、报错信息丰富对新手非常友好等你真正理解了流程的每一步之后再去换更灵活的流程会顺手很多。2. 流程选型和环境准备为什么我推荐这套组合单细胞转录组上游分析的工具链选择直接决定了你后面会踩多少坑。我用过好几套组合最终稳定下来的一套是Cell Ranger核心定量 FastQC数据质控 multiqc报告汇总 R产出矩阵的初步质检。这套组合最大的优势是链路成熟、社区用户多遇到问题基本都能搜到解决方案。2.1 硬件和系统配置的底线很多人忽略硬件配置一上来就跑Cell Ranger结果不是OOM就是跑一天才跑完一个样本。Cell Ranger的count流程对内存的需求很高官方建议是每1亿个read对至少分配32GB内存。我从实际经验看一个标准的10x样本大约产生4-6亿个read对想跑得舒服至少要准备128GB内存和8核以上的CPU。如果实验室服务器配置不够可以适当降低参考基因组比对时的线程数但内存这块几乎没法省。操作系统方面我用的是Ubuntu 20.04 LTS这也是Cell Ranger官方支持的系统版本。CentOS虽然也能跑但依赖库版本偶尔会出幺蛾子。这里有个小技巧如果实验室只有CentOS服务器推荐直接用Docker容器跑Cell Ranger能省掉很多环境配置的麻烦。2.2 Cell Ranger的版本选择Cell Ranger现在有两个大版本在广泛使用7.x和8.x。8.x比7.x在memory管理和表达矩阵输出格式上有一些调整但核心算法差异不大。我在生产环境上一直用7.1.0版本原因只有一个——我们的下游分析流程特别是Seurat版本和7.1.0的产出格式最兼容。如果你是自己从零搭流程直接用最新的8.x版本就行没必要纠结。安装Cell Ranger本身很简单从官网下载tar.gz压缩包解压即可不需要编译。但要注意两点一是需要注册账号才能下载二是解压后要把cellranger这个可执行文件加到PATH里同时确保系统里有Python 3.7以上版本。我见过不少人卡在“cannot find python”这个报错上其实只是因为他们没装python3或者环境变量没配好。2.3 参考基因组的准备参考基因组是上游分析中一个容易被低估的环节。Cell Ranger需要的是经过注释的reference包不能直接用FASTA和GTF文件。官方提供了人和小鼠的预构建参考基因组下载解压就能用。但如果你做的是非模式物种就需要自己构建参考基因组包。构建参考基因组包的完整命令是cellranger mkref \ --genomemy_species \ --fasta/path/to/genome.fa \ --genes/path/to/annotations.gtf这里有一个我踩过多次的坑gtf文件里的chr命名必须和fasta文件里的染色体命名完全一致。比如fasta里是“chr1”gtf里就不能只写“1”否则构建出的参考基因组在比对阶段会丢失大量reads。检查方法很简单grep ^ genome.fa | head -5 grep -E \tgene\t annotations.gtf | head -5 | cut -f1对比两边的染色体名称形式不一致就先用sed批量处理统一命名再加同序后再构建ref。3. 核心细节解析比对与定量的关键环节整个上游流程的核心是Cell Ranger count这一步。它内部会依次完成过滤、比对、UMI去重、基因定量等子任务。很多人以为把命令丢进去回车就完事了其实这里面的每个参数都有讲究直接决定表达矩阵的质量。3.1 count命令的运行逻辑单样本分析的基础命令长这样cellranger count \ --idsample1 \ --transcriptome/path/to/refdata-cellranger \ --fastqs/path/to/fastq_dir \ --samplesample1 \ --localcores16 \ --localmem120几个关键参数我逐个说一下--id是输出文件夹的名字建议用有意义的样本名不要用默认的“count”之类否则样本一多就乱了。--sample参数指定fastq文件名的匹配前缀。10x测序下机的fastq文件名一般长这样sample1_S1_L001_R1_001.fastq.gz其中sample1就是样本前缀。Cell Ranger会自动匹配该前缀下所有的R1和R2文件。这里最容易出的问题是同一个flowcell里有多个样本时务必确认你指定的前缀不会同时匹配到另一个样本的文件。--localcores和--localmem控制计算资源。不要贪心把所有核心都塞进去实测下来并行度太高会导致IO瓶颈反而拖慢速度。16核配120GB内存是我压测多组数据后比较稳的配置。3.2 比对策略的取舍Cell Ranger内部默认调用STAR比对器将read比对到参考基因组上。它的比对策略和普通RNA-seq有区别单细胞数据是短read且包含barcode/UMI信息所以Cell Ranger会把barcode和UMI先剥离出来只拿真正的转录本序列去比对比对结束后再把标签信息合并回去。有一个参数会影响比对率--trim-tso。这个参数在我做的很多样本里实测能提高1-3%的比对率。它的作用是切除模板转换寡核苷酸TSO序列中可能存在的多余碱基。如果你用的是10x 3 v3试剂盒的数据建议加上这个参数。但如果是5试剂盒或其他平台的数据加不加区别不大需要因样本而异。3.3 UMI去重和过滤的原理UMI去重是单细胞定量和普通转录组最不一样的地方。因为PCR扩增会带来大量重复read如果不去除同一个RNA分子会被算成好几条。UMI的作用就是给每个原始RNA分子一个唯一的随机标签比对结束后同一条基因上相同UMI的reads都会被去重为一条。Cell Ranger默认用的是“按UMI位置取唯一”的策略这个过程在它的内部报告里体现为“Valid UMIs”和“Sequencing Saturation”两个指标。关于细胞过滤cell callingCell Ranger默认的过滤逻辑是检测barcode对应的UMI总数分布在拐点处截断区分真实细胞和空液滴/背景RNA。这个阈值的设置逻辑比较复杂但有一个常见现象是如果你的样本细胞活性不高或上样量偏高默认的cell calling结果可能会高估细胞数量。这时候建议先看web_summary.html里的barcode rank plot累计UMI数排序图如果发现拐点不明显可以考虑降级到更严格的过滤或者在下游分析中再用Seurat的QC标准重新过滤。4. 实操过程与核心环节实现手把手跑通全流程前几节讲了原理这一节我按实际操作的顺序把从拿到下机数据到获得表达矩阵的整个流程逐步过一遍每一步会贴出核心命令和关键检查节点。4.1 第一步下机数据整理与格式检查10x平台下机数据通常是BCL格式需要用10x官方的Cell Ranger mkfastq转化成fastq格式。如果你的测序服务商已经直接提供了fastq文件那么这一步可以跳过。但我建议还是留个心眼拿到fastq后先做一个基本检查# 查看每个fastq的read条数 for file in *.fastq.gz; do echo -n $file: zcat $file | wc -l | awk {print $1/4} done正常情况下一份10x单细胞数据包含8个循环的barcode读段和90循环的转录本读段R1读长通常是28bp含barcode和UMIR2读长至少90bp。如果你发现R1的长度是150bp那说明厂商给的是非标准格式不能直接跑Cell Ranger需要先做处理。这个坑我身边不下三个人踩过——他们拿到的是测序公司输出的常规转录组fastq完全不含barcode信息硬着头皮跑Cell Ranger报了各种奇怪的错。如果只有一个样本且fastq文件就放在一个目录下可以直接把目录路径传给--fastqs参数。如果目录里有多个样本的fastq就需要用--sample参数指定你要分析的那个样本的前缀。4.2 第二步fastq质控与报告查看在跑Cell Ranger之前强烈建议先对fastq做一个快速质控。虽然Cell Ranger内部也会做质量统计但提前看一眼原始数据质量能帮你判断是否需要重新测序或数据是否完整。mkdir -p qc_results for file in *.fastq.gz; do fastqc -t 8 -o qc_results $file done multiqc qc_results -o qc_results用multiqc把所有fastqc报告汇总成一个html文件重点看三块read长度分布、GC含量分布、接头污染比例。其中GC含量若是出现明显的双峰往往提示样本污染或文库制备异常。read长度分布一般是固定的长条如果是锯齿形说明测序仪读长波动异常这类数据建议先向测序平台反馈再决定是否继续分析。4.3 第三步运行Cell Ranger count质控通过后就正式进入count阶段。进入你的fastq所在目录的上一级创建analysis目录然后执行mkdir -p single_cell_analysis cd single_cell_analysis cellranger count \ --idsample1 \ --transcriptome/data/reference/refdata-cellranger-GRCm39-2024-A \ --fastqs/data/fastq/sample1 \ --samplesample1 \ --localcores16 \ --localmem120这一步根据你的数据和配置不同从4小时到15小时不等。运行日志会实时打印进度包含当前进行到的阶段、已使用的内存、运行时长等。如果中间报错日志里会给出Error信息。大部分错误集中在三种路径不存在、内存不够、字符编码问题。4.4 第四步解读web_summary.htmlCount跑完后进入sample1/outs/目录你会看到几个关键文件web_summary.html核心质控报告用浏览器打开filtered_feature_bc_matrix/过滤后的表达矩阵下游分析用这个raw_feature_bc_matrix/未过滤的表达矩阵包含所有barcodemolecule_info.h5分子信息文件10x官方工具箱Vloupy的输入metrics_summary.csv各指标的纯文本版本打开web_summary.html后你需要重点判断几个指标Estimated Number of Cells这个数值和你实验预期是否一致。如果差太多说明细胞捕获或上样有问题。我见过一个样本预期8000个细胞结果只call出2000个后来发现是细胞活性太低绝大多数细胞在上机前已经破裂了。Fraction Reads in Cells这个指标表示有多少比例的reads被分配到真实的细胞barcode中一般要求在70%以上低于50%说明很大一部分reads来自背景RNA或空液滴样本质量堪忧。Median Genes per Cell每个细胞检测到的中位基因数10x 3 v3的数据通常在800到2500之间。这个数值受细胞类型影响极大例如中性粒细胞基因数偏低那是正常的。但如果一个已知是普通细胞系如HeLa的样本中位基因数低于500就需要警惕了。Sequencing Saturation测序饱和度越高说明UMI去重后新检出基因越少。临床上常见的值是50%-90%如果低于30%可以考虑加深测序量来获取更多有效数据。4.5 第五步表达矩阵的初步质检拿到矩阵后我习惯用R先做一个快速的初步质检判断整个上游流程的产出质量是否可信。一个常用的小脚本library(Seurat) data - Read10X(sample1/outs/filtered_feature_bc_matrix/) obj - CreateSeuratObject(counts data, project sample1) obj[[percent.mt]] - PercentageFeatureSet(obj, pattern ^MT-) VlnPlot(obj, features c(nFeature_RNA, nCount_RNA, percent.mt), ncol 3)这个图能直观看到nFeature每个细胞检测到的基因数、nCount每个细胞的总UMI数和线粒体基因比例的分布。如果发现很大一部分细胞线粒体比例超标20%说明这些细胞很可能已经破裂细胞质mRNA流失只剩线粒体RNA还留在碎片里。这类细胞在下游分析前要在Seurat里过滤掉。4.6 多样本合并的补充说明如果你是多个样本的整合分析项目上游流程还有最后一步合并多个样本。两种常用方式手动merge或cellranger aggr。这里我要特别提醒如果想要做的是批次效应的校正后再比较建议不要在一开始就aggr而是为每个样本保留独立的表达矩阵进入下游后用整合算法处理批次。aggr主要应用在同一个实验条件下不同泳道的合并场景。它在合并时还会做测序深度的标准化如果你只想要raw count用于下游分析直接用merge反而更干净。5. 常见问题与排查技巧实录我踩过的那些坑最后一节我把这几年跑单细胞上游流程时遇到的典型报错和解决方案按高频顺序整理出来每条都是实测有效才敢写进来。5.1 报错排查速查表报错信息根因解决方案ERROR: Reference genome contains duplicate gene namesGTF注释文件里有重复基因名用awk检查GTF对重复gene_id做去重处理或用Cell Ranger的mkref前预处理脚本过滤ERROR: No FASTQs were found matching the sample name--sample参数和fastq文件名不匹配查看fastq文件名的下划线分隔格式确认前缀匹配规律Out of memory error内存配置不足调整--localmem确保内存是核数的8倍以上Failed to parse GTF fileGTF格式不规范检查GTF文件是否用tab分隔基因结构是否为三行完整CDS、exon、geneWARNING: Low fraction reads in cells细胞活性低或背景RNA过多调整cell calling策略可以在下游分析中据此剔除样本5.2 实战案例一比对率低的溯源有一段时间我连续处理某批样本时发现比对率普遍在55%-60%左右远低于正常水平的85%-90%。刚开始怀疑是参考基因组版本问题换了新版本也没改善。后来仔细检查fastq文件才发现这批数据的read结构里R1后面还混了一段索引序列导致barcode识别异常。通过用--demultiplex重新分析原始BCL文件修正了read结构定义后比对率回升到89%。这个案例说明一个道理上游分析遇到的很多问题根子不在计算流程本身而在数据产生的源头。遇到异常指标第一反应应该是回去看原始数据格式、试剂盒种类和处理流程。5.3 实战案例二细胞数虚高的处理某次跑一个悬液样本web_summary显示检测到约12000个细胞但我实验预期只有6000个左右。点开barcode rank图才发现拐点不明显背景RNA的UMI丰度普遍偏高。我用更保守的cell calling方式重新处理后细胞数回到了6500中位基因数也从虚低恢复到了正常水平。实际操作时处理类似问题有两个思路一是给Cell Ranger传入--force-cells期望细胞数强制指定二是保留默认call出的矩阵在下游用Seurat做更严格的过滤。我倾向第二种因为强制指定细胞数容易把空液滴的轻微背景污染也算进去污染后续的聚类分析。5.4 定时检查运行日志的小经验Cell Ranger count运行时间动辄数小时很多人习惯直接挂后台不管第二天早上来看结果。我的经验是——最好中途至少检查一次日志。运行开始后的30分钟到1小时内日志里会出现比对阶段的进度条此时如果发现“n reads”增长异常慢比如半小时还不到一千万大概率是服务器IO瓶颈或CPU被其他程序占用。此时及时调低并行度或释放资源能避免第二天发现count跑到一半就报错OOM白等一整晚。5.5 磁盘空间的一个隐藏坑Cell Ranger count运行中会生成大量中间文件有时最终输出只有几个G但中间文件的峰值磁盘占用是最终文件大小的3-5倍。我处理过一批8个样本的合并任务中间文件直接把服务器剩下500GB的空间全部占满了跑到最后一个样本时报了disk full错误。建议每个样本至少预留80GB的临时空间并在运行前用df -h确认空间充裕另外定期清掉已经没有用的中间文件。最后分享一个省时间的小技巧现在跑单细胞上游分析我基本上都会写一个批处理脚本把fastqc、multiqc、cellranger count串在一起样本一多特别省事。核心思路是给每个样本建独立目录所有输出带时间戳日志统一收集。这里贴一个简化版给你参考#!/bin/bash SAMPLE$1 REF/data/reference/refdata-cellranger-GRCm39-2024-A FASTQ_DIR/data/fastq OUT_DIR/data/analysis nohup cellranger count \ --id${SAMPLE} \ --transcriptome${REF} \ --fastqs${FASTQ_DIR} \ --sample${SAMPLE} \ --localcores16 \ --localmem120 \ ${OUT_DIR}/${SAMPLE}_cellranger.log 21 批量跑的时候用一个for循环逐个调用这个脚本即可。个人体验是把上游流程脚本化之后分析效率能提升好几倍也大大降低了手工敲错参数的概率。单细胞上游分析的每一步都环环相扣只要掌握了核心思路和关键参数剩下的就是处理不完的特殊情况。希望这篇长达数千字的梳理能帮你少走一些弯路把时间留在真正重要的生物学发现上。每一批数据跑完、拿到质量可靠的表达矩阵的时候那种踏实感就是你入坑单细胞的最好回报。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑