转录组入门(8):差异基因结果注释

作业要求

我们统一选择p<0.05而且abs(log2FC)大于1的基因为显著差异表达基因集,对这个基因集用R包做KEGG/GO超几何分布检验分析。
然后把表达矩阵和分组信息分别作出cls和gct文件,导入到GSEA软件分析。
来源于生信技能树:http://www.biotrainee.com/forum.php?mod=viewthread&tid=1750#lastpost

实验过程

1.差异基因筛选

我在转录组入门(7):差异基因分析已经完成了差异基因筛选,为了更好的衔接,我将上一步的代码也一并写入,完整流畅一些,最后我们得到的是数据diff_gene_deseq2,包含了差异表达基因。(这里就不在详细注释这些代码,请看上一篇文章)

require(DESeq2)
control1 <- read.table("~/disk2/data/rna-seq/matrix/SRR3589959.count", sep="\t", col.names = c("gene_id","control1"))
control2 <- read.table("~/disk2/data/rna-seq/matrix/SRR3589961.count", sep="\t", col.names = c("gene_id","control2")) 
rep1 <- read.table("~/disk2/data/rna-seq/matrix/SRR3589960.count", sep="\t", col.names = c("gene_id","akap951")) 
rep2 <- read.table("~/disk2/data/rna-seq/matrix/SRR3589962.count", sep="\t",col.names = c("gene_id","akap952"))
raw_count <- merge(merge(control1, control2,by="gene_id"),merge(rep1,rep2, by="gene_id"))
raw_count_filt <- raw_count[-48823:-48825,]
raw_count_filter <- raw_count_filt[-1:-2,]
ENSEMBL <- gsub("\\.\\d*", "", raw_count_filter$gene_id) 
row.names(raw_count_filter) <- ENSEMBL
raw_count_filter <- raw_count_filter[ ,-1]
condition <- factor(c(rep("control",2),rep("akap95",2)), levels = c("control","akap95"))
countData <- raw_count_filter[,1:4]
colData <- data.frame(row.names=colnames(raw_count_filter), condition)
dds <- DESeqDataSetFromMatrix(countData, colData, design= ~ condition)
head(dds)
dds2 <- DESeq(dds)
resultsNames(dds2)
res <- results(dds2)
summary(res)
table(res$padj<0.05)
res <- res[order(res$padj),]
diff_gene_deseq2 <-subset(res,padj < 0.05 & (log2FoldChange > 1 | log2FoldChange < -1))

2.GO/KEGG分析及GSEA

我们主要用到的就是Y叔的R包:clusterProfiler包,github上有详细的说明,这个包的功能很强大,我小白一个真的是整不明白,大致看了一些,不过还是有学习到很多,下面就开始贴代码。

2.1 安装clusterProfiler

安装clusterProfiler以及依赖的包,因为个人的电脑都是有差别的,所以我也不好说,这样的代码就一定适合你,因为在我参考别人的时候,就是出现了很多问题,没法安装和载入这个包。具体问题还是要具体分析,也不要那么容易放弃,稍微折腾一些,说不定就能解决。

# Bioconductor的包,安装都是一个套路,source一下,bioLite一下,就差不多了。
source("https://bioconductor.org/biocLite.R")
biocLite("clusterProfiler")
library(clusterProfiler)
# DOSE和DO.db这两个包在我安装的时候提示需要安装,才能载入clusterProfiler,所以就直接安装。
# 问题是在我安装的过程中,又提示好多依赖包没法安装,出现了权限的问题,说是目录NOT PERMISSION。
# 所以一气之下,我就直接修改了R包的读写权限,因为个人电脑,也没有什么特别重要的资料,
# 所以我就直接将相关的R包的目录递归修改成777,这可是相当危险的操作,可不要随意在服务器上进行,后果自负哈。
# 平时个人电脑我都是以root身份进行操作,一下在Ubuntu上以普通用户的身份
# 经常出现权限不足的提示,没有办法进行操作,尤其是R,非常的麻烦。
# 我主要修改了/usr/lib/R/library 和 /usr/local/lib这两个目录,全部递归修改权限为777,折后貌似可以安装成功。
biocLite("DOSE")
require(DOSE)
library(DO.db)
2.2 安装构建自己的基因组注释数据

Biocouductor官网已经拥有了构建好的常用的19个注释数据库,包括了小鼠,人类和拟南芥等常用注释数据,可以用安装bioconductor包的方法来直接安装和载入注释数据,直接使用。

19个注释数据库

# 我们是小鼠数据,所以直接安装载入就可以了,当然人类的也是一样。
# 人类的注释数据
biocLite("org.Hs.eg.db")
library(org.Hs.eg.db)
# 小鼠的注释数据
biocLite("org.Mm.eg.db")
library(org.Mm.eg.db)
  • 如果没有包括在这些注释数据库里面,那么就需要使用AnnotationHub这个包来构建自己的OrgDb。代码如下:
# 这个包应该是clusterProfiler自带的,可以直接载入
library(AnnotationHub)
hub <- AnnotationHub()
# 可以用query()函数来查找你要的物种注释信息,这里我参考官网的内容,我查找的是番茄的注释
# 选择的格式是OrgDb,所以我们选择AH55774
query(hub, "Solanum lycopersicum")
## AnnotationHub with 2 records
## # snapshotDate(): 2017-04-25 
## # $dataprovider: Inparanoid8, ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/
## # $species: Solanum lycopersicum
## # $rdataclass: Inparanoid8Db, OrgDb
## # additional mcols(): taxonomyid, genome, description,
## #   coordinate_1_based, maintainer, rdatadateadded, preparerclass, tags,
## #   rdatapath, sourceurl, sourcetype 
## # retrieve records with, e.g., 'object[["AH10593"]]' 

##          title                               
##   AH10593 | hom.Solanum_lycopersicum.inp8.sqlite
##  AH55774 | org.Solanum_lycopersicum.eg.sqlite 
# 下载注释数据
sl <- hub[["AH55774"]] 
2.3 GO(Gene Ontology)分析

这里涉及到多种类型的ID转换,我们常见的ENSEMBL,ENTREZID这两大类,这里我在分析的时候发现,ENTREZID=kegg=ncbi-geneid,这三者有事相同的ID号。jimmy博客有详细的介绍,我进行了适当的参考:http://www.bio-info-trainee.com/710.html

  • ID转换函数介绍
# 看一下数据库的ID类型
keytype(org.Mm.eg.db)
##  [1] "ACCNUM"       "ALIAS"        "ENSEMBL"      "ENSEMBLPROT"  "ENSEMBLTRANS"
##  [6] "ENTREZID"     "ENZYME"       "EVIDENCE"     "EVIDENCEALL"  "GENENAME"    
##  [11] "GO"           "GOALL"        "IPI"          "MGI"          "ONTOLOGY"    
##  [16] "ONTOLOGYALL"  "PATH"         "PFAM"         "PMID"         "PROSITE"     
##  [21] "REFSEQ"       "SYMBOL"       "UNIGENE"      "UNIPROT" 
# Jimmy推荐的是使用select()函数进行ID的转换
# keys是原始的ID,columns是转换之后的ID,keytype是要指定的原始ID类型
gene <- row.names(diff_gene_deseq2)
tansid <- select(org.Mm.eg.db,keys = gene,columns = c("GENENAME","SYMBOL","ENTREZID"),keytype = "ENSEMBL")
## ENSEMBL                                                GENENAME SYMBOL ENTREZID
## 1 ENSMUSG00000003309 adaptor protein complex AP-1, mu 2 subunit  Ap1m2    11768
## 2 ENSMUSG00000046323    developmental pluripotency-associated 3  Dppa3    73708
## 3 ENSMUSG00000001123       lectin, galactose binding, soluble 9 Lgals9    16859
## 4 ENSMUSG00000018569                                  claudin 7  Cldn7    53624
## 5 ENSMUSG00000023906                                  claudin 6  Cldn6    54419
## 6 ENSMUSG00000000184                                  cyclin D2  Ccnd2    12444
# 此外还有bitr()函数可以转换ID,得到的结果都是一样的
anyid <- bitr(gene,fromType = "ENSEMBL",toType = c("GENENAME","SYMBOL","ENTREZID"),OrgDb = org.Mm.eg.db)
  • enrichGO()函数进行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:差异基因ID;ont:主要的分为三种,三个层面来阐述基因功能,生物学过程(BP),细胞组分(CC),分子功能(MF);OrgDb:指定物种注释数据;keytype:ID类型;pAdjustMethod:P值校正方法。

# 进行go分析
ego <- enrichGO(
  gene = row.names(diff_gene_deseq2),
  OrgDb = org.Mm.eg.db,
  keytype = "ENSEMBL",
  ont = "MF"
)
# 气泡图
dotplot(ego, font.size=5)
# 网络图
enrichMap(ego, vertex.label.cex=1.2, layout=igraph::layout.kamada.kawai)
# GO图需要安装额外的包
biocLite("topGO")
biocLite("Rgraphviz")
require(Rgraphviz)
plotGOgraph(ego)
气泡图
网络图
GO图

关于这些图的说明,可以参考诺禾致源的微信文章

2.4 GSEA分析

基因集富集分析 (Gene Set Enrichment Analysis, GSEA) 的基本思想是使用预定义的基因集(通常来自功能注释或先前实验的结果),将基因按照在两类样本中的差异表达程度排序,然后检验预先设定的基因集合是否在这个排序表的顶端或者底端富集。基因集合富集分析检测基因集合而不是单个基因的表达变化,因此可以包含这些细微的表达变化,预期得到更为理想的结果。
参考资料:GSEA分析是什么鬼(上)GSEA分析是什么鬼(下)

# Gene Set Enrichment Analysis(GSEA)
# 获取按照log2FC大小来排序的基因列表
genelist <- diff_gene_deseq2$log2FoldChange
names(genelist) <- rownames(diff_gene_deseq2)
genelist <- sort(genelist, decreasing = TRUE)
# GSEA分析(具体参数参考:https://mp.weixin.qq.com/s/p-n5jq5Rx2TqDBStS2nzoQ)
gsemf <- gseGO(genelist,
               OrgDb = org.Mm.eg.db,
               keyType = "ENSEMBL",
               ont="MF"
)
# 查看大致信息
head(gsemf)
# 画出GSEA图
gseaplot(gsemf, geneSetID="GO:0000977")
GSEA结果分析图
2.5 KEGG(pathway)分析

KEGG将基因组信息和高一级的功能信息有机地结合起来,通过对细胞内已知生物学过程的计算机化处理和将现有的基因功能解释标准化,对基因的功能进行系统化的分析。
KEGG的另一个任务是一个将基因组中的一系列基因用一个细胞内的分子相互作用的网络连接起来的过程,如一个通路或是一个复合物,通过它们来展现更高一级的生物学功能。
参考文章:http://blog.sciencenet.cn/blog-364884-779116.html
KEGG物种缩写:http://www.genome.jp/kegg/catalog/org_list.html
GO和KEGG输出文件解读:http://www.bio-info-trainee.com/370.html

# 转换ID适合KEGG
x=bitr(rownames(diff_gene_deseq2),fromType = "ENSEMBL",toType = "ENTREZID", OrgDb = "org.Mm.eg.db")
# 获取keggID
kegg <- x[,2]
# KEGG分析,在KEGG官网中,物种都有对应的缩写,小鼠mmu,其他的缩写看官网:http://www.genome.jp/kegg/catalog/org_list.html
ekk <- enrichKEGG(kegg, keyType = "kegg",organism = "mmu", pvalueCutoff = 0.05, pAdjustMethod = "BH", qvalueCutoff = 0.1)
head(summary(ekk))
# 气泡图
dotplot(ekk, font.size=5)
# 将GO/KEGG结果转换成CSV格式输出
write.csv(as.data.frame(ekk),"KEGG-enrich.csv",row.names =F)
write.csv(as.data.frame(ego),"GO-enrich.csv",row.names =F)
KEGG分析可视化

PS:最后,终于完成了转入组入门,从小白慢慢的开始入门,确实不容易,中间有想过要放弃,真的太难,没有完全一样的流程可以让我参考,只能一遍看别人的,一遍自己摸索,慢慢的学习,我很庆幸自己坚持了来了,走了一遍流程,虽然没有那样的熟悉,但是却是个极大的进步。这里必须要感谢几个大牛的帮助:Jimmy大神,徐洲更同学,还有Y叔,主要参考了他们几个人的博客,边学习,边进步,着实不易。

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

推荐阅读更多精彩内容