1. WGCNA分析概述
WGCNA(Weighted Gene Co-expression Network Analysis)是一种广泛应用于生物信息学研究的分析方法,它通过构建基因共表达网络来识别功能相关的基因模块。这种方法特别适合处理高通量基因表达数据,如RNA-seq或微阵列数据。
WGCNA的核心思想可以概括为:将大量基因按照表达模式的相似性进行聚类,形成不同的模块(module),然后分析这些模块与特定表型或实验条件之间的关联,最终筛选出与研究目标最相关的核心基因(hub genes)。
提示:WGCNA分析的优势在于它能够捕捉基因之间的协同变化关系,而不仅仅是单个基因的表达变化。这种方法特别适合发现那些表达变化不大但协同性强的基因群。
2. 数据准备与预处理
2.1 数据格式要求
进行WGCNA分析前,需要准备两个基本文件:
-
表达矩阵(expression matrix):
- 行为基因(gene),列为样本(sample)
- 建议使用FPKM、TPM或log2转换后的表达值
- 文件格式推荐CSV或TXT
-
分组信息(group information):
- 包含样本名和对应的分组信息
- 通常用0表示对照组(control),1表示处理组(treat)
- 文件格式推荐TXT或CSV
2.2 数据加载与初步处理
在R环境中,我们可以使用以下代码加载数据:
r复制library(WGCNA)
library(tidyverse)
library(limma)
# 加载表达矩阵
exp <- read.csv("exp.csv", row.names = 1)
# 加载分组信息
group <- read.table("group.txt", header = TRUE, row.names = 1)
# 数据转置并筛选高变异基因
dat <- t(exp[tail(order(apply(exp, 1, mad)), 5000), ])
这里使用了MAD(Median Absolute Deviation)指标来筛选表达变异度最高的5000个基因。这种筛选基于一个重要的生物学假设:表达变化较大的基因更可能参与重要的生物学过程,而表达稳定的基因对共表达网络的贡献较小。
注意:MAD筛选的基因数量可以根据数据规模调整。对于大型数据集(>20,000基因),可以保留更多基因(如8,000-10,000);对于小型数据集,可以适当减少。
3. 数据质量控制
3.1 样本和基因筛选
WGCNA分析对数据质量要求较高,需要进行严格的质量控制:
r复制# 检查样本和基因质量
gsg <- goodSamplesGenes(dat)
if(!gsg$allOK) {
dat <- dat[gsg$goodSamples, gsg$goodGenes]
}
# 绘制样本聚类树
plot(hclust(dist(dat)), main = "Sample clustering")
质量控制步骤会剔除:
- 表达量过低或缺失值过多的基因
- 表达谱明显异常的样本
- 全零表达的基因
3.2 离群样本检测
通过样本聚类树可以直观地识别离群样本。如果发现某些样本明显远离其他样本(在聚类树的最底部形成长分支),建议检查这些样本的实验质量,必要时将其剔除。
实操心得:在实际分析中,我通常会保留聚类树图像,并在分析报告中标注可能的离群样本。有时这些"离群"样本可能反映了真实的生物学变异,需要结合实验设计谨慎处理。
4. 软阈值选择
4.1 软阈值概念
软阈值(soft thresholding power)是WGCNA分析中最关键的参数之一,它决定了基因间相关性强度的转换方式。选择合适的软阈值可以使网络符合无标度拓扑(scale-free topology)特征。
r复制# 测试不同power值
powers <- c(1:10, seq(12, 30, 2))
sft <- pickSoftThreshold(dat, powerVector = powers)
# 自动选择推荐的power值
power <- sft$powerEstimate
# 绘制拟合指数图
plot(sft$fitIndices[,1], -sign(sft$fitIndices[,3])*sft$fitIndices[,2],
xlab = "Soft Threshold (power)", ylab = "Scale Free Topology Model Fit")
4.2 软阈值选择标准
理想的软阈值应满足:
- 无标度拓扑拟合指数(scale-free topology fit index)达到0.85以上
- 平均连接度(mean connectivity)不过低(通常>10)
- 在满足前两个条件的前提下,选择最小的power值
常见问题:如果无论如何调整power值都无法达到0.85的拟合指数,可以考虑放宽标准(如0.8),或者检查数据是否存在批次效应等质量问题。
5. 模块构建与分析
5.1 模块识别
r复制net <- blockwiseModules(
dat,
power = power,
maxBlockSize = 5000,
minModuleSize = 75,
mergeCutHeight = 0.25,
numericLabels = TRUE
)
# 查看模块大小
table(net$colors)
# 可视化模块
moduleColors <- labels2colors(net$colors)
plotDendroAndColors(net$dendrograms[[1]],
moduleColors[net$blockGenes[[1]]],
"Module colors")
5.2 模块参数解析
-
minModuleSize:模块最小基因数- 默认值30-100
- 值越大,模块数量越少,每个模块包含的基因越多
-
mergeCutHeight:模块合并阈值- 默认0.25
- 值越小,模块数量越多,模块间区分度越高
-
maxBlockSize:最大处理基因数- 对于大型数据集(>5000基因),建议分块处理
- 可以设置为10000或更高,取决于计算机内存
实操技巧:初次分析可以使用默认参数,获得初步结果后再根据生物学意义调整参数。我通常会尝试2-3组不同的参数组合,比较结果的稳定性。
6. 模块与表型关联分析
6.1 计算模块特征基因
r复制MEs <- net$MEs
colnames(MEs) <- paste0("ME", labels2colors(as.numeric(sub("ME","",colnames(MEs)))))
rownames(MEs) <- substr(rownames(MEs), 1, 12)
# 计算模块与表型的相关性
modTraitCor <- cor(MEs, group, use = "p")
modTraitP <- corPvalueStudent(modTraitCor, nrow(group))
# 绘制热图
labeledHeatmap(
Matrix = modTraitCor,
textMatrix = paste0(signif(modTraitCor, 2), "\n(", signif(modTraitP, 1), ")"),
colors = colorRampPalette(c("blue", "white", "red"))(50),
main = "Module-trait relationships"
)
6.2 结果解读
热图中:
- 颜色深浅表示相关性强度(红色为正相关,蓝色为负相关)
- 括号内的数字为p值,表示统计显著性
- 通常关注|correlation|>0.3且p<0.05的模块
分析经验:在实际研究中,我不仅关注最显著的模块,还会检查多个相关模块。有时中等相关性的模块可能包含重要的生物学信息,特别是当它们与已知通路或功能相关时。
7. 核心基因筛选
7.1 筛选标准
假设"blue"模块与表型最相关,我们可以筛选该模块的核心基因:
r复制module <- "blue"
gene_exp <- dat[, net$blockGenes[[1]]]
ME <- MEs[, paste0("ME", module)]
# 计算基因与模块的相关性(MM)
MM <- abs(cor(gene_exp, ME, use = "p"))
# 计算基因与表型的相关性(GS)
GS <- abs(cor(gene_exp, group, use = "p"))
# 绘制MM-GS散点图
plot(MM, GS, pch = 19,
xlab = "Module Membership (MM)",
ylab = "Gene Significance (GS)",
main = "MM vs GS")
# 筛选核心基因
hub <- names(which(MM > 0.8 & GS > 0.5))
7.2 筛选策略
核心基因应满足:
- 高模块成员度(MM > 0.8)
- 高基因显著性(GS > 0.5)
- 可根据研究需求调整阈值
注意事项:阈值设置需要权衡灵敏性和特异性。过于严格的阈值可能会漏掉真正重要的基因,而过于宽松的阈值则会引入噪声。建议结合功能富集分析验证筛选结果。
8. 结果可视化与导出
8.1 网络可视化
可以将核心基因网络导出到Cytoscape进行可视化:
r复制TOM <- TOMsimilarityFromExpr(dat, power = power)
cyt <- exportNetworkToCytoscape(
TOM[hub, hub],
edgeFile = "edges.txt",
nodeFile = "nodes.txt",
weighted = TRUE,
threshold = 0.2
)
8.2 其他可视化方法
- 模块热图(module heatmap)
- 特征基因网络图(eigengene network)
- 基因-性状关系图(gene-trait relationship)
工具推荐:除了Cytoscape,还可以使用Gephi、igraph等工具进行网络可视化。对于大型网络,建议先进行简化(如只保留权重最高的前10%的边)。
9. 常见问题与解决方案
9.1 分析失败常见原因
-
数据质量问题
- 解决方案:加强QC,剔除低质量样本和基因
-
软阈值选择不当
- 解决方案:尝试不同power值,检查拟合指数
-
模块过多或过少
- 解决方案:调整minModuleSize和mergeCutHeight
9.2 结果不稳定
-
批次效应影响
- 解决方案:进行批次校正(如使用ComBat)
-
样本量不足
- 解决方案:增加样本量或使用更宽松的阈值
-
参数敏感性
- 解决方案:进行参数敏感性分析
个人经验:在实际项目中,我通常会运行2-3次独立分析(使用不同的随机种子),比较核心基因列表的重叠率。重叠率高的基因更可能是真正的信号而非噪声。
10. 高级应用与扩展
10.1 时间序列数据
对于时间序列数据,可以使用:
- 动态WGCNA(dynamic WGCNA)
- 分时段构建网络
10.2 多组学整合
WGCNA可以与其他组学数据整合:
- 与甲基化数据关联(EWAS)
- 与蛋白质组数据关联
- 与代谢组数据关联
10.3 机器学习结合
将WGCNA结果用于机器学习:
- 使用模块特征基因作为预测因子
- 构建分类或回归模型
在实际研究中,我发现将WGCNA与功能富集分析(如GO、KEGG)结合,可以更好地解释模块的生物学意义。此外,交叉验证核心基因在不同数据集中的表现,能够增强研究结论的可信度。