GEO

GEO数据挖掘实战:探针转换、批次校正与差异分析

2026/6/25
GEO数据挖掘实战:探针转换、批次校正与差异分析

BLUF 摘要

GEO是NCBI维护的国际公共基因表达数据库,存储超10亿测量值。本文详细拆解GEO的数据结构、获取方法(网页/R/Python/FTP)以及标准化分析流程:质控、预处理、差异表达、功能富集与可视化。覆盖limma、DESeq2、clusterProfiler等主流工具,并给出批次效应处理、结果筛选等实战技巧,帮助快速上手公共数据挖掘。

这篇文章最有意思的点是,作者真的把GEO的每个环节都跑了一遍,不是那种纸上谈兵的教程。我自己试过之后发现,最坑的其实不是下载数据,而是探针到基因的转换这一步——平台注释文件经常过时,一不小心就会丢大半基因。另外,那个ComBat批次校正虽然好用,但你要是样本量太小,它反而会引入假信号。这些细节文章里都提到了,挺实在的。


第一次用GEO,我差点被数据搞崩溃

说实话,我第一次打开NCBI的GEO主页时,整个人是懵的。满屏的GPL、GSM、GSE编号,跟密码似的。而且你搜一个关键词,出来几千个结果,根本不知道哪个数据集靠谱。后来踩了几个坑,才摸清楚门道。

GEO是个好东西,2000年就上线了,存了超过100亿个基因表达测量值,覆盖100多个物种,1500多个实验室往里灌数据。但问题也在这儿——数据太杂,质量参差不齐。有的数据集只有两个样本,有的批次效应明显到一眼就能看出来。

三层数据结构,其实没那么复杂

GEO的数据用三层模型组织,每个编号都有特定含义:

平台(GPL编号)

平台就是实验用的芯片或测序仪。比如GPL96对应的是Affymetrix的HG-U133A芯片。每个平台都有自己的探针注释文件,这个文件是关键,后面会提到它有多坑。

样本(GSM编号)

每个样本一个GSM编号,里面包含测量数据和元数据——生物来源、处理条件啥的。同一个平台可以对应几十上百个样本。

数据集(GSE编号)

一个GSE就是一项研究的所有样本集合。这是你下载数据的主要单位。比如GSE12345,里面可能包含正常组和疾病组的芯片数据。

数据存储有三种形式:SOFT格式(纯文本,包含完整元数据和表达矩阵)、Series Matrix(压缩的矩阵文件,行是基因,列是样本)、原始数据(CEL或FASTQ文件)。多数时候你只需要Series Matrix就够了,除非要做自己的标准化。

下载数据,我试了四种方式

网页检索

NCB上直接搜关键词或GSE编号,用过滤器缩小范围。这个最直观,但一次只能下载一个数据集,批量操作不行。

R语言(推荐)

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("GEOquery")
library(GEOquery)
gset <- getGEO("GSE12345", destdir = "./data/", GSEMatrix = TRUE)

GEOquery包是我最常用的,自动下载、解析、返回ExpressionSet对象,后面直接接limma或DESeq2就行。缺点是偶尔会因为网络问题中断,我习惯用getOption设置超时时间。

Python

pip install GEOparse
import GEOparse
gse = GEOparse.get_GEO("GSE12345", destdir="./")

Python生态用户可以用GEOparse,跟pandas、scikit-learn集成很方便。但它的文档比R包少,遇到格式不标准的GSE会报错。

FTP直接下载

适合批量下载原始数据。路径结构是ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE5290/soft/GSE5290.soft.gz。我一般只在需要CEL文件时用这个,因为10MB以下的微阵列数据直接FTP比API快。

质量控制,别信那些“直接跑差异分析”的教程

每次看到有人拿到数据就跑差异分析,我都想提醒一句:先做质控!不然结果全是噪声。

我通常从三个层面看:

样本水平:PCA和层次聚类。离群样本一眼就能看出来。有一次我跑了个GSE,PCA图上对照组和处理组完全混在一起,仔细一看,原来有两个样本标签贴反了。

探针水平:信号强度过滤。我会剔除在超过90%样本中表达值低于1的探针。这个阈值可以根据平台调整,但默认1是个不错的起点。

批次效应:如果样本来自不同批次,一定要看PCA上批次是否分离。分离了就要校正。R包arrayQualityMetrics能自动生成质控报告,省很多事。

数据预处理,探针转基因是第一大坑

探针→基因转换

这是最容易出问题的一步。一个基因可能对应多个探针,常见做法是取中位数或均值。但有个坑:平台注释文件有时候会过时,或者某些探针没有注释到基因。我处理过一个Affymetrix平台,探针总数5.4万个,能匹配到基因的只有2.8万个。剩下那些就丢了,你敢信?

解决方案:用最新的注释包,比如hgu133a.db,定期去Bioconductor更新。实在不行就手动去NCBI官网下载最新版。

标准化

芯片数据我推荐RMA(affy::rma())或分位数标准化(limma::normalizeBetweenArrays())。RNA-seq数据用DESeq2的vst转换或者edgeR的TMM标准化。

注意:RMA只适用于Affymetrix芯片。Agilent的数据要用limma::normalizeWithinArrays()

批次效应校正

ComBat(sva包里的)是目前最常用的。用法如下:

library(sva)
combat_data <- ComBat(dat = exprs(eset), batch = batch_info, mod = model_matrix)

但有个限制:如果你只有两个批次,每批次样本少于3个,ComBat的估计会不稳定,甚至可能放大噪声。这时候我会选择removeBatchEffectlimma包),或者在差异分析模型里直接把批次作为协变量。

差异表达分析,选对工具很关键

实验设计

先构建分组向量,明确对照组和处理组。对比矩阵用makeContrasts定义。

方法选择

数据类型 推荐工具 场景
芯片数据 limma+voom 各种设计,统计效能高
RNA-seq DESeq2 计数数据,考虑测序深度
两样本比较 t检验/Wilcoxon 样本量小的时候
多样本比较 ANOVA/线性模型 多组间,可控制协变量

我常用limma处理芯片数据,因为它对异常值不敏感,而且支持voom转换直接处理RNA-seq计数。跑完结果后,筛选标准:调整后p值<0.05,log2(FC)绝对值≥1。

功能富集分析,clusterProfiler是真爱

拿到差异基因后,下一步就是看它们参与了哪些通路。我用clusterProfiler包做GO和KEGG富集,代码很简单:

library(clusterProfiler)
library(org.Hs.eg.db)
ego <- enrichGO(gene = rownames(top_genes),
                OrgDb = org.Hs.eg.db,
                keyType = "SYMBOL",
                ont = "BP",
                pAdjustMethod = "fdr",
                pvalueCutoff = 0.05)

但注意:如果差异基因数量太少(比如只有几十个),富集结果往往不显著。这时候可以适当放宽p值或logFC的阈值,但一定要在论文里说明。

可视化,让数据自己说话

火山图展示差异基因的显著性和变化幅度。热图展示表达模式。富集分析的结果用气泡图或网络图。

我用ggplot2画火山图,pheatmap画热图。注意:热图最好按行标准化,否则不同基因的表达量范围不同,颜色会失真。

实用技巧和踩过的坑

数据选择策略

  • 优先找跟自己研究物种、组织、处理条件匹配的数据集
  • 芯片数据选Affymetrix或Agilent,注释完善
  • 每组至少3个生物学重复,越多越好

常见问题

  1. 批次效应过强:用ComBat校正,或者在模型中加入批次。如果批次效应大到完全覆盖了生物学差异,那就只保留同一批次的数据。
  2. 差异基因太少:检查质控是否太严。logFC阈值从1.5降到1,但要小心假阳性。也可能是实验设计的问题,处理效应本身就不强。
  3. 富集结果不理想:换数据库试试,GO不行就KEGG,再不行Reactome。另外检查探针→基因转换是否准确,这一步丢基因太多,富集肯定没戏。

工具推荐

环节 推荐 优势
数据获取 GEOquery 无缝衔接后续分析
质控 arrayQualityMetrics 自动生成报告
预处理 limma, DESeq2 社区支持强
差异分析 limma+voom (芯片), DESeq2 (RNA-seq) 可靠
富集分析 clusterProfiler 支持多种数据库
可视化 ggplot2, pheatmap 高度可定制

我的建议:从简单数据集开始练手

别一上来就挑战多因素多批次的数据。先找一个单因素设计的芯片数据(比如正常vs疾病),跑通完整流程——下载、质控、预处理、差异分析、富集。回头再看这篇文章,你会发现每一步都是有道理的。

等熟练了,再尝试整合多组学数据,或者做meta分析。但记住:GEO数据再大也是别人做的实验,你合成的数据永远替代不了自己的实验验证。分析结果顶多帮你提出假说,别把它当成真理。

常见问题(FAQ)

GEO数据下载后,探针转基因怎么那么麻烦?

平台注释文件常过时,很多探针无法匹配到基因。建议使用最新Bioconductor注释包(如hgu133a.db)或手动从NCBI下载最新注释文件。

批次效应太强怎么办?ComBat校正好用吗?

ComBat常用但样本量小(如每批<3个)时可能放大噪声。此时可用limma的removeBatchEffect或在模型中将批次作为协变量。

GEO数据那么多,怎么选靠谱的数据集?

优先选研究物种、组织、处理条件匹配的,每组至少3个重复。Affymetrix或Agilent芯片注释更完善,避免选择样本量过小或批次效应明显的数据。

Roger深圳
本文由 Roger 审核,最后更新于 2026年6月25日
联系编辑 →
标签
← 返回文章列表
分享到:微博

版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。

文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容仅供参考,请以官方信息为准。

若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。 也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。