你是不是也遇到过这种情况:手里攥着三个GEO数据集,想合并起来做WGCNA分析,结果一跑代码就报错,或者出来的模块跟预期完全不一样,甚至根本对不上号?别慌,这其实是很多刚入行或中途转行做生信的朋友都会踩的坑。今天我就把这几年踩过的雷、熬过的夜,总结成这套实操方案,帮你把这三个数据集真正“揉”在一起,做出有说服力的共表达网络。
先说个真事。去年有个学生找我,说他的三个数据集样本量分别是20、30、50,合并后样本量够了,但聚类树怎么都分不开。我一看原始数据,好家伙,一个是芯片数据,两个是RNA-seq,而且批次效应大得离谱。这就是典型的“垃圾进,垃圾出”。做3个geo数据整合做wgcna,核心不在于代码多高大上,而在于预处理是否够“脏”、够“真”。
第一步,数据清洗与标准化,这是地基。别急着合并,先分别处理每个数据集。对于芯片数据,用affy或oligo包做RMA标准化;对于RNA-seq,用DESeq2或edgeR做VST或rlog转换。注意,这里有个细节,很多新手会直接用log2(CPM+1),这在WGCNA里其实不太稳,建议用variance stabilizing transformation。另外,一定要检查探针映射,不同平台的探针ID得统一映射到Gene Symbol,如果有多个探针对应一个基因,取方差最大的那个,或者取平均值,千万别随便丢弃,否则信息损失严重。
第二步,批次效应校正,这是关键。三个数据集来自不同时间、不同实验室,技术噪音远大于生物学信号。这时候,ComBat函数就是你的救命稻草。在merge之前,先对每个数据集分别做标准化,然后提取基因表达矩阵,用sva包里的ComBat函数进行校正。这里有个坑,校正前最好确保每个数据集内部已经做过初步的过滤,去掉低表达基因,否则ComBat会把噪声也当成信号去校正。校正后,画PCA图看看,如果三个数据集的样本在PCA图上能混在一起,不分彼此,那恭喜你,批次效应基本消除了。
第三步,构建共表达网络,这是核心。合并后的数据,输入WGCNA。这里要注意软阈值的选择。不要盲目追求高R平方,通常0.8-0.9之间,网络拓扑结构最接近无标度网络。对于3个geo数据整合做wgcna,样本量如果不够大(比如总共少于60个),建议用signed hybrid网络,这样既能保留正负相关,又能减少假阳性。模块识别后,用cutreeDynamic函数切割树状图,得到初步模块。
第四步,模块与性状关联,这是升华。别只盯着模块里的基因看,要关联临床性状或实验分组。比如,你的三个数据集分别对应不同阶段的患者,你可以看哪个模块与“晚期”显著相关。这时候,用cor.test或lm函数计算模块特征基因(eigengene)与性状的关联。如果某个模块与性状高度相关,再深入挖掘其中的Hub基因。
最后,验证与可视化。用Cytoscape画网络图,把Hub基因标红。同时,去GO和KEGG数据库做富集分析,看看这些基因富集在什么通路。如果富集结果符合你的生物学假设,那这篇论文的数据基础就稳了。
我见过太多人,为了凑样本量,强行合并不相关的数据集,结果出来的模块毫无生物学意义。记住,3个geo数据整合做wgcna,不是为了合并而合并,是为了增强统计效力,发现更稳健的生物学规律。数据要干净,批次要校正,网络要稳健,结论才可信。别怕麻烦,预处理多花一小时,分析时能少掉两根头发。