GeneOverlap: 用于基因Overlap的检验及可视化R包

参考学习资料:https://www.bioconductor.org/packages/release/bioc/vignettes/GeneOverlap/inst/doc/GeneOverlap.pdf

1.数据准备

Overlapping的基因列表可以揭示生物学意义,并可能形成新的假说。例如,组蛋白修饰是一个重要的细胞机制,可以包装和重新包装染色质。通过使染色质结构更密集或更疏松,起到开启或关闭基因表达的作用。组蛋白H3(H3K4me3)第4位赖氨酸(H3K4me3)上的三甲基化与基因激活有关,其全基因组富集可以通过ChIP-seq实验进行定位。由于H3K4me3的激活作用,如果我们将H3K4me3结合的基因与高表达的基因重叠,我们应该预计会有积极的关联。类似地,我们可以在不同组蛋白修饰的基因列表与不同表达组的基因列表之间进行这种Overlap,从而确定每个组蛋白修饰在基因调控中的作用。
这个问题可以表示为超几何分布或结合表(这可以通过费舍尔精确检验来解决;请参阅GeneOverlap文档)。这项任务在生物学研究中非常常见,GeneOverlap是为了操作数据、执行测试并可视化Overlapping的结果。
GeneOverlap包由两个类组成:GeneOverlap和GeneOverlipMatrix。GeneOverlap类执行测试,并充当GeneOverlipMatrix类的构建块。
首先是安装和加载包,因为收录在bioconductor,需要用到相应的安装函数:

rm(list = ls())
#BiocManager::install("GeneOverlap")
library(GeneOverlap)
data(GeneOverlap)
sapply(hESC.ChIPSeq.list, length)
sapply(hESC.RNASeq.list, length)
gs.RNASeq

若要使用GeneOverlay类,请创建两个表示基因名称的字符向量。一种简单的方法是使用read.table("filename.txt")从文本文件中读取它们。
该包有内置数据集包括几个基因列表数据,可以用data()加载。现在,让我们看看数据中包含的内容:有三个对象。hESC.ChIPSeq.listhESC.RNASeq.list对象包含来自Chip-seq和RNA-seq实验的基因列表。gs.RNASeq变量包含基因组背景中的基因数量。后面有介绍它们是如何创建的。先来看看基因列表中有多少个基因。

> sapply(hESC.ChIPSeq.list, length)
 H3K4me3  H3K9me3 H3K27me3 H3K36me3 
   13448      297     3853     4533 
> sapply(hESC.RNASeq.list, length)
  Exp High Exp Medium    Exp Low 
      6540       6011       8684 
> gs.RNASeq
[1] 21196

在GeneOverlap中,我们将基因列表集合称为表示为命名列表的基因集。在这里我们可以看到,ChIP-seq基因集包含四个不同组蛋白标记的基因列表:H3K4me3、H3K9me3、H3K27me3和H3K36me3;RNA-seq基因集包含三个不同表达水平的基因列表:高、中、低表达水平。有两个组蛋白标记与基因激活相关:H3K4me3和H3K36me3,另外两个与基因抑制相关:H3K9me3和H3K27me3。

2.检验两个基因列表之间的GeneOverlap

我们想要探索激活标记-H3K4me3是否与高表达的基因相关。首先,让我们构造一个GeneOverlap对象

go.obj <- newGeneOverlap(hESC.ChIPSeq.list$H3K4me3,
                         hESC.RNASeq.list$"Exp High",
                         genome.size=gs.RNASeq)
go.obj

显示如下:

> go.obj
GeneOverlap object:
listA size=13448
listB size=6540
Intersection size=5916
Overlap testing has not been performed yet.

正如我们所看到的,GeneOverlap构造函数已经为我们做了一些基本的数据统计,比如交叉点的数量。为了检验关联性的统计显著性,我们做了GeneOverlap类,将问题描述为检验两个变量是否独立,这可以表示为一个列联表(contingency table),然后使用Fisher的精确检验来寻找统计显著性。这里的P值为零,这意味着overlap非常重要。费舍尔精确检验还给出了代表关联强度的odds ratio。如果odds ratio等于或小于1,则两个列表之间没有关联。如果odds ratio远大于1,那么这种关联就很强。该类还计算Jaccard指数,该指数衡量两个列表之间的相似性。Jaccard指数在0和1之间变化,0表示两者之间没有相似性,1表示两者相同。要显示更多详细信息,请使用print函数。

go.obj <- testGeneOverlap(go.obj)
go.obj
> go.obj
GeneOverlap object:
listA size=13448
listB size=6540
Intersection size=5916
Overlapping p-value=0e+00
Jaccard Index=0.4
> print(go.obj)
Detailed information about this GeneOverlap object:
listA size=13448, e.g. ENSG00000187634 ENSG00000188976 ENSG00000187961
listB size=6540, e.g. ENSG00000000003 ENSG00000000419 ENSG00000000460
Intersection size=5916, e.g. ENSG00000188976 ENSG00000187961 ENSG00000187608
Union size=14072, e.g. ENSG00000187634 ENSG00000188976 ENSG00000187961
Genome size=21196
# Contingency Table:
     notA  inA
notB 7124 7532
inB   624 5916
Overlapping p-value=0e+00
Odds ratio=9.0
Overlap tested using Fisher's exact test (alternative=greater)
Jaccard Index=0.4

显示odds ratio为9.0,Jaccard指数为0.4。print函数还显示列联表(contingency table),该表说明了问题是如何形成的。

此外,我们还想知道H3K4me3是否与低表达的基因有关。修改参数:

go.obj <- newGeneOverlap(hESC.ChIPSeq.list$H3K4me3,
                         hESC.RNASeq.list$"Exp Low",
                         genome.size=gs.RNASeq)
go.obj <- testGeneOverlap(go.obj)
print(go.obj)

结果为

> print(go.obj)
Detailed information about this GeneOverlap object:
listA size=13448, e.g. ENSG00000187634 ENSG00000188976 ENSG00000187961
listB size=8684, e.g. ENSG00000000005 ENSG00000000938 ENSG00000000971
Intersection size=2583, e.g. ENSG00000187583 ENSG00000187642 ENSG00000215014
Union size=19549, e.g. ENSG00000187634 ENSG00000188976 ENSG00000187961
Genome size=21196
# Contingency Table:
     notA   inA
notB 1647 10865
inB  6101  2583
Overlapping p-value=1
Odds ratio=0.1
Overlap tested using Fisher's exact test (alternative=greater)
Jaccard Index=0.1

与高表达的基因相比,P值现在是1,odds ratio为0.1。因此,H3K4me3与基因抑制无关。
一旦创建了一个GeneOverlap对象,就可以使用几个访问器来提取它的节点值slots。例如

> head(getIntersection(go.obj))
[1] "ENSG00000187583" "ENSG00000187642" "ENSG00000215014" "ENSG00000142609" "ENSG00000203301"
[6] "ENSG00000215912"
> getOddsRatio(go.obj)
[1] 0.06418943
> getContbl(go.obj)
     notA   inA
notB 1647 10865
inB  6101  2583
> getContbl(go.obj)
     notA   inA
notB 1647 10865
inB  6101  2583
> getGenomeSize(go.obj)
[1] 21196

也可以在创建对象后更改slots "listA", "listB" 和 "genome.size"。例如
setListA(go.obj) <- hESC.ChIPSeq.listH3K27me3 setListB(go.obj) <- hESC.RNASeq.list"Exp Medium"
go.obj

> go.obj
GeneOverlap object:
listA size=3853
listB size=6011
Intersection size=1549
Overlap testing has not been performed yet.

更换上述任一slots后,对象进入未检验状态。所以我们需要重新检验一下:

> go.obj <- testGeneOverlap(go.obj)
> go.obj
GeneOverlap object:
listA size=3853
listB size=6011
Intersection size=1549
Overlapping p-value=2.8e-69
Jaccard Index=0.2

我们还可以改变基因组大小,看看p值是如何随之变化的。

v.gs <- c(12e3, 14e3, 16e3, 18e3, 20e3)
setNames(sapply(v.gs, function(g) {
  setGenomeSize(go.obj) <- g
  go.obj <- testGeneOverlap(go.obj)
  getPval(go.obj)}), v.gs)

结果如下:

> setNames(sapply(v.gs, function(g) {
+   setGenomeSize(go.obj) <- g
+   go.obj <- testGeneOverlap(go.obj)
+   getPval(go.obj)}), v.gs)
       12000        14000        16000        18000        20000 
1.000000e+00 9.999746e-01 6.039536e-05 9.006016e-24 5.589067e-51 

正如预期的那样,基因组大小越大,P值越显著。这是因为,随着 "universe"的增长,两个基因列表偶然重叠的可能性变得越来越小。

3.Visualizing all pairwise overlaps

当需要比较两个基因集合,每个都有一个或多个列表时,手动比较它们的效率会相当低。可以构造矩阵,其中行表示来自一个集合的列表,而列表示来自另一个集合的列表。矩阵的每个元素都是一个GeneOverlay对象。要完全可视化这些重叠信息,可以使用热图。为了说明这一点,我们希望将Chip-seq的所有基因列表与rna-seq的所有基因列表进行比较。

gom.obj <- newGOM(hESC.ChIPSeq.list, hESC.RNASeq.list,
                  gs.RNASeq)
drawHeatmap(gom.obj)
图1

newGOM构造函数使用两个命名列表创建一个新的GeneOverlipMatrix对象。然后,我们需要做的就是使用draHeatmap函数来显示它。在热图中,颜色键表示odds ratios,重要的p值叠加在网格上。
要从GeneOverlipMatrix对象检索信息,可以使用两个重要的访问器,分别称为getMatrix和getNestedList。例如,getMatrix accessor以矩阵形式获取诸如p值之类的信息

> getMatrix(gom.obj, name="pval")
          Exp High   Exp Medium      Exp Low
H3K4me3  0.0000000 0.000000e+00 1.000000e+00
H3K9me3  0.9996654 7.071538e-13 9.999497e-01
H3K27me3 1.0000000 2.797009e-69 1.061420e-09
H3K36me3 0.0000000 9.999998e-01 1.000000e+00

或者提取odds ratios:

> getMatrix(gom.obj, "odds.ratio")
           Exp High Exp Medium    Exp Low
H3K4me3   8.9672775  3.8589147 0.06418943
H3K9me3   0.6366248  2.3460391 0.62254173
H3K27me3  0.3338513  1.9408115 1.24113618
H3K36me3 10.9219512  0.8265542 0.02145576

getNestedListaccessor可以以嵌套列表的形式获取每个比较的基因列表:外部列表表示列,内部列表表示行:

inter.nl <- getNestedList(gom.obj, name="intersection")
str(inter.nl)

另一个重要的访问器是方法"[",它允许以类似于矩阵的方式检索GeneOverlap对象。例如,

> go.k4.high <- gom.obj[1, 1]
> go.k4.high
GeneOverlap object:
listA size=13448
listB size=6540
Intersection size=5916
Overlapping p-value=0e+00
Jaccard Index=0.4

获取表示H3K4me3和高表达基因之间的比较的GeneOverlap对象。还可以使用标签获取GeneOverlap对象,例如

> gom.obj["H3K9me3", "Exp Medium"]
GeneOverlap object:
listA size=297
listB size=6011
Intersection size=142
Overlapping p-value=7.1e-13
Jaccard Index=0.0

GeneOverlapMatrix 还可以对一组基因进行自我比较。例如,如果我们想知道Chip-seq基因列表之间是如何关联的,我们可以这样做

gom.self <- newGOM(hESC.ChIPSeq.list,
                   genome.size=gs.RNASeq)
drawHeatmap(gom.self) 
图2

仅使用上三角矩阵。
还可以更改颜色数量和用于热图的颜色。例如:

drawHeatmap(gom.self, ncolused=5, grid.col="Blues", note.col="black")
图3

或者改为显示Jaccard指数值

drawHeatmap(gom.self, what="Jaccard", ncolused=3, grid.col="Oranges",
            note.col="black")
图4

4.数据源及其处理

这里使用的实验数据是从ENCODE [ENCODE Consortium, ]项目的网站下载的。ChIP-seq和RNA-seq样品均来源于人胚胎干细胞(hESC)。使用Bowtie[Langmead et al., 2009]和Tophat [Trapnell et al., 2009]将原始读取文件与参考基因组进行比对。
Cufflinks [Trapnell et al., 2010]被用来从RNA-seq数据中估计基因表达水平。只保留了蛋白质编码基因以供进一步分析。用FPKM状态对基因进行筛选,只保留“OK”状态的基因。这给我们留下了21,196个编码基因,它们的FPKM值得到了可靠的估计。然后将这些基因分为高(FPKM>10)、中(FPKM>1和<=10)和低(FPKM<=1)三组。每组中重复的基因ID在测试前被删除。
对于ChIP-seq,使用来自IP处理的一个复制和来自输入控制的一个复制。
使用MACS2(v2.0.10)使用默认参数值执行Peak calling。然后,Peak列表使用diffReps包进行区域注释[Shen et al., 2013]。
然后提取在基因区和启动子区域出现Peak的基因。使用上面获得的RNA-seq基因列表进一步筛选基因。

5 SessionInfo

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] GeneOverlap_1.22.0 ggthemes_4.2.0     patchwork_1.0.0    forcats_0.4.0      stringr_1.4.0     
 [6] dplyr_0.8.3        purrr_0.3.3        readr_1.3.1        tidyr_1.0.0        tibble_2.1.3      
[11] ggplot2_3.3.0      tidyverse_1.3.0   

loaded via a namespace (and not attached):
 [1] nlme_3.1-141       bitops_1.0-6       fs_1.3.1           usethis_1.5.1      lubridate_1.7.4   
 [6] devtools_2.2.2     RColorBrewer_1.1-2 httr_1.4.1         rprojroot_1.3-2    tools_3.6.1       
[11] backports_1.1.5    utf8_1.1.4         R6_2.4.1           KernSmooth_2.23-16 DBI_1.0.0         
[16] mgcv_1.8-29        colorspace_1.4-1   withr_2.1.2        tidyselect_0.2.5   prettyunits_1.0.2 
[21] processx_3.4.1     curl_4.2           compiler_3.6.1     cli_2.0.1          rvest_0.3.5       
[26] xml2_1.2.2         desc_1.2.0         isoband_0.2.0      labeling_0.3       caTools_1.17.1.2  
[31] scales_1.1.0       callr_3.3.2        digest_0.6.23      pkgconfig_2.0.3    sessioninfo_1.1.1 
[36] dbplyr_1.4.2       rlang_0.4.4.9000   readxl_1.3.1       rstudioapi_0.10    farver_2.0.1      
[41] generics_0.0.2     jsonlite_1.6       gtools_3.8.1       magrittr_1.5       Matrix_1.2-17     
[46] Rcpp_1.0.3         munsell_0.5.0      fansi_0.4.0        lifecycle_0.1.0    stringi_1.4.3     
[51] yaml_2.2.0         MASS_7.3-51.4      pkgbuild_1.0.6     gplots_3.0.1.1     grid_3.6.1        
[56] gdata_2.18.0       crayon_1.3.4       lattice_0.20-38    haven_2.2.0        splines_3.6.1     
[61] hms_0.5.2          zeallot_0.1.0      ps_1.3.0           pillar_1.4.2       pkgload_1.0.2     
[66] reprex_0.3.0       glue_1.3.1         remotes_2.1.1      BiocManager_1.30.9 modelr_0.1.5      
[71] vctrs_0.2.0        testthat_2.3.0     cellranger_1.1.0   gtable_0.3.0       assertthat_0.2.1  
[76] broom_0.5.4        viridisLite_0.3.0  memoise_1.1.0      ellipsis_0.3.0    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容