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 转录组学习八(功能富集分析)


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容