2. GEO数据库访问与检索

说实话,GEO 这个数据库刚上手时挺让人头大的——数据集成千上万,命名规则乱得像星座图。我最早做差异分析时,光找对数据集就花了两天。后来摸清了门道,发现其实就那么几步。

NCBI 网站搜索技巧:别在关键词上纠结

NCBI 的主站搜索框看似简单,但很多人直接往里敲基因名或疾病名,结果出来一堆不相关的东西。我个人的习惯是:先筛选数据集类型。

举个例子,你要找“乳腺癌”相关的表达谱芯片。直接在搜索框输入 breast cancer,点回车——会看到杂交数据、SNP 数据、高通量测序数据混在一起。怎么破?用左边的 Filter 栏。

技巧: 在搜索结果页左侧,点击 “DataSets” 标签旁的 “Filter”,勾选 “Expression profiling by array” 和 “Homo sapiens”。这样能过滤掉 80% 的噪声。

我自己踩过的一个坑:搜 GSE 编号时,有时候会跳到完全不同的页面。比如你输入 GSE12345,NCBI 可能会直接跳到那个 Series 的主页。但如果你是想找包含这个系列的数据集列表,最好用 “GEO Datasets” 子库去搜。

常用的搜索语法其实很简单,记住下面这几个就够用:

# 搜索基因符号
GENE[Gene Symbol] AND "breast cancer"[Title]

# 搜索平台
"GPL570"[Platform] AND "lung cancer"[Description]

# 搜索特定类型的数据
"Expression profiling by array"[DataSet Type] AND "diabetes"[MeSH Terms]

嗯,这里的 [MeSH Terms] 是 NCBI 的医学主题词,比纯文本搜索精准得多。我在一次项目中用这招,把 200 多个无关数据集一次性筛掉,只剩下 12 个有效候选。

GEO2R 在线工具:不用写 R 也能做差异分析

GEO2R 是 NCBI 官方提供的在线差异分析工具。你不需要装 R 环境,浏览器里点几下就能拿到差异基因列表。但很多人用它时忽略了一个关键点:样本分组必须明确。

操作流程很简单:

  1. 打开目标数据集的 GEO Series 主页(比如 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSEXXXXX)。
  2. 点击页面底部的 “Analyze with GEO2R” 按钮(绿色图标)。
  3. 在 GEO2R 页面中,你会看到所有样本的表格。用鼠标选中你关注的样本组(按住 Ctrl 多选),然后点 “Define groups”。
  4. 命名分组(比如 “control” 和 “treatment”),再点 “Submit”。
  5. 选择校正方法(默认 Benjamini & Hochberg 就行),点 “Save all results”。
注意: GEO2R 的底层用的是 limma 包。它假设数据已经过 log2 转换。如果原始数据是未转换的 Affymetrix 芯片,结果可能会偏差很大。我遇到过一例,GEO2R 给出的 top 基因全是假阳性,因为数据集本身是 log2 之前的强度值。

GEO2R 会生成一个 R 脚本,你可以下载下来自己跑。脚本里包含了完整的数据加载、归一化、差异分析代码。我个人建议:即使在线结果漂亮,也一定下载这个 R 脚本,因为你可以事后检查参数,甚至修改对比组。

看看典型的输出结果长什么样:

ID	adj.P.Val	P.Value	t	B	logFC	Gene.symbol	Gene.title
1007_s_at	0.000012	0.000001	12.34	8.56	2.34	DDR1	Discoidin domain receptor tyrosine kinase 1
1053_at	0.000045	0.000003	10.21	7.12	1.98	RFC2	Replication factor C subunit 2
117_at	0.000089	0.000007	9.87	6.45	-1.56	HSPA6	Heat shock 70kDa protein 6

这个表格里重点关注 adj.P.Val(校正后 p 值)和 logFC(差异倍数对数)。我一般取 adj.P.Val < 0.05 且 |logFC| > 1 作为筛选阈值。注意,有些文章里 logFC 是自然对数还是以 2 为底?GEO2R 默认是以 2 为底,所以 1 对应 2 倍变化。

批量记录筛选:别手动复制粘贴了

当你要处理几十个数据集时,一个个点开页面看样本信息会疯掉。NCBI 提供了 GEO 批量下载 功能。你可以通过构建一个包含多个 GSE 编号的查询 URL,一次性获取所有概要信息。

具体做法:在 GEO 主页的搜索框里输入多个 GSE 编号,用 OR 连接:

GSE12345 OR GSE67890 OR GSE11111

然后点击搜索。结果页会列出这些数据集的标题、样本数、平台等关键元数据。你可以直接复制表格到 Excel 里做筛选。

批量下载元数据的高级方法: 用 NCBI 的 Entrez Programming Utilities(E-utilities)。通过 HTTP 请求获取 XML 或 JSON 格式的完整信息。例如,获取 GSE12345 的概要信息:
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=gds&id=12345&retmode=json
返回的 JSON 结构清晰,适合用 Python 的 requests 库解析。我在一次大项目里用这个方式抓取了 300 多个数据集的元数据,半小时搞定。

对于芯片数据,你还可以批量下载原始 CEL 文件。在 Series 页面的 “Supplementary file” 区域,如果数据是公开的,会有 “Download” 链接。注意:很多大数据集(比如 RNA-seq 的 FASTQ)只提供 SRA 编号,你需要用 fasterq-dump 或 prefetch 下载,但这已经超出本章范围了。

一张图看懂本章流程

下面这个流程图概括了从搜索到筛选再到差异分析的完整链路。我自己画图时习惯把容易出错的节点标红,你们可以留意一下。

GEO 数据库访问与检索核心流程 ① 确定研究问题 ② NCBI GEO 搜索 关键词 + 过滤器 批量记录筛选 ③ 选择目标数据集 ④ GEO2R 差异分析 样本分组定义 下载 R 脚本 ⑤ 差异基因列表 ⚠ 关键提醒 1. 搜索时善用 MeSH 词和过滤器,避免结果杂乱 2. GEO2R 前务必检查数据是否已 log2 转换

常见问题与避坑清单

最后,我把这些年踩过的坑整理成表格,建议保存一份。

场景 问题 解决方案
搜索时返回0结果 关键词太宽泛或拼写错误 用 Organism[ORGN] 缩小范围,如 breast cancer[Title] AND Homo sapiens[ORGN]
GEO2R 分组后报错 样本组之间数量不均衡,或包含未定义组 确保每组至少3个样本;删除多余的未分组样本
下载的 R 脚本运行失败 R 版本不兼容或缺少包 先运行 BiocManager::install(c("GEOquery","limma"))
批量筛选时找不到所需元数据 某些数据集的标题/摘要过于简略 改用 E-utilities 获取详细XML,从中提取 Sample@characteristics 字段

记住:数据质量 > 分析技巧。花20分钟检查样本分组和平台信息,能避免后续浪费一天时间。

我曾经接手过一个项目,同事用 GEO2R 跑了一晚上,结果发现对照组里混了两个肿瘤样本——因为原始的 characteristics 字段写的是 “normal adjacent to tumor”,他没注意看。