WGCNA(6):筛选 hub gene

通过前期的分析,我们确定了感兴趣的module,但是module中又含有几十甚至上百的基因,下一步需要进一步筛选hub gene。

WGCNA(3):基因模块与性状关联识别重要基因 - 简书 (jianshu.com)

差异基因,hub 基因以及关键基因的区别,可以去看这篇帖子:
关键基因和hub基因(生物网络角度) - 云+社区 - 腾讯云 (tencent.com)

1. 准备工作

导入前期数据,这里我选择了分步法构建网络的结果,大家可以根据自己的数据选择使用哪种方法构建网络。

# 设置工作目录
> setwd("D:/RNA-seq/WGCNA/mad0.3/cor 0.25")
# 载入WGCNA包
> library('WGCNA')
# 允许R语言以最大线程运行
> options(stringsAsFactors = FALSE)
> allowWGCNAThreads()
Allowing multi-threading with up to 4 threads.
# 载入第一步中的表达量和表型值
> lnames = load(file = "WGCNA0.3-dataInput.RData")
> lnames
# 载入第二步的网络数据
> lnames = load(file = "networkConstruction-stepByStep.RData")
> lnames

2. 筛选hub基因

2.1 筛选key module

  • 在上一步基因模块与性状的热图中,可以明显看到和性状相关性最强的基因模块是哪一个,即为key module。
  • 当然也可以反向找,感兴趣的基因在哪个module里,这个module就是key module。

由于我没有目的基因,所以这里都将与性状相关性最强的module当做Key module。
参考文章:WGCNA关键模块和hub基因筛选 - 简书 (jianshu.com)

2.2 筛选hub gene

在确定key module后,需要进一步确定hub gene,通常有三种方法。

a. 连接度 connectivity

参考材料:
https://horvath.genetics.ucla.edu/html/CoexpressionNetwork/Rpackages/WGCNA/Tutorials/Simulated-07-Membership.pdf
这里需要计算每个基因的连接度,在网络分析里通常称为degree。

  • 整个网络的连接度是kTotal
  • 模块连接度是kWithin,
  • kOut=kTotal-kWithin
  • kDiff=kIn-kOut=2*kIN-kTotal
# 这部分计算量还挺大的,如果基因数目多的话需要在Linux下计算
> ADJ=abs(cor(datExpr,use="p"))^6
> Alldegrees =intramodularConnectivity(ADJ, moduleColors)
> write.csv(Alldegrees, file = "intramodularConnectivity.csv")

绘制GS和连接度的相关性散点图:

## 这部分在专题(3)中计算过一次,因为没有保存,所以这里又重新计算
> nSamples = nrow(datExpr)
# 指定datTrait中感兴趣的一个性状,这里选择weight_g
> weight = as.data.frame(datTraits$weight_g)
> names(weight) = "weight"
# 各基因模块的名字(颜色)
> modNames = substring(names(MEs), 3)
# 计算MM的P值
> geneModuleMembership = as.data.frame(cor(datExpr, MEs, use = "p"))
> MMPvalue = as.data.frame(corPvalueStudent(as.matrix(geneModuleMembership), nSamples))
> names(geneModuleMembership) = paste("MM", modNames, sep="")
> names(MMPvalue) = paste("p.MM", modNames, sep="")
# 计算性状和基因表达量之间的相关性(GS)
> geneTraitSignificance = as.data.frame(cor(datExpr, weight, use = "p"))
> GSPvalue = as.data.frame(corPvalueStudent(as.matrix(geneTraitSignificance), nSamples))
> names(geneTraitSignificance) = paste("GS.", names(weight), sep="")
> names(GSPvalue) = paste("p.GS.", names(weight), sep="")

下面代码可以实现GS和degree的回归散点图:

> colorlevels=unique(moduleColors)
> pdf("GS vs. degree_weight.pdf",width = 14,height = 8)
# 布局。这个可以根据自己的module数目进行调整。我有20个module,所以这里设置了4行,每行5个图
> par(mfrow=c(4,5))
# 设置图形边界,四个数字分别对应下左上右
> par(mar = c(5,5,3,3))
> for (i in c(1:length(colorlevels))) 
 {
     whichmodule=colorlevels[[i]]; 
     restrict1 = (moduleColors==whichmodule);
     verboseScatterplot(Alldegrees$kWithin[restrict1], 
                       geneTraitSignificance[restrict1,1], 
                        col=moduleColors[restrict1],
                        main=whichmodule, 
                        xlab = "Connectivity", ylab = "Gene Significance", abline = TRUE)
 }
> dev.off()
Figure 1: Gene significance (y-axis) vs. intramodular connectivity (x-axis) plotted separately for each module in the simulated data set. For the green and the brown module we observe that intramodular hub genes tend to have high gene significance. The opposite is true in the turquoise module.

图中可以看出,weight这个性状中,green和brown两个module中的GS和连接度的相关性最好,这两个module中的hub gene有更高的GS。

b. KME (官方)

这个方法是WGCNA官方说明书推荐的,通过计算KME值(module eigengene-based connectivity)来衡量基因和模块的关系,通常选择|kME| >=阈值(0.8)来筛选出hub gene。

  • kME = cor(x, ME),x是基因表达量
    Hub genes are those that show most connections in the network as indicated by their high KME (eigengene connectivity) value.
# 基于准备工作,进行下列计算
# 计算KME值
> datKME=signedKME(datExpr, MEs, outputColumnName="kME_MM.")
> write.csv(datKME, "kME_MM.csv")
# 提取感兴趣的module,这里以lightyellow为例
> FilterGenes = abs(datKME$kME_MM.lightyellow) > 0.8
# 返回结果
> table(FilterGenes)
FilterGenes
FALSE  TRUE 
41584    41 
# 共有41个gene,输出结果
> hubgene_lightyellow <- dimnames(data.frame(datExpr))[[2]][FilterGenes]
> write.csv(hubgene_lightyellow, "hubgene_KME_lightyellow.csv")

这里的41个gene里发现有不是这个module里的基因,修改如下:

> datKME=signedKME(datExpr, MEs, outputColumnName="kME_MM.")
> module = "lightyellow"
> column = match(module, modNames)
> moduleGenes = moduleColors==module
> lightyellow_module<-as.data.frame(dimnames(data.frame(datExpr))[[2]][moduleGenes])
> names(lightyellow_module)="genename"
> lightyellow_KME<-as.data.frame(datKME[moduleGenes,column]) 
> names(lightyellow_KME)="KME"
> rownames(lightyellow_KME)=lightyellow_module$genename
> FilterGenes = abs(lightyellow_KME$KME) > 0.8
> table(FilterGenes)
FilterGenes
FALSE  TRUE 
  638    39 
> lightyellow_hub<-subset(lightyellow_KME, abs(lightyellow_KME$KME)>0.8)
> write.csv(lightyellow_hub, "hubgene_KME_lightyellow.csv")

这里就只有39个了,都在module里。

c. MM & GS (常用)

在专题(3)中,我们绘制了MM vs. GS的散点图:

MM vs. GS

hub基因即为图中右上角的基因,生信技能树中有相关的介绍:
WGCNA得到模块之后如何筛选模块里面的hub基因 (qq.com)
即通过MM和GS进行筛选,这里的标准不固定,根据自己的数据进行更改。这里我用的标准是|GS|>0.2,|MM|>0.8。

# 选择lightyellow模块
> hub<- abs(geneModuleMembership$MMlightyellow)>0.8 & abs(geneTraitSignificance)>0.2
> table(hub)
hub
FALSE  TRUE 
41595    41 
> hub<-as.data.frame(dimnames(data.frame(datExpr))[[2]][hub]) 
> write.csv(hub, "hubgene_GSMM_lightyellow_weight.csv")

这里发现,41个gene中有不属于这个module的基因,评论区的小伙伴们也遇到了这个问题,检查后修改如下:

> module = "lightyellow"
> column = match(module, modNames)
> moduleGenes = moduleColors==module
> lightyellow_module<-as.data.frame(dimnames(data.frame(datExpr))[[2]][moduleGenes])
> names(lightyellow_module)="genename"
> MM<-abs(geneModuleMembership[moduleGenes,column])
> GS<-abs(geneTraitSignificance[moduleGenes, 1])
> lightyellow_MMGS<-as.data.frame(cbind(MM,GS))
> rownames(lightyellow_MMGS)=lightyellow_module$genename
> hub_b<-abs(lightyellow_MMGS$MM)>0.8&abs(lightyellow_MMGS$GS)>0.2
> table(hub_b)
FALSE  TRUE 
  638    39 
> lightyellow_hub_b<-subset(lightyellow_MMGS, abs(lightyellow_MMGS$MM)>0.8&abs(lightyellow_MMGS$GS)>0.2)
> write.csv(lightyellow_hub_b, "hubgene_MMGS_lightyellow.csv")

这里和上面一样了,39个gene。

另外在这个地方,我发现|MM|>0.8和上面|KME|>0.8选出来的hub gene是一样的,所以这两个是一个东西吗?有没有了解的大佬能帮我解答一下,不胜感激。(这个问题已经解决,评论区有一个大佬有回答)

d. chooseTopHubInEachModule()

WGCNA中有一个自带函数,chooseTopHubInEachModule(),可以获得每个module中最核心的一个hub gene,注意这个结果每个模块只返回一个hub gene。

> HubGenes <- chooseTopHubInEachModule(datExpr,moduleColors)
> write.csv (HubGenes,file = "TopHubGenes_of_each_module.csv",quote=F)

e. weighted

在将模块信息导出为Cytoscape格式时,计算了每个基因的weight,也可以作为筛选hub gene的标准。
WGCNA(5):模块导出至其他可视化软件 - 简书 (jianshu.com)

> cyt = exportNetworkToCytoscape(modTOM,edgeFile = 
  paste("CytoscapeInput-edges-", paste(module, collapse="-"), ".txt", sep=""), 
  nodeFile = paste("CytoscapeInput-nodes-", paste(module,  collapse="-"), ".txt", sep=""),
  weighted = TRUE, 
  threshold = 0.1,
  nodeNames = modProbes, nodeAttr = moduleColors[inModule])
  • weighted = TRUE,计算weighted值
  • threshold = 0.1,筛选weighted的阈值,对于我的数据,0.1时edge只有27个,调整到0.08,则有218个。
  • 也可以直接通过weighted值排序,直接选择最高的一部分基因作为hub,例如nTop = 30。
> nTop = 30
> IMConn = softConnectivity(datExpr[, modProbes])
> top = (rank(-IMConn) <= nTop)
> cyt = exportNetworkToCytoscape(modTOM[top, top],edgeFile = 
  paste("CytoscapeInput-edges-", paste(module, collapse="-"), "_top30.txt", sep=""), 
  nodeFile = paste("CytoscapeInput-nodes-", paste(module,  collapse="-"), ".txt", sep=""),
  weighted = TRUE, 
  nodeNames = modProbes, nodeAttr = moduleColors[inModule])

这篇帖子的初衷,是我发现在找hub基因的时候,大家有各种各样的办法,但是好像没有一个人把所有的方法系统整理出来。我很想把所有的方法都试一遍,然后选择一个适合自己数据的最优解。
但是在整理的时候发现,这里面有很多东西我都不是很理解,包括WGCNA说明书后面模拟数据的一大部分分析,我都没有特别理解,只能把自己大概的理解分享出来,如果有错误的地方,非常希望懂行的老师同学批评指导,也希望有想法的小伙伴可以互相交流。

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

推荐阅读更多精彩内容

  • 因为样本数量比较可观,所以可以进行WGCNA分析。这里是并不需要选取所有的基因来做WGCNA分析,挑选的标准可以是...
    六六_ryx阅读 44,450评论 44 164
  • 本教程根据PlantTech的WGCNA课程编写,课程还是不错的,所以将该课程给大家分享一下。 WGCNA笔记第一...
    周小钊阅读 21,060评论 5 103
  • WGCNA的理论背景知识[https://www.jianshu.com/p/e102681ec979]WGCNA...
    Y大宽阅读 27,946评论 3 60
  • 网络图 在传统的网络图里面,一般分为非权重网络和权重网络对于非权重网络: 非权重网络的特点是只能表示两个点之间是否...
    小潤澤阅读 20,039评论 14 48
  • 听说WGCNA是一个看上去比较厉害的转录组分析方法,近期又多次看到了相关的内容,所以跟风学习一下。对于我这种业余学...
    果蝇饲养员的生信笔记阅读 8,908评论 2 29