GEO数据库数据下载与解析:公共数据挖掘入门

726 字
4 分钟
GEO数据库数据下载与解析:公共数据挖掘入门

GEO(Gene Expression Omnibus)是全球最大的基因表达公共数据库。截至 2025 年已收录超过 600 万样本。对生信新手来说,GEO 是练手的最佳数据来源——数据量适中、格式统一、免费。

实测环境:Debian 12,R 4.x + GEOquery。

1. GEO 数据层级#

GPLxxxx (Platform 平台) — 测序芯片/测序仪型号
└── GSExxxx (Series 数据集) — 一个研究项目的数据集合
└── GSMxxxx (Sample 样本) — 单个样本的表达数据

你要下载的最小单位是 GSE 编号。

2. 安装 GEOquery#

if (!require("BiocManager")) install.packages("BiocManager")
BiocManager::install("GEOquery")
library(GEOquery)

3. 下载与解析#

# 下载GSE数据集
gse <- getGEO("GSE183947", GSEMatrix = TRUE, getGPL = FALSE)
# 如果返回list(多个平台),取第一个
if (inherits(gse, "list")) {
eset <- gse[[1]]
} else {
eset <- gse
}
# 提取表达矩阵
expr <- exprs(eset)
head(expr[, 1:5])
# 提取样本注释
pheno <- pData(eset)
head(pheno[, c("title", "geo_accession", "source_name_ch1")])

4. 解析样本信息#

GEO 的样本注释通常藏在 characteristics_ch1 列里,需要手动解析:

library(tidyverse)
# 提取分组信息
sample_info <- pheno %>%
select(title, geo_accession, characteristics_ch1) %>%
mutate(
condition = str_extract(characteristics_ch1, "condition: (.*)"),
tissue = str_extract(characteristics_ch1, "tissue: (.*)")
) %>%
mutate(across(c(condition, tissue), ~ str_remove(.x, ".*: ")))

5. 批量下载多个GSE#

gse_list <- c("GSE183947", "GSE150910", "GSE164690")
for (gse_id in gse_list) {
cat("Downloading:", gse_id, "\n")
gse <- tryCatch(
getGEO(gse_id, GSEMatrix = TRUE, getGPL = FALSE),
error = function(e) { cat("ERROR:", e$message, "\n"); return(NULL) }
)
if (!is.null(gse)) {
saveRDS(gse, paste0(gse_id, ".rds"))
}
Sys.sleep(2) # 礼貌延迟,避免被NCBI限速
}

6. GEO2R 替代方案#

NCBI 的在线工具 GEO2R 功能有限。用 R 本地做差异分析替代:

library(limma)
# 构建设计矩阵
condition <- factor(c(rep("Control", 3), rep("Treatment", 3)))
design <- model.matrix(~ 0 + condition)
colnames(design) <- levels(condition)
# limma差异分析
fit <- lmFit(expr, design)
contrast <- makeContrasts(Treatment - Control, levels = design)
fit2 <- contrasts.fit(fit, contrast)
fit2 <- eBayes(fit2)
results <- topTable(fit2, number = Inf, adjust.method = "BH")
# 筛选差异基因
sig <- results %>%
filter(adj.P.Val < 0.05, abs(logFC) > 1)

7. 国内下载加速#

NCBI GEO 服务器在美国。getGEO 默认走 HTTPS 下载,国内可能极慢:

# 方案1:用代理
Sys.setenv(http_proxy = "http://127.0.0.1:7890")
# 方案2:手动下载后本地读
# 从 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE183947
# 底部 "Download family" → Series Matrix File(s)
# 下载后用:
gse <- getGEO(filename = "GSE183947_series_matrix.txt.gz")
# 方案3:用GEOmirror包(国内镜像,不保证最新)
# remotes::install_github("jmzeng1314/GEOmirror")

8. 踩坑#

坑1:getGEOcannot open URL——网络问题。换代理或手动下载。

坑2:表达矩阵已经是 log2 转换的——GEO 上的数据很多已经 log2 过了,别再次 log2。

坑3:多个平台的数据——一个 GSE 可能包含不同芯片平台(GPL)的数据。getGEO 返回 list,每个元素对应一个平台。要用 sapply(gse, function(x) annotation(x)) 查看并选择合适的。

坑4:characteristics_ch1 列格式不统一——每个研究者写法不同,有的用 condition: Cancer,有的用 group: Tumor。需要人工看,没法完全自动化。

坑5:样本量太小做差异分析——GEO 上很多数据集 n=2 或 n=3,用 limma 或 DESeq2 跑差异分析 power 极低。先用 PCA 看看是否能分开,再决定是否做差异分析。


本文于 2025-06-10 实测。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

GEO数据库数据下载与解析:公共数据挖掘入门
https://fg.ink/posts/geo-data-download-geoquery/
作者
风观
发布于
2025-01-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
50
分类
1
标签
29
总字数
61,837
运行时长
0
最后活动
0 天前

文章目录