包:metagene
作者查尔斯·乔利·波帕朗charles.joly-beauparlant@crchul.ulaval.ca法比安·克劳德·拉马泽fabien.lamaze.1@ulaval.caRawane Sambrawane.samb.1@ulaval.ca阿斯特丽德·路易斯·德尚Astrid-Louise.Deschenes@crchudequebec.ulaval.ca阿诺·德洛特arnaud.droit@crchuq.ulaval.ca
修改: 2015年9月18日
编译2016年11月10日星期四19:37:27
许可证: artist -2.0 |文件
这个包产生元基因样图来比较dna相互作用蛋白在选定的特征组的行为。典型的分析可以在基因的转录起始位点(TSS)或任何感兴趣的区域(如增强子)的粘度中进行。可以在单个分析中比较一组特性和/或一组bam文件的多个组合。自举分析用于比较组和定位具有统计上不同富集概况的区域。为了提高分析的灵敏度,使用校准数据代替峰值调用者(即:MACS2或PICS)产生的峰值。metagene包使用bootstrap来更好地估计每组样本的平均富集和置信区间。
这个小插图将介绍metagene包的所有主要功能。
库(metagene)
分析中可以包含的BAM文件的数量没有硬性限制(但是如果BAM文件太多,内存可能会成为问题)。BAM文件必须被索引。例如,如果您使用文件名file.bam
,文件名为file.bam.bai
必须存在于同一目录中。
BAM文件的路径(相对或绝对)必须是一个矢量:
<- get_demo_bam_files(
## [1] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep1. ". bam" ## [2] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep2。. bam" ## [3] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep1。. bam" ## [4] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep2。"/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/ctrl.bam"
对于这个演示,我们有2个样本(每个样本有2个重复)。也可以使用命名向量将自己的名字添加到每个BAM文件中:
Named_bam_files <- bam_files names(Named_bam_files) <- letters[seq_along(bam_files)] Named_bam_files
## a ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep1. ". bam" ## b ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep2。. bam" ## c# # "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep1。## d ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep2。“/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/ctrl.bam”
使用已命名的BAM文件可以简化metagene辅助函数的使用和设计的创建。
为了比较感兴趣的自定义区域,可以使用一个或多个BED文件的列表。
区域<- get_demo_regions()区域
## [1] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/list1。## [2] "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/list2.bed"
文件的名称(没有扩展名)将用于命名每个组。
metagene
也支持narrowPeak和broadPeak.
作为BED文件列表的替代方案,农庄
或GRangesList
对象可以被使用。
中已经提供了一些常用的数据集metagene
包:
promoters_hg19
promoters_hg18
promoters_mm10
promoters_mm9
数据(promoters_hg19) promoters_hg19
## GRanges对象具有23056个range和1个元数据列:## seqnames ranges strand | gene_id ## | ## 1 chr19 [58873215, 58875214] - | 1 ## 10 chr8 [18247755, 18249754] + | 10 ## 100 chr20 [43279377, 43281376] - | 100 ## 1000 chr18 [25756446, 25758445] - | 1000 ## 10000 chr1 [244005887, 244007886] - | 10000 ## # ... ... ... ... . ...## 9991 chr9 [115094945, 115096944] - | 9991 ## 9992 chr21 [35735323, 35737322] + | 9992 ## 9993 chr22 [19108968, 19110967] - | 9993 ## 9994 chr6 [90538619,90540618] + | 9994 ## 9997 chr22 [50963906, 50965905] - | 9997 ## ------- ## seqinfo:来自hg19基因组的93个序列(1个循环)
有关每个数据集的详细信息,请参阅其文档(即:promoters_hg19 ?
).
一个设计组包含一组BAM文件,当它们放在一起时,就代表了一个逻辑分析。此外,设计组包含每个存在的BAM文件之间的关系。样本(有或没有重复)和对照可以分配到同一个设计组。根据需要,可以有尽可能多的组。一个BAM文件可以分配给多个组。
为了表示每个BAM文件之间的关系,设计组必须具有以下列:
有两种可能的方法来创建设计组,通过读取文件或直接在R中创建设计对象。
可以使用文本文件将设计组加载到metagene包中。由于要指定BAM文件之间的关系,因此以下列是必填的:
该文件还必须包含头文件。建议使用样品
查询第一列的名称,但未检查该值。设计文件中的其他列将用于命名设计组,并且必须是唯一的。
fileDesign <- system.file("extdata/design.txt", package="metagene")表(fileDesign, header=TRUE, stringsAsFactors=FALSE)设计$Samples <-粘贴(system. name)file("extdata", package="metagene"), design$Samples, sep="/") able(design)
样品 | align1 | align2 |
---|---|---|
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align1_rep1.bam | 1 | 0 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align1_rep2.bam | 1 | 0 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align2_rep1.bam | 0 | 1 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align2_rep2.bam | 0 | 1 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / ctrl.bam | 2 | 2 |
不是必须使用设计文件,您可以创建设计data.frame
使用您喜欢的方法(只要遵守前面提到的值的限制)。
例如,之前的design data.frame可以直接在R中创建:
design <- data.frame(Samples = c("align1_rep1. "bam”、“align1_rep2。bam”、“align2_rep1。bam”、“align2_rep2。bam", "ctrl.bam"), align1 = c(1,1,0,0,2), align2 = c(0,0,1,1,2)) design$Samples <- paste0(system. bam)file("extdata", package="metagene"), "/", design$Samples) able(design)
样品 | align1 | align2 |
---|---|---|
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align1_rep1.bam | 1 | 0 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align1_rep2.bam | 1 | 0 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align2_rep1.bam | 0 | 1 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / align2_rep2.bam | 0 | 1 |
/ tmp / Rtmpn6ozhW / Rinst77db76ee300c metagene / extdata / ctrl.bam | 2 | 2 |
一个典型的元成因分析将包括以下步骤:
最小亚干分析可分为两个步骤:
新
功能)。情节
regions <- get_demo_regions() bam_files <- get_demo_bam_files() #初始化mg <- metagene$new(regions = regions, bam_files = bam_files) #绘图mg$plot(title = "Demo metagene plot")
# # align1_rep1_list1
# # align1_rep1_list2
# # align1_rep2_list1
# # align1_rep2_list2
# # align2_rep1_list1
# # align2_rep1_list2
# # align2_rep2_list1
# # align2_rep2_list2
# # ctrl_list1
# # ctrl_list2
正如您所看到的,显式调用meta分析的每个步骤并不是强制性的。例如,在前面的示例中,情节
函数使用默认值自动调用其他步骤(下一节将更详细地描述这些步骤)。
在这种特殊情况下,由于默认情况,情节是混乱的metagene将为BAM文件和区域的每种可能组合生成一条曲线。因为我们有5个BAM文件和2个区域,所以我们得到了10条曲线。
如果我们想要更多地控制分析的每一步是如何执行的,我们必须直接调用每个函数。
为了完全控制元基因分析的每一步,了解如何执行完整的分析是很重要的。如果我们对默认值感到满意,则不必显式调用每个步骤(如前一节所示)。
在此步骤中,将从每个BAM文件中提取指定的每个区域的覆盖率。更具体地说,一个新的农庄
将指定的所有区域组合在一起创建地区
的参数新
函数。
Regions <- get_demo_regions() bam_files <- get_demo_bam_files() mg <- metagene$new(Regions = Regions, bam_files = bam_files)
为了生成元生图,覆盖率必须在矩阵中转换,其中列表示位置,行表示区域。此外,为了减少后续步骤的计算时间,还对位置进行了分类。
我们可以控制箱子的大小bin_count
论点。默认情况下,bin_count
在此步骤中将使用100个。
mg produce_matrices美元()
我们还可以使用我们之前制作的设计来去除背景信号并组合重复:
Mg $produce_matrices(设计=设计)
data.frame
元成图是利用ggplot2
包,它需要一个data.frame
作为输入。在此步骤中,将计算功能区的值。用于估计置信区间的算法可以用统计
参数。
默认情况下,metagene使用“bootstrap”来更好地估计每组区域/BAM文件中每个位置的富集平均值。另一种称为“基本”的方法将简单地使用色带来表示每个组中每个位置的95%的值。
Mg $produce_data_frame(stat = "basic")
# # align1_list1
# # align1_list2
# # align2_list1
# # align2_list2
在此步骤中,metagene将使用data.frame
来绘制计算值ggplot2
.我们使用。来显示区域的子集region_names
和exp_names
参数。的region_names
对应于初始化时使用的区域名称。的exp_name
将根据是否添加了设计而变化。如果没有添加设计,则此参数对应于BAM名称或BAM文件名。否则,我们必须使用设计中的列名。
mg$plot(region_names = "list1", title = "Demo plot子集")
metagene
对象有多个getter函数可用于访问存储在metagene
对象。
get_params
初始化过程中使用的各种参数metagene
对象,生成的矩阵和生成的绘图被保存,并可以使用get_params
功能:
Mg <- get_demo_metagene()
## $padding_size ## [1] 0 ## ## $verbose ## [1] FALSE ## ## $bin_count ## [1] 100 ## ## $bam_files ## align1_rep1 ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep1。. bam" ## align1_rep2 ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align1_rep2。. bam" ## align2_rep1 ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep1。. bam" ## align2_rep2 ## "/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/align2_rep2。/tmp/Rtmpn6ozhW/Rinst77db76ee300c/metagene/extdata/ctrl. bam" ## ctrl ## "bam" ## ## $force_seqlevels ## [1] FALSE ## ## $flip_regions ## [1] FALSE
get_design
要获得用于生成最后版本矩阵的设计,可以使用get_design
功能:
另外,也可以在不生成##矩阵的情况下添加一个设计:#mg$add_design(get_demo_design()) mg$get_design()
## Samples align1 align2 ## 1 align1_rep1。Bam 1 0 ## 2 align1_rep2。Bam 1 0 ## 3 align2_rep1。Bam 0 1 ## 4 align2_rep2。Bam 0 1 ## 5 ctrl。Bam 2 2
get_bam_count
要获取BAM文件中对齐的读取数,可以使用get_bam_count
功能:
mg get_bam_count美元(bam_files [1])
## [1] 4635
get_regions
要获取所有区域,可以使用get_regions
功能:
mg get_regions美元()
## GRangesList对象长度为2:## $list1 ## GRangesList对象具有50个范围和0个元数据列:## seqnames ranges strand ## ## [1] chr1 [16103663, 16105662] * ## [2] chr1 [23921318, 23923317] * ## [3] chr1 [34848977, 34850976] * ## [4] chr1 [36368182, 36370181] * ## [5] chr1 [36690488, 36692487] * ## ... ... ... ...## [46] chr1 [172081530, 172083529] * ## [47] chr1 [172081796, 172083795] * ## [48] chr1 [172147016, 172149015] * ## [49] chr1 [172205805, 172207804] * ## [50] chr1[172260642, 172262641] * ## ##…## <1个元素> ## ------- ## seqinfo: 1个未指定的基因组序列;没有seqlengths
提取区域的子集也是可能的get_regions
功能:
Mg $get_regions(region_names = c(regions[1]))
## GRangesList对象,长度为1:## $list1 ## GRangesList对象,包含50个range和0个元数据列:## seqnames ranges strand ## ## [1] chr1 [16103663, 16105662] * ## [2] chr1 [23921318, 23923317] * ## [3] chr1 [34848977, 34850976] * ## [4] chr1 [36368182, 36370181] * ## [5] chr1 [36690488, 36692487] * ## ... ... ... ...## [46] chr1 [172081530, 172083529] * ## [47] chr1 [172081796, 172083795] * ## [48] chr1 [172147016, 172149015] * ## [49] chr1 [172205805, 172207804] * ## [50] chr1 [172260642, 172262641] * ## ## ------- ## seqinfo: 1个未指定基因组序列;没有seqlengths
get_raw_coverages
的初始化过程中生成的覆盖metagene
对象时,可以使用get_raw_coverages
函数。请注意,为了节省空间,metagene将只提取所提供区域的覆盖。
覆盖范围<- mg$get_raw_coverages()覆盖范围[b[1]]
# # RleList长度22 # # $ chr10 # # integer-Rle长度与1 # #运行长度:130694993 130694993 # #值:0 # # # # $ chr11 # # integer-Rle长度与1 # #运行长度:122082543 122082543 # #值:0 # # # # $ chr12 # # integer-Rle长度与1 # #运行长度:120129022 120129022 # #值:0 # # # # $ chr13 # # integer-Rle长度与1 # #运行长度:120421639 120421639 # #值:0 # # # # $ chr14 # # integer-Rle长度与1 # #运行长度:124902244 124902244 # #值:0 ## ##…## <17个元素>
长度(保险)
## [1]
也可以通过提供文件名来提取所有覆盖的子集:
覆盖<- mg$get_raw_coverages(文件名= bam_files[1:2])长度(覆盖)
## [1]
get_normalized_coverages
的get_normalized_coverages
函数的工作原理与get_raw_coverages
函数,除了它返回以每百万对齐读取(RPM)为单位的覆盖率。
metagene的每个函数(getter除外)都不可见地返回一个指向自身的指针。这意味着函数可以被链接:
rg <- get_demo_regions() bam <- get_demo_bam_files() d <- get_demo_design() title <- "Show chain" mg <- metagene$new(rg, bam)$produce_matrices(design = d)$plot(title = title)
# # align1_list1
# # align1_list2
# # align2_list1
# # align2_list2
要复制元数据对象,必须使用克隆
功能:
Mg_copy <- mg$clone()
而metagene
尽量减少它的内存使用,在处理多个大型数据集时可能会遇到内存限制(特别是当有很多具有大宽度的区域时)。
避免这种情况的一种方法是分别分析每个数据集,然后在生成元成图之前合并:
Mg1 <- metagene$new(bam_files = bam_files, regions = regions[1]) Mg1 $produce_data_frame() ## align1_rep1_list1 ## align1_rep2_list1 ## align2_rep2_list1 ## ctrl_list1 mg2 <- metagene$new(bam_files = bam_files, regions = regions[2]) mg2$produce_data_frame() ## align1_rep2_list2 ## align1_rep2_list2 ## align2_rep2_list2 ## align2_rep2_list2 ## ctrl_list2
然后你可以提取data.frame
S并将它们与rbind
:
$get_data_frame() df2 <- mg2$get_data_frame() df <- rbind(Df1, df2)
最后,你可以使用plot_metagene
生成元生图的函数:
p <- plot_metagene(df) p + ggplot2::ggtitle("管理大型数据集")
可以使用permutation_test
的功能。metagene
包中。请注意,排列测试功能仍在开发中,预计会在未来的版本中进行更改。
第一步是决定我们想要比较哪些配置文件并提取相应的矩阵:
矩阵< - mg get_matrices美元()m1 < -矩阵[[“list1”]][[“align1”]][["输入"]]m2 < -矩阵[[“list1”]][[“align2”]][["输入"]]
然后我们定义了用于比较两个概要文件的函数。为此,有一个配套的软件包metagene
命名similaRpeak提供多个指标。
对于这个例子,我们将准备一个函数来计算两个配置文件之间的RATIO_NORMALIZED_INTERSECT:
library(similaRpeak) perm_fun <- function(profile1, profile2) {similarity(profile1, profile2)[["metrics"]][["RATIO_NORMALIZED_INTERSECT"]]}
然后,我们使用这个度量来比较我们的两个配置文件:
ratio_normalized_intersect <- perm_fun(colMeans(m1), colMeans(m2)) ratio_normalized_intersect
## [1] 0.7336965
为了检查这个值是否重要,我们可以对用于生成轮廓的两个矩阵进行排列,并计算它们的RATIO_NORMALIZED_INTERSECT:
permutation_results <- permutation_test(m1, m2, sample_size = nrow(m1), sample_count = 1000, FUN = perm_fun)
最后,我们检查计算值大于排列结果的频率:
Sum (ratio_normalized_intersection> = permutation_results) / length(permutation_results)
## [1] 0.005