WGCNA与基因模块时空表达分析

分析目标:
(1)梳理WGCNA的基本流程。
(2)功能注释
(3)对相应的基因模块进行时空表达特征评估

一、WGCNA分析(基因共表达分析)

我们有4000+个感兴趣的基因,希望通过这一步得到的结果是:按照基因之间的表达特征的相似性,将其分为若干基因模块(module)。

本次实验使用的数据集
(1)GSE25219-GPL5175数据集:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE25219
(2)GSE25219-GPL5175样本注释:根据matrix前面的注释行,对样本数据进行提取后的结果。

注:GPL5175是一种transcript水平的检测平台,因此每一个行的标签代表的是一个基因的转录本的类型*。

(一)输入数据集的预处理

  • 原始数据集

我们下载到原始数据之后,需要对探针名进行转换。GPL5175平台比较复杂的一个点在于,其注释数据中对应基因混乱不明确,给我们下游的分析带来了困难。

data<-read.table("GSE25219-GPL5175_series_matrix.txt",comment.char = "!",header = T,row.names = 1)
# ## transform the gene probe##
gene_anno<-read.csv("probe_anno.csv",row.names = 1) #transcript or gene level is important
colnames(gene_anno)<-c("ID","anno")
# ## 将row name赋值给data #方便下游的合并去交集
data2<-cbind(rownames(data),data)
colnames(data2)[1]<-"ID"
dim(data2) #17565 #1341
# ## make the ID to the rownames of this data frame
merge_data<-merge(data2,gene_anno) #将两者merge到一起
merge_data2<-merge_data[!duplicated(merge_data$anno),] #去除重复
rownames(merge_data2)<-trimws(merge_data2$anno, which = c("both", "left", "right"), whitespace = "[ \t\r\n]") #去除前后可能的空白
merge_data3<-merge_data2[,c(-1,-1342)]
dim(merge_data3) #17337 #deplicate is not too much
write.table(merge_data3,"merge_data.txt")

得到上述探针名进行基因名的转换后的数据集后,下次只需要读取转换后的矩阵即可。

data<-read.table("merge_data.txt")

在这里插入图片描述

  • 样本数据集

这个是根据原始数据集matrix前对样本注释信息提取到的样本的注释集。

## construct the datTraits
label<-read.table("label.txt")
region<-read.table("region.txt")
year<-read.table("year.txt")
stage<-read.table("stage.txt")
meta.data<-rbind(label,region,year,stage)
meta.data2<-as.data.farme(t(meta.data))
colnames(meta.data2)<-c("ID_REF","subRegion","time")
NCX<-c("V1C","A1C","DFC"……)#等等
meta.data2[meta.data2%in%NCX,"Region"]<-"NCX"
write.csv(meta.data2,"meta.data.csv")

同样,将样本信息进行上述处理,保存到meta.data的文件中之后,我们下次如果使用只需要读取即可。

meta.data<-read.csv("meta.data.csv")

在这里插入图片描述

(二)对数据集进行筛选

  • 基因层面的筛选

虽然原始的数据集中有很多的基因,但是我们实际上感兴趣的是这4000多个基因,因此我们需要首先,从原始数据集中提取这4000多个基因的表达情况。

genes<-read.table("input_interest_gene_all.txt",sep="\t",header = F)
genes2<-genes[!duplicated(genes$V1),]
filter_data<-data[rownames(data)%in%genes2,] #筛选感兴趣的gene set
  • 样本层面的筛选

剔除属于Stage1和Stage2阶段的样本

filter_sample<-meta.data[which(!meta.data$Stage%in%c("Stage: 1","Stage: 2")),"ID_REF"]
filter_data<-filter_data[,colnames(filter_data)%in%filter_sample]
filter_metadata<-meta.data[meta.data$ID_REF%in%filter_sample,]

最后得到在行和列层面上筛选过的data和meta.data。

(三)WGCNA分析——寻找共表达的基因模块

一般网上对于这个的描述特别的杂乱和复杂,在我看来这一步可以简化为以下。

(1)加载WGCNA包

library(WGCNA)
options(stringsAsFactors = FALSE) 

(2)准备基因的输入矩阵

datExpr0<-t(datExpr)

(3)筛选软阈值

## pick softscores
powers = c(c(1:20))
sft = pickSoftThreshold(datExpr1,powerVector = powers, verbose = 5)#verbose=5说明什么
#(1)是否符合幂律分布;
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")
abline(h=0.90,col="red")
#(2)节点的平均连接度
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")
par(mfrow = c(1,1))

在这里插入图片描述通过上述实验,筛选出软阈值为9。以9为阈值,用于下游的分析。

(4)一步式计算基因模块

net = blockwiseModules(datExpr1, power = 9,
                       corType = "pearson",
                       networkType="unsigned",
                       TOMType = "unsigned", 
                       minModuleSize = 30,
                       verbose = 3) #记住power依旧是9 #这里的参数实际上是由上面一步步得到的                 

这一步就得到了wgcna分析的所有结果,下面可以根据这个net变量的结果进行多样化的绘图。

当需要将基因模块与表型建立起相关性时,还需要构建表型矩阵,由于这里这一部分并非是我们的核心,因此暂时不去考虑。

如对基因模块从表达特征上进行聚类。

MEDiss = 1-cor(net$MEs)
METree = hclust(as.dist(MEDiss), method = "average")
sizeGrWindow(7, 6)
plot(METree, main = "Clustering of module eigengenes",
     xlab = "", sub = "")
abline(h=0.25, col = "red")  #根据实际情况而定

在这里插入图片描述
(5)提取每一种颜色模块中的基因。

moduleGenes = names(net$colors)[net$colors%in%c("turquoise")]
write.csv(moduleGenes,"turquoise_module.csv")

二、对模块基因进行GO功能注释

(略)

三、基因模块表达的时空pattern的分析

(一)从WGCNA的结果中提取特定模块的eigengenes

这一步是对前面步骤结果的提取。

moduleColors<-as.data.frame(table(net$colors))$Var1
MEs0 = moduleEigengenes(net$MEs, moduleColors)$eigengenes

(二)与样本注释数据集合并(以提取黄色模块为例)

pcaPlotDat <- merge(filter_metadata,cbind(PC1=filter_data$MEyellow,ID_REF=rownames(filter_data)))
pcaPlotDat$PC1<-as.numeric(pcaPlotDat$PC1)
subtypeOrder<-c("Stage: 3","Stage: 4","Stage: 5","Stage: 6","Stage: 7",
                "Stage: 8","Stage: 9","Stage: 10","Stage: 11","Stage: 12","Stage: 13","Stage: 14","Stage: 15")
pcaPlotDat$Stage<-factor(pcaPlotDat$Stage,levels = subtypeOrder)

(三)画图

library(ggplot2)
ggplot(pcaPlotDat,aes(x=Stage,y=PC1,group=Region))+ 
  geom_point(size=3,aes(colour=Region,shape=Region))+
  geom_smooth(method="loess",se=FALSE,aes(colour=Region),formula = y~x)+
  labs(title = "Yellow module")+
  theme(plot.title=element_text(hjust=0.5))

在这里插入图片描述觉得得到的结果比较奇怪,和老师的plot相比。我不理解,为什么我的这个PC1有正有负,且和之前看到的与表型相关性的结果,看起来不太一样(很不明显)。
在这里插入图片描述我觉得基本思路应该没问题了,可能还是一些细节的问题。
等下换一个环境,重新做一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值