TCGA数据下载与整理:从GDC入口到表达矩阵的完整指南 第一次接触TCGA数据集的时候我其实是有点懵的。表面上它就是一个公开的癌症数据网站可等你真正想下载一批数据开始分析就会发现一堆问题涌上来下载入口有GDC、cBioPortal、Xena到底用哪个下载下来的文件为什么是一堆没有扩展名的文件夹临床信息里的样本ID和文件名怎么对不上这篇就当作一个新手向的记录把我自己踩过的坑和验证过的流程都写清楚希望能帮你少走弯路。我会按“理解数据→选对入口→实操下载→避坑整理”这条线来讲最后还会附上一个本地整理数据的模板思路。无论你是想复现别人的文章、做毕业设计还是想系统探索某个癌种的多组学特征这篇都适用。1. 先搞清楚TCGA到底是什么1.1 一句话版本和背景TCGA全称是The Cancer Genome Atlas中文通常叫“癌症基因组图谱计划”。这是由美国国家癌症研究所和美国国家人类基因组研究所联合推动的大型公开项目2006年启动2018年完成数据收集一共覆盖了33种癌症类型包括肺癌、乳腺癌、结直肠癌、肝癌、胃癌这些常见癌种也包含胆管癌、间皮瘤、葡萄膜黑色素瘤等相对少见的类型。项目采集了超过2万个肿瘤样本对应约1.1万名患者并对每个样本做了多种分子层面的检测。更关键的是它还配套了随访信息比如生存时间、肿瘤分期、患者年龄性别等。也就是说TCGA给每个患者建立的不是一张单维度的“基因表达表”而是一个包含转录组、突变、拷贝数变异、DNA甲基化、miRNA表达、部分蛋白质组学甚至还有病理切片的完整数据档案。很多新手会把TCGA和GEO搞混。我常用的区分方式是这样的GEO是一个通用的“什么都能放”的数据仓库研究者做实验后把数据传上去样本规模通常偏小而且不同数据集之间的处理标准差异很大TCGA则是专门针对癌症的大规模队列项目数据覆盖面广、临床信息完整、处理流程也经过了统一标准化所以更适合做系统性的挖掘和分析。1.2 为什么说它是“宝藏”数据库TCGA的价值不只在于“数据量多”更在于“数据配得齐”。什么叫配得齐举个例子你研究肺腺癌拿到一个样本的转录组表达数据后还可以同时看到这个样本的突变信息、拷贝数变异、甲基化状态又能查到对应患者的生存月数、肿瘤分期和诊断年龄。这种多维度对齐让你可以自己做完整的证据链分析比如“某基因高表达→拷贝数扩增→患者预后更差”这类故事。另一个特点是数据经过了GDC平台的统一处理。原始测序数据在不同实验室、不同批次下存在偏差但GDC把所有数据重新做了一遍比对、定量、注释的流程下载到的已经是harmonized的标准数据。对新手来说这意味着不需要自己从头处理几十GB的原始FASTQ文件直接拿到可以分析的矩阵文件能省下大量时间和计算资源。1.3 新手最需要先理解的概念正式开始下载前建议先消化下面几个基础概念后面操作就不容易乱。项目Project命名规则是“TCGA-癌种缩写”比如TCGA-LUAD是肺腺癌TCGA-BRCA是乳腺癌TCGA-KIRC是肾透明细胞癌。筛选数据时第一层条件就是选项目。样本Sample来源于某位患者的某一次取材用TCGA barcode标识。平时我们看到的一长串TCGA-XX-XXXX-XX-XXXX-XX就是样本编码后面会细讲。文件FileGDC平台真正可下载的对象。一个样本的转录组数据可能是一个TSV文件一批样本的突变信息可能合并成一个MAF文件。数据类别Data Category和数据类型Data Type决定了你要下载的是转录组、突变还是甲基化数据。简单来说整个筛选逻辑就是“找一个项目→选一批样本→下载对应类型的文件”。想清楚这条链路后面操作就会顺畅很多。2. 认识TCGA的数据层次与文件类型2.1 一个癌种项目里有哪些数据类型以TCGA-LUAD肺腺癌为例下载页面里你会看到十几种不同类型的数据。其中最常用的几类包括转录组表达数据最常见也是大多数人上手的第一步。它测量的是每个基因在各种样本中的表达量可以用来做差异表达分析、生存分析、共表达网络等。体细胞突变数据来自外显子组测序或全基因组测序文件通常是MAF格式或VCF格式可以用来分析突变图谱、寻找高频突变基因。拷贝数变异数据描述染色体片段的扩增和缺失常见的是GISTIC算法处理过的基因水平拷贝数文件。DNA甲基化数据来源多为450K甲基化芯片常用于表观遗传分析。临床数据包含生存时间、生存状态、肿瘤分期、年龄、性别、吸烟史等关键字段是所有预后分析的必配项。miRNA表达和蛋白质组学数据使用频率相对低一些但在特定研究里同样重要。2.2 主要数据类型速查表我整理了一张常用数据类型表格方便你对照数据类别Data Category数据类型Data Type常见文件格式典型用途Transcriptome ProfilingGene Expression QuantificationTSV/CSV差异表达、富集分析、生存分析Simple Nucleotide VariationMasked Somatic MutationMAF突变图谱、驱动基因分析Copy Number VariationGene Level Copy Number / SegmentsTXT/SEG拷贝数扩增缺失分析DNA MethylationMethylation Beta ValueTXT/IDAT表观遗传、甲基化差异分析ClinicalClinical SupplementTSV/BCR XML生存分析、临床信息匹配Proteome ProfilingRPPATSV/TXT蛋白质表达分析BiospecimenBiospecimen SupplementTSV/XML样本元数据管理2.3 从文件名反推样本身份下载后你会发现GDC上的文件名多半是一长串UUID比如“c12a3f84-9d01-4d2f-9e9e-9d5ae1743f2e”非常不友好。想把它与具体样本对应起来必须学会看两个文件一个是manifest文件另一个是metadata文件。更基础的是学会读TCGA样本barcode。标准格式是15位或更长例如“TCGA-A1-A0SB-01A-11R-A115-07”拆开看是这样的“TCGA”项目标识“A1”组织来源TSS编码“A0SB”参与者编号“01”样品类型01一般表示原发性实体肿瘤11表示实体组织正常样本02是复发肿瘤06是转移灶“A”样本序号同一患者多个样本时用来区分“11”分析份数“R”分析流程中的部分代号“A115”和“07”分别代表板号和测序中心。当时我为了记住这些规则花了不少时间因为合并数据时如果只看前12位就会把同一患者的肿瘤样本和正常样本混在一起。建议你在做任何数据分析之前都写一个脚本把barcode各段拆开至少确认一下样品类型那一两位。3. 下载前必读选对下载入口3.1 四种主流通路对比TCGA数据有多个获取途径但它们的设计思路不同适合的场景也不太一样。我用一个表格把主流方案列出来下载入口数据特点最大优势适合场景GDC Data Portal最原始、最完整的文件级数据支持灵活筛选、多组学一体化下载需要特定样本、特定流程数据的深度分析cBioPortal已经做了一定的汇总和可视化可快速查看突变和拷贝数图谱快速了解某个基因在泛癌中的状态UCSC Xena提供整理好的表达矩阵和临床表型直接下载矩阵省去处理步骤下游分析为主想跳过GDC复杂筛选TCGAbiolinksR包面向R用户的数据获取与整理方案下载整理一体化可复现性强习惯R语言、需要批量分析3.2 不同场景应该选哪个我自己一般按这样选如果你想做严谨的、可复现的课题且希望自己完全掌握样本筛选过程首选GDC Data Portal。如果你只想快速看某几个基因在某个癌种里的表达和突变情况比如做个复现验证用cBioPortal最省事。如果你拿到数据后主要是做矩阵层面的分析不太想管文件级的细节UCSC Xena直接下载整理好的表达矩阵会更顺手。如果你未来要反复更新、复跑同一个分析流程愿意把一切操作脚本化TCGAbiolinks是最佳选择。3.3 一个被很多人忽略的版本问题数据库本身会不断更新GDC每隔一段时间就会发布新的Data Release不同release里文件数量、处理流程版本、基因组注释版本都可能有差异。很多人只知道下载却不记录版本号等要写论文或复现别人结果时才发现“当时用的版本找不到了”。所以无论你从哪个入口下载强烈建议记录三样东西下载日期、GDC release版本、具体workflow类型。放在分析项目的README文件里一辈子受用。4. 手把手实操从GDC Data Portal下载4.1 准备工作和关键筛选GDC Data Portal的地址是portal.gdc.cancer.gov不用注册也能下载开放数据但建议先注册一个账号并生成一个token因为某些受控的临床文件需要权限验证。进入页面后点击“Repository”开始筛选。以下是一次典型的“下载肺腺癌STAR流程的转录组counts”操作在Cases面板里选择Primary Site为“Lung”或者在Project里直接选“TCGA-LUAD”。在Files面板里Data Category选“Transcriptome Profiling”Data Type选“Gene Expression Quantification”Experimental Strategy选“RNA-Seq”Workflow Type选“STAR - Counts”。如果你还需要样本层面的筛选可以在Cases面板里设置Sample Type比如只保留“Primary Solid Tumor”原发性实体瘤和“Solid Tissue Normal”实体组织正常样本。这里有一个新手常踩的坑Workflow Type有好几个选项老的HTSeq - Counts和新的STAR - Counts混在一起。建议优先选择新的STAR流程因为它是GDC当前统一处理的流程文件里还附带gene_name列更好用。4.2 拿到Manifest文件筛选完成后把所有文件加入购物车。GDC的逻辑是点击“Add All Files to Cart”后右上角的Cart里会列出所有文件。这时你有两个选择一是直接点击“Download”里的“Cart”下载一个压缩包里面放着所有文件二是点击“Download”里的“Manifest”下载一个Manifest文件。文件数量多的时候强烈建议选Manifest然后用GDC官方提供的命令行客户端批量下载。Manifest文件实质是一个文本文件里面每一行写着一个文件的UUID、文件名、大小和状态等信息。它的作用就是告诉下载工具“你需要下载哪些文件”这样即使断线了也可以重新执行命令继续下载。4.3 用GDC Client批量下载GDC Client是官方出的命令行下载工具可以从GDC官网的工具页面下载。它支持断点续传、并发下载比浏览器手动点下载靠谱得多。下载并解压后在命令行里进入对应目录执行gdc-client download -m manifest.txt -d TCGA-LUAD -t gdc_user_token.txt参数解释一下-m manifest.txt指定你刚才下载的Manifest文件-d TCGA-LUAD指定数据存放目录-t gdc_user_token.txt指定token文件下载受控数据时必须有如果只是下载开放数据有时可以不加但加上更稳妥。如果你希望下载快一点可以加并发参数gdc-client download -m manifest.txt -d TCGA-LUAD -t gdc_user_token.txt -n 8-n 8表示同时用8个进程下载。我自己的经验是并发数设到8到16一般比较稳设太高反而容易触发服务端限制。下载过程中如果某个文件失败只要重新运行同样的命令它就会自动跳过已下载完的文件只补未下载的部分。5. 另一种省事方案用TCGAbiolinks在R里直接取数5.1 为什么推荐给生信新手GDC网页版筛选看起来直观但一旦要下载多个癌种、多类数据手动操作就非常繁琐而且不容易复现。TCGAbiolinks是R语言生态里专门为TCGA数据设计的一个包它把查询、下载、整理、标准化打包成了几个函数所有操作都能写进脚本以后想更新数据或换癌种改一行参数就行。它对新手友好的地方在于省去了自己分析manifest、自己合并矩阵的过程。下载完直接得到整理好的表达矩阵或SummarizedExperiment对象再配合R的生态工具几乎可以无缝衔接下游分析。5.2 环境准备安装TCGAbiolinks前确保R版本不要太老然后用下面的命令安装if (!require(BiocManager, quietly TRUE)) install.packages(BiocManager) BiocManager::install(TCGAbiolinks)如果网络比较慢多试几次。安装成功后加载包并开始查询。5.3 完整代码实操下面是一段查询和下载肺腺癌STAR counts数据的示例library(TCGAbiolinks) # 查询数据 query_luad - GDCquery( project TCGA-LUAD, data.category Transcriptome Profiling, data.type Gene Expression Quantification, workflow.type STAR - Counts, sample.type c(Primary Solid Tumor, Solid Tissue Normal) ) # 查看查询到的文件数量 getResults(query_luad) | nrow() # 下载数据 GDCdownload(query_luad, method api, files.per.chunk 20) # 整理为表达对象 expr_data - GDCprepare(query_luad)代码里几个参数的含义project指定癌种项目data.category和data.type限定数据类型workflow.type指定STAR流程sample.type指定样本类型这里选了肿瘤和正常两类方便后续做差异分析method api从R中直接使用GDC API下载适合不想额外装GDC Client的情况如果你已经装好了GDC Client也可以改成method client。下载并整理后expr_data是一个SummarizedExperiment对象。你可以这样取出表达矩阵library(SummarizedExperiment) counts_matrix - assay(expr_data) colnames(counts_matrix) - colData(expr_data)$barcode这时得到的矩阵就是“基因 × 样本”的格式行名是基因ID或基因名列名是对应的TCGA barcode。6. 常见问题与实战避坑6.1 下载速度慢、断线怎么办GDC的服务器在国外国内用户下载速度可能会不稳定这是很多新手第一次下载时最头疼的问题。常见的解决办法包括优先使用gdc-client而不是浏览器直接下载。它的断点续传机制可以让你反复执行同一命令而不重复下载已完成文件。合理设置并发数-n实测8到16比较合适。如果某个文件反复下载失败先看是不是网络波动稍等再重试不要一直开着几十个并发反而容易被限制。我自己曾经下载一个癌种的几百个文件第一次跑到一半断网了重启后直接重新执行gdc-client download -m manifest.txt它就自动跳过已完成的文件继续补全这个体验确实比浏览器好太多。6.2 下载下来的文件怎么对应样本下载完成后你会看到一堆UUID命名的文件夹里面放着没有扩展名的文件。这时候不要慌它们其实是TSV或相关格式只是扩展名被省略了。关键是把UUID映射回TCGA barcode。做法是回到GDC页面在Cart里点击下载Metadata文件会得到一个JSON或TSV文件。里面记录了每个file_id也就是UUID对应的associated_entities其中就有case和sample barcode族。用一个小脚本就能完成映射。最简单的做法是用TCGAbiolinks或手动写R代码读取metadatameta - jsonlite::fromJSON(metadata.cart.json)然后按file_id关联到宿路径。6.3 临床信息合并的坑临床数据下载下来后你会发现里面可能有好几个Sheet或表格比如“clinical.tsv”和“supplemental”等字段也很多。最常用的生存字段是days_to_death、days_to_last_follow_up、vital_status等但它们分散在多个表格里。一个更大的坑是不同表格用的样本ID长度不一样有的用12位case ID有的用15位sample ID直接合并很容易错位。我的习惯是先把所有TCGA barcode统一拆成“case_id前12位 sample_id前15位”两列再基于case_id去合并临床字段。只要你把barcode层级搞清楚这个坑是可以完全避开的。6.4 磁盘空间和文件数量的现实问题TCGA看起来只是“文本文件”但全量下载一个癌种的转录组数据比如LUAD约500个样本每个STAR Counts文件约几MB到十几MB总体也要几个GB如果下载多个癌种或多个平台的完整数据几十GB都是很正常的。下载前建议先规划好一个目录结构例如data/ TCGA-LUAD/ manifest.txt raw_files/ metadata.cart.json不要把所有文件一股脑塞进一个目录不然后期排查起来非常痛苦。另外建议下载完成并确认文件完整后把manifest.txt和metadata.cart.json也保留在项目目录里它是你日后追踪数据来源的重要依据。6.5 另一个容易出错的细节数据版本我在前面也提到GDC会定期发布新的Data Release。有时候你参考的老教程使用的是旧的HTSeq流程而新版数据已经换成STAR流程基因注释版本也从GENCODE v22更新到了更高版本。直接拿新旧数据混用很可能导致基因ID对不上、counts数量级不一致等问题。所以做任何正式分析前先确认你手上的文件全部来自同一个GDC release并且workflow type一致。如果发现混合了不同版本最好重新下载。7. 拿到数据之后的第一步建议7.1 本地目录怎么组织数据下载完成只是开始真正考验人的是后续整理。我先给你一套我常用的目录结构my_tcga_project/ data/ raw_data/ TCGA-LUAD/ # UUID文件夹 manifest.txt metadata.cart.json clinical/ clinical.tsv processed/ expr_count_matrix.tsv clinical_clean.tsv scripts/ 01_download.R 02_clean_expr.R 03_clinical_merge.R results/这样分层的意义在于原始数据永远保持只读所有处理过程都通过脚本执行并输出到processed和results这样任何一步出了错都可以追溯。7.2 用一个脚本把表达数据合并成矩阵如果你是通过GDC网页下载的文件最后可能得到几百个TSV文件每个文件是一个样本的表达结果。把这些文件合并成一个大矩阵是第一次真正“面对数据”的步骤。下面是一个用data.table合并全部counts文件的参考脚本library(data.table) files - list.files(data/raw_data/TCGA-LUAD, pattern \\.tsv$, full.names TRUE) merged_list - lapply(files, function(f) { dt - fread(f) sample_id - tools::file_path_sans_ext(basename(f)) setnames(dt, unstranded, sample_id) dt[, c(gene_id, sample_id), with FALSE] }) expr_matrix - Reduce(function(x, y) merge(x, y, by gene_id), merged_list) fwrite(expr_matrix, data/processed/expr_count_matrix.tsv, sep \t)注意不同workflow输出文件的列名有差异新STAR流程通常包含gene_id、gene_name、unstranded、stranded_first等列。脚本里的unstranded是未区分链的counts列非链特异性建库测序一般看这一列。7.3 后续分析还可以做什么等表达矩阵和临床信息整理好后你可以按自己的课题向下走。最常见的几个方向是差异表达分析用DESeq2或edgeR比较肿瘤和正常样本得到差异基因列表生存分析根据某个基因的表达量中位数把患者分组做KM曲线和Cox回归多组学关联把突变、拷贝数和表达关联起来寻找潜在的驱动事件免疫浸润分析基于表达矩阵推断样本里免疫细胞比例再和预后关联。我个人每次拿到一个癌种的数据会先做三件事检查样本ID是否对齐、合并表达矩阵、跑一遍总生存的KM曲线验证基本逻辑。只有这些基础环节干净了后面才能放心往下分析。TCGA数据很好用但好用的前提是第一步下载和处理没出错希望上面这些经验能真正帮到你。