UCSC Xena 泛癌数据挖掘
跟完这篇,您能在 UCSC Xena 上零门槛取到 TCGA 泛癌的表达、样本类型与生存数据,既会在浏览器里在线看一个基因在各癌种的表达和生存曲线,也会把矩阵下载下来、在 R 里拼成一张分析可用的整洁表。
Xena 是什么
UCSC Xena 是加州大学圣克鲁兹分校维护的公共基因组数据平台。它最大的好处是把 TCGA、GTEx 这些大型数据集整理成了规整、已归一化、可直接下载的矩阵,省掉大量从原始测序数据算起的清洗工作,特别适合快速起步。
用之前先分清三个词:
| 概念 | 是什么 | 一句话记住 |
|---|---|---|
| Xena Browser | 网页可视化工具(https://xenabrowser.net) | 在线画图、看分布、跑生存曲线就用它 |
| Hub | 存放数据的服务器 | 不同来源的数据挂在不同 hub 上,一般不用您操心 |
| Cohort(队列) | 一批被统一处理、能放一起比的样本 | 您分析前要先选定一个 cohort |
做泛癌「肿瘤 vs 正常」,最常用的 cohort 是 TCGA TARGET GTEx。它把 TCGA 的肿瘤、GTEx 的正常组织用同一套流程重新处理过,因此可以直接放在一起比——正好补上 TCGA 自身正常样本太少的短板。如果您只关心 TCGA 内部,也可以选 GDC TCGA 或 TCGA Pan-Cancer (PANCAN) 这类 cohort。
下面给两条路线:路线一在浏览器里在线看,几分钟出图、适合先摸情况;路线二把表下下来,在 R 里整理,适合要复现、要接后续分析。
路线一:在浏览器里在线看(不下载)
想快速看一个基因(以 TP53 为例)在各癌种的表达,甚至它高低与生存有没有关系,全程不用下载:
- 打开
https://xenabrowser.net,进入可视化(Visualization)。 - 选 cohort:搜 TCGA TARGET GTEx(做肿瘤 vs 正常就用它)。
- 加第一列变量:输入基因名
TP53,选它的 gene expression RNAseq 数据集——每个样本的表达就铺开了。 - 加第二列变量:选一个表型,比如样本类型(sample type)或癌种/部位(primary site),用来给样本分组。
- 打开图表视图,让 Xena 按分组画箱线图。它会给出各组的分布,并附一个组间统计检验的 p 值,方便您一眼看方向。
- 想看生存:用顶部的 Kaplan-Meier 菜单,以
TP53表达作分组依据(默认按中位数切高/低组),选 Overall Survival,得到 KM 曲线和 log-rank 检验的 p 值。
一点提醒:生存分析只对肿瘤样本有意义,GTEx 正常组织没有生存终点,画 KM 前记得把范围限定在 TCGA 肿瘤样本上。另外,Xena 的界面按钮文字会随版本更新,具体名称以您当时看到的为准,但「选 cohort → 加基因列 → 加表型列 → 出图」这个顺序是稳定的。
在线看的定位是快速摸情况:判断值不值得深入、方向对不对。真要写进文章、要复现,还是走路线二把数据落到本地。
路线二:下载三张表,拼成分析可用的矩阵
一次标准的泛癌表达分析,通常就需要三张表。它们在 Xena 的数据页(https://xenabrowser.net/datapages/)里,按 cohort 找到对应数据集,每个数据集页面都有下载链接(一般是 .gz 压缩的文本):
| 要下的表 | 内容 | 用来干嘛 |
|---|---|---|
| 表达矩阵(gene expression RNAseq) | 行=基因、列=样本,值是已归一化的表达 | 主角,取目标基因的表达 |
| 表型 / 临床表(phenotype) | 每个样本一行,含样本类型、癌种、来源 | 给样本分组(肿瘤/正常、哪个癌种) |
| 生存数据(survival) | 每个样本的生存终点与时间 | 做预后、画 KM(仅 TCGA 样本有) |
三张表都以样本 ID 为主键,这是后面能拼起来的关键。下载时留意每个数据集页面标题里写明的单位和 ID 类型(下一节细说),三张表要来自同一个 cohort,别混用。
认清关键字段:样本类型、癌种、单位
下下来的表,字段名可能和您预期的不完全一样。动手前先认清三处,能避开后面绝大多数坑。
一、表型表里的分组字段。 具体字段名以文件表头为准,TCGA TARGET GTEx 的表型表里常见这几列:
| 字段(以表头为准) | 记录什么 | 取值举例 |
|---|---|---|
_sample_type | 样本类型 | Primary Tumor、Solid Tissue Normal、Normal Tissue(GTEx 正常)、Metastatic |
_primary_site | 组织/器官部位 | Lung、Liver、Breast… |
detailed_category | 更细的癌种/疾病分类 | Lung Adenocarcinoma… |
_study | 数据来源 | TCGA、GTEX、TARGET |
有了这些列,您就能干净地筛出「TCGA 的肿瘤」和「GTEx 的正常」,不必去猜样本名。
二、样本 ID 的编码。 TCGA 的样本 ID 是条形码,末段两位数字就标了样本类型,实在没有表型表时可以用它兜底:
barcode 末段(如 TCGA-XX-XXXX-01) | 含义 |
|---|---|
| 01–09 | 肿瘤样本(01 = 原发实体瘤最常见) |
| 10–19 | 正常样本(11 = 实体正常组织 Solid Tissue Normal) |
| 20 及以上 | 对照/细胞系等特殊类型 |
不过优先用表型表里的 _sample_type 列,比解析条形码更稳、更清楚。
三、表达值的单位和基因 ID。 Xena 的表达矩阵基本是已经 log2 变换过的归一化值(例如 log2(norm_count+1)、log2(tpm+0.001) 一类),具体变换和偏移量写在数据集页面标题/说明里,务必读一眼,不同数据集别混着比。基因 ID 有的用基因符号(如 TP53),有的用 Ensembl 号(如 ENSG...,可能带版本后缀);若是 Ensembl,先映射成基因符号再分析,方法见 基因 ID 转换。
在 R 里整理成一张长表
三张表拼起来的目标很简单:得到一张「每个样本一行,带上目标基因表达 + 样本类型 + 癌种 + 来源」的整洁长表,之后分癌种比较、画图都从它出发。
library(data.table)
g <- "TP53" # 目标基因
# 1)三张表都是从 Xena 数据页下载的 .gz 文本;真实文件名见各数据集下载页
expr <- fread("xena_expression.gz") # 第 1 列是基因 ID,其余每列一个样本
pheno <- fread("xena_phenotype.gz") # 每个样本一行,含样本类型、癌种、来源
# 2)只取目标基因那一行,转成「样本 × 表达」的长表
setnames(expr, 1, "gene")
one <- expr[gene == g] # 只留目标基因这一行
tidy <- data.table(
sample = names(one)[-1], # 去掉第 1 列基因名,剩下都是样本 ID
expr = as.numeric(one[, -1]) # 该基因在各样本的表达
)
# 3)按样本 ID 并上表型(样本类型、癌种、来源)
# pheno 的样本列名以表头为准,这里假设也叫 sample
tidy <- merge(tidy, pheno, by = "sample", all.x = TRUE)
# 4)只保留 TCGA 肿瘤 + GTEx 正常;字段取值以文件表头为准
sub <- tidy[`_study` %in% c("TCGA", "GTEX")]
到这一步,sub 就是一张能直接用的长表。想看某个癌种里肿瘤和正常的差异,按部位/癌种和样本类型分组比较即可(分癌种做 Wilcoxon 秩和检验是常用做法):
# 举例:只看肺部,比较肿瘤 vs 正常
lung <- sub[`_primary_site` == "Lung"]
wilcox.test(expr ~ `_sample_type`, data = lung) # 具体取值按表头对齐
要接生存分析,把下载的生存表也按 sample 并进来,用 OS(事件 0/1)和 OS.time(天)走 KM 或 Cox 即可,做法见 生存分析入门 与 预后 signature 与风险模型。
常见的坑
Xena 上手快,但下面几点不注意,结论容易站不住:
- TCGA 拼 GTEx 有批次效应。 两个来源即便同一流程处理过,仍可能残留系统差异。把它们放一起比时要意识到这一点,必要时在解读或建模里考虑来源因素,别把批次差当成生物学差异。相关处理见 批次效应。
- 单位必须一致。 已 log2 的值不要再 log 一次;不同数据集(counts、TPM、norm_count)的绝对值不可比。始终以数据集页面标明的单位为准。
- TCGA 正常样本本来就少。 很多癌种配对正常是个位数,只靠 TCGA 内部比很不稳——这正是引入 GTEx 的原因,但也因此更要认批次的账。
- 样本 ID 要对得上。 表达矩阵的列和表型表的行,样本 ID 写法要能匹配(大小写、分隔符、有没有末段编码)。合并后核对一下没丢样本。
- 泛癌是筛线索,不是下定论。 同时扫几十个癌种,多重比较被放大,
padj<0.05只是常用惯例、按数据和检验数量调整,不是铁律。跨癌种一致的信号更值得追,但仍需回到单癌种深入验证。把泛癌结果读成「候选/提示」这个分量为止。
在平台上跑一遍
上面这套「取数—整理—分癌种比较」的活,在百沐一下不用写代码:说清您要看的基因和癌种(比如「帮我看 TP53 在泛癌里肿瘤 vs 正常的表达」),平台会自动从公共数据库取数、对齐样本、分癌种跑完并给出箱线图、生存曲线和可复现的 R 代码,您也可以把自己的数据一起传上来分析。
上手见 组学智能体使用指南,或直接开始:https://app.baimuyixia.com 。
相关
- 单基因泛癌分析 — 拿一个基因,在 33 个癌种里系统扫表达、预后、免疫浸润
- TCGA 数据获取与整理 — 换个入口:从 GDC 取最原始、字段最全的 TCGA 数据
- 表达矩阵整理 — 把下下来的数据理成规范的表达矩阵与分组表
- 预后 signature 与风险模型 — 拿到表达和生存后,怎么建风险模型、画 KM 与 ROC