做肿瘤生信或医疗AI的同学,日常免不了跟GEO打交道。但GEO里数据集质量参差,尤其像咽喉癌这种亚型,样本量普遍偏小,临床信息残缺更是常态。最近我在做头颈鳞癌相关课题,顺带把咽喉癌方向几个引用率较高的公开数据集(GSE2379、GSE27020、GSE25727)过了一遍,分别覆盖下咽、原发性喉癌复发、早期喉癌预后三个细分场景。本文从算法工程师视角记录开箱体验、适用任务、踩坑点,并给出可直接复用的差异表达分析R代码。
数据集一:GSE2379 — 下咽头颈鳞癌基因表达
基本参数
- 样本:38例(34肿瘤 + 4正常)
- 平台:Affymetrix HG-U95A(约12,650个转录本探针)
- 特点:专攻下咽部位,罕见癌种中样本量尚可
适用任务:二分类(肿瘤 vs 正常)、差异表达基因初筛。
踩坑记录:HG-U95A是老芯片,探针注释需用GPL91平台的旧版注释文件,直接用最新hgu95av2.db会丢大量探针。建议从GEO页面下载GPL91的soft文件本地解析。
数据集二:GSE27020 — 原发性喉癌复发预测表达
基本参数
- 样本:109例(训练集75例未复发 + 34例复发)
- 平台:Affymetrix HG-U133 Plus 2.0(GPL570)
- 特点:自带复发/未复发标签,已有文献基于该集构建SVM预测模型(筛选出725个差异基因)
适用任务:二分类(复发预测)、特征选择、预后风险建模。
踩坑记录:GEO页面提供的是合并后的表达矩阵,训练/验证集需根据样本标签自行拆分,务必查阅原始文献(PMID可查)确认划分标准,避免数据泄露。
数据集三:GSE25727 — 早期喉癌基因表达预后
基本参数
- 样本:56例早期喉癌FFPE肿瘤样本
- 平台:Illumina HumanWG-6 v3.0
- 特点:FFPE样本RNA降解严重,但该数据集质量在同类中属上乘,已用于识别早期喉癌复发相关基因(248 up / 34 down)
适用任务:预后风险分层、生存分析特征筛选、跨平台验证。
踩坑记录:FFPE表达分布与新鲜冻存样本有系统性差异,若用此集做外部验证,建议先做批次效应校正(如ComBat)。
实战:GSE27020 差异表达分析完整流程(R + limma)
以下代码直接基于GEO下载的GSEMatrix,完成探针注释、分组提取、差异分析、结果输出。
# ===== 1. 环境准备 =====
if (!require("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install(c("GEOquery", "limma", "hgu133plus2.db"))
library(GEOquery)
library(limma)
library(hgu133plus2.db)
# ===== 2. 数据下载(GSE27020) =====
gse <- getGEO("GSE27020", GSEMatrix = TRUE)
expr_data <- exprs(gse[[1]]) # 54675探针 × 109样本
dim(expr_data)
# ===== 3. 探针ID → 基因Symbol(GPL570) =====
probe_ids <- rownames(expr_data)
symbols <- mapIds(hgu133plus2.db,
keys = probe_ids,
column = "SYMBOL",
keytype = "PROBEID",
multiVals = "first")
keep <- !is.na(symbols)
expr_data <- expr_data[keep, ]
symbols <- symbols[keep]
# 多探针对应同基因取均值
expr_agg <- aggregate(expr_data, by = list(symbols), FUN = mean)
rownames(expr_agg) <- expr_agg[, 1]
expr_agg <- expr_agg[, -1] # 最终 ~2万基因 × 109样本
# ===== 4. 分组信息(复发 vs 未复发) =====
pdata <- pData(gse[[1]])
# 根据文献:75例未复发(no recurrence),34例复发(recurrence)
group <- factor(ifelse(grepl("recurrence", pdata$characteristics_ch1, ignore.case=TRUE),
"Recurrence", "No_Recurrence"))
table(group)
# ===== 5. limma 差异分析 =====
design <- model.matrix(~ 0 + group)
colnames(design) <- levels(group)
fit <- lmFit(expr_agg, design)
contrast <- makeContrasts(Recurrence - No_Recurrence, levels = design)
fit2 <- contrasts.fit(fit, contrast)
fit2 <- eBayes(fit2)
results <- topTable(fit2, adjust = "fdr", number = Inf)
deg <- results[abs(results$logFC) > 1 & results$adj.P.Val < 0.05, ]
nrow(deg) # 通常得到数百个显著差异基因,与文献725个基本吻合
# ===== 6. 导出 =====
write.csv(deg, "GSE27020_DEG_results.csv")
head(deg[order(-abs(deg$logFC)), ], 20)
代码跑通后,即可获得该数据集的差异表达基因列表,可直接用于后续建模或富集分析。
三个数据集横向对比与选型建议
| 数据集 | 样本量 | 细分场景 | 推荐用途 |
|---|---|---|---|
| GSE2379 | 38 | 下咽癌 vs 正常 | 小样本探索、差异初筛 |
| GSE27020 | 109 | 原发性喉癌复发预测 | 分类建模、特征筛选(首选) |
| GSE25727 | 56 | 早期喉癌预后 | 生存特征筛选、外部验证 |
若您想进行复现性研究,GSE27020与GSE25727常被配对使用(前者训练,后者验证),已有文献验证过该组合的可行性。
关于数据获取的一点补充
上述三个数据集均来自GEO公开数据库,直接通过GEOquery即可下载。但GEO原始数据常存在平台注释不一致、临床信息分散等问题,预处理耗时较长。笔者在调研过程中,发现一个名为 Qianfanghub 的医学科研数据索引平台,它对公开数据集做了体系化整理(覆盖ICD 23大疾病体系),并附带清晰的模态、样本量、任务类型标签,可快速定位所需数据。咽喉癌相关数据集的直达索引页如下(供参考):
- GSE2379:
https://www.qianfanghub.com/dataset/neoplasms/throat-cancer/gse2379 - GSE27020:
https://www.qianfanghub.com/dataset/neoplasms/throat-cancer/gse27020 - GSE25727:
https://www.qianfanghub.com/dataset/neoplasms/throat-cancer/gse25727
以上即是三个咽喉癌公开数据集的开箱评测与实战代码,全部代码已在本地R 4.2环境下验证通过。如果大家在实际跑数时遇到注释或分组提取的问题,欢迎留言交流。