2. GEO数据库访问与检索
说实话,GEO 这个数据库刚上手时挺让人头大的——数据集成千上万,命名规则乱得像星座图。我最早做差异分析时,光找对数据集就花了两天。后来摸清了门道,发现其实就那么几步。
NCBI 网站搜索技巧:别在关键词上纠结
NCBI 的主站搜索框看似简单,但很多人直接往里敲基因名或疾病名,结果出来一堆不相关的东西。我个人的习惯是:先筛选数据集类型。
举个例子,你要找“乳腺癌”相关的表达谱芯片。直接在搜索框输入 breast cancer,点回车——会看到杂交数据、SNP 数据、高通量测序数据混在一起。怎么破?用左边的 Filter 栏。
我自己踩过的一个坑:搜 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 环境,浏览器里点几下就能拿到差异基因列表。但很多人用它时忽略了一个关键点:样本分组必须明确。
操作流程很简单:
- 打开目标数据集的 GEO Series 主页(比如
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSEXXXXX)。 - 点击页面底部的 “Analyze with GEO2R” 按钮(绿色图标)。
- 在 GEO2R 页面中,你会看到所有样本的表格。用鼠标选中你关注的样本组(按住 Ctrl 多选),然后点 “Define groups”。
- 命名分组(比如 “control” 和 “treatment”),再点 “Submit”。
- 选择校正方法(默认 Benjamini & Hochberg 就行),点 “Save all results”。
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 里做筛选。
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 下载,但这已经超出本章范围了。
一张图看懂本章流程
下面这个流程图概括了从搜索到筛选再到差异分析的完整链路。我自己画图时习惯把容易出错的节点标红,你们可以留意一下。
常见问题与避坑清单
最后,我把这些年踩过的坑整理成表格,建议保存一份。
| 场景 | 问题 | 解决方案 |
|---|---|---|
| 搜索时返回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”,他没注意看。