转录组GO富集与微生物相关性分析

原始数据格式

我相信做生物分析的都知道很多时候难点往往不在于代码怎么写,而在于数据格式很多时候与各种包的要求不相符合,因此我先列一下本次分析中用到的数据格式

表1:转录组数据使用原始矩阵

A_1A_2A_3B_1B_2B_3C_1C_2C_3D_1……
Gene0000001…………………………………………………………
Gene0000002…………………………………………………………
Gene0000003…………………………………………………………
Gene0000004…………………………………………………………
………………………………………………………………

表2:分组数据

sample_IDgroup
A_1A
A_2A
A_3A
B_1B
B_2B
B_2B
C_1C
…………

表3:细菌丰度表

genus1genus2genus3genus4……
A_1…………………………
A_2…………………………
A_3…………………………
B_1…………………………
B_2…………………………
………………………………

表4:基因注释文件
由于我做的是非模式生物,所以进行GO富集时还需要一个基因注释文件,这个文件的后缀是.map(用文本文档按下列格式弄好改后缀就行),gene_id列与GO_number列之间用\t制表符分隔

gene_idGO_number
Gene0000001GO:0005515
Gene0000001GO:0051259, GO:0046872, GO:0030176, GO:0005783, GO:0030968, GO:0016874, GO:0016021, GO:0016020, GO:0008270, GO:0000299, GO:0006928, GO:0006512, GO:0006511, GO:0007165, GO:0005515, GO:0030433, GO:0005789, GO:0004842, GO:0000209, GO:0004872
Gene0000003GO:0008076, GO:0005242, GO:0030955, GO:0005244
…………

使用TCC包进行差异基因分析

TCC是什么包?为什么要用TCC包?目前常用的差异基因分析包为DEseq2或者edgeR,但是这两个包在寻找差异基因时只能够找出两组之间的差异基因,即使你的数据里有A、B、C、D四个组,DESeq2分析后也只会返回A vs B,A vs C,A vs D,B vs C……的结果,而不会找出在四个组中有显著性差异的基因。这对于做临床研究、药理研究的同志们来说可能够了,但是对于植物学方面的就不够用了(不同器官、不同生长阶段等)。那么有没有可以多组同时比较的R包呢?经过检索我发现了这个TCC包可以满足要求1。其实这个包是在DESeq,DESeq2和edgeR三个包基础上构建了一个适用于多组分析的pipeline。这里我使用的是基于DESeq2的管道,更多内容可以参考帮助文档。分析代码如下:

#gene_count_matrix,为基因表达矩阵,读入过程略
#group为分组,读入过程略
library(TCC)
#构建TCC类
tcc <- new("TCC", gene_count_matrix, group)
#下面使用TCC包基于DESeq2的管道方案
ssss <- calcNormFactors(tcc, norm.method = "deseq2",
	 test.method = "deseq2", 
	 iteration = 3)
DE <- estimateDE(ssss,
	 test.method = "deseq2", 
	 full = ~ group, 
	 reduced = ~ 1)
res <- getResult(DE)

res就是分析后的结果了,根据names可以很清楚这个结果包含哪些信息

使用topGO包进行GO富集分析

这里没什么说的,就是一个典型的topGO分析,有不明白的可以参考其他博主的内容

#准备基因列表,注意,一定要因子化!!!
genelist<-res$estimatedDEG
names(genelist)<-res$gene_id                        
genelist<-as.factor(genelist)                  
#读入基因注释文件
gene2GO_map<-readMappings("D:/gene2GO.map") 
#构建topGO类,注意MF。CC和BP是分开构建三个。
Godata_BP <- new(
  "topGOdata",
  ontology = "BP",
  allGenes = genelist,
  annot = annFUN.gene2GO,
  gene2GO = gene2GO_map)
#寻找差异GO
resultFis_BP <- runTest(Godata_BP, algorithm = "classic", statistic = "fisher")
#找出排名前100的GO
sig.tab <- GenTable(
  Godata_BP,
  Fis = resultFis_BP,
  topNodes = 100)

计算转录组与微生物组相关性

这边由于微生物和转录组在两个不同的矩阵中,所以自己写了个函数进行相关性计算,比较懒直接用了循环嵌套,速度有些慢,用apply族写的话速度应该会快很多。需要注意的是,循环数小的应该放在外层,循环数大的应该放在内层

get_matrix_cor<-function(x,y)
{
  cormatrix<-as.data.frame(matrix(numeric(0),ncol=length(x),nrow = length(y)))
  for (i in (1:length(x))){
    for (j in (1:length(y))){
      cormatrix[j,i]<-cor(x[,i],y[,j])
    }
  }
}

计算相关性矩阵

trans_bac_cor_matrix<-get_matrix_cor(bac_genus_matrix,t(gene_count_matrix)) %>% as.data.frame()

根据GO号提取相关性矩阵并绘图

一个转录组数据里面的gene数以万计,画在一张图上就什么都看不见了,因此根据我感兴趣的GO号提取出来画图会好的多。GO号的选取可以根据富集结果的sig.tab选取,这里重点讲述画图和输出结果的过程

提取相关性矩阵

#输入一个GO号
GO="0005985"
#获取感兴趣的GO号相对应的gene名字
a<-genesInTerm(Godata_BP,paste0("GO:",GO))[[1]] %>% as.vector() 
#从相关系数矩阵中提取对应基因的行,建议用apply族函数改写,简化代码
b<-c()
for (i in 1:length(a) ){
b[i]<-which(row.names(trans_bac_cor_matrix)==a[i])
}
matrix_BF<-trans_bac_cor_matrix[b,]

这里的matrix_BF就是转录组与微生物组的相关性矩阵了,后期用来进行热图绘制。但是用pheatmap包进行热图绘制前需要先去除NA

#删除NA
matrix_BF<-matrix_BF[-which(is.na(matrix_BF)),]
na_flag <- apply(is.na(matrix_BF), 2, sum)
matrix_BF<-matrix_BF[,na_flag==0]
#注意,我这里删除NA的策略是将某种存在NA的菌直接删去,所以如果有某个基因全是
#NA的话,那matrix_BF就会成为一个空数据框,这个时候需要将这行删去。  

绘制热图

#绘制热图
annotation_col = data.frame(
ClassBac = factor(paste0('Cluster',cutree(hclust_BF,10)))
)
rownames(annotation_col) = colnames(matrix_BF)
pdf(paste0("D:/GO_",GO,".pdf"))
  heatmap_BF<-pheatmap::pheatmap(matrix_BF,show_colnames = F,annotation_col = annotation_col)
dev.off()

这里展示一张(涉及数据因此基因名盖住了)
相关性热图

输出与热图对应的相关性矩阵

pheatmap会自动聚类,这样绘制完成的热图就与之前提取的相关性矩阵不对应了,因此在这里进行一个处理,使得我们输出的矩阵与热图顺序一致。该部分内容参考了一位博主的方法,但是后来找不到页面了,如有侵权,与我联系

hclust_BF=hclust(dist(t(matrix_BF)))
hclust_BF_row=hclust(dist(matrix_BF)) 
col_cluster=cutree(hclust_BF,k=10)
row_cluster=cutree(hclust_BF_row,k=2)
newOrder=matrix_BF[hclust_BF_row$order,]
newOrder[,ncol(newOrder)+1]=row_cluster[match(row.names(newOrder),names(row_cluster))]
names(newOrder)[ncol(newOrder)]="Cluster"
names2=names(matrix_BF[,hclust_BF$order])
newOrder[nrow(newOrder)+1,]=col_cluster[match(c(names2,"cluster"),names(col_cluster))]
row.names(newOrder)[nrow(newOrder)]="Cluster"
#输出对应矩阵
write.csv(newOrder,paste0("D:/GO_",GO,".csv"))

这样输出的矩阵就与热图上的位置一致了。


  1. http://www.bioconductor.org/packages/release/bioc/html/TCC.html ↩︎