)
做单细胞测序数据分析十个新手有九个在第一步就被劝退了——“数据到底从哪下”、“下完是哪个文件”、“Read10X怎么老报错”。我见过太多人选好了数据集、装好了R包结果在导入那一步卡了两整天还有人把GEO下载的原始测序文件当成表达矩阵硬读跑出一堆莫名其妙的结果。这篇内容是“scRNA-seq新手操作”系列的第一篇就把“数据下载与导入”这件事彻底讲透不仅讲按钮和命令怎么敲更要把背后那套文件结构、数据库编号逻辑和格式原理拆开揉碎再配上一份MarkdownMD格式的实操笔记模板让你的每一步都有迹可循。这篇内容适合完全没碰过scRNA-seq的生信小白、想系统理顺流程的入门者也适合需要带新人的课题组导师。已经跑通全流程的朋友可以直接跳到第四部分抄避坑清单。另外我要强调一个观点新手入门第一步优先用公开数据集里“已经处理好的表达矩阵”暂时绕开原始fastq否则你会在一开始就被测序数据量和比对耗时折磨到怀疑人生。1. 先看清全局数据下载与导入在整个流程里到底扮演什么角色很多人上来就急着跑代码结果连自己在流程的哪一环都不知道。scRNA-seq分析跟做菜很像先买菜原始数据、再洗菜切菜比对定量得到表达矩阵、然后下锅质控、降维、聚类、最后装盘可视化和注释。数据下载和导入就是“买菜”和“确认食材已经切好”这两步一旦这里的文件结构没搞明白后面所有环节都是空中楼阁。1.1 完整分析流程到底跑几步scRNA-seq从测序仪下机到最终出图大致分为四个阶段。第一阶段是原始数据获取也就是从测序中心拿到或从公共数据库下载fastq文件第二阶段是表达定量需要把reads比对到参考基因组并分配到每个细胞、每个基因上目前最常用的是10x平台的Cell Ranger流程也有STARsolo、kallisto等开源方案第三阶段是质控与预处理这一步在Seurat、Scanpy这类工具里完成包括低质量细胞过滤、双细胞去除、数据标准化第四阶段才是主菜降维聚类、marker基因鉴定、细胞类型注释、轨迹分析等。新手最容易犯的错误就是直接从第一阶段跳到第三阶段拿fastq文件当表达矩阵去读。严格来说Seurat读的应当是一张“基因×细胞”的计数矩阵而不是原始测序read。Cell Ranger这类工具已经把原始fastq转录成了表达计数矩阵整个流程的逻辑是这样的fastq文件 → 比对参考基因组 → 生成barcode-gene计数矩阵 → 质量控制 → 下游分析。所以“数据的下载与导入”实际上包含两种场景一种是下载别人已经处理好的计数矩阵比如10x官方示例数据或GEO补充文件里的矩阵直接导入Seurat另一种是下载原始fastq自己用Cell Ranger跑定量。我强烈建议新手在第一步选前者用最低成本跑通完整的Seurat流程等彻底理解了矩阵的结构再去碰fastq和比对工具那时候你会有一种“一切都通了”的感觉。1.2 为什么先从公开数据集练手以及MD笔记的价值公开数据集是新手最稳妥的起点。好处很实在第一不用花钱也不占自己的测序资源第二这些数据大多有文献配套你分析完可以和作者的注释结果对一对看看自己的聚类和细胞类型注释准不准第三踩坑的人多搜任何一个报错信息都能找到前人的经验。以10x官方示例的PBMC 3k为例这是10x公司用来演示标准流程的经典数据集大约2700个外周血单个核细胞文件体积小普通笔记本跑起来完全没压力。用它跑一遍你能看到典型的10x数据长什么样也能验证软件环境是否配置正确。这里我要特意讲讲MD笔记。生信项目跟实验室实验不一样实验有纸质本子记录代码操作却容易忘记。数据在哪个目录下、用的是哪个版本参考基因组、wget下来的文件校验和是多少三天不碰就全忘了。Markdown文档在生信圈子里越来越普及因为它本质是纯文本可以用任何编辑器打开GitHub或GitLab直接渲染也方便跟别人协作。你在记录下载信息时顺手写一个表格把样本编号、下载链接、文件大小、日期全部记下来以后复现项目时不用从零开始猜这也是“数据的下载与导入/MD”这个标题里包含MD的用意——实操笔记和数据分析一样重要。2. 数据从哪来数据库、编号体系和文件格式一次讲清楚下载数据最怕的不是下不动而是下错了文件还不知道。很多人在NCBI GEO页面上看到一堆链接完全分不清哪些是表达矩阵、哪些是原始数据、哪些是平台注释。这一节我用最直接的方式把数据库编号和文件格式讲透。2.1 GEO、GSE、GSM、SRA到底什么关系在GEO上搜单细胞数据你一定见过这些编号GSE、GSM、SRR、GPL。它们之间的层级关系可以这样理解GSESeries是一个研究项目对应一篇论文或一项实验GSMSample是该项目下的一个样本每个GSM有自己独立的平台和描述GPL是测序平台编号比如GPL24676是10x Genomics的某个版本SRR则是存放原始测序reads的SRA数据库编号。单细胞转录组数据通常是以“补充文件”的形式挂在GSE页面底部的Supplementary file区域这才是我们要下载的重点。GSE页面中部那些关于实验设计的文字描述只是帮你判断这个数据适不适合做你的课题。原始fastq文件默认放在SRA数据库里体积巨大一个10x样本的fastq动辄几十个GB新手现阶段可以直接绕开。许多老的数据集挂在GEO上的补充文件可能只有原始数据没有处理好的计数矩阵。这种情况的解决路径只有两条要么去文章正文的数据可用性声明里找作者上传的矩阵链接要么老老实实用SRA工具下载fastq自己跑Cell Ranger。后者比较费时费力但这属于进阶内容后面我会专门写一篇。2.2 10x格式的“三件套”barcodes、features、matrixscRNA-seq的计数矩阵最常见的形式是10x平台的“三件套”三个文件各自承担一个角色。barcodes.tsv是一列细胞条码代表你检测到的每个细胞features.tsv旧版本叫genes.tsv是基因注释通常两列第一列是Ensembl基因ID或基因符号第二列是基因符号matrix.mtx则是一个稀疏矩阵文件记录了三样东西基因数、细胞数、非零表达值的总数然后是无数行“基因索引、细胞索引、表达值”。这三个文件靠行顺序对应起来可以理解为矩阵的每一列对应barcodes.tsv里的一行每一行对应features.tsv里的一行而matrix.mtx只记录非零的数值。为什么这么做因为单细胞矩阵通常有上万个基因和几千上万个细胞全量储存会产生大量零值白白浪费内存和磁盘空间。用稀疏格式存非零值文件体积可以缩小数十倍。你可以用生活里的Excel表格来类比barcodes是Excel的行名features是列名matrix.mtx是单元格里的数值只不过它只存了非空白的单元格。搞懂这个结构后面所有导入操作的报错原因你都能一眼看穿。2.3 Cell Ranger输出目录长什么样如果你决定从原始数据自己跑定量那一定会接触Cell Ranger的输出目录。Cell Ranger是10x官方的比对和定量工具跑完后会在outs目录下生成一整包结果。我们下游分析真正要用的核心目录叫filtered_feature_bc_matrix里面的内容正是上面说的三件套只是文件名都带.gz压缩后缀。与之并列的还有raw_feature_bc_matrix那是做过简单过滤前的矩阵细胞数非常多包含大量背景液滴新手在导入阶段优先使用filtered版本就好。你还会在outs下看到analysis目录里面有聚类、差异表达等官方预计算结果不过这些主要以json和h5格式存在大多数人在Seurat里会重新做一遍。另外会有一个cloupe.cloupe文件那是给10x自家Loupe Browser软件看的可视化文件在R里用不上。我之所以花篇幅讲目录结构是因为在GEO下载到的很多tar.gz压缩包解压后就是按照这种目录结构组织的。你只要看到filtered_feature_bc_matrix这样的路径就知道该把data.dir指向哪里而不是瞎猜。3. 上手实操用10x官方数据完成下载与导入现在进入正题。我们从10x官方示例数据PBMC 3k出发完成一次从下载到导入Seurat的完整流程。整个操作建议在Linux服务器或Mac上做Windows用户用浏览器下载tar包也可以后面我会专门说明。3.1 准备工作环境与R包先确认环境。R版本建议4.2以上RStudio或命令行运行R都可以。你需要安装Seurat以及它依赖的SeuratObject包。国内网络环境下直接install.packages连CRAN可能很慢建议配置清华或中科大镜像。options(repos c(CRAN https://mirrors.tuna.tsinghua.edu.cn/CRAN/)) install.packages(Seurat)如果Bioconductor系列包缺失还要配BiocManager。一次装不成功很常见关键是看报错里缺哪个系统依赖比如Ubuntu上缺libcurl、libxml2用apt装上再回去重装R包就行。装完以后建议把包版本记录到MD笔记里这是可复现的第一步。sessionInfo()输出的内容直接复制到笔记里以后你遇到“为什么我的Seurat版本跑出的结果和教程不一样”这种问题回头对比sessionInfo就能定位。3.2 下载PBMC 3k压缩包并解压打开10x官网的sample数据集页面找到PBMC 3k版本下载filtered_gene_bc_matrices.tar.gz。在Linux终端操作的话命令大概是这样mkdir -p scRNA_practice/pbmc3k cd scRNA_practice/pbmc3k wget https://cf.10xgenomics.com/samples/cell-exp/3.0.0/pbmc_3k/pbmc_3k_filtered_gene_bc_matrices.tar.gz tar -xzvf pbmc_3k_filtered_gene_bc_matrices.tar.gz find . -type f解压后你应能看到类似filtered_gene_bc_matrices/hg19/的目录里面躺着barcodes.tsv、genes.tsv、matrix.mtx三个文件。老版本数据用的是genes.tsv新版本用features.tsv这只是命名习惯的差异内容作用相同。Windows用户没有wget的话可以直接用浏览器下载tar.gz然后用7-Zip或RStudio里File菜单解压注意解压时选择“解压到当前目录”别又套一层同名文件夹。我建议你下载完立刻执行md5sum把校验值记进MD笔记确保文件没损坏。md5sum pbmc_3k_filtered_gene_bc_matrices.tar.gz3.3 在R中导入数据并初步检查打开R或RStudio运行以下代码library(Seurat) counts - Read10X(data.dir filtered_gene_bc_matrices/hg19) class(counts) dim(counts)data.dir指的是包含三件套的那个目录不是更外层目录。Read10X能自动识别带.gz的文件不需要提前解压。counts的类型是dgCMatrix这是R里常用的稀疏矩阵类行是基因列是细胞和普通矩阵比内存占用小得多。检查完矩阵维度就可以创建Seurat对象pbmc - CreateSeuratObject(counts counts, project pbmc3k, min.cells 3, min.features 200) pbmc如果一切正常你会看到一个显示2700个样本、将近14000个特征的Seurat对象。这意味着数据导入成功你的scRNA-seq分析之旅正式开始了。3.4 CreateSeuratObject参数到底代表什么新手最容易忽略的是CreateSeuratObject里的两个过滤参数min.cells和min.features。min.cells3表示一个基因至少在3个细胞里有表达才保留min.features200表示一个细胞至少要检测到200个基因才保留。前者用来剔除在极少数细胞中出现的零星表达往往对应背景噪音后者用来剔除空液滴或破损细胞没有足够基因数的细胞是不完整的。这两个参数配合起来相当于在第一道关卡就帮我们丢掉明显低质量的数据。你可以试着把min.features调成1000看看保留了多少细胞再把调成50看看混入了多少异常值。亲手尝试一次比对一下Seurat对象里细胞数量的变化你对质控的理解会深很多。4. 常见问题与排查技巧实录这一部分是我最想写的内容因为很多坑是教程里不会告诉你的。下面按问题频率从高到低整理成速查表格后面逐条展开。问题现象可能原因解决思路下载的压缩包没有三件套下错文件原始数据在SRA回到GSE页面底部找Supplement文件tar解压报错文件不完整或磁盘不足重新下载并核对md5校验值Read10X报“cannot open gz file”data.dir路径指错层级用find确认三件套的实际目录读入后基因全是Ensembl ID原始文件本身就是Ensembl注释做好记录后续统一转换再合并数据集太大内存不够矩阵稀疏度不够或文件过大换服务器或先抽样小批次调试4.1 下到的文件不是预期的东西这是最常见也最坑的。GEO页面的下载链接很多有些人看到GSM编号就一路点进去最后下载了一个样本级的tar包里面装的可能是cellranger count的中间输出也可能是bam文件。应对办法很简单先看文件后缀和大小三件套的压缩文件通常只有几十到几百MB整个单细胞样本的表达矩阵不会大到几个GB。如果下到的是几十GB的文件那八成是原始测序数据没跑了。另一个判断技巧是看GEO页面底部的文件说明列标注h5、mtx.gz或csv的才是矩阵类文件标注sra、fastq.gz的属于原始数据。如果有多个样本注意看一下每个GSM对应的是哪个样本别把不同样本的细胞混在一起。4.2 tar包解压报错或解压后找不到文件wget下载途中网络抖动可能导致tar包不完整。Linux解压时会直接报gzip: stdin: unexpected end of file这时重新下载并对比md5值即可。还有一种情况是磁盘满了解压到一半报错用df -h检查剩余空间。我个人的习惯是下载后先不急着解压先记录文件大小和md5再解压能省去不少“到底哪个文件坏了”的纠结。解压后找不到三件套的另一个常见原因是tar包里带了一层多余的目录比如解压出的是filtered_gene_bc_matrices/hg19/。新手如果只盯着最外层自然看不到文件。用find . -type f列出所有文件看清楚真实层级再设置data.dir。4.3 Read10X报错cannot open gzfile或file not found很多人的data.dir设置错误指到了包含压缩包的上一层目录里面根本没有barcodes.tsv。Read10X内部逻辑是到data.dir下找这三个固定文件名的文件你必须保证这三个文件直接位于data.dir下而不是再套子目录。如果你解压后的目录是filtered_gene_bc_matrices/hg19data.dir就要写“filtered_gene_bc_matrices/hg19”不带引号里的父路径。如果文件名是genes.tsv而不是features.tsv新版Seurat也能兼容。真正麻烦的是某些GEO上传者把文件改成了自定义名字比如ref_genes.tsv这种时候Read10X就找不到标准文件名了解决方法是复制成标准文件名再读或者就直接用data.table读取并自己构造稀疏矩阵不过后者对新手不友好。4.4 基因注释版本不一致的问题导入成功不代表万事大吉。我遇到过几次这种情况读入后基因名全是Ensembl ID而后面想标注marker基因时需要的是基因符号或者不同数据集的基因注释版本不同合并时匹配不上。经验做法是在matadata笔记里第一时间记录参考基因组版本和注释来源比如“使用的10x GRCh38参考基因组、gene symbol命名”或“Ensembl v93注释”并统一用symbol或ID保存。如果你需要把Ensembl ID转成symbol可以用AnnotationDbi或Seurat的辅助函数但注意转换过程中会有部分基因因为版本差异找不到对应符号这是正常现象记录丢弃的比例即可不用慌。版本问题在合并多个数据集时尤其致命我会在后续文章里单独展开。4.5 数据集太大内存根本读不进去新手很容易一上来就下载一个几十万细胞的数据集试图在16G内存的笔记本上跑。单细胞矩阵虽然稀疏但几十万细胞仍然会让内存告急。解决顺序是这样的先确认自己分析的目的如果只是练手用pbmc 3k这种几千细胞的样本就好如果必须处理大数据优先申请服务器读入后尽早检查矩阵维度如果基因数特别高可以先按表达比例过滤一波。另外读入时可以用Read10X自带的参数只读取部分行快速查看数据结构但真正跑分析时还是建议一次性加载到内存里反复读取反而更慢。5. 实际跑完这些坑之后我留下的一些小习惯最后分享一点个人的工作习惯不算是技术内容但我觉得比单纯讲代码更重要。第一我现在的每个scRNA-seq项目都会建一个固定的目录结构比如data放原始下载文件scripts放R和shell脚本notebook放MD笔记这样无论过多久回来都能快速找到东西。第二下载数据的第一时间就把链接、文件名、md5、下载日期写进MD笔记的表格里这个习惯帮我避免了好几次“这个数据到底从哪来的”的窘境。第三遇到任何报错第一反应不是盲目搜索网上的答案而是先保存报错原文和sessionInfo再带着这两样东西去搜索效率会高很多。这篇文章写到这已经把scRNA-seq的数据下载与导入部分讲完整了。我用的是PBMC 3k这个经典数据集路径相对简单适合新手建立信心。等你把这份操作跑完可以在Seurat对象上继续做标准化、PCA、聚类和UMAP可视化你会发现前面这些关于文件结构、稀疏矩阵、路径配置的知识在后面每一步都在发挥作用。数据结构理解得越扎实后续分析出错的概率就越低。下一篇文章我打算讲一讲质量控制中那些“看起来能跑但结果不对”的隐藏陷阱如果你在这篇实操中遇到了我提到的任何一个问题或者有其他奇怪的报错欢迎带着报错信息来聊。