WGCNA 学习笔记
1. WGCNA 概述
WGCNA(加权基因共表达网络分析)是一种系统生物学方法,用于构建基因共表达网络并识别与特定性状相关的基因模块。它通过分析基因表达数据,探索基因之间的协同表达模式和功能关系。
2. WGCNA 的基本步骤
2.1 数据输入与预处理
- 数据准备:输入的数据通常是基因表达矩阵,行代表基因,列代表样本。
- 数据预处理:包括去除低表达基因、标准化数据等步骤,以确保数据质量。
2.2 计算基因间的相关性(建立关系矩阵)
- 目标:量化基因之间的表达相似性。
- 计算 Pearson 相关系数:
-
计算基因表达量之间的 Pearson 相关系数 ( r ),并生成相似性矩阵(关系矩阵)。
-
公式:
s i j = ∣ c o r ( x i , x j ) s_{ij} = |cor(x_i, x_j) sij=∣cor(xi,xj)
其中 ( s i j s_{ij} sij ) 表示基因 ( i ) 和 ( j ) 之间的相关系数,值在 0 到 1 之间。
-
示例:
假设三个基因的表达数据如下:
样本 | Gene1 | Gene2 | Gene3 |
---|---|---|---|
样本1 | 50 | 55 | 52 |
样本2 | 60 | 63 | 61 |
样本3 | 70 | 75 | 72 |
样本4 | 80 | 84 | 82 |
2.2.1Pearson 相关系数计算过程
1. 数据准备
假设基因表达数据如下:
样本 | Gene1 | Gene2 | Gene3 |
---|---|---|---|
样本1 | 50 | 55 | 52 |
样本2 | 60 | 63 | 61 |
样本3 | 70 | 75 | 72 |
样本4 | 80 | 84 | 82 |
2. 计算基因间的 Pearson 相关系数
2.1 计算基因的均值
首先,计算每个基因的均值(平均表达量):
- Gene1:
G e n e 1 ‾ = 50 + 60 + 70 + 80 4 = 65 \overline{Gene1} = \frac{50 + 60 + 70 + 80}{4} = 65 Gene1=450+60+70+80=65
- Gene2:
G e n e 2 ‾ = 55 + 63 + 75 + 84 4 = 69.25 \overline{Gene2} = \frac{55 + 63 + 75 + 84}{4} = 69.25 Gene2=455+63+75+84=69.25
- Gene3:
G e n e 3 ‾ = 52 + 61 + 72 + 82 4 = 66.75 \overline{Gene3} = \frac{52 + 61 + 72 + 82}{4} = 66.75 Gene3=452+61+72+82=66.75
2.2 计算 Pearson 相关系数
计算 Gene1 与 Gene2 的相关性
-
计算偏差:
- 样本1: ((50 - 65, 55 - 69.25) = (-15, -14.25))
- 样本2: ((60 - 65, 63 - 69.25) = (-5, -6.25))
- 样本3: ((70 - 65, 75 - 69.25) = (5, 5.75))
- 样本4: ((80 - 65, 84 - 69.25) = (15, 14.75))
-
计算 Pearson 相关系数:
- 分子:
( − 15 × − 14.25 ) + ( − 5 × − 6.25 ) + ( 5 × 5.75 ) + ( 15 × 14.75 ) = 213.75 + 31.25 + 28.75 + 217.5 = 491.25 (-15 \times -14.25) + (-5 \times -6.25) + (5 \times 5.75) + (15 \times 14.75) = 213.75 + 31.25 + 28.75 + 217.5 = 491.25 (−15×−14.25)+(−5×−6.25)+(5×5.75)+(15×14.75)=213.75+31.25+28.75+217.5=491.25
-
分母:
( − 1 5 2 + − 5 2 + 5 2 + 1 5 2 ) × ( − 14.2 5 2 + − 6.2 5 2 + 5.7 5 2 + 14.7 5 2 ) \sqrt{(-15^2 + -5^2 + 5^2 + 15^2) \times (-14.25^2 + -6.25^2 + 5.75^2 + 14.75^2)} (−152+−52+52+152)×(−14.252+−6.252+5.752+14.752)
225 + 25 + 25 + 225 × 203.0625 + 39.0625 + 33.0625 + 217.5625 = 500 × 492.75 \sqrt{225 + 25 + 25 + 225} \times \sqrt{203.0625 + 39.0625 + 33.0625 + 217.5625} = \sqrt{500} \times \sqrt{492.75} 225+25+25+225×203.0625+39.0625+33.0625+217.5625=500×492.75
= 22.36 × 22.20 = 497.1 = 22.36 \times 22.20 = 497.1 =22.36×22.20=497.1
- Pearson 相关系数:
r G e n e 1 , G e n e 2 = 491.25 497.1 ≈ 0.99 r_{Gene1, Gene2} = \frac{491.25}{497.1} \approx 0.99 rGene1,Gene2=497.1491.25≈0.99
计算 Gene1 与 Gene3 的相关性
类似的步骤用于计算 Gene1 与 Gene3 的 Pearson 相关系数。
计算 Gene2 与 Gene3 的相关性
同样的方法计算 Gene2 与 Gene3 的 Pearson 相关系数。
2.3 生成关系矩阵
根据计算结果,生成关系矩阵:
Example matrix = [ 1.00 0.98 0.95 0.98 1.00 0.97 0.95 0.97 1.00 ] \text{Example matrix} = \begin{bmatrix} 1.00 & 0.98 & 0.95 \\ 0.98 & 1.00 & 0.97 \\ 0.95 & 0.97 & 1.00 \\ \end{bmatrix} Example matrix= 1.000.980.950.981.000.970.950.971.00
- 对角线上的值为 1,表示基因与自身完全相关。
- 非对角线上的值表示基因之间的相关性。例如,Gene1 和 Gene2 的相关系数为 0.98,说明这两个基因在样本中的表达非常相似。
总结
通过计算 Pearson 相关系数并生成关系矩阵,我们能够量化基因表达之间的相似性,为 WGCNA 的后续步骤(如构建邻接矩阵、识别基因模块等)打下基础。
通过计算 Pearson 相关系数生成的关系矩阵为:
Gene1 | Gene2 | Gene3 | |
---|---|---|---|
Gene1 | 1.00 | 0.998 | 0.995 |
Gene2 | 0.998 | 1.00 | 0.997 |
Gene3 | 0.995 | 0.997 | 1.00 |
2.3 构建邻接矩阵
- 目的:将关系矩阵转换为邻接矩阵,通过幂指数加权调整网络特性。
- 公式:
2.4.计算拓扑重叠矩阵(TOM)
目标:
计算拓扑重叠矩阵(TOM)是为了评估基因之间的拓扑重叠度。TOM 通过考虑基因的邻接关系,识别基因之间的共表达关系,从而帮助识别和定义基因模块。
计算 TOM 的步骤:
2.4.1.1. 理解拓扑重叠矩阵(TOM)的概念:
TOM 衡量的是基因间的共表达关系,通过评估基因与其邻接基因的重叠程度来确定其连接强度。与邻接矩阵不同,TOM 计算考虑了基因间的共同邻居,从而提供了一个更加全面的基因相似性度量。
2.4.1.2. 从邻接矩阵计算 TOM:
邻接矩阵 是一个加权矩阵,其中每个元素表示两个基因之间的连接强度。TOM 矩阵从邻接矩阵导出,主要考虑基因对之间的拓扑重叠,即它们共享多少连接的基因。
TOM 计算公式如下:
[
T
O
M
i
j
=
a
i
j
+
∑
k
a
i
k
a
j
k
min
(
k
i
,
k
j
)
+
ϵ
TOM_{ij} = \frac{a_{ij} + \sum_{k} a_{ik} a_{jk}}{\text{min}(k_i, k_j) + \epsilon}
TOMij=min(ki,kj)+ϵaij+∑kaikajk
]
其中:
- ( a i j a_{ij} aij)是邻接矩阵中基因 (i) 和基因 (j) 之间的连接强度。
- ( k i k_i ki) 和 ( k j k_j kj) 分别是基因 (i) 和基因 (j) 的连接度(连接的基因数目)。
- ( ϵ \epsilon ϵ) 是一个小常数,用于避免除以零的情况。
2.4.2. 详细计算过程:
假设我们已经有了一个邻接矩阵(如下所示):
G1 | G2 | G3 | |
---|---|---|---|
G1 | 1 | 0.8 | 0.5 |
G2 | 0.8 | 1 | 0.7 |
G3 | 0.5 | 0.7 | 1 |
步骤 1: 计算基因的连接度
- Gene1 的连接度 (k_1):
k 1 = sum of connections = 0.8 + 0.5 = 1.3 k_1 = \text{sum of connections} = 0.8 + 0.5 = 1.3 k1=sum of connections=0.8+0.5=1.3 - Gene2 的连接度 ( k_2 ):
k 2 = sum of connections = 0.8 + 0.7 = 1.5 k_2 = \text{sum of connections} = 0.8 + 0.7 = 1.5 k2=sum of connections=0.8+0.7=1.5 - Gene3 的连接度 ( k_3 ):
k 3 = sum of connections = 0.5 + 0.7 = 1.2 k_3 = \text{sum of connections} = 0.5 + 0.7 = 1.2 k3=sum of connections=0.5+0.7=1.2
步骤 2: 计算 TOM 矩阵
计算 TOM 矩阵中的每个元素:
-
TOM_{G1,G2}:
T O M G 1 , G 2 = a G 1 , G 2 + a G 1 , G 3 × a G 2 , G 3 min ( k G 1 , k G 2 ) TOM_{G1,G2} = \frac{a_{G1,G2} + a_{G1,G3} \times a_{G2,G3}}{\text{min}(k_{G1}, k_{G2})} TOMG1,G2=min(kG1,kG2)aG1,G2+aG1,G3×aG2,G3T O M G 1 , G 2 = 0.8 + 0.5 × 0.7 min ( 1.3 , 1.5 ) = 0.8 + 0.35 1.3 = 1.15 1.3 ≈ 0.885 TOM_{G1,G2} = \frac{0.8 + 0.5 \times 0.7}{\text{min}(1.3, 1.5)} = \frac{0.8 + 0.35}{1.3} = \frac{1.15}{1.3} \approx 0.885 TOMG1,G2=min(1.3,1.5)0.8+0.5×0.7=1.30.8+0.35=1.31.15≈0.885
-
TOM_{G1,G3}:
T O M G 1 , G 3 = a G 1 , G 3 + a G 1 , G 2 × a G 2 , G 3 min ( k G 1 , k G 3 ) TOM_{G1,G3} = \frac{a_{G1,G3} + a_{G1,G2} \times a_{G2,G3}}{\text{min}(k_{G1}, k_{G3})} TOMG1,G3=min(kG1,kG3)aG1,G3+aG1,G2×aG2,G3
T O M G 1 , G 3 = 0.5 + 0.8 × 0.7 min ( 1.3 , 1.2 ) = 0.5 + 0.56 1.2 = 1.06 1.2 ≈ 0.883 TOM_{G1,G3} = \frac{0.5 + 0.8 \times 0.7}{\text{min}(1.3, 1.2)} = \frac{0.5 + 0.56}{1.2} = \frac{1.06}{1.2} \approx 0.883 TOMG1,G3=min(1.3,1.2)0.5+0.8×0.7=1.20.5+0.56=1.21.06≈0.883
-
TOM_{G2,G3}:
T O M G 2 , G 3 = a G 2 , G 3 + a G 2 , G 1 × a G 1 , G 3 min ( k G 2 , k G 3 ) TOM_{G2,G3} = \frac{a_{G2,G3} + a_{G2,G1} \times a_{G1,G3}}{\text{min}(k_{G2}, k_{G3})} TOMG2,G3=min(kG2,kG3)aG2,G3+aG2,G1×aG1,G3
T O M G 2 , G 3 = 0.7 + 0.8 × 0.5 min ( 1.5 , 1.2 ) = 0.7 + 0.4 1.2 = 1.1 1.2 ≈ 0.917 TOM_{G2,G3} = \frac{0.7 + 0.8 \times 0.5}{\text{min}(1.5, 1.2)} = \frac{0.7 + 0.4}{1.2} = \frac{1.1}{1.2} \approx 0.917 TOMG2,G3=min(1.5,1.2)0.7+0.8×0.5=1.20.7+0.4=1.21.1≈0.917
最终,TOM 矩阵为:
G1 | G2 | G3 | |
---|---|---|---|
G1 | 1.00 | 0.885 | 0.883 |
G2 | 0.885 | 1.00 | 0.917 |
G3 | 0.883 | 0.917 | 1.00 |
2.4.3. 结果解释
- TOM 矩阵 表示基因之间的拓扑重叠度。高值表示基因对之间的重叠较多,即它们共享更多的共表达基因。
- TOM 矩阵的应用:用于后续的模块识别步骤,帮助识别具有相似表达模式的基因模块。
总结:拓扑重叠矩阵(TOM)的计算通过考虑基因的共同邻居,提供了基因之间的更全面的相似性度量,有助于在 WGCNA 中识别基因模块。
2.5 识别基因模块
目标:
将基因按照其表达模式的相似性进行分组,形成具有相似表达特征的基因集合。每个模块通常代表一个生物学上相关的基因群体,能够揭示基因之间的协同作用和潜在的功能关系。
方法:使用层次聚类和动态树切割算法
2.5.1. 层次聚类(Hierarchical Clustering)
层次聚类是一种用于将样本或基因逐步合并成簇(clusters)的方法。在 WGCNA 中,层次聚类主要用于将基因基于其拓扑重叠矩阵**(TOM)**进行分组。
步骤:
-
计算距离矩阵:
- 计算基因对之间的距离,通常使用 (1 - TOM) 作为距离度量,因为 TOM 越高,基因间的相似性越高。
- 距离矩阵 ( D i j D_{ij} Dij) 计算公式: D i j = 1 − T O M i j D_{ij} = 1 - TOM_{ij} Dij=1−TOMij
-
构建层次聚类树(Dendrogram):
- 使用距离矩阵进行层次聚类,生成层次聚类树。
- 方法:常用的距离计算方法包括平均连接(Average linkage)或最小连接(Single linkage)。
在 R 中,可以使用
hclust
函数进行层次聚类:# 计算距离矩阵 distMatrix <- as.dist(1 - TOM) # 执行层次聚类 geneTree <- hclust(distMatrix, method = "average")
-
绘制聚类树:
- 绘制层次聚类树,以可视化基因的聚类结果
# 绘制聚类树 plot(geneTree, main = "Gene Clustering Tree", xlab = "Genes", sub = "")
2.5.2. 动态树切割算法(Dynamic Tree Cut)
动态树切割算法用于将层次聚类树分割成不同的模块(簇)。该算法根据树的结构和基因间的相似性,自动确定模块的数量和边界。
步骤:
-
设置动态树切割参数:
- 最小模块大小(minModuleSize):模块中基因的最小数量。
- 剪枝阈值(cutTreeDynamic):决定模块边界的参数。
-
执行动态树切割:
- 根据层次聚类树和设定的参数,执行动态树切割算法,确定每个基因所属的模块。
在 R 中,可以使用
cutreeDynamic
函数:# 执行动态树切割 dynamicMods <- cutreeDynamic(dendro = geneTree, distM = 1 - TOM, minClusterSize = 30)
-
模块分配:
- 将基因分配到不同的模块,每个模块由一个唯一的模块编号表示。
# 模块分配 moduleColors <- labels2colors(dynamicMods)
输出:模块特征向量(Module Eigengene, ME)
每个模块的特征向量(ME)表示该模块中所有基因的主成分,用于总结模块中基因的表达特征。
步骤:
-
计算模块特征向量:
- ME 计算公式:对每个模块中基因的表达量进行主成分分析,计算模块的特征向量。
在 R 中,可以使用
moduleEigengenes
函数:# 计算模块特征向量 moduleEigengenes <- moduleEigengenes(datExpr, dynamicMods)
-
分析模块特征向量:
- 模块特征向量表示模块中基因的整体表达模式,可以用于后续的关联分析,如与样本表型的相关性分析。
# 模块特征向量分析 moduleTraitCor <- cor(moduleEigengenes$eigengenes, traitData)
总结
通过层次聚类和动态树切割算法,我们可以将基因表达数据分组为不同的基因模块。每个模块的特征向量(ME)提供了模块中基因的综合表达特征,用于进一步的模块功能注释和与表型的关联分析。这一过程帮助我们理解基因如何协同作用以及它们在生物学过程中的角色。
2.6 模块与表型的关联分析
目的
模块与表型的关联分析旨在识别与特定性状(如疾病状态、表型特征等)相关的基因模块。通过分析模块特征向量(Module Eigengene, ME)与表型数据的相关性,可以确定哪些模块与性状有显著关联,从而帮助揭示基因与性状之间的关系。
分析步骤
1. 计算模块特征向量(ME)
模块特征向量(ME)是每个基因模块的主成分,表示模块中基因的整体表达模式。ME 可以用来总结模块的表达特征,并用于与表型数据的相关性分析。
计算 ME 的步骤:
-
计算每个基因的 ME:
- 对于每个模块,计算其所有基因在所有样本中的表达量的均值或主成分。
- 在 R 中,可以使用
moduleEigengenes
函数来计算 ME。
library(WGCNA) # 假设 datExpr 是基因表达矩阵,moduleColors 是基因模块分配 moduleEigengenes <- moduleEigengenes(datExpr, moduleColors) MEs <- moduleEigengenes$eigengenes
-
结果:
MEs
为模块特征向量矩阵,其中每列对应一个模块的特征向量。
2. 计算 ME 与表型数据的相关性
目的:识别哪些模块的表达模式与特定表型数据显著相关。
步骤:
-
准备表型数据:
- 表型数据可以是连续变量(如株高、疾病评分)或分类变量(如是否患病)。
-
计算相关性:
- 计算每个模块特征向量(ME)与表型数据之间的相关系数。
- 使用皮尔逊相关系数(Pearson correlation coefficient)或斯皮尔曼等级相关系数(Spearman rank correlation coefficient)。
R 代码示例:
# 假设 traitData 是表型数据,MEs 是模块特征向量 moduleTraitCor <- cor(MEs, traitData, use = "p") moduleTraitPvalue <- corPvalueStudent(moduleTraitCor, nSamples)
moduleTraitCor
为模块特征向量与表型数据的相关系数矩阵。moduleTraitPvalue
为相关系数的 p 值矩阵,表示相关性的显著性。
-
结果解释:
- 查看
moduleTraitCor
矩阵中每个模块与表型的相关系数。 - 选择相关系数显著的模块(通常 p 值 < 0.05)进行进一步分析。
- 查看
3. 基因显著性(GS)分析
目的:评估每个基因与其所属模块的关联性,以了解基因在模块中的重要性。
步骤:
-
计算基因显著性(GS):
-
对每个基因,计算其与表型数据的相关性(基因显著性)。
-
计算公式:
G S i = c o r ( g i , t r a i t D a t a ) GS_{i} = cor(g_i, traitData) GSi=cor(gi,traitData)
其中 ( g i g_i gi ) 是基因 ( i ) 在所有样本中的表达量。
R 代码示例:
# 假设 geneList 是所有基因,traitData 是表型数据 geneTraitCor <- cor(datExpr, traitData, use = "p")
-
-
结果解释:
geneTraitCor
为基因与表型数据的相关系数矩阵。- 通过基因显著性分析,可以识别在模块中与表型数据显著相关的基因。
-
模块内基因显著性分析:
- 计算每个模块内基因的显著性,并评估其在模块中的重要性。
R 代码示例:
# 计算模块内基因显著性 moduleGenes <- which(moduleColors == module) moduleGeneCor <- geneTraitCor[moduleGenes, ]
moduleGenes
为指定模块中的所有基因。moduleGeneCor
为这些基因与表型数据的相关系数。
总结
模块与表型的关联分析通过计算模块特征向量(ME)与表型数据的相关性,识别与性状显著相关的模块。基因显著性(GS)分析进一步评估基因与模块的关联性,帮助识别在模块中对性状有重要作用的基因。这些分析有助于揭示基因与性状之间的关系,提供生物学上的洞见。
2.7 功能注释与富集分析
- 目标:了解模块中基因的生物学功能。
- 方法:
- 对模块中的基因进行 GO、KEGG 富集分析,探索其生物学功能和通路。
3. WGCNA 的具体实现
示例应用:玉米株高基因表达分析
假设我们有关于玉米株高的基因表达数据,我们希望使用 WGCNA 来分析与株高相关的基因模块。
1. 数据准备:
假设基因表达数据如下表所示:
样本 | Gene1 | Gene2 | Gene3 |
---|---|---|---|
样本1 | 50 | 55 | 52 |
样本2 | 60 | 63 | 61 |
样本3 | 70 | 75 | 72 |
样本4 | 80 | 84 | 82 |
2. 计算基因间的相关性:
计算 Pearson 相关系数,生成关系矩阵:
[
\text{Example matrix} = \begin{bmatrix}
1.00 & 0.98 & 0.95 \
0.98 & 1.00 & 0.97 \
0.95 & 0.97 & 1.00 \
\end{bmatrix}
]
3. 构建邻接矩阵:
假设选择 ( \beta = 6 ):
[
a_{ij} = |cor(x_i, x_j)|^6
]
4. 计算 TOM:
生成拓扑重叠矩阵,用于基因模块的聚类和识别。
5. 识别基因模块:
使用层次聚类将基因分组,并通过动态树切割算法识别模块。
6. 模块与株高的关联分析:
计算每个模块的特征向量与玉米株高的相关性,识别与株高显著相关的模块。
7. 功能注释:
对显著相关的模块进行功能注释,了解其在玉米株高调控中的作用。
总结
WGCNA 是一种强大的方法,通过构建基因共表达网络并识别基因模块,帮助揭示基因与复杂性状(如玉米株高)的关系。通过上述步骤,你可以从基因表达数据中提取有用的信息,进行模块识别和功能分析。