拿到基因表达矩阵之后的那点事(四)

简介: 得到了差异基因并进行了一顿操作可视化后,我们可以开始富集分析了,Don't say so much,要富集当然首推Y叔的成功之作-- Clusterprofiler, 因为我的数据物种比对的牛的基因组,也是属于模式物种,用该包去做富集是更为方便~~ ,当然这个包也不仅仅限于模式物种,开发者当然会考虑的比较全面,提供了几个函数去做非模式物种或无参的富集,后面我也会说到~~ OK,开始富集吧!!

R包(OrgDb注释包)的准备

  1. 我们先去看下牛这个物种的缩写是什么,全部的物种及其简写(三个字母)。可以看到简写为bta
  2. 然后我们我们去Bioconductor上去搜这个物种的Org类型的注释包,选择最新的包安装就行了
    b719f140fbfbb6dc158c6f38e4592ee.png
  3. 搜不到的时候怎么办?别急,AnnotationHub包,一个包含大量注释信息的数据库,里面有很多物种及来源于很多数据库的注释信息,我们通过这个包去找到你物种的Org注释信息,制作为标准注释库,就可和模式生物一样使用了

#BiocManager::install("AnnotationHub") 
  packageVersion('AnnotationHub') #查看版本
  library('AnnotationHub')
  ah <- AnnotationHub() #这步时间较长,耐心等待,也有时候会加载失败。
  #AnnotationHub的数据来源有哪些?
  unique(ah$dataprovider)
> #AnnotationHub的数据来源有哪些?
> unique(ah$dataprovider)
 [1] "UCSC"                                  "Ensembl"                               "RefNet"                               
 [4] "Inparanoid8"                           "NHLBI"                                 "ChEA"                                 
 [7] "Pazar"                                 "NIH Pathway Interaction Database"      "Haemcode"   
  .......
  #AnnotationHub目前支持哪些物种?我想找的物种在这里面么
  unique(ah$species)
   [1] "Homo sapiens"                                            "Vicugna pacos"                                          
   [3] "Dasypus novemcinctus"                                    "Otolemur garnettii"                                     
   [5] "Papio hamadryas"                                         "Papio anubis"                                           
   [7] "Felis catus"                                             "Pan troglodytes" 
  .....
  #查看目标物种
  ah$species[which(ah$species == "Bos taurus")]
  #查看该物种信息
  mu = query(ah,"Bos taurus")
  mu
  #可以看到信息OrgDb属于rdataclass里面的,所以使用 以下方式精确搜索
  ah[ah$species == "Bos taurus" & ah$rdataclass =='OrgDb']
  AnnotationHub with 1 record
# snapshotDate(): 2019-10-29 
# names(): AH75735
# $dataprovider: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/
# $species: Bos taurus
# $rdataclass: OrgDb
# $rdatadateadded: 2019-10-29
# $title: org.Bt.eg.db.sqlite
# $description: NCBI gene ID based annotations about Bos taurus
# $taxonomyid: 9913
# $genome: NCBI genomes
# $sourcetype: NCBI/ensembl
# $sourceurl: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/, ftp://ftp.ensembl.org/pub/current_fasta
# $sourcesize: NA
# $tags: c("NCBI", "Gene", "Annotation") 
# retrieve record with 'object[["AH75735"]]' 
 关注结果里的names 和 title 俩行 可以看到AH75375对应牛的编号,且存在OrgDb对象
 #制作为标准注释库,就可和模式生物一样使用了,使用[[]]用于下载数据 结果就是一个OrgDb类的对象了 
Bta.OrgDb <- ah[["AH75375"]]

OK,根据上面最后得到这个Bta.OrgDb这个对象我们可以用之做富集了

  1. 还是搜不到,但还是想用Org类型的注释包,那就麻烦点看下这个帖子吧,自己构建物种包OrgDb,然后用clusterProfiler富集分析,原理是基于eggnog-mapper结果中的基因ID和Go的对应信息文件制作的,非模式富集原理类似只不过用包的形式把对应文件封装起来,其实个人认为没必要单单为了富集去做个一个Org的包,因为提供了函数可以直接基于gene和Go|Kegg对应文件做富集。

富集分析

转换ID,准备数据文件

我这里就直接在Bioconductor上去下载牛的Orgdb包去做富集了,富集分析可以基于ENSEMBL的ID号,但是建议都转换为ENTREZ ID。

#两列信息就够了
diff_gene_Deseq2 <- diff_gene %>% dplyr::select(GeneID,log2FoldChange)
#或者拿整个差异基因一起进行富集
All_gene_id <- bitr(diff_gene_Deseq2$GeneID, fromType = "ENSEMBL", toType = c("ENTREZID", "SYMBOL"), OrgDb = org.Bt.eg.db)
#保留转换成功的ENTREZID"
diff_gene_Deseq2 <- diff_gene_Deseq2[diff_gene_Deseq2$GeneID%in%All_gene_id$ENSEMBL,]
#转换id
tran_id <-  bitr(up_id, fromType = "ENSEMBL", toType = c("ENTREZID", "SYMBOL"), OrgDb = org.Bt.eg.db)

另一种转换转换id方法, toTable函数会提取该包中的ensemble和geneid对应关系

EG2Ensembl=toTable(org.Bt.egENSEMBL) #提取该包的ensemble和geneid对应关系
colnames(diff_gene_Deseq2)[1] <- 'ensembl_id'
results1=merge(diff_gene_Deseq2,EG2Ensembl,by='ensembl_id',all.x=T)
id <- na.omit(results1)

GO功能富集

All <- enrichGO(OrgDb="org.Bt.eg.db", 
                gene = diff_gene_Deseq2$GeneID,
                ont = "all",
                keyType = 'ENSEMBL',
                pvalueCutoff = 1,
                qvalueCutoff = 1, 
                pAdjustMethod = "BH",
                readable= TRUE) 
names(attributes(All))  #查看对象包含元素
result <- All@result    #其中的 result,即为所有基因的富集结果数据框形式
y = All[All$p.adjust < 0.5, asis = T] 
#提供asis参数可以直接过滤enrich对象,这样方便我们不用先提取数据框再去做筛选了
我们也可以直接对于这个对象去使用barplot,dotplot函数作图了

可视化

内置了许多可视化的函数

##常用到的dotplot
dotplot(All, split="ONTOLOGY",showCategory=20,color = 'pvalue')+ 
        facet_grid(ONTOLOGY~.,scale="free")+
  scale_size(range=c(2, 10)) +
  scale_color_continuous(low='gold', high='green')
dotplot(All, x = ~GeneRatio/BgRatio)
dotplot(All, x = ~ -log(qvalue))  ## 注意我们可以指定x轴的内容
#其他一些可视化
barplot(All,showCategory=20,title="EnrichmentGO")  
cnetplot(All, node_label="category")  #网络图展示富集功能和基因的包含关系
emapplot(All) #网络图展示各富集功能之间共有基因关系
heatplot(All) #热图展示富集功能和基因的包含关系
goplot(ego) #igraph布局的DAG 有向无环图
plotGOgraph(All)  #矩形代表富集到的top10个GO terms, 颜色从黄色过滤到红色,对应p值从大到小。

建议大家要多去Y叔公众号去学习该包的专题,阅读帖子,了解更细致的作图细节,比如上面dotplot函数默认映射的是按照p.adjust值的大小,加上color = 'pvalue'参数之后就可以按照p值大小去映射,在你的矫正p值都普遍较高时候可以用到,还有我们可以通过scale_size/color等去调点大小,图颜色,就不需要再去把富集结果的表弄出来再用ggplot去画 一步到位省时省力,当然其他的centplot,emapplot函数里也有一些好用的参数(比如node_label参数控制展示的内容),大家请自行了解,不再多讲~~

6295253fd6bbe1d0325d2eefb9f0d54.png

1b55c5eed967c71be058fe995405ba0.png

Goplot包富集

除了内置函数可视化,这里再推荐另外一个包Goplot对结果文件进行可视化,图形总体感觉还是比较美观的~

该包文档地址:https://wencke.github.io/

这个包内置了一个EC数据集 方便我们构造数据格式,需要注意的是该包对列名,数据格式要求严格,我们要跟着模仿修改,示例文件中是ENSEMBLID,我这里用基因Symbol ID试一下,这里值简单演示,更多类型多请详细看文档~~

data(EC)
head(EC$david)
head(EC$genelist)
library(GOplot)
## 用自己的数据演示
gene_list <- id[,c(3,4)]  #一列Symbol ID 一列 Log(foldchange)              
colnames(gene_list) <- c('ID','logFC')   #修改列名和内置数据一样
enrich_result <- All@result #提取该基因列表富集的结果
enrich_result <- dplyr::select(enrich_result,ONTOLOGY,ID,Description,geneID,p.adjust)
names(enrich_result) <- c('Category','ID','Term','Genes','adj_pval') #修改列名和内置数据一样
enrich_resulte$Genes <- gsub('/',',',enrich_resulte$Genes)
rownames(enrich_resulte) <- seq(1,nrow(enrich_resulte))
##
circ <- circle_dat(enrich_resulte,gene_list)
GOBubble(circ, title = 'Bubble plot', colour = c('orange', 'darkred', 'gold'), display = 'multiple', labels = 3)
# Colour the background according to the category
GOBubble(circ, title = 'Bubble plot with background colour', display = 'multiple', bg.col = T, labels = 3)

b5c0fb80af0b5e6455e8b9320e1b161.png

KEGG功能富集

#要尽量使用Entrezid
KEGG <- enrichKEGG(gene= tran_id$ENTREZID,
                    organism  = 'bta', 
                    keyType = "kegg",
                    pAdjustMethod = "BH",
                    #minGSSize = 10,
                    #maxGSSize = 500,
                    qvalueCutoff = 1,
                    pvalueCutoff = 1)
KEGG1 <- as.data.frame(KEGG)
#barplot
barplot(KEGG, font.size=12, showCategory=20, title="Enrichment Top20") 
#标题,字体,泡泡大小
dotplot(KEGG, font.size=8, showCategory=10, title="Enrichment KEGG Top10") + scale_size(rang=c(5,20))
#pathway关系网络图(通过差异基因关联)
emapplot(kk,  showCategory = 30)
#pathway与差异基因关系网络图
cnetplot(kk, showCategory = 5)
#pathway映射
browseKEGG(kk, "hsa04934") #在pathway通路图上标记富集到的基因,会链接到KEGG官网

21f7061c72e44811a06da293b885f35.png

这里可视化用到的函数和Go富集分析的基本一致,另外提一点,KEGG除了pathway这个数据库,另一个Module数据库也是比较常用的,大家也可以做下富集看有没有什么新的发现

## KEGG Moudule富集分析
xx <- enrichMKEGG(gene = id$gene_id,
                  organism='bta',
                  minGSSize=1)

GSEA富集分析

一般拿全谱数据跑,步骤简单讲就是可以取DEseq2结果中的ID列和log(FC)列数据取出来,然后转换为ENTREZID,从大到小排序,最后用 gseGO和gseKEGG做基因集富集

library(dplyr)
gene_list <- dplyr::select(resdata,Gene,log2FoldChange)
names(gene_list) <- c('ensembl_id','Log2FC')#排序数据, 可以根据log2foldchange, 也可以是pvalues
#转换id
tran_id <-  bitr(gene_list$ensembl_id, fromType = "ENSEMBL", toType = c("ENTREZID", "SYMBOL"), OrgDb = org.Bt.eg.db)
#查看没有转换成功的id  也可以选择foldchange
gene_list <- merge(gene_list[gene_list$ensembl_id%in%tran_id$ENSEMBL,],tran_id,by.x = 'ensembl_id',by.y = 'ENSEMBL')%>%
  dplyr::select(.,c('ENTREZID','Log2FC')) %>% arrange(desc(Log2FC)) 
gene_list <- gene_list[!duplicated(gene_list$ensembl_id),] #第一列必须没有重复
genelist <- gene_list$Log2FC 
names(genelist) <- gene_list$ENTREZID
head(genelist)

Go富集

ego <- gseGO(
  geneList  = genelist,
  OrgDb  = org.Bt.eg.db,
  keyType = "ENTREZID",
  ont  = "ALL",
  nPerm  = 1000,  #置换检验的置换次数
  minGSSize  = 100,
  maxGSSize  = 500,
  pvalueCutoff = 1,
  verbose  = FALSE)
gsea_GO <- ego@result
#查看 enrichResult 类对象中的元素
names(attributes(ego))
#同上文提到的,clusterProfiler 包里的一些默认作图方法,例如
dotplot(ego,color = 'pvalue')  #富集气泡图
emapplot(ego) #网络图展示各富集功能之间共有基因关系
gseaplot(ego, 'GO:0002376')    #基因集富集得分图
cnetplot(ego, showCategory = 5)#GO term与差异基因关系网络图

dce93751a4902f9adf9c52377ff54db.png

Kegg富集

kk <- gseKEGG(
  geneList  = genelist,
  keyType  = 'kegg',
  organism = 'bta',
  nPerm  = 1000,
  minGSSize = 10,
  maxGSSize = 500,
  pvalueCutoff = 0.05,
  pAdjustMethod     = "BH"
)
dotplot(kk,color = 'pvalue')  #富集气泡图
#pathway映射
browseKEGG(kk, "bta04064") #在pathway通路图上标记富集到的基因,会链接到KEGG官网

关于KEGG的可视化,如果我们想去看具体的通路上基因的表达变化,除了用上面browseKEGG函数去链接官网查看,我还想到一个类似功能且十分强大的R包pathview

library(pathview)
pathview(gene.data = genelist, pathway.id = 'bta04110',species="bta", 
         limit=list(gene=max(abs(genelist)), cpd=1),
         kegg.native = T
        )

00c5106427c7c927d019e5872e82b47.png

然后在目录里会直接生成俩张图,一张是该目标物种在这条pathway里存在的基因,一张是差异基因的表达变化图,颜色的改变代表foldchange的变化,方便我们直观的观察基因的上下调~

OK!! 常规的富集分析或者基因集富集(GSEA)流程基本如上所示, 但是各个环节参数调用或更个性化的作图还需自己多练习摸索,另外无参物种或者说非模式物种的基因富集 ,我们留到下次再说吧~~

参考链接:1.https://www.jianshu.com/p/bb4281e6604e?utm_campaign=haruki

2.https://www.cnblogs.com/jessepeng/p/12159139.html


相关文章
|
机器学习/深度学习 数据采集 索引
探索数据的维度:多元线性回归在实际应用中的威力
探索数据的维度:多元线性回归在实际应用中的威力
数学问题-反射定律&折射定律的向量形式推导
数学问题-反射定律&折射定律的向量形式推导
209 0
|
人工智能
从浅到深研究矩阵的特征值、特征向量
从浅到深研究矩阵的特征值、特征向量
176 0
|
机器学习/深度学习 决策智能
矩阵分析 (五) 矩阵的分解
矩阵分析 (五) 矩阵的分解
152 0
|
机器学习/深度学习 决策智能
矩阵分析 (八) 矩阵的直积
矩阵分析 (八) 矩阵的直积
432 0
|
机器学习/深度学习
等约束二次规划中的特征分解研究(Matlab代码实现)
等约束二次规划中的特征分解研究(Matlab代码实现)
向量带来的高维思维
学习向量对于我们来说是突然的,感觉我一直在经历“降维打击”,经过十几节课的系统学习,向量似乎在我的眼里和高中时候的不太一样了。为什么这么说呢?在以前的认知里,向量就是简单的“有大小、有方向的量”,
拿到基因表达矩阵之后的那点事(一)
做转录组一般拿到基因表达矩阵之后工作即可开始做差异分析,在此之前还有一步就是对矩阵做标准化,常见的几种RPKM、FPKM、TMM等,虽然RPKM、FPKM方法被吐槽的尤为厉害,但是大多数测序公司给出的结果依然还是很多在使用这种方法,这里我还是以RPKM作为演示。
218 0
拿到基因表达矩阵之后的那点事(二)
上次说了除了FPKM/RPKM标准化,我们可以直接拿原始Counts去进行差异分析,基于Deseq2、edgeR、limma三个包简单介绍一下分析流程。其中edgeR包在无生物学重复的研究中也用的较多~~
254 0
|
数据可视化
拿到基因表达矩阵之后的那点事(三)
之前的流程我们已经通过三种常用的方法对样品之间做了差异分析,接下来我们就以最流行的DEseq2包分析的结果接着进行分析,可视化~
197 0