公共数据挖掘模块:一键调 TCGA / GEO
跟完这篇,您能从一个研究问题出发,在公共数据库里找到一份「预处理好、可以直接分析」的数据集,三分钟判断它到底能不能用,接入分析后拿到一张具体的差异表或生存结果——全程不用自己从原始测序数据算起。
公共数据挖掘,到底省了什么
「公共数据挖掘」说白了就一件事:别人已经测好、还整理好的数据,您拿来直接回答自己的问题。它省掉的不是分析,而是分析之前那段最耗时、最不出彩的活——找数据、下原始文件、比对定量、清洗格式。
关键分水岭是「原始」还是「预处理好」。同样是公共数据,这两条路的工作量差着一个数量级:
| 原始数据 | 预处理好的数据集 | |
|---|---|---|
| 拿到的东西 | FASTQ / SRA 等测序原文件 | 规整的表达矩阵 + 分组/临床信息 |
| 您要做的 | 自己比对、定量、注释、去批次 | 直接读进来就能算 |
| 花的时间 | 几天,还要算力 | 几分钟 |
| 适合谁 | 需要最原始、最完整字段 | 绝大多数分析,尤其是快速验证想法 |
这篇只讲第二条路:怎么找到预处理好的数据、判断它可用、接进分析拿到结果。除非您有特殊需求,能用预处理好的就别去碰原始文件。
第一步:把问题写成检索条件
找数据之前,先把问题写成一句「谁比谁、看什么」的话。这句话直接决定您要找什么样的数据集,也决定后面用哪种方法分析。
以一个贯穿全篇的例子来走:「肝癌里,肿瘤组织和正常组织比,哪些基因的表达变了?」
把它拆成检索时要用的几个条件:
| 要素 | 本例 | 决定了什么 |
|---|---|---|
| 物种 | 人(Homo sapiens) | 筛掉小鼠、细胞系 |
| 疾病/组织 | 肝细胞癌(liver / hepatocellular carcinoma) | 检索主题词 |
| 对比分组 | 肿瘤 vs 正常 | 数据集里必须同时含这两组 |
| 数据类型 | 表达谱(RNA-seq 或芯片) | 决定去哪个库、用哪种方法 |
| 结局变量 | 无(本例只做差异)/若问预后则需生存时间 | 决定要不要带临床信息 |
这一步别省。最常见的翻车是:数据下下来才发现它「只有肿瘤、没有正常」,或者「没有生存时间,做不了预后」。把要素列清楚,检索时就能一眼排除这些。
第二步:去这几个地方找预处理好的数据
预处理好的公共数据集,主要集中在下面几个来源。它们各有侧重,按您的问题挑:
| 来源 | 覆盖 | 拿到的是什么 | 怎么取 |
|---|---|---|---|
| TCGA / GDC 官方 | 33 个癌种的多组学 | 较原始,字段全,需自己整理 | R 包 TCGAbiolinks |
| UCSC Xena | TCGA、GTEx、TARGET 等 | 已归一化、开箱即用的矩阵 | 网页下载 / 直读文本 |
| cBioPortal | 大量癌症基因组学研究 | 在线勾选即得,含临床 | 网页 / R 包 cBioPortalData |
| GEO(GEO2R) | 海量 GSE 数据集 | 在线跑差异,直接出结果表 | GSE 页面上的网页工具 |
| GEO(GEOquery) | 海量 GSE 数据集 | 处理后的 Series Matrix | R 包 GEOquery |
| recount3 | 大量 RNA-seq 研究 | 统一口径重新处理过的 counts | R 包 recount3 |
对着本例(肝癌肿瘤 vs 正常)挑几条常见路子:
想要癌症数据、还想补上正常组织——去 UCSC Xena。 TCGA 本身的正常样本很少,Xena 提供了把 TCGA 肿瘤和 GTEx 正常组织统一处理后的合并队列,正好补齐这个短板。下下来是纯文本矩阵,直接读入:
# Xena 下载的是纯文本矩阵,行是基因、列是样本
expr <- read.table("TCGA-LIHC.expr.tsv", header = TRUE, row.names = 1, sep = "\t")
# 注意:Xena 上的表达值通常已归一化 / log 转换过,不是原始 counts(下面会用到这点)
从一篇论文里看到某个 GSE 号——用 GEOquery 直接拉处理后的矩阵:
library(GEOquery)
gse <- getGEO("GSExxxxx", GSEMatrix = TRUE) # 换成真实编号
eset <- gse[[1]]
expr <- exprs(eset) # 表达矩阵:行基因、列样本
meta <- pData(eset) # 样本信息:分组、临床都在这里
只想快速看某个 GSE 的差异结果、连数据都不想下——用 GEO2R。 它是 NCBI 挂在每个 GSE 页面上的网页工具,您在页面上把样本分成两组,点一下,它就在线用 limma 跑出一张差异表给您,全程不用下载。适合快速探路。
做 RNA-seq、后面要用 DESeq2、需要原始 counts——用 recount3。 它把大量 RNA-seq 研究按统一流程重新处理,直接给统一口径的 counts:
library(recount3)
projects <- available_projects() # 列出已统一处理的项目
rse <- create_rse(subset(projects, project == "LIHC"))
counts <- transform_counts(rse) # 得到可用的原始 counts 矩阵
选哪条的经验法则:要快、要开箱即用,去 Xena / cBioPortal;手里已有 GSE 号,用 GEOquery / GEO2R;要原始 counts 走标准 RNA-seq 流程,用 recount3。
第三步:三分钟判断它能不能用
搜到不等于能用。选中一个数据集,动手分析前先照下面四条快速核对,任何一条不过关都要谨慎。
- 有没有您要的两组。 本例必须同时含「肿瘤」和「正常」样本。翻一眼样本的分组/临床标签,确认两组都在、且分得清楚。只有肿瘤没有正常,这个问题就做不了。
- 样本量与重复数够不够。 数一下每组各有几个样本。做差异表达,每组至少 3 个生物学重复是常被采用的最低门槛(是惯例、不是铁律;样本越多越稳,临床受限时更少的也有,但结论要更保守地看)。
- 分组信息清不清楚。 好数据要让您一眼看出谁是实验组、谁是对照。重点看样本的
Characteristics/ 临床表里,分组列是否齐全规整;如果只能靠猜样本名,整理起来会很费劲。 - 拿到的数值是什么口径。 这条最容易被忽略,却直接决定下一步用什么方法——是原始 counts,还是已归一化 / log 转换过的值?看数据集说明或矩阵里的数值范围就能大致判断(整数大多是 counts,带小数的一两位数多半已归一化)。
前三条不过关,换一个数据集;第四条不用于取舍,但记牢它,第四步要用。
第四步:接入分析,拿到一个结果
数据核对通过,就可以接进标准分析了。用哪种方法,取决于第三步第 4 条判断出的数值口径——这是预处理好的数据最容易踩的坑:
- 拿到的是原始 counts(recount3、部分 GEO / TCGA counts 矩阵)→ 走 DESeq2(负二项模型要整数原始计数);
- 拿到的是已归一化 / log 值(芯片数据、Xena 的 log 矩阵)→ 走 limma。
路线一:原始 counts → DESeq2。
library(DESeq2)
# counts:原始计数矩阵;coldata:一列 group,取值 tumor / normal
dds <- DESeqDataSetFromMatrix(counts, coldata, design = ~ group)
res <- results(DESeq(dds), contrast = c("group", "tumor", "normal"))
# 常用惯例阈值,按数据调,不是铁律
sig <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)
路线二:已归一化 / log 值 → limma。
library(limma)
# expr:已归一化 / log 表达矩阵;group:因子,tumor / normal
design <- model.matrix(~ group)
fit <- eBayes(lmFit(expr, design))
tt <- topTable(fit, coef = 2, number = Inf) # 差异表:logFC、adj.P.Val
跑完您就拿到了本篇要的具体结果:一张差异表,列着每个基因的 log2 倍数变化和校正后 p 值,按阈值一卡就是差异基因列表。到这一步,一个「肝癌肿瘤 vs 正常」的差异分析,从找数据到出结果,全程没碰过一个原始测序文件。
上面的
padj < 0.05且|log2FC| > 1(约 2 倍)是领域常用惯例、不是铁律:样本量大可收紧到padj < 0.01;差异基因太少可放宽到|log2FC| > 0.585(约 1.5 倍)。阈值最好在看结果前定好,别调到「好看」为止。差异分析每一步的门道见 DESeq2 差异表达分析怎么做对。
拿到差异基因后,常见的下一步是富集分析、火山图、或(若数据带生存时间)预后分析,见文末相关链接。
几个绕不开的坑
预处理好的数据省事,但不等于没坑。用之前把下面几条记在心里。
- 口径没对上。 把归一化 / log 值当原始 counts 喂给 DESeq2,或反过来,都会得出错误结果。动手前务必确认数值口径(第三步第 4 条),据此选方法。
- 拼数据集就有批次效应。 把多个来源(比如 TCGA 肿瘤 + GTEx 正常,或几个 GSE)合在一起,批次差异会混进结果,甚至盖过真实的生物学差异。合并分析前要识别并处理,见 批次效应识别与去除。
- 样本名要对齐。 表达矩阵的列名和分组/临床表的样本名,必须在大小写、下划线、前后缀上完全一致,否则接不上。整理规范见 表达矩阵与分组表整理规范。
- 引用归属别漏。 公共数据都有原始出处。写进论文或报告时,请按数据集标注的原始数据库与项目编号(如 TCGA 项目名、GEO 的 GSE 号)致谢并引用;您只是使用者,不改变原始归属。
- 别人的处理口径未必透明。 「预处理好」意味着有人替您做了归一化、过滤等决定,而这些决定您未必完全知道。做重要结论前,尽量看清该数据集的处理说明;口径不清时,结论要更保守。
在平台上跑一遍
上面这一整条——检索、判断口径、按口径选对方法、接进分析——在「百沐一下」不用写代码:进【数据分析 → 公共数据挖掘】,按疾病、组织、来源(TCGA / GEO)筛选,列表直接显示每个数据集的样本量、分组、平台;选中一个「一键」接入智能统计、智能绘图或组学智能体,用一句话说清「谁比谁、做什么」,平台替您核对样本、对齐口径、跑完出结果,还附可复现的 R 代码。想把公共数据和自己的数据联合分析,勾选时一起选上即可。
用法见 公共数据挖掘使用指南,或直接开始:https://app.baimuyixia.com 。
相关
- GEO 数据库检索入门 —— 怎么用检索式加筛选器,快速找到符合课题的 GSE
- 表达矩阵与分组表整理规范 —— 把拿到的数据整理成能直接分析的规范格式
- 单基因泛癌分析 —— 用公共数据在多个癌种里系统扫一个基因
- 公共数据挖掘使用指南 —— 平台上检索、选用、发起分析的完整操作