2023-12-02转录组分析——WGCNA

Weighted Gene Co-Expression Network Analysis(加权基因共表达网络分析,简称WGCNA)可鉴定表达模式相似的基因集合(module),解析基因集合与样品表型之间的联系,绘制基因集合中基因之间的调控网络并鉴定关键调控基因。
WGCNA的流程主要分为:输入数据——构建共表达网络——划分模块——模块与性状关联分析——模块之间的关联分析——模块中Hub基因的鉴定。此处输入的数据是经过其他方法筛出来的,比如之前TCseq分析中,对照和处理之间有差异的Cluster集群。具体原理网上有很多,这里就不多说,直接开搞。

1、文件准备

首先,就是准备两个文件:
1、基因表达矩阵文件,即横轴是不同样本以及生物重复ID,纵轴是基因ID,之后是基因的FPKM值,在此将该文件命名为“FPKM.txt”。

图片.png

2、性状数据文件,横轴是不同性状的名称,纵轴是对应样品的名称,格式必须与上个文件保持一致,在此将该文件命名为“trait.txt”。


图片.png

2、构建相关性矩阵和邻接矩阵

通过R语言中的WGCNA包开始分析,要注意的是WGCNA依赖的包较多,根据系统提示,逐一安装其他包。

#安装WGCNA包
install.packages('BiocManager') 
BiocManager::install('WGCNA')
library(WGCNA)  #若加载失败,安装提示中依赖的包
#基因表达值矩阵
gene <- read.delim('FPKM.txt', row.names = 1, check.names = FALSE)
#只保留平均表达值在 1 以上的基因
gene <- subset(gene, rowSums(gene)/ncol(gene) >= 1)
#转置矩阵
gene <- t(gene)

接着需要我们确定一个软阈值powers(soft threshold),以建立邻接矩阵并根据连通度使基因分布符合无尺度网络。

#power 值选择
powers <- 1:20
sft <- pickSoftThreshold(gene, powerVector = powers, verbose = 8)
 
#拟合指数与 power 值散点图
par(mfrow = c(1, 2))
plot(sft$fitIndices[,1], -sign(sft$fitIndices[,3])*sft$fitIndices[,2], type = 'n', 
    xlab = 'Soft Threshold (power)', ylab = 'Scale Free Topology Model Fit,signed R^2', 
    main = paste('Scale independence'))
text(sft$fitIndices[,1], -sign(sft$fitIndices[,3])*sft$fitIndices[,2],
    labels = powers, col = 'red');
abline(h = 0.80, col = 'red')  #R方的值可以自己确定,一般>0.8最好
#平均连通性与 power 值散点图
plot(sft$fitIndices[,1], sft$fitIndices[,5],
    xlab = 'Soft Threshold (power)', ylab = 'Mean Connectivity', type = 'n',
    main = paste('Mean connectivity'))
text(sft$fitIndices[,1], sft$fitIndices[,5], labels = powers, col = 'red')
图片.png

左图纵坐标是R平方的值,R方越接近1,表明该网络就越接近无尺度网络,通常要求R方的值>0.8,负值是因为乘slope列数值的负方向。软阈值一般选择R方大于0.8时的power值,即10。如果不确定,可以在代码中输入“sft$powerEstimate”让系统自身估计。


图片.png

可以看到系统评估的是13,emmm...当然也要综合上面右图——纵坐标是平均连通性,该值随β的增加而降低。那么接下来就用系统评估的最佳阈值13构建无标度网络。

3、构建共表达网络

#估计的最佳 power 值
powers <- sft$powerEstimate
 
#获得 TOM 矩阵
adjacency <- adjacency(gene, power = powers)
tom_sim <- TOMsimilarity(adjacency)
rownames(tom_sim) <- rownames(adjacency)
colnames(tom_sim) <- colnames(adjacency)
tom_sim[1:6,1:6]
#TOM 相异度 = 1 – TOM 相似度
tom_dis  <- 1 - tom_sim
#层次聚类树
geneTree <- hclust(as.dist(tom_dis), method = 'average')
plot(geneTree, xlab = '', sub = '', main = 'Gene Dendrogram',
    labels = FALSE, hang = 0.04)
#使用动态剪切树挖掘模块
minModuleSize <- 30  #模块基因数目
dynamicMods <- cutreeDynamic(dendro = geneTree, distM = tom_dis,
    deepSplit = 2, pamRespectsDendro = FALSE, minClusterSize = minModuleSize)

table(dynamicMods)   #查看共划分多少个模块
图片.png

该步骤是对基因进行聚类,每条线代表一个基因,相似的基因被聚到一个分支。输入“table(dynamicMods)”后可以看到,将这些基因划分为14个模块。


图片.png

接下来,为这些模块增添颜色,并通过颜色名称命名不同的模块。

#模块颜色指代
dynamicColors <- labels2colors(dynamicMods)
table(dynamicColors)
 
plotDendroAndColors(geneTree, dynamicColors, 'Dynamic Tree Cut',
    dendroLabels = FALSE, addGuide = TRUE, hang = 0.03, guideHang = 0.05,
    main = 'Gene dendrogram')
图片.png

4、共表达拓扑热图


#基因表达聚类树和共表达拓扑热图
plot_sim <- -(1-tom_sim)
diag(plot_sim) <- NA
TOMplot(plot_sim, geneTree, dynamicColors,
    main = 'Network heatmap plot')
图片.png

在该热图中,基因间表达相似度越高,颜色就会越深。

#计算基因表达矩阵中模块的特征基因
MEList <- moduleEigengenes(gene, colors = dynamicColors)
MEs <- MEList$eigengenes
head(MEs)[1:6]
#表征模块间相似度
ME_cor <- cor(MEs)
ME_cor[1:6,1:6]
 
#绘制聚类树
METree <- hclust(as.dist(1-ME_cor), method = 'average')
plot(METree, main = 'Clustering of module eigengenes', xlab = '', sub = '')
 
#可以通过height 值确定一个合适的阈值作为剪切高度
abline(h = 0.2, col = 'blue')
abline(h = 0.25, col = 'red')
#模块特征基因聚类树热图
plotEigengeneNetworks(MEs, '', cex.lab = 0.8, xLabelsAngle= 90,
    marDendro = c(0, 4, 1, 2), marHeatmap = c(3, 4, 1, 2))
#相关程度高于 0.75 的模块将合并到一起
merge_module <- mergeCloseModules(gene, dynamicColors, cutHeight = 0.25, verbose = 3)
mergedColors <- merge_module$colors
table(mergedColors)
 #基因表达和模块聚类树
plotDendroAndColors(geneTree, cbind(dynamicColors, mergedColors), c('Dynamic Tree Cut', 'Merged dynamic'),
    dendroLabels = FALSE, addGuide = TRUE, hang = 0.03, guideHang = 0.05)

5、模块与性状关联

接下来就是性状数据与基因模块之间的关联分析。

#导入trait性状数据
trait <- read.delim('trait.txt', row.names = 1, check.names = FALSE)
 
#使用上一步新组合的共表达模块的结果
module <- merge_module$newMEs
 
#基因共表达模块和表型的相关性分析
moduleTraitCor <- cor(module, trait, use = 'p')
moduleTraitCor[1:6,1:6]  #相关矩阵,根据自己的性状个数进行修改
 
#相关系数的 p 值矩阵
moduleTraitPvalue <- corPvalueStudent(moduleTraitCor, nrow(module))
 
#相关图绘制
textMatrix <- paste(signif(moduleTraitCor, 2), '\n(', signif(moduleTraitPvalue, 1), ')', sep = '')
dim(textMatrix) <- dim(moduleTraitCor)
 
par(mar = c(5, 10, 3, 3))
labeledHeatmap(Matrix = moduleTraitCor, main = paste('Module-trait relationships'),
    xLabels = names(trait), yLabels = names(module), ySymbols = names(module),
    colorLabels = FALSE, colors = blueWhiteRed(50), cex.text = 0.7, zlim = c(-1,1),
    textMatrix = textMatrix, setStdMargins = FALSE)

图片.png

每一个模块中,上面的数字代表皮尔逊相关系数,下面(括号)里的值代表显著性P值。该图表示哪些模块中的基因可能与处理表型密切相关。从图中不难发现,“green”模块“MTA10”时期存在较为显著的正相关,表示该模块中的基因参与了MTA处理引起的表型差异,进一步获取该模块中的基因(ps:该数据并不好,相关性系数不是太高,只有0.7,一般最好在0.9左右)。

6、筛选关键基因集

#基因与模块的对应关系列表
gene_module <- data.frame(gene_name = colnames(gene), module = mergedColors, stringsAsFactors = FALSE)
head(gene_module)
#“green”模块内的基因名称
gene_module_select <- subset(gene_module, module == 'green')$gene_name
 
#“green”模块内基因在各样本中的表达值矩阵
gene_select <- t(gene[,gene_module_select])
 
#“green”模块内基因的共表达相似度
tom_select <- tom_sim[gene_module_select,gene_module_select]
#选择 green 模块内的基因
gene_green <- gene[ ,gene_module_select]
 
#基因的模块成员度计算
geneModuleMembership <- signedKME(gene_green, module['MEgreen'], outputColumnName = 'MM')
MMPvalue <- as.data.frame(corPvalueStudent(as.matrix(geneModuleMembership), nrow(module)))
 
#各基因表达值与表型的相关性分析
geneTraitSignificance <- as.data.frame(cor(gene_green, trait['MTA10'], use = 'p'))
GSPvalue <- as.data.frame(corPvalueStudent(as.matrix(geneTraitSignificance), nrow(trait)))
 
#选择显著(p<0.01)、高 green 模块成员度(MM>=0.8),与 MTA10表型高度相关(r>=0.8)的基因
geneModuleMembership[geneModuleMembership<0.8 | MMPvalue>0.01] <- 0
geneTraitSignificance[geneTraitSignificance<0.8 | MMPvalue>0.01] <- 0
 
select <- cbind(geneModuleMembership, geneTraitSignificance)
select <- subset(select, geneModuleMembership>=0.8 & geneTraitSignificance>=0.8)
head(select)
nrow(select)#查看相关系高的基因个数
图片.png

最终筛选到了16个候选基因(右侧“Environment”中点击“select”即可查看),进一步结合注释信息确认其是否是自己想要的hub基因。WGCNA分析过程较为繁琐,一环扣一环,要确保每一步正确,再进行下一步操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容