GEO 这个库,我前前后后用了快八年,从最早读研时帮师兄跑差异表达,到后来自己带项目做数据挖掘,踩过的坑比跑过的样本还多。很多人第一次听到“基因表达综合数据库”这名字,第一反应是“哦,一个存数据的仓库”,然后就去搜教程、抄代码,结果下载下来一堆 SOFT、MINiML、Series Matrix 文件,打开一看全是注释行和探针 ID,瞬间懵掉。这篇东西就是想把这件事讲透:GEO 到底是什么、它的数据是怎么组织的、怎么从里面精准捞出你要的那一批样本、怎么把探针矩阵变成能直接分析的基因表达矩阵,以及那些教程里从来不写、但你一定会撞上的坑。不管你是刚进实验室、连 R 都没装利索的新手,还是已经能跑流程但总在数据清洗环节卡住的老手,下面这些内容应该都能对上你的痛点。我尽量不堆术语,能用生活化的比喻就用比喻,但该严谨的地方一个参数都不省,毕竟这行里一个样本分组搞错,后面所有结论都是白搭。
1. 先搞清楚 GEO 到底是个什么东西
1.1 它不是“一个数据库”,而是“四层嵌套的数据结构”
很多人把 GEO 当成一个平铺的表格库,这是最大的误解。GEO 的本质是一个分层索引系统,从大到小依次是 Platform(平台)、Series(系列)、Sample(样本)、DataSet(数据集)。你可以把它想象成一个大型图书馆:Platform 是“这本书用的是什么语言写的”(比如 Affymetrix HG-U133 Plus 2.0 芯片,或者 Illumina 某款测序仪),Series 是“一整套丛书”(一个研究项目上传的全部数据),Sample 是“丛书里的每一册”(每一个生物学重复),DataSet 则是官方后期整理过的“精选合集”。
这个层级关系决定了你检索时的策略。新手常犯的错是直接搜关键词然后随便点一个 Series 就下,结果发现里面只有 3 个样本,根本做不了差异分析。正确的思路是先想清楚你要回答的生物学问题,再反推需要什么样的 Series:是病例对照、是时间序列、还是药物处理梯度?然后看这个 Series 下挂了多少 Sample、用的什么 Platform、有没有原始数据(RAW)还是只有处理过的矩阵。
我见过太多人卡在第一步,就是因为没理解这个嵌套关系。举个具体例子:你在搜索框输入某个疾病名称,返回几十条 Series,每条下面标注的样本数从 2 到 200 不等。如果你要做的是两组比较,样本数少于 6(每组 3 个)的基本没有统计效力,直接跳过;如果你要做的是生存分析,那还得看这个 Series 有没有附带的临床信息表。这些判断都建立在你对四层结构的理解之上。
1.2 Series Matrix 文件和 RAW 文件,到底该下哪个
这是新手问得最多的问题,没有之一。简单说:Series Matrix 是作者或官方已经处理好的表达矩阵,通常是探针级别的强度值,经过了一定的背景校正和标准化;RAW 文件则是原始的下机数据,芯片的是 CEL 文件,测序的是 FASTQ 或 count 矩阵。
我的建议很直接: 如果你只是想做常规的差异表达分析,优先下 Series Matrix 。原因有三:一是体积小,几十兆就能搞定,不像 RAW 动辄几个 G;二是省去了标准化这一步,虽然不同平台的处理方式不一样,但至少作者已经跑过一轮;三是格式统一,读进来就是一个行为探针、列为样本的矩阵,配合平台注释文件就能映射到基因。
但 Series Matrix 有个致命问题:它里面的“标准化”到底做到什么程度,你根本不知道。有的作者只做了 log2 转换,有的做了 RMA,有的甚至没做任何校正。所以拿到矩阵后第一件事永远是看数值分布——如果最大值是 60000 多,那多半是原始强度值,需要 log2;如果最大值在 15 左右,那大概率已经 log 过了。这个判断我在后面实操部分会给出具体的检查代码。
至于 RAW 文件,什么时候必须下?两种情况:一是你要做更精细的分析,比如探针水平的可变剪接、或者需要自己控制标准化参数;二是这个 Series 压根没提供 Matrix 文件,只有 CEL。后者在早期数据里很常见。下 RAW 的代价是处理流程长,芯片数据要用 affy 或 oligo 包跑 RMA,测序数据要做比对和定量,对算力有一定要求。
1.3 平台注释:探针 ID 到基因 Symbol 的那道桥
GEO 里最让人抓狂的环节之一,就是拿到矩阵后发现行名全是
1552258_at
、
A_23_P12345
这种鬼东西。这就是探针 ID,它和基因名之间的映射关系存在 Platform 的注释文件里。每个 Platform 都有一个 GPL 编号,比如 GPL570 对应 Affymetrix HG-U133 Plus 2.0,GPL96 对应 HG-U133A。
这里有个关键认知: 同一个基因可能对应多个探针,一个探针也可能对应多个基因 。这不是数据错误,而是生物学现实——可变剪接、探针设计区域重叠都会导致这种情况。所以从探针矩阵到基因矩阵的转换,本质上是一个“多对多”的坍缩过程,你必须决定怎么聚合:是取表达量最大的探针代表这个基因,还是取所有探针的均值,还是用某种加权方式。
我个人的习惯是取最大均值探针(max mean),理由是这个探针的信号最强、最稳定,受背景噪声影响最小。但这个选择不是绝对的,如果你的研究关注的是某个基因的特定转录本,那取均值可能更合适。这个决策点我会在第三节详细展开,因为它是整个流程里最容易被忽略、却对下游结果影响最大的步骤之一。
2. 检索与样本筛选:怎么从几万条记录里捞出你要的那一批
2.1 检索式怎么写才不遗漏也不冗余
GEO 的检索框支持布尔逻辑,但它的语法和 PubMed 不完全一样,很多人直接照搬 PubMed 的检索式,结果要么漏掉大量相关记录,要么返回一堆无关的。我的经验是分三步走:先用宽泛的关键词摸清这个领域在 GEO 里大概有多少数据,再用限定条件收窄,最后人工过一遍标题和摘要。
具体来说,检索式里可以用的字段包括研究类型、物种、平台、样本数范围等。比如你想找人类某疾病的病例对照芯片数据,一个比较稳的写法是把疾病名称和物种限定组合起来,再排除掉非表达谱的类型。这里要注意,GEO 的物种字段用的是学名,人就是 Homo sapiens,小鼠是 Mus musculus,写俗名会搜不到。
还有一个技巧:善用“Series”类型的过滤。GEO 里除了 Series,还有 Samples 和 Platforms 的独立记录,如果你在检索时不过滤类型,返回结果会非常杂。我一般直接在检索结果页左侧勾选 Series,这样出来的每一条都是一个完整的研究项目,点进去能看到全部样本和设计信息。
2.2 看一个 Series 值不值得用,重点看这五个地方
点进一个 Series 页面后,信息量很大,但真正决定“用不用”的其实就五块内容。第一块是 Summary,也就是研究摘要,这里会写清楚实验设计、分组情况、处理条件。第二块是 Overall design,这一栏比 Summary 更具体,通常会列出每组多少个样本、用了什么处理。第三块是 Samples 列表,点开每个样本能看到它的标题、来源组织、特征信息(characteristics)。第四块是 Platform,确认芯片型号或测序平台,这决定了你后面用哪个注释包。第五块是 Supplementary file,看看有没有作者额外上传的临床信息表、分组表。
我判断一个 Series 能不能用的标准很实际: 样本分组是否清晰、每组重复数是否够、有没有明显的批次混杂 。所谓批次混杂,就是比如所有病例样本都在第一批测的、所有对照都在第二批测的,这种数据你后面做差异分析,得到的差异基因里混着大量批次效应,根本分不清是疾病导致的还是测序批次导致的。这种情况在 GEO 里不算少见,尤其是早期上传的数据。
2.3 样本分组信息的提取:别信标题,信 characteristics
这是血泪教训。很多 Series 的样本标题写得很随意,比如
GSM123456
、
Sample 1
、
Control_rep1
,光看标题你根本不知道它属于哪一组。真正的分组信息藏在每个样本的 characteristics 字段里,那里会有类似
disease state: tumor
、
tissue: liver
、
treatment: vehicle
这样的键值对。
我的做法是把所有样本的 characteristics 导出来,做成一张表,然后人工核对分组。这一步看起来笨,但极其必要。我遇到过标题写着“normal”但 characteristics 里 disease state 是“adjacent normal”的样本——这两者在某些研究里含义不同,前者是健康人,后者是癌旁组织,混在一起分析结论就偏了。还有的 Series 里 characteristics 字段不统一,有的样本有 treatment 这一项,有的没有,这种数据要么放弃,要么仔细甄别后只用信息完整的子集。
提示:导出 characteristics 时,建议同时保留样本的 GSM 编号、标题、来源组织和所有特征键值对,做成宽表。后面无论用 R 还是 Python 处理,这张表都是你对齐分组和表达矩阵的唯一依据。
3. 数据下载与矩阵构建:从原始文件到可分析矩阵
3.1 下载策略:手动、脚本还是第三方工具
下载 GEO 数据有三条路。第一条是网页手动点,适合样本量小、只做一次的情况,缺点是容易漏文件、文件名混乱。第二条是用 R 的 GEOquery 包,这是最主流的方式,一行
getGEO()
就能把 Series Matrix 拉下来并解析成 ExpressionSet 对象。第三条是用一些命令行工具或第三方脚本批量下载,适合需要处理几十个 Series 的场景。
我平时主要用 GEOquery,原因是它把下载和解析合二为一,返回的对象里直接包含了表达矩阵、样本信息(phenoData)和平台信息(featureData)。但 GEOquery 有个坑:它对网络状况比较敏感,大文件下载经常中断,而且默认的超时时间偏短。我的处理办法是先设置更长的超时时间,再配合本地缓存目录,这样重复运行同一个 Series 时不会反复下载。
如果你要批量处理很多 Series,我建议写一个循环,把每个 Series 的 GSM 列表、分组信息、矩阵分别存成本地文件,而不是每次都重新拉。这样即使某个 Series 解析失败,也不影响其他的,而且后面做质控和合并时读取本地文件快得多。
3.2 矩阵读进来之后,先做这三项检查
拿到表达矩阵,别急着做差异分析,先做三项检查,能帮你避开后面 80% 的坑。
第一项是 维度检查 。看看矩阵有多少行多少列,行数应该和平台上的探针数大致对得上,列数应该等于样本数。如果列数明显少于你在网页上看到的样本数,说明有些样本没有表达数据,可能是质控没通过被作者剔除了,这时候你要去 phenoData 里核对到底哪些样本还在。
第二项是 数值分布检查 。算一下每列的中位数、四分位数,画个箱线图。如果各样本的中位数差异很大,说明标准化不充分或者存在严重的批次效应。理想情况下,所有样本的箱线图应该在同一水平线上。如果最大值超过 100,基本可以确定没做 log 转换,需要手动 log2。这里有个细节:log2 之前要检查有没有 0 或负值,有的话要么加一个小的偏移量,要么用其他转换方式。
第三项是 缺失值和重复探针检查 。看看矩阵里有没有 NA,占比多少。少量 NA 可以接受,后面做分析时用插补或者直接剔除该探针;如果 NA 比例很高,这个 Series 的数据质量就值得怀疑了。重复探针的问题前面提过,同一个基因多个探针,需要决定聚合策略。
3.3 探针到基因的映射:三种聚合策略的取舍
这一步是整个流程的核心决策点,我把它单独拎出来讲。假设你有一个矩阵,行是探针、列是样本,平台注释文件告诉你每个探针对应哪个基因 Symbol。现在要把探针矩阵变成基因矩阵,有三种常见做法。
第一种是 取最大均值探针 。对每个基因,计算它所有对应探针在所有样本上的平均表达值,选均值最大的那个探针代表这个基因。这种做法的逻辑是:表达量最高的探针通常信号最可靠,受背景噪声影响最小。缺点是可能丢失其他转录本的信息,而且如果某个基因的多个探针表达模式差异很大(比如可变剪接),取最大会掩盖这种异质性。
第二种是 取所有探针均值 。把同一基因的所有探针表达值平均。这种做法更“平滑”,但问题是如果某个探针设计得不好、信号很低,会拉低整个基因的表达估计。而且当探针数量差异很大时(有的基因 1 个探针,有的 10 个),均值的可比性会受影响。
第三种是 保留所有探针,不做聚合 。这种做法在某些特定分析里是合理的,比如你关注的是探针水平的差异,或者要做可变剪接分析。但对于常规的基因水平差异表达,保留多探针会让后续的统计检验变得复杂,而且同一个基因的多个探针结果可能互相矛盾。
我个人的默认选择是第一种,取最大均值探针。这个策略在绝大多数差异表达场景下表现稳定,而且实现简单。但我要强调,这不是唯一正确答案。如果你的研究问题涉及转录本异构体,或者你发现某个关键基因的多个探针表达模式截然不同,那就应该重新考虑聚合策略,甚至回到探针水平做分析。
3.4 一个完整的矩阵构建流程示例
下面给出一段可以直接参考的 R 代码框架,展示从 GEOquery 下载到基因矩阵输出的完整链路。注意这只是框架,具体参数要根据你的数据调整。
# 加载必要的包
library(GEOquery)
library(dplyr)
# 设置超时和缓存目录
options(timeout = 600)
dir.create("geo_cache", showWarnings = FALSE)
# 下载并解析 Series Matrix
gset <- getGEO("GSEXXXXX", destdir = "geo_cache", GSEMatrix = TRUE)
# 如果返回的是列表(多个平台),取第一个
if (length(gset) > 1) gset <- gset[[1]]
# 提取表达矩阵和样本信息
expr <- exprs(gset)
pheno <- pData(gset)
# 检查数值分布,决定是否 log2
if (max(expr, na.rm = TRUE) > 100) {
expr[expr <= 0] <- NA
expr <- log2(expr)
}
# 提取平台注释(探针到基因的映射)
gpl <- annotation(gset)
plat <- getGEO(gpl, destdir = "geo_cache")
anno <- Table(plat)[, c("ID", "GENE_SYMBOL")]
# 合并并聚合:取最大均值探针
expr_df <- as.data.frame(expr)
expr_df$probe <- rownames(expr_df)
merged <- merge(anno, expr_df, by.x = "ID", by.y = "probe")
merged <- merged[!is.na(merged$GENE_SYMBOL) & merged$GENE_SYMBOL != "", ]
# 计算每个探针的均值并选最大
sample_cols <- setdiff(colnames(merged), c("ID", "GENE_SYMBOL"))
merged$mean_expr <- rowMeans(merged[, sample_cols], na.rm = TRUE)
merged <- merged[order(merged$GENE_SYMBOL, -merged$mean_expr), ]
gene_expr <- merged[!duplicated(merged$GENE_SYMBOL), ]
# 整理最终矩阵
rownames(gene_expr) <- gene_expr$GENE_SYMBOL
gene_matrix <- gene_expr[, sample_cols]
这段代码里有几个地方值得说明。
getGEO
返回的对象可能是列表,取决于这个 Series 是否涉及多个平台,所以要先判断。log2 转换前把非正值设为 NA,是因为 log2 对 0 和负数无定义,直接算会报错或产生 -Inf。聚合那一步用
order
加
duplicated
的组合,是先按基因名排序、再按均值降序,这样每个基因第一次出现的就是均值最大的探针,逻辑上等价于取最大均值探针,但比循环快得多。
4. 质控、标准化与批次效应:那些决定成败的中间环节
4.1 为什么质控不能跳过
很多人拿到矩阵就直接跑差异分析,结果出来一堆基因,但重复性很差,换个数据集就复现不了。问题往往出在质控环节被跳过了。质控的目的不是“让数据好看”,而是识别出那些质量差的样本,决定是剔除还是保留。
芯片数据的质控指标包括阵列的伪影、背景强度、探针水平的异常值等。如果你下的是 RAW 的 CEL 文件,可以用 affyPLM 包做拟合,看 NUSE 和 RLE 图,那些明显偏离的样本就是可疑的。如果你只有 Series Matrix,质控手段有限,但至少可以看样本间的相关性——计算样本两两之间的相关系数,如果某个样本和同组其他样本的相关性明显偏低,那它可能就是离群样本。
这里我要提醒一个常见误区: 不要为了追求“干净”而随意剔除样本 。每剔除一个样本都要有依据,要么是质控指标明显异常,要么是分组信息存疑。如果只是因为它“看起来不太合群”就删掉,很可能删掉的是真实的生物学变异,反而让结论失真。
4.2 标准化方法的选择逻辑
标准化要解决的问题是:不同样本之间因为技术原因(比如杂交效率、测序深度)导致的整体表达水平差异,需要被校正掉,才能比较生物学差异。芯片数据常用的标准化方法有 RMA、MAS5、GCRMA 等,测序数据常用的是 TPM、FPKM 或者 DESeq2 的 median of ratios。
如果你下的是已经处理过的 Series Matrix,标准化这一步作者已经做过了,你不需要重做,但需要知道他用的是什么方法。这个信息通常在 Series 页面的数据处理描述里,或者在相关文献里。如果你下的是 RAW 数据,那标准化就是你必须自己做的第一步。芯片数据我一般用 RMA,因为它对低表达探针的处理比较稳健,而且输出的是 log2 尺度,后续分析方便。
测序数据的标准化要更小心。TPM 和 FPKM 适合样本内比较和可视化,但不适合直接拿来做差异表达分析,因为它们的方差和均值相关,违反了多数统计检验的假设。做差异表达应该用原始 count 矩阵配合 DESeq2 或 edgeR,这两个工具内部会做合适的标准化。
4.3 批次效应:GEO 数据里最隐蔽的杀手
批次效应是指因为实验时间、操作人员、试剂批次等技术因素导致的系统性差异。在 GEO 这种公共数据里,批次效应几乎无处不在,因为很多 Series 是多个批次合并上传的,甚至有些 Series 本身就是多个研究合并的。
识别批次效应的方法很多,最直观的是 PCA。把样本投影到前两个主成分上,如果样本按批次而不是按生物学分组聚集,那批次效应就很严重。另一个方法是看样本相关性热图,如果同一批次的样本之间相关性异常高,也是信号。
校正批次效应有几种策略。如果批次信息和生物学分组完全混杂(比如所有病例在一个批次、所有对照在另一个批次),那抱歉,这种数据没法校正,只能放弃。如果批次和分组有部分交叉,可以用 ComBat 或者 limma 的 removeBatchEffect 做校正。但要注意,校正批次效应是有代价的——它会引入额外的假设,可能过度校正掉真实的生物学信号。我的原则是:能不用就不用,如果要用,一定要在校正前后都做一次 PCA 对比,确认生物学分组仍然可分。
注意:ComBat 校正后的矩阵不能直接用于某些基于计数的模型(比如 DESeq2),因为校正后的值不再是整数。如果下游要用这类工具,应该把批次作为协变量放进模型,而不是预先校正矩阵。
5. 常见问题与排查实录
5.1 下载失败、解析报错、文件损坏
这是最高频的问题。GEOquery 下载大文件时经常因为网络波动中断,报错信息五花八门,有的是超时,有的是 gz 文件解压失败,有的是返回的对象为空。我的排查顺序是这样的:先看缓存目录里文件大小是否正常,如果明显偏小,说明没下完,删掉重下;如果文件大小正常但解析报错,可能是文件本身损坏,换个时间重下或者手动从网页下载后放到缓存目录;如果返回对象为空,检查 GSE 编号是否正确,有些编号对应的是已经撤稿的记录。
还有一个隐蔽的坑:某些 Series 的 Matrix 文件里,样本列的顺序和 phenoData 里的顺序不一致。这种情况极少见,但一旦发生,你的分组就会全部错位。防范办法是在合并矩阵和分组信息时,用 GSM 编号做匹配,而不是依赖列的顺序。
5.2 探针注释缺失或过时
平台注释文件不是永远准确的。有些老平台的注释更新滞后,新的基因 Symbol 没有收录;有些探针在注释文件里对应多个基因,用分号隔开;还有些探针压根没有对应的基因 Symbol,注释为空。这些情况都会导致你在映射时丢失一部分探针。
处理策略是:对于多基因对应的探针,可以拆开分别保留,也可以只保留第一个,取决于你的分析目的;对于注释为空的探针,直接剔除,但要在方法部分说明剔除了多少;对于注释过时的平台,可以考虑用更新的注释包,比如 Bioconductor 上有些平台有社区维护的更新版注释。
5.3 分组信息混乱导致的分析偏差
前面提过 characteristics 字段不统一的问题,这里展开说排查方法。把 phenoData 导出后,先看每个特征字段的取值分布,找出那些取值特别少或者特别杂的字段。然后针对你的分组变量,逐个样本核对。如果发现某个样本的分组信息缺失或者矛盾,最稳妥的做法是查原始文献——Series 页面通常会附上相关论文的链接,论文的方法部分会详细描述分组标准。
我遇到过一个典型案例:某个 Series 里 characteristics 写着
group: control
和
group: treated
,但 treated 组里混了几个样本的 treatment 字段是
none
。这种矛盾信息说明作者在上传时可能填错了,需要结合样本标题和文献描述来判断。这种时候宁可少用几个样本,也不要把分组搞错。
5.4 表达矩阵里出现负值或极端值
log2 转换后的矩阵出现负值是正常的,因为原始值小于 1 时 log2 就是负的。但如果出现很大的负值(比如 -10 以下),说明原始值接近 0,这些通常是低表达或者未检测到的探针。处理方式可以是设一个阈值,把低于阈值的值设为阈值,或者直接保留,因为后续的差异分析工具通常会对低表达基因做过滤。
极端大值则要警惕,可能是探针杂交异常或者图像伪影。检查方法是看这个探针在所有样本上的分布,如果只有一个样本异常高,那很可能是技术问题,可以考虑把这个值设为 NA 或者用其他样本的中位数替代。但如果是多个样本都高,那可能是真实的生物学信号,不要轻易动。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| getGEO 返回空对象 | GSE 编号错误或记录已撤 | 核对编号,网页确认记录存在 |
| 下载中断或文件偏小 | 网络超时 | 增大 timeout,删缓存重下 |
| 矩阵列数与样本数不符 | 部分样本无表达数据 | 核对 phenoData,确认保留样本 |
| 箱线图中位数差异大 | 标准化不足或批次效应 | 检查是否需 log2,做 PCA 看批次 |
| 探针映射后基因数骤减 | 注释缺失或多对多 | 检查注释文件,决定聚合策略 |
| 分组与预期不符 | characteristics 填写错误 | 查原始文献,逐样本核对 |
| 差异基因复现性差 | 批次混杂或质控缺失 | 做 PCA 和相关性分析,评估批次 |
6. 从矩阵到结论:分析前的最后准备
6.1 样本分组表的最终确认
走到这一步,你手上应该有两样东西:一个是基因表达矩阵(行是基因、列是样本),一个是样本信息表(行是样本、列包括 GSM 编号、分组、其他协变量)。在跑任何统计模型之前,必须确认这两者的样本顺序完全一致。我的做法是把矩阵的列名和分组表的样本 ID 做一次集合比较,确认没有遗漏也没有多余,然后按相同顺序重排。
这个步骤听起来琐碎,但它是后面所有分析的基础。我见过不止一次因为列顺序错位导致对照组和实验组颠倒的案例,而且这种错误在结果层面往往不会报错,只会给你一个“看起来合理但完全错误”的差异基因列表。防范成本很低,收益极高。
6.2 低表达基因过滤的阈值怎么定
差异表达分析前通常会过滤掉低表达基因,目的是减少多重检验的负担、提高统计效力。过滤阈值没有统一标准,常见做法是要求基因在至少一定比例的样本中表达值高于某个分位数。比如要求基因在至少 25% 的样本中表达值大于矩阵的整体 25% 分位数。
这个阈值的设定要结合你的数据特点。如果样本量小,过滤太狠会丢失真实信号;如果样本量大,适度过滤能显著提升分析效率。我的经验是先用一个温和的阈值(比如在至少 20% 样本中表达),跑一遍分析看看结果是否合理,再根据需要调整。不要一上来就用很激进的阈值,那样可能把一些低表达但有生物学意义的基因过滤掉。
6.3 把整个流程串起来的最小可复现清单
最后给一个清单,把从零到可分析矩阵的关键步骤列出来,方便你对照检查自己的流程有没有遗漏。
- 明确生物学问题,确定需要的 Series 类型和样本量要求。
- 用布尔检索式在 GEO 中筛选,按 Series 类型过滤,人工核对标题和摘要。
- 进入候选 Series,核对 Summary、Overall design、样本 characteristics、Platform 和补充文件。
- 决定下载 Matrix 还是 RAW,优先 Matrix,特殊情况才下 RAW。
- 用 GEOquery 或手动方式下载,设置缓存和超时,核对文件完整性。
- 读入矩阵,做维度、数值分布、缺失值三项检查。
- 根据数值范围决定是否 log2,处理非正值。
- 获取平台注释,做探针到基因的映射,选择聚合策略。
- 导出基因矩阵和样本分组表,核对样本顺序一致性。
- 做质控和批次效应评估,决定是否需要校正。
- 过滤低表达基因,进入差异表达分析。
这份清单里的每一步我都单独踩过坑,尤其是第 3 步和第 9 步,看起来是“准备工作”,实际上决定了后面分析的天花板。GEO 数据的价值在于它的公开和丰富,但它的陷阱也在于此——没有人替你保证数据质量,所有的判断都得自己做。我个人的体会是,在这个库上花的时间,前期筛选和清洗占七成,真正跑模型占三成,而这七成里的大部分功夫,都花在确认“这个样本到底属于哪一组”这种看似不起眼的事情上。把这一步做扎实,后面的分析才有意义。
本文系统阐述GEO数据库的四层嵌套结构(Platform/Series/Sample/DataSet),详解Series Matrix与RAW文件的选择逻辑,强调平台注释在探针ID到基因Symbol映射中的核心作用;详述基于布尔检索的精准筛选策略、characteristics字段驱动的样本分组提取方法;重点解析表达矩阵读入后的维度/数值分布/缺失值三项质控检查,以及最大均值探针、均值聚合、保留探针三种映射策略的适用场景;涵盖批次效应识别(PCA)、标准化选择(RMA/DESeq2)及常见问题排查(注释过时、分组错位、负值处理)。全文聚焦生物信息学中GEO数据从获取到可分析基因表达矩阵的关键技术环节。
429

被折叠的 条评论
为什么被折叠?



