美文网首页注释和富集RNA-seq基因组组装
拿到基因表达矩阵之后的那点事(四)

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

作者: 凯凯何_Boy | 来源:发表于2020-08-17 19:34 被阅读0次

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

    R包(OrgDb注释包)的准备

    1. 我们先去看下牛这个物种的缩写是什么,全部的物种及其简写(三个字母)。可以看到简写为bta

    2. 然后我们我们去Bioconductor上去搜这个物种的Org类型的注释包,选择最新的包安装就行了


      图片.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参数控制展示的内容),大家请自行了解,不再多讲~~


    图片.png
    图片.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)  
    
    
    图片.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官网
    
    图片.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与差异基因关系网络图
    
    图片.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
            )
    
    图片.png

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

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

    参考链接:1.https://www.jianshu.com/p/bb4281e6604e?utm_campaign=haruki
    2.https://www.cnblogs.com/jessepeng/p/12159139.html

    相关文章

      网友评论

        本文标题:拿到基因表达矩阵之后的那点事(四)

        本文链接:https://www.haomeiwen.com/subject/qgkqjktx.html