跳到主要内容

02 数据获取:从 GDC 拿到合规数据

选题确定之后,第一件事是把数据拿到本地。TCGA 数据托管在 GDC(Genomic Data Commons),有网页端和 API 两种获取方式。本章用 TCGAbiolinks 把 TCGA-LIHC 的 RNA-seq counts、突变 MAF 和临床数据全部下到本地,并整理成后续分析可以直接用的格式。

两种获取方式怎么选

方式适合优势劣势
GDC Portal 网页小规模探索、手动挑几个样本可视化界面、不需要写代码不可复现、批量操作麻烦
TCGAbiolinks(R)批量下载、分析流程一体化可复现、参数记录清楚首次下载慢(几个 GB)
gdc-client(命令行)下载 controlled-access 数据、BAM直接、快需要 token、手动整理

教学和发表项目一律用 TCGAbiolinks:代码即记录,下次跑同样的代码拿到同样的数据。

安装

if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
BiocManager::install("TCGAbiolinks")

下载 RNA-seq counts

library(TCGAbiolinks)
library(SummarizedExperiment)

# 查询:TCGA-LIHC, RNA-seq, HTSeq raw counts
query_rna <- GDCquery(
project = "TCGA-LIHC",
data.category = "Transcriptome Profiling",
data.type = "Gene Expression Quantification",
workflow.type = "STAR - Counts"
)

# 下载(约 2-3 GB,首次耗时 10-30 分钟)
GDCdownload(query_rna, method = "api", files.per.chunk = 10)

# 整理成 SummarizedExperiment
se_rna <- GDCprepare(query_rna)
se_rna
# 输出: class: RangedSummarizedExperiment
# dim: 60660 x 424

关键参数说明

  • workflow.type = "STAR - Counts":拿的是 STAR 比对 + HTSeq 计数的 raw counts(整数)。不要选 FPKM,差异分析工具(DESeq2)要求原始整数 counts
  • files.per.chunk = 10:分 10 个文件一批下载,避免一次性请求太多被 GDC 拒绝
  • GDCprepare() 自动把几百个单样本文件合并成一个矩阵

下载体细胞突变 MAF

query_maf <- GDCquery(
project = "TCGA-LIHC",
data.category = "Simple Nucleotide Variation",
data.type = "Masked Somatic Mutation",
access = "open"
)

GDCdownload(query_maf)
maf_data <- GDCprepare(query_maf)
# 输出: data.frame,每行一个突变,标准 MAF 格式
nrow(maf_data)
# 约 30000-50000 行

Masked Somatic Mutation 是 GDC 公开的体细胞突变(已去掉可能泄露身份的胚系变异),open-access 不需要 dbGaP 权限

下载临床数据

clinical <- GDCquery_clinic("TCGA-LIHC", type = "clinical")
dim(clinical)
# 约 377 行 x 70+ 列
head(clinical[, c("submitter_id", "vital_status", "days_to_death",
"days_to_last_follow_up", "ajcc_pathologic_stage",
"gender", "age_at_diagnosis")])

数据到手后先做的三件事

1. 确认样本类型

TCGA barcode 的第 14-15 位标识样本类型:

代码含义在 LIHC 里大约数量
01Primary Tumor371
11Solid Tissue Normal50
02Recurrent Tumor极少
06Metastatic0
# 提取样本类型
sample_types <- substr(colnames(se_rna), 14, 15)
table(sample_types)
# 01: 371 11: 50 ...

下游差异分析用 "01" vs "11"。如果你只想做肿瘤内的亚型比较(比如预后好 vs 预后差),只保留 "01"。

2. 去重复样本

同一个 patient 可能有多次采样(不同 aliquot)。保留策略:按 plate number 取最新的一个

# TCGAbiolinks 自带去重
se_rna_unique <- se_rna[, !duplicated(substr(colnames(se_rna), 1, 12))]

3. 对齐临床表和表达矩阵

# 表达矩阵的 patient ID(前 12 位)
expr_patients <- substr(colnames(se_rna_unique), 1, 12)

# 临床表的 patient ID
clin_patients <- clinical$submitter_id

# 取交集
common <- intersect(expr_patients, clin_patients)
cat("有完整临床+表达数据的患者:", length(common), "\n")

临床变量整理

TCGA 原始临床表字段多且混乱。做生存分析只需要几列:

library(dplyr)

clin_clean <- clinical %>%
filter(submitter_id %in% common) %>%
transmute(
patient_id = submitter_id,
# OS: 总生存
OS = ifelse(vital_status == "Dead", 1, 0),
OS.time = ifelse(vital_status == "Dead",
days_to_death,
days_to_last_follow_up),
# 临床分期
stage = case_when(
grepl("Stage I$|Stage IA|Stage IB", ajcc_pathologic_stage) ~ "I",
grepl("Stage II", ajcc_pathologic_stage) ~ "II",
grepl("Stage III", ajcc_pathologic_stage) ~ "III",
grepl("Stage IV", ajcc_pathologic_stage) ~ "IV",
TRUE ~ NA_character_
),
gender = gender,
age = round(age_at_diagnosis / 365.25)
) %>%
filter(!is.na(OS.time), OS.time > 0)

cat("可用样本:", nrow(clin_clean), "\n")
summary(clin_clean$OS.time)

OS.time 的单位是天。后续做 KM 曲线时转成月(OS.time / 30)更直观。

保存成下游可用的格式

# 保存表达矩阵(raw counts)
saveRDS(se_rna_unique, "data/tcga_lihc_rnaseq.rds")

# 保存整理后的临床表
write.csv(clin_clean, "data/tcga_lihc_clinical.csv", row.names = FALSE)

# 保存 MAF
write.table(maf_data, "data/tcga_lihc_somatic.maf",
sep = "\t", quote = FALSE, row.names = FALSE)

后面所有章节都从这三个文件开始,不再重新下载。

常见坑

坑 1:GDC 下载超时或中断

国内直连 GDC 经常慢或断流。三种解法

  • files.per.chunk = 5(更小的分批)
  • 挂梯子或用学校 VPN
  • 凌晨下载(GDC 在北美白天负载高)

如果反复失败,用 gdc-client 命令行工具 + manifest 文件下载更稳。

坑 2:选了 FPKM 而不是 raw counts

workflow.type = "STAR - Counts" 拿 raw counts;另有 FPKM / FPKM-UQ 选项。DESeq2 / edgeR 要求 raw integer counts,FPKM 已经归一化过了不能用。如果论文里需要 TPM 值做可视化,可以后续自己从 counts 算。

坑 3:没注意 GDC data release 版本

GDC 定期更新数据(重跑 pipeline、修改注释)。同一段代码隔半年再跑,结果可能不同。在代码里注释 # Downloaded: GDC Data Release 39.0, 2026-05-19,方法段也写。

坑 4:把 tumor 和 normal 当成独立样本

TCGA-LIHC 的 50 个 normal 来自 50 个 tumor 患者(配对设计)。做差异分析时应该用 paired designdesign = ~ patient + condition),而不是当成 371 vs 50 不配对。配对能大幅提高统计效力。

坑 5:临床数据缺失太多直接删

days_to_death 对存活患者是 NA(正常!用 days_to_last_follow_up 补)。ajcc_pathologic_stage 约有 20% NA。不要因为 stage 缺失就删样本 — 这些样本的表达和突变数据仍然有用,只是不能做分期相关的分析。

下一步

接着深入

横向延伸

参考资源

AI 陪学

让 AI 陪我学这一篇

AI 会读这篇文章后给你 3-5 步学习计划, 逐步陪你学完,最后出 1-3 道题验证你掌握得怎么样。 登录后 AI 才能记住你的进度。

静态文件

离线资料下载

手册 HTML / PDF 已在后台预生成,点击后直接下载网站静态资源。