老学员在以前的交流群里面提问说go数据库的注释结果希望可以分层次展示,如下所示:
关于Gene Ontology (GO) 数据库
Gene Ontology (GO) 数据库是一个广泛使用的生物信息学资源,它提供了一个标准化的词汇表来描述基因和蛋白质的属性。GO 数据库主要分为三个主要的本体(ontology):
分子功能(Molecular Function, MF):描述单个基因产物(如蛋白质和RNA)或其复合物在分子水平上的活动,例如“催化活性”或“转运活性”。
细胞组分(Cellular Component, CC):描述基因产物在细胞内的位置,如线粒体、核糖体等。
生物过程(Biological Process, BP):涉及多个分子活动的生物学过程,如DNA修复或信号转导。
每个GO本体都是一个有向无环图(DAG),其中术语(terms)作为节点,术语之间的关系(如“is a”、“part of”、“regulates”等)作为边。这些关系定义了术语之间的层次结构和连接。
在GO数据库中,每个术语都有一个唯一的标识符(GO ID),并且可以有多个层次的分类。例如,一个基因产物可能在分子功能中被归类为“氧化还原酶活性”,在细胞组分中被归类为“线粒体基质”,在生物过程中被归类为“氧化磷酸化”。
GO数据库的层级结构允许用户探索不同级别的术语,从而理解基因产物在不同生物学层面上的作用。术语之间的层级关系可以是直接的,也可以通过中间术语进行传递。例如,如果一个术语是另一个术语的子类(通过“is a”关系),或者是一个更大结构的一部分(通过“part of”关系),那么它们之间就存在层级关系。
此外,GO数据库还提供了一些工具和指南,用于管理和分析GO注释,包括用于检索、浏览、搜索、可视化和下载本体和注释的工具。通过这些资源,研究人员可以更深入地了解基因产物的功能,并在各种生物学研究中应用这些信息。
GO.db
是一个在 Bioconductor 上可用的 R 包
它存储了 Gene Ontology(GO)的信息。这个包提供了一个方便的方式来访问和使用 GO 数据库中的信息。以下是 go.db
包中的一些关键信息和功能:
数据结构:
go.db
包是一个 AnnotationDb 类型的对象,它包含了多个数据表,每个表都包含了不同类型的 GO 信息。这些表可以通过keytypes()
和columns()
函数来查看 。关键类型(Keytypes):
go.db
提供了几种关键类型,包括 "DEFINITION"、"GOID"、"ONTOLOGY" 和 "TERM"。这些关键类型允许用户通过不同的方式访问数据库中的条目 。列(Columns):包中的每个数据表都有多个列,包含了如定义(DEFINITION)、GO编号(GOID)、所属本体(ONTOLOGY)和术语(TERM)等信息 。
访问数据:可以使用
keys()
函数获取特定关键类型的所有键(例如 GO 编号),然后使用select()
函数来检索与这些键相关的数据 。查询操作:
select()
函数允许用户执行类似 SQL 中的select
操作,通过指定键和列来查询数据。例如,可以查询特定 GO 编号的定义、术语和所属本体 。其他信息:
go.db
包还提供了其他有用的信息,如 GO 术语的祖先和后代关系,可以通过ls()
函数查看包中所有可用的对象 。使用示例:
library(GO.db)
keytypes(GO.db) # 查看关键类型
columns(GO.db) # 查看列
keys(GO.db, keytype = "GOID") # 获取所有 GO 编号
select(GO.db, keys = "GO:0000001", columns = c("TERM", "ONTOLOGY")) # 查询特定 GO 编号的信息
go.db
包是生物信息学分析中的重要工具,特别是在进行基因功能注释和富集分析时。通过这个包,研究人员可以方便地访问和利用 GO 数据库中的信息 。
有向无环图(DAG)的重点就是父节点和子节点
在R中使用GO.db
包可以方便地获取每个GO条目的父节点和子节点信息。GO.db
包提供了多种函数来查询GO术语之间的关系。以下是一些基本的使用方法:
获取所有父节点信息:使用
GOBPANCESTOR
(对于生物过程)、GOMFANCESTOR
(对于分子功能)和GOCCANCESTOR
(对于细胞组分)可以获取给定GO ID的所有父节点信息。例如,获取特定GO ID的父节点:library(GO.db)
ancestor <- as.list(GOBPANCESTOR)
ancestor_info <- ancestor[["GO:0001580"]] # 使用具体的GO ID替换获取上一级父节点信息:使用
GOBPPARENTS
(对于生物过程)、GOMFPARENTS
(对于分子功能)和GOCCPARENTS
(对于细胞组分)可以获取给定GO ID的直接父节点信息。例如:parent_info <- GOBPPARENTS["GO:0001580"]
获取所有子节点信息:使用
GOBPOFFSPRING
(对于生物过程)、GOMFOFFSPRING
(对于分子功能)和GOCCOFFSPRING
(对于细胞组分)可以获取给定GO ID的所有子节点信息。例如:offspring_info <- GOBPOFFSPRING["GO:0001580"]
获取下一级子节点信息:使用
GOBPCHILDREN
(对于生物过程)、GOMFCHILDREN
(对于分子功能)和GOCCCHILDREN
(对于细胞组分)可以获取给定GO ID的直接子节点信息。例如:children_info <- GOBPCHILDREN["GO:0001580"]
查看某个GO ID的详细信息:可以直接查看特定GO ID的详细信息,包括定义、所属本体等。例如:
term_info <- GOTERM["GO:0001580"]
这些函数可以帮助你构建GO术语的层级结构,并进行各种分析,如GO富集分析等。更多详细信息和高级功能,可以参考GO.db
的官方文档和教程 。
只有一个父节点的就是第二层次的GO条目
很简单的代码,因为 cellular process ,是biological_process的子集,而且就这一个父节点,所以前者就是我们需要的第二层次的GO条目:
library(GO.db)
> ancestor <- as.list(GOBPANCESTOR)
> ancestor[["GO:0008150"]]
[1] "all"
> select(GO.db, keys = "GO:0008150",
+ columns = c("TERM", "ONTOLOGY"))
1 GO:0008150 biological_process BP
> ancestor[["GO:0009987"]]
[1] "GO:0008150" "all"
> select(GO.db, keys = "GO:0009987",
+ columns = c("TERM", "ONTOLOGY"))
1 GO:0009987 cellular process BP
很简单的代码遍历一下即可:
goids=keys(GO.db, keytype = "GOID") # 获取所有 GO 编号
go2 = do.call(rbind,
lapply(goids, function(x){
if(length(ancestor[[x]] )==2){
return( select(GO.db, keys = x,
columns = c("TERM")) )
}
}))
head(go2)
write.table(go2,file = 'tmp.txt',
quote = F,row.names = F,col.names = F)
如下所示,在BP里面就18个第二层次的go的term :
GO:0000003 reproduction
GO:0002376 immune system process
GO:0008152 metabolic process
GO:0009987 cellular process
GO:0016032 viral process
GO:0032501 multicellular organismal process
GO:0032502 developmental process
GO:0040007 growth
GO:0040011 locomotion
GO:0042592 homeostatic process
GO:0043473 pigmentation
GO:0044419 biological process involved in interspecies interaction between organisms
GO:0044848 biological phase
GO:0048511 rhythmic process
GO:0050896 response to stimulus
GO:0051179 localization
GO:0051703 biological process involved in intraspecies interaction between organisms
GO:0065007 biological regulation
默认的富集分析结果只能说是控制显示多少个term,并不是多少层级:
library(clusterProfiler)
library(ggthemes)
library(org.Hs.eg.db)
data(geneList, package = "DOSE")
de <- names(geneList)[1:100]
yy <- enrichGO(de, 'org.Hs.eg.db', ont="BP", pvalueCutoff=0.01)
head(yy)
barplot(yy,showCategory = 30)
可以看到,多种层级的注释都有,仅仅是那个染色体分离,就有多种下面的 :
> yy@result$Description[grepl('segr',yy@result$Description)]
[1] "chromosome segregation"
[2] "nuclear chromosome segregation"
[3] "sister chromatid segregation"
[4] "mitotic sister chromatid segregation"
[5] "regulation of chromosome segregation"
[6] "regulation of sister chromatid segregation"
[7] "regulation of mitotic sister chromatid segregation"
[8] "negative regulation of sister chromatid segregation"
[9] "negative regulation of mitotic sister chromatid segregation"
[10] "negative regulation of chromosome segregation"
[11] "positive regulation of chromosome segregation"
[12] "meiotic chromosome segregation"
[13] "homologous chromosome segregation"
我们前面拿到了bp的18个儿子,所以如果大家仅仅是想展示第二层次,就不需要有上面的那么多条目:
> yy@result[yy@result$ID %in% go2$GOID,1:5]
ID Description GeneRatio BgRatio pvalue
GO:0048511 GO:0048511 rhythmic process 4/99 296/18870 0.07044242
GO:0016032 GO:0016032 viral process 5/99 432/18870 0.07706179
但是,因为我们默认是超几何分布检验会卡阈值,所以很多父节点是不会被显示,如果一定要它们,就需要删除阈值:
yy <- enrichGO(de, 'org.Hs.eg.db', ont="BP",
pvalueCutoff=0.999,qvalueCutoff = 0.999,maxGSSize = 20000)
dim(yy@result)
yy@result[yy@result$ID %in% go2$GOID,1:5]
如下所示,这些第二层次的go条目基因列表都很大 :
如果你也想做单细胞转录组数据分析,最好是有自己的计算机资源哦,比如我们的2024的共享服务器交个朋友福利价仍然是800,而且还需要有基本的生物信息学基础,也可以看看我们的生物信息学马拉松授课(买一得五) ,你的生物信息学入门课。而且下周六日我们在长沙线下授课哦:千呼万唤,让我们长沙线下约起