前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >院士团队的WGCNA挖掘文章修改成为癌症转移与否关键模块

院士团队的WGCNA挖掘文章修改成为癌症转移与否关键模块

作者头像
生信技能树
发布2023-09-04 16:42:34
3100
发布2023-09-04 16:42:34
举报
文章被收录于专栏:生信技能树生信技能树

代码是完全公开的,大家很容易复制粘贴到自己的表达量矩阵群,其实算起来WGCNA本身就一个函数而已,就是划分基因模块,其它都是附加分析。总体来说就是4个步骤:

  • 合适的矩阵(一般来说,是多个基因或者其它特征指标在多个样品的矩阵)
  • 运行WGCNA,对基因等特征划分模块
  • 计算模块和样品其它属性的相关性
  • 对模块进行go或者kegg等数据库注释搞清楚模块的功能

下面我们就针对前面的 院士课题组的WGCNA数据挖掘文章能复现吗 进行4步骤复现:

合适的矩阵

前面的 院士课题组的WGCNA数据挖掘文章能复现吗 教程里面,我们拿到了转录组差异分析后的上下调基因列表,然后目前的转录组测序表达量矩阵里面的基因表达量是整数格式的counts值,并不适合做后续的运行WGCNA,对基因等特征划分模块。需要一个简单的转换,代码如下所示:

代码语言:javascript
复制
rm(list = ls()) 
load( file =  '../step1-deg/DEG_deseq2.Rdata' ) 
colnames(DEG_deseq2) 
nrDEG=DEG_deseq2[,c("log2FoldChange",   "padj")] 
head(nrDEG) 
colnames(nrDEG)=c('logFC','P.Value')

# 凡是阈值,都是可以自定义 
logFC_t <- 2.5
pvalue_t <- 0.001
gene_up= rownames( nrDEG[with(nrDEG,
                              logFC > logFC_t & P.Value < pvalue_t),])
gene_down=rownames( nrDEG[with(nrDEG,
                               logFC < -logFC_t & P.Value < pvalue_t),]) 
length(gene_up);length(gene_down)
head(gene_up);head(gene_down)

load(file = '../step1-deg/symbol_matrix.Rdata')  
symbol_matrix[1:4,1:4] ## 基因名字的样品,矩阵
dat = log2(edgeR::cpm(symbol_matrix)+1)
# 这个归一化方法不太推荐
library(limma)
library(edgeR)
library(DESeq2) 
dge <- DGEList(counts=symbol_matrix)
dge <- calcNormFactors(dge)
logCPM <- cpm(dge, log=TRUE, prior.count=3)
design <- model.matrix(~0+factor(group_list))
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(symbol_matrix)
design
v <- voom(dge,design,plot=TRUE, normalize="quantile")
dat = v$E

dat[1:4,1:4]
boxplot(dat,las=2)
table(group_list)

kp = group_list=='case'
# 矩阵,样品过滤,基因过滤
dat = dat[c(gene_up,gene_down),kp]
dim(dat)

仅仅是因为前面的 院士课题组的WGCNA数据挖掘文章能复现吗 ,它是先差异分析,然后做wgcna,并不代表我们一定要这样做,如何过滤基因都是可以有自己的考虑,言之有理即可,也可以是简简单单基因sd或者mad的排序后取top 5000或者其它数量级的基因列表做后续的wgcna

然后运行WGCNA,对基因等特征划分模块

运行WGCNA之前需要确定一下软阈值,当然了,这个步骤也是可以自由修改的,

代码语言:javascript
复制

#1.确定软阈值----
library(WGCNA)
dat0 <- t(dat)

powers = c(c(1:10), seq(from = 12, to=20, by=2))
# Call the network topology analysis function
sft = pickSoftThreshold(dat0, 
                        powerVector = powers, 
                        verbose = 5)
po <- sft$powerEstimate;po

# Plot the results:
sizeGrWindow(9, 5)
par(mfrow = c(1,2));
cex1 = 0.9;

# Scale-free topology fit index as a function of the soft-thresholding power
plot(sft$fitIndices[,1], 
     -sign(sft$fitIndices[,3])*sft$fitIndices[,2],
     xlab="Soft Threshold (power)",
     ylab="Scale Free Topology Model Fit,signed R^2",
     type="n",
     main = paste("Scale independence"));
text(sft$fitIndices[,1], 
     -sign(sft$fitIndices[,3])*sft$fitIndices[,2],
     labels=powers,cex=cex1,col="red");

# this line corresponds to using an R^2 cut-off of h
abline(h=0.90,col="red")

# Mean connectivity as a function of the soft-thresholding 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, cex=cex1,col="red")
 

#2.一步构建网络----
# 报错:https://blog.csdn.net/liyunfan00/article/details/91686840
cor <- WGCNA::cor
net = blockwiseModules(dat0, power = po,
                       TOMType = "unsigned", minModuleSize = 30,
                       reassignThreshold = 0, mergeCutHeight = 0.25,
                       numericLabels = TRUE, pamRespectsDendro = FALSE,
                       saveTOMs = F, 
                       verbose = 3) #一步构建网络
#改回去
cor<-stats::cor

class(net)
names(net)
table(net$colors)

#(1)保存net相关信息
moduleLabels = net$colors
moduleColors = labels2colors(net$colors)
MEs = net$MEs;
geneTree = net$dendrograms[[1]];
save(net,MEs, moduleLabels, moduleColors, geneTree, 
     file = "Step2networkConstruction-auto.RData")

可以看到,模块划分的非常棒啊:

模块划分的非常好

可以看到是10个模块,每个模块都有几百个基因 :

代码语言:javascript
复制
  0   1   2   3   4   5   6   7   8   9 
509 993 515 341 290 272 209 197 160 122 

简简单单的 blockwiseModules 函数就完成了wgcna分析

计算模块和样品其它属性的相关性

模块是基因的合集,它可以有自己的值,也是跟基因一样的在每个样品都有一个计算好的值。同时呢,每个样品也有其它属性,比如病人就可以有年龄,体重等等,肿瘤病人还有tnm和stage信息,比如下面的代码,我们选择了肿瘤病人的转移与否这个二分类变量,取跟前面的模块进行关联分析

代码语言:javascript
复制
#1.Modules-traits relationships----
# Define numbers of genes and samples
dat <- t(dat)
nGenes = ncol(dat)
nSamples = nrow(dat)

# Recalculate MEs with color labels
MEs0 = moduleEigengenes(dat, moduleColors)$eigengenes
MEs0[1:6,1:6]

MEs = orderMEs(MEs0)
MEs[1:6,1:6]

phe = data.table::fread('TCGA-CHOL.GDC_phenotype.tsv.gz',data.table = F)
colnames(phe)
phe=phe[match(rownames(dat),phe$submitter_id.samples),]
# [41] "pathologic_M"                             
# [42] "pathologic_N"                             
# [43] "pathologic_T" 
group_list = phe$pathologic_M
table(group_list)
group_list=ifelse(group_list=='M0','non','M')
group_list=as.factor(group_list)
# 肿瘤,tmn,stage。。。。

design=model.matrix(~0+ group_list)
colnames(design)=levels(group_list)
moduleTraitCor = cor(MEs, design, use = "p")
head(moduleTraitCor)

moduleTraitPvalue = corPvalueStudent(moduleTraitCor, 
                                     nSamples)
head(moduleTraitPvalue)

#可视化
sizeGrWindow(10,6)

# Will display correlations and their p-values
textMatrix =  paste(signif(moduleTraitCor, 2), 
                    "\n(",signif(moduleTraitPvalue, 1),
                    ")", 
                    sep = "");
dim(textMatrix) = dim(moduleTraitCor)
textMatrix[1:6,1:3]

par(mar = c(3, 12, 3, 1));
# Display the correlation values within a heatmap plot
design1 <- as.data.frame(design)
labeledHeatmap(Matrix = moduleTraitCor,
               xLabels = names(design1),
               yLabels = names(MEs),
               ySymbols = names(MEs),
               colorLabels = FALSE,
               colors = blueWhiteRed(50),
               textMatrix = textMatrix,
               setStdMargins = FALSE,
               cex.text = 1,
               zlim = c(-1,1),
               main = paste("Module-trait relationships"))

可以看到,有两个模块跟我们的肿瘤转移是正相关,一个模块是负相关,如下所示:

肿瘤转移的模块

最后就是对模块进行go或者kegg等数据库注释搞清楚模块的功能

前面我们知道了有两个模块跟我们的肿瘤转移是正相关,一个模块是负相关,而且也知道了模块里面的基因是什么,但是基因那么多我们没办法描述它,通常是需要对各个模块里面的基因进行go或者kegg等数据库注释搞清楚模块的功能。代码也是很简单的:

代码语言:javascript
复制
rm(list = ls())  ## 魔幻操作,一键清空~
options(stringsAsFactors = F)
library(WGCNA)
load( file = "Step2networkConstruction-auto.RData")

table(moduleColors)
group_g=data.frame(gene=names(net$colors),
                   group=moduleColors)
head(group_g)
#save(group_g,file='wgcna_group_g.Rdata') 
library(clusterProfiler)
# Convert gene ID into entrez genes
head(group_g)
tmp <- bitr(group_g$gene, fromType="SYMBOL", 
            toType="ENTREZID", 
            OrgDb="org.Hs.eg.db")
de_gene_clusters=merge(tmp,group_g,by.x='SYMBOL',by.y='gene')
table(de_gene_clusters$group)
head(de_gene_clusters)

gcSample <- split(de_gene_clusters$ENTREZID, 
                               de_gene_clusters$group) 
xx <- compareCluster(gcSample, fun="enrichKEGG",
                     organism="hsa", pvalueCutoff=0.05)
dotplot(xx)  

如下所示,我们不仅仅是是知道了有两个模块跟我们的肿瘤转移是正相关,而且知道了这两个模块的功能是细胞恶性增殖以及细胞迁移,完美的对应了肿瘤的恶性转移。

肿瘤的恶性转移

我们这里并没有去重复院士团队的WGCNA挖掘文章,而是自作主张的把它修改成为癌症转移与否关键模块,结果也挺好的。

相比大家也懂我们为什么没有去重复院士团队的WGCNA挖掘文章的细节。代码这里给大家,感兴趣的可以去读一下,蛮有意思的:https://cowtransfer.com/s/9c88947d74bf4b 点击链接查看 [ 2023-浙江大学李兰娟院士-WGCNA数据挖掘.zip ] ,或访问奶牛快传 cowtransfer.com 输入传输口令 whhffg 查看;

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 合适的矩阵
  • 然后运行WGCNA,对基因等特征划分模块
  • 计算模块和样品其它属性的相关性
  • 最后就是对模块进行go或者kegg等数据库注释搞清楚模块的功能
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档