跳到正文
百沐一下百沐一下
本节目录

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 TCGATCGA Pan-Cancer (PANCAN) 这类 cohort。

下面给两条路线:路线一在浏览器里在线看,几分钟出图、适合先摸情况;路线二把表下下来,在 R 里整理,适合要复现、要接后续分析。

路线一:在浏览器里在线看(不下载)

想快速看一个基因(以 TP53 为例)在各癌种的表达,甚至它高低与生存有没有关系,全程不用下载:

  1. 打开 https://xenabrowser.net ,进入可视化(Visualization)。
  2. 选 cohort:搜 TCGA TARGET GTEx(做肿瘤 vs 正常就用它)。
  3. 加第一列变量:输入基因名 TP53,选它的 gene expression RNAseq 数据集——每个样本的表达就铺开了。
  4. 加第二列变量:选一个表型,比如样本类型(sample type)或癌种/部位(primary site),用来给样本分组。
  5. 打开图表视图,让 Xena 按分组画箱线图。它会给出各组的分布,并附一个组间统计检验的 p 值,方便您一眼看方向。
  6. 想看生存:用顶部的 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

相关