3.转录组 | 富集分析(clusterProfiler)

基因富集分析 (gene set enrichment analysis):在一组基因或蛋白中找到过表达的基因或蛋白。

常用的注释数据库:
①GO( The Gene Ontology Consortium): 描述基因的层级关系
②KEGG( Kyoto Encyclopedia of Genes and Genomes):提供pathway的数据库
富集分析的方法:
①ORA(over-repressentation analysis):目前用得最多
②FCS(funcyional class scoring):有一个可视化软件GSEA
③PT(pathway topology):难度比较大

本次富集分析的工具是clusterProfiler,支持上面提到的三类方法。


1.准备数据集和软件

①数据准备

rm(list = ls())
options(stringsAsFactors = T)
library(DESeq2)
control <- read.table("SRR3589956_matrix.count",
                      sep="\t", col.names = c("gene_id","control"))
rep1 <- read.table("SRR3589957_matrix.count",
                   sep="\t", col.names = c("gene_id","rep1"))
rep2 <- read.table("SRR3589958_matrix.count",
                   sep="\t",col.names = c("gene_id","rep2"))
raw_count <- merge(merge(control, rep1, by="gene_id"), rep2, by="gene_id")
raw_count_filt <- raw_count[-1:-5,]
ENSEMBL <- gsub("(.*?)\\.\\d*?_\\d", "\\1", raw_count_filt$gene_id)
row.names(raw_count_filt) <- ENSEMBL

delta_mean <- abs(mean(raw_count_filt$rep1) - mean(raw_count_filt$rep2))

sampleNum <- length(raw_count_filt$control)
sampleMean <- mean(raw_count_filt$control)
control2 <- integer(sampleNum)

for (i in 1:sampleNum){
  if(raw_count_filt$control[i] < sampleMean){
    control2[i] <- raw_count_filt$control[i] + abs(raw_count_filt$rep1[i] - raw_count_filt$rep2[i])
  }
  else{
    control2[i] <- raw_count_filt$control[i] + rpois(1,delta_mean)
  }
}

raw_count_filt$control2 <- control2

library(DESeq2)
countData <- raw_count_filt[,2:5]
condition <- factor(c("control","KD","KD","control"))
dds <- DESeqDataSetFromMatrix(countData, DataFrame(condition), design= ~ condition )
nrow(dds)
dds <- dds[ rowSums(counts(dds)) > 1, ]
nrow(dds)

##使用DESeq进行差异表达分析
dds <- DESeq(dds)
res <- results(dds)
mcols(res, use.names = TRUE)
summary(res)

###准备富集分析的数据集,根据padj < 0.05 且Log2FoldChange的绝对值大于1的标准。
deseq2.sig <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)

②安装包下载注释数据 (rog.HS.eg.db)

source("https://bioconductor.org/biocLite.R")
biocLite("clusterProfiler")
biocLite("AnnotationHub")
library(AnnotationHub)
ah <- AnnotationHub()
head(unique(ah$species))
ah[ah$species == 'Homo sapiens' & ah$rdataclass == 'OrgDb']
目标数据库
org.hs <- ah[['AH61777']]
##若是在rstudio中下载不下来,可以将网址复制到网页中下载,之后再加载进来
loadDb("org.Hs.eg.db.sqlite")
org.hs <- loadDb("org.Hs.eg.db.sqlite")
##对数据库进行简单的探索
unique(ah$dataprovider)    #查看数据来源 
unique(ah$species)         #查看数据库中有多少个物种的注释信息
unique(ah$rdataclass)      #查看注释信息的数据存放格式,FaFile表示fasta文件; TxDb表示转录组数据库; OrgDb,用于基因ID、基因名、GO、KEGG ID之间的相互映射
ah$species[which(ah$species == "Arabidopsis thaliana")]   #筛选目标物种,查找目标物种是否存在,例如“拟南芥”
ah[ah$species == 'Arabidopsis thaliana' & ah$rdataclass == 'OrgDb']   #筛选目标物种,查找目标物种、目标数据库是否存在,例如“拟南芥的OrgDb库”
2.GO富集分析

GO分析主要的函数是:

enrichGO(gene, OrgDb, keyType = "ENTREZID", ont = "MF",
  pvalueCutoff = 0.05, pAdjustMethod = "BH", universe, qvalueCutoff = 0.2,
  minGSSize = 10, maxGSSize = 500, readable = FALSE, pool = FALSE)

##主要关注的参数如下:
gene: 差异表达的基因。不推荐使用"A1BG"这种类型的命名,请用setReadable转换。
OrgDb: 物种注释数据库,一般是org开头。
keytpe: ID类型。
ont: 有三个层次,分别是BP(Biological Process), CC(Cellular Component), MF(Molecular Function)。一个基因的功能可以从生物学过程、所属细胞部分和分子功能三个角度定义。
pAdjustMethod:p值矫正的方法。

提供相应的数据即可:

ego <- enrichGO(
  gene = row.names(deseq2.sig),
  OrgDb = org.hs,
  keyType = "ENSEMBL",
  ont = "MF"
)

head(ego)

可视化

dotplot(ego,font.size=10)
barplot(ego,showCategory=20,drop=T)
ego.MF <- enrichGO(gene = row.names(deseq2.sig), OrgDb = org.hs, ont='MF',pAdjustMethod = 'BH',pvalueCutoff = 0.05, qvalueCutoff = 0.2,keyType = 'ENSEMBL')
plotGOgraph(ego.MF)
dotplot

barplot

plotGOgraph
3.KEGG富集分析

KEGG分析主要的函数是:

enrichKEGG(gene, organism = "hsa", keyType = "kegg", pvalueCutoff = 0.05,
  pAdjustMethod = "BH", universe, minGSSize = 10, maxGSSize = 500,
  qvalueCutoff = 0.2, use_internal_data = FALSE)

主要参数:
gene: 基因名,要和keyType对应
organism: 需要参考 [http://www.genome.jp/kegg/catalog/org_list.html](https://link.jianshu.com/?t=http://www.genome.jp/kegg/catalog/org_list.html), 人类是hsa
keyType: 基因的命名方式, "kegg", 'ncbi-geneid', 'ncib-proteinid' and 'uniprot'选择其一
library(clusterProfiler)
gene_list <- mapIds(org.hs, keys = row.names(deseq2.sig),
                       column = "ENTREZID", keytype = "ENSEMBL" )


kk <- enrichKEGG(gene_list, organism="hsa",
                 keyType = "ncbi-geneid",
                 pvalueCutoff=0.05, pAdjustMethod="BH",
                 qvalueCutoff=0.1)
head(summary(kk))
红色字符串表示 一个基因可以有多个功能(KEGG注释),当然一个KEGG注释下也有可以多个基因

可视化

dotplot(kk)
dotplot
4.GSEA分析

用clusterProfiler的gseGO或GSEA函数分析,后者可以自定义输入数据:

gseGO(geneList, ont = "BP", OrgDb, keyType = "ENTREZID", exponent = 1,
  nPerm = 1000, minGSSize = 10, maxGSSize = 500, pvalueCutoff = 0.05,
  pAdjustMethod = "BH", verbose = TRUE, seed = FALSE, by = "fgsea")
主要参数:
geneList: 排序数据, 可以根据log2foldchange, 也可以是pvalues
nPerm: 重抽取次数
minGSSize: 每个基因集的最小数目maxGSSize: 用于测试的基因注释最大数目
genelist <- sig.deseq2$log2FoldChange
names(genelist) <- rownames(sig.deseq2)
genelist <- sort(genelist, decreasing = TRUE)
gsemf <- gseGO(genelist,
      OrgDb = org.hs,
      keyType = "ENSEMBL",
      ont="MF"
      )
head(gsemf)

可视化

gseaplot(gsemf, geneSetID="GO:0004871")
GSEA

参考:
01 转录组入门(8): 富集分析
02 GEO数据挖掘小尝试:(三)利用clusterProfiler进行富集分析
03 转录组学习八(功能富集分析)


写在最后 | 不管是这一部分中的富集分析还是之前的差异表达分析,虽然参考前辈们写出的攻略便捷了很多,参看这些攻略会认为这部分的分析是满满的套路,但不跑一遍是不知道其中隐藏着哪些细节上的问题。同时这些也只是很粗浅的一些分析,仍然需要更进一步的学习。

你可能感兴趣的:(3.转录组 | 富集分析(clusterProfiler))