1简介

这个R包是BSmooth算法的参考实现,用于分析全基因组亚硫酸氢盐测序(WGBS)数据。这个包可以包含对齐软件,可从.此包不适用于单位点亚硫酸氢盐测序分析(通常为Sanger亚硫酸氢盐测序或焦硫亚硫酸氢盐测序)。

该软件包已用于分析捕获亚硫酸氢盐测序数据。对于这种类型的数据,包中最有用的部分是它的数据处理函数。BSmooth算法本身可能不适用于标准的捕获亚硫酸氢盐测序实验,因为它严重依赖于平滑,这再次要求我们已经测量了基因组更大区域的甲基化。

中详细描述了BSmooth算法(Hansen, Langmead, and Irizarry 2012).它被应用于人类癌症数据(Hansen, Timp, et al. 2011)我们也用它来分析恒河猴的数据(Tung et al. 2012).具体来说,该算法使用平滑从低覆盖率亚硫酸氢盐测序中获得可靠的半局部甲基化估计。平滑后,它使用生物重复来估计生物变异并识别差异甲基化区域(DMRs)。平滑部分甚至可以用于单个样本,但我们认为个体之间的差异是DNA甲基化的一个重要方面,需要加以解释(Hansen, Wu, et al. 2011)进行相关讨论。

我们开发的主要重点是对人类CpG甲基化的分析,我们已经成功地在其他灵长类动物身上使用了它(Tung et al. 2012).这种方法很可能在非人类生物中起作用,但必须小心:平滑参数(我们根据人类数据选择的)应该仔细评估。此外,它可能根本不适合甲基化结构(与人类)有很大不同的生物。

对于非cpg甲基化,情况是复杂的。我们从未使用该算法来分析非cpg甲基化,但这样做应该很简单。然而,目前编码中使用的数据结构可能无法方便地从人类基因组中的28.2亿个cpg扩展到大约2x585M个c(很可能对每条染色体进行单独的分析)。对于基因组较小的生物来说,这应该不是什么问题。我们正在考虑改变这些基础数据结构,以便更容易地分析人类的非cpg甲基化。

1.1系统需求

该包要求将所有数据加载到系统内存中。我们所说的“数据”并不是指个人阅读量(这对于全基因组实验来说是很大的)。相反,我们需要的是汇总数据,给出支持甲基化的读取数以及每个位点上的读取总数。专注于人类数据,我们需要处理每个样本最多有2820万个条目的对象(因为人类基因组中大约有2820万个cpg)。这为我们提供了数据对象的上限。

在此基础上,从(Hansen, Timp, et al. 2011)包括平滑的值,占用大约1.2GB的RAM,这意味着可以轻松地使用8GB的RAM进行分析。为了提高速度,该包允许简单的并行处理样品/染色体。这将需要为所使用的每个核心复制多个数据对象,从而大大增加内存使用,甚至可能增加到32GB。这可以通过以速度为代价按顺序处理样本来避免。

在一个64GB节点上,来自(Hansen, Timp, et al. 2011)使用8个核心并行处理大约需要1个小时(总共使用的RAM远远小于64GB)。这并不包括解析来自对齐输出文件的数据。

1.2一些术语

因为不是所有的甲基化都发生在CpG位点,我们尝试使用术语“甲基化位点”来代替CpG。我们用这个术语来指代单碱基甲基化位点。

一些来自DNA甲基化领域的标准术语:差异甲基化区域(DMR),超甲基化(一种条件/样本的甲基化程度高于另一种情况/样本的甲基化程度),低甲基化(一种条件/样本的甲基化程度低于另一种情况/样本的甲基化程度),最后是指单个位点的差异甲基化位置(DMP)。

1.3引用

如果您使用这个包,请引用我们的BSmooth论文(Hansen, Langmead, and Irizarry 2012)

1.4依赖关系

库(bsseq)

2概述

该包假设已经从对齐中提取了以下数据:

  • 甲基化位点的基因组位置,包括染色体和位置。
  • a(矩阵)的M(甲基化)值,描述读取支持甲基化覆盖单个位点的数量。矩阵中的每一行是一个甲基化位点,每列是一个样本。
  • Cov (Coverage)值的矩阵,描述覆盖单个位点的读取总数。矩阵中的每一行是一个甲基化位点,每列是一个样本。

我们可以看看一些来自(Lister et al. 2009)特别是来自IMR90细胞系的22号染色体。

数据(BS.chr22) BS.chr22
##一个“BSseq”类型的对象,其中## 494728甲基化位点## 2样本##尚未平滑##所有分析都在内存中

基因组位置存储为a农庄对象农庄是一般的基因组区域;我们将单个碱基甲基化位点表示为宽度为1的区间(这似乎有点奇怪,但这是有充分理由的)。例如,Lister数据中的前4个位点是

head(granges(BS.chr22), n = 4)
## seqnames ranges strand ##    ## [1] chr22 14430632 * ## [2] chr22 14430677 * ## [3] chr22 14430687 * ## [4] chr22 14430702 * ## ------- ## seqinfo: 1个来自未指定基因组的序列;没有seqlengths

我们还有M和Cov矩阵

头(getCoverage (BS。空空的22,类型= "M"), n = 4)
# # r1, r2 20 # # # # 17 [1] [2] 4 20 # # [3] 6 19 # # 2 4 [4]
head(getCoverage(BS.chr22), n = 4)
# # r1, r2 18 23 # # # # [1] [2] 11 28 25 # # # # 10 [3] [4] 8 21

由于CpG甲基化在染色体的两条链上是对称的,我们将正链和反链上的读数聚合成一个值,我们假设基因组位置指向CpG的C。这在任何方面都不是至关重要的,人们可以很容易地分别分析每条链,但CpG甲基化是对称的,这使得位点的数量减少了一半。

如何将甲基化数据输入到这个数据结构(称为BSseq对象)将在下面的部分中描述。我们还有一节介绍如何操作这些类型的对象。

分析通常由以下步骤组成。

  1. 平滑,使用函数BSmooth ()
  2. 使用函数计算t统计量BSmooth.tstat ().这将转换BSseq对象转换为BSseqTstat对象。
  3. 使用函数将这些t统计值设置为阈值,以识别DMRsdmrFinder (),返回简单的data.frame

在识别DMRs之前或之后查看平滑的数据通常是一个好主意。这可以使用函数来完成plotRegion ()而且plotManyRegions ()

我们也有评估二项式模型和毒性模型的拟合优度的函数;对于大多数用户来说,这似乎是不感兴趣的。参见手册页binomialGoodnessOfFit ()

我们还允许使用函数轻松计算每个位点的Fisher精确检验fisherTests ()

3.使用类BSseq的对象

3.1基本操作

类的对象BSseq包含一个农庄目标是基因组位置。这农庄对象可以通过农庄().若干标准农庄方法直接作用于BSseq对象,例如start ()结束()seqnames ()(染色体名称)等。

这些对象还包含phenoData对象获取样本苯酚数据。有用的方法有sampleNames ()pData ()

最后,我们有方法,如昏暗的()ncol ()(列数;样本数),nrow ()(行数;甲基化位点数)。

对象可以使用两个索引进行子集设置BSseq (i, j)第一个指标为甲基化位点,第二个指标为样品。另一种非常有用的设置对象的方法是使用方法subsetByOverlaps ().这将选择一组基因组区间内的所有甲基化位点(第一个参数和第二个参数之间有区别,任何一个都可以)BSseq农庄).

例子:

head(start(BS.chr22), n = 4)
## [1] 14430632 14430677 14430687 14430702
head(seqnames(BS.chr22), n = 4)
## factor-Rle长度为4,运行1次##长度:4 ##值:chr22 ##级别(1):chr22
sampleNames (BS.chr22)
##[1]“r1”“r2”
pData (BS.chr22)
## 2行1列的数据帧## Rep ## <字符> ## r1 replicate1 ## r2 replicate2
暗(BS.chr22)
## [1] 494728 2
BS.chr22 [1:6, 1]
##一个“BSseq”类型的对象,其中## 6个甲基化位点## 1个样本##尚未平滑##所有分析都在内存中
subsetByOverlaps (BS。空空的22,农庄(seqnames = "chr22", ranges = IRanges(start = 1, end = 2*10^7)))
##一个“BSseq”类型的对象,其中## 67082甲基化位点## 2样本##尚未平滑##所有分析都在内存中

3.2数据处理

我们有很多函数来操作一个或多个BSseq对象。

BSseq ()实例化类的对象BSseq.基因组位置被传递进来,或者作为农庄对象(参数gr)或作为染色体和位置向量(参数空空的而且pos).的参数而且接受矩阵,可以直接给它一个phenoData对象。

M < -矩阵(0:8 3 3)x < -矩阵(1:9,3,3)BStmp < - BSseq(对应= c(“chr1”、“chrX”,“chr1”),pos = 1:3, M = M x = x, sampleNames = c(“A1”、“A2”、“B”))

一个BSseq对象的排序可由orderBSseq ().这确保了来自单个染色体的数据出现在一个有序的、连续的块中。也有可能指定染色体顺序(这是不太重要的)。平滑函数假设BSseq已经下令了。

农庄(BStmp)
## seqnames ranges strand ##    ## [1] chr1 1 * ## [2] chrX 2 * ## [3] chr1 3 * ## ------- ## seqinfo:来自未指定基因组的2个序列;没有seqlengths
BStmp <- orderBSseq(BStmp, seqOrder = c("chr1", "chrX")) granges(BStmp))
## seqnames ranges strand ##    ## [1] chr1 1 * ## [2] chr1 3 * ## [3] chrX 2 * ## ------- ## seqinfo:来自未指定基因组的2个序列;没有seqlengths

chrSelectBSseq ()执行通常有用的选择一个或多个染色体的任务,也可以对输出进行排序。以防order = TRUE时,输出按顺序排列seqnames论点。

chrSelectBSseq(BStmp, seqnames = "chr1", order = TRUE)
##一个“BSseq”类型的对象,其中## 2甲基化位点## 3样本##尚未平滑##所有分析都在内存中

当然,在这种情况下,函数做的很少,因为BS.chr22已经只包含了22号染色体的数据。

结合()结合了两种BSseq对象:返回对象的样本是两个对象样本的并集,甲基化位点是两个甲基化位点的并集。这两个物体不需要测量相同的轨迹(在下面的例子中,BStmp有1号染色体和X染色体的数据)。

BStmp2 <- combine(BStmp, BS.chr22[1:3,])
## seqinfo中的警告。mergexy(x, y):两个组合的对象没有共同的序列级别。(使用## suppressWarnings()来抑制此警告。)mergexy(x, y):两个组合的对象没有共同的序列级别。(使用## suppressWarnings()取消此警告。)
农庄(BStmp2)
## seqnames ranges strand ##    [1] chr1 1 * ## [2] chr1 3 * ## [3] chrX 2 * ## [4] chr22 14430632 * ## [5] chr22 14430677 * ## [6] chr22 14430687 * ## ------- # seqinfo: 3个来自未指定基因组的序列;没有seqlengths
getCoverage (BStmp2)
## A1 A2 B r1 r2 ## [1,] 1 4 7 0 0 ## [2,] 3 6 9 0 0 ## [3,] 25 8 0 0 ## [4,] 0 0 0 18 23 ## [5,] 0 0 0 11 28 ## [6,] 0 0 0 10 25

collapseBSseq类的数列相加,这通常是非常有用的任务BSseq对象。这通常用于分析的开始,其中每个列可能对应一个通道,几个这样的列代表单个生物样品的数据。

(BStmp, group = c("A", "A", "B")))
##一个“BSseq”类型的对象,其中## 3甲基化位点## 2样本##尚未平滑##所有分析都在内存中

3.3获得覆盖范围(甲基化)

覆盖率(Cov或M值)由getCoverage (),使用类型论点:

头(getCoverage (BS。空空的22,类型= "Cov"), n = 4)
# # r1, r2 18 23 # # # # [1] [2] 11 28 25 # # # # 10 [3] [4] 8 21
头(getCoverage (BS。空空的22,类型= "M"), n = 4)
# # r1, r2 20 # # # # 17 [1] [2] 4 20 # # [3] 6 19 # # 2 4 [4]

这将返回一个-可能非常大的-矩阵。方法也可以获得基于区域的覆盖地区函数的参数。这个论证要么是adata.frame(列空空的开始而且结束)或农庄对象。我们举个例子

region <- GRanges(seqnames = c("chr22", "chr22"), ranges = IRanges(start = 1.5 * 10^7 + c(0,200000), width = 1000))chr22, regions = regions, what = "perRegionTotal")
## r1 r2 ## [1,] 30 38 ## [2,] NA NA

什么perRegionTotal返回值是每个区域的总覆盖率(注意没有覆盖率的区域返回NA).同样的,perRegionAverage产生该区域的平均覆盖率。然而,获得实际值通常是有用的,比如

getCoverage (BS。空空的22,地区= regions, what = "perBase")
# # # # ([1]) [1] [2] 30 # # # # 21 [1] [2] 2 8 # # [3] 7 0 # # # # [[2]] # # NULL

这是默认行为,它返回一个列表,其中每个元素对应一个区域。请注意,没有覆盖的地区将得到a

甲基化估计可以用相同的方法获得,使用函数getMeth ().如果类型设置为该函数返回简单的单位点甲基化估计值(即M/Cov)。为了得到平滑估计,BSseq对象需要使用Bsmooth平滑,并且类型设置为光滑的(默认)。的getCoverage (0getMeth ()有一个地区和一个什么论点。为getMeth ()什么参数可以是perBaseperRegion(后者实际上是每个区域的平均甲基化)。此外,可以使用考虑低覆盖率位点以及甲基化百分比可能接近0或1的位点的方法计算置信区间(Agresti和Coull 1998).目前,无法计算区域一级汇总估计数的置信区间。例子

getMeth (BS。空空的22,地区,类型= "raw")
# # # #([1])[1][2] # #(1) 0.1904762 - 0.1666667 # #(2) 1.0000000 - 0.7500000 # # 0.1428571[3]南# # # # # # [[2]]NULL
getMeth (BS。空空的22,地区[2], type = "raw", what = "perBase")
## [[1]] ## null

4读取数据

4.1BSmooth对齐套件的对齐输出

从BSmooth对齐套件中读取输出文件(汇总证据)非常简单,使用read.bsmooth ().这个函数以一些目录作为参数,这些目录通常对应于样本,并带有对齐输出。有时,人们可能只想读取某些染色体,这可以通过seqnames论点。的默认值qualityCutoff = 20确保我们不使用基本质量严格低于20的甲基化证据(因为我们可能不确定读取是否真的支持甲基化)。这个函数read.bsmooth ()允许gzip和非gzip的输入文件。读取经过gzip压缩的文件速度更快,因此我们建议在对齐后进行gzip压缩。

在开发BSmooth的过程中,我们尝试了许多不同的输出格式。可以读取这些遗留格式read.umtab ()而且read.umtab2 ()

4.2来自其他对齐器的对齐输出

我们感兴趣的是向包中添加额外的解析器;如果您最喜欢的对齐软件不受支持,请随时联系。

总的来说,我们需要总结甲基化证据。简而言之,对于每个甲基化位点,我们需要知道有多少reads覆盖了该位点,以及这些reads中有多少支持甲基化。

例如,考虑Lister数据。网上公布的文件看起来

>头mc_imr90_r1_22装配位置绞线类mc h 22 14430632 + CG 9 10 22 14430633 - CG 88 22 14430677 + CG 11 22 14430678 - CG 3 10 22 14430688 - CG 6 10 22 14430703 - CG 2 8 22 14431244 + CG 5 10 22 14431245 - CG 5 11

在这些文件中,证据是按链分割的。通常最简单的方法是一次读取一个样本,实例化一个BSseq对象,然后使用结合()而且collapseBSseq ()来组合样本,因为这些函数处理的对象具有不同的cpg集。在Lister数据中,注意位置是“C”的位置,所以基本上,如果您想结合来自两条链的证据,“-”链上的cpg需要从它们的位置减去1。一个完整的脚本显示如何使用这些文件创建BS.chr22可在本月/脚本/ \ _BS.chr22.Rbsseq包中。该文件的路径可以通过

系统。文件(“脚本”、“get_BS.chr22。R", package = "bsseq")

5分析

计算平滑甲基化水平很简单。我们划分子集BS.chr22为了运行时的目的,我们只平滑了1个样本

BS.chr22.1 <- BSmooth(BS. chr22.1)空空的22[,"r1"], verbose = TRUE) BS.chr22.1
##一个“BSseq”类型的对象,其中## 494728甲基化位点## 1样本##已被## BSmooth平滑(ns = 70, h = 1000, maxGap = 100000000) ##所有分析都在内存中

许多参数与使用多核有关。如果你有多个样本或染色体,这是很有用的。mc.cores告诉BSmooth ()使用多少内核parallelBy描述并行化是针对样本还是针对染色体。如果并行化超过样本,每个核心将计算整个基因组的平滑。如果是超过样本,每个核将平滑所有样本的一个或多个染色体。适当的选择取决于可用的样本和cpu内核的数量。如果你有相同数量的样本和核心,最快的是parallelBy = "sample".如果你的样本比核心少,最快的是parallelBy = "染色体".这个论点mc.preshedule应该不需要更改(除非可能如果一个小值maxGap使用);参见手册页并行:mclapply.注意设置mc.cores由于操作系统的限制,在MS Windows上不支持大于1的值。

有关分析工具的更详细的讨论,请阅读配套的小插图“使用bsseq包分析WGBS”,其中还找到DMRs并绘制它们。

使用该函数可以有效地计算费雪的精确检验fisherTests()”。

二项和泊松拟合优度检验统计量可以计算使用binomialGoodnessOfFit ()而且poissonGoodnessOfFit ()

6sessionInfo ()

## R版本4.1.0(2021-05-18)##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.2 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.13-bioc/R/lib/libRblas。所以## LAPACK: /home/biocbuild/bbs-3.13-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # # [1]stats4并行数据图形grDevices跑龙套数据集# #[8]方法基础# # # #其他附加包:# # [1]bsseq_1.28.0 SummarizedExperiment_1.22.0 # # [3] Biobase_2.52.0 MatrixGenerics_1.4.0 # # [5] matrixStats_0.58.0 GenomicRanges_1.44.0 # # [7] GenomeInfoDb_1.28.0 IRanges_2.26.0 # # [9] S4Vectors_0.30.0 BiocGenerics_0.38.0 # # [11] BiocStyle_2.20.0 # # # #通过加载一个名称空间(而不是附加):# # [1] Rcpp_1.0.6 locfit_1.5 - 9.4 # # [3] lattice_0.20-44 Rsamtools_2.8.0 # # [5] Biostrings_2.60.0 gtools_3.8.2 # # [7] digest_0.6.27 R6_2.5.0 # # [9] evaluate_0.14 sparseMatrixStats_1.4.0 # # [11] zlibbioc_1.38.0 rlang_0.4.11 # # [13] data.table_1.14.0 jquerylib_0.1.4 # # [15] R.oo_1.24.0 R.utils_2.10.1 # # [17] Matrix_1.3-3 rmarkdown_2.8 # # [19] BiocParallel_1.26.0 stringr_1.4.0 # # [21] rcurl_1.98 - 1.3 munsell_0.5.0 # # [23] DelayedArray_0.18.0 HDF5Array_1.20.0 # # [25] compiler_4.1.0 rtracklayer_1.52.0##[39]基因组比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对## [55] rhdf5_2.36.0 BiocManager_1.30.15 ## [57] knitr_1.33 sass_0.4.0 ## [59] BiocIO_1.2.0

7参考文献

阿兰·库尔和布伦特·库尔,1998年。二项比例区间估计的近似优于精确。美国统计学家52(2): 119-26。http://www.jstor.org/stable/2685469

汉森,卡斯珀·D,本杰明·朗米德,拉斐尔·A·伊瑞扎里,2012。“BSmooth:从亚硫酸氢盐全基因组测序读数到不同甲基化区域。”基因组生物学13 (10): r83。https://doi.org/10.1186/gb-2012-13-10-r83

Hansen, Kasper D, Winston Timp, Hector Corrada Bravo, Sarven Sabunciyan, Benjamin Langmead, Oliver G. McDonald, Bo Wen等。2011。“跨癌症类型表观遗传结构域稳定性的普遍丧失。”自然遗传学43(8): 768-75。https://doi.org/10.1038/ng.865

汉森,Kasper D,吴志金,Rafael A Irizarry, Jeffrey T Leek, 2011。“测序技术并不能消除生物多样性。”自然生物技术29(7): 572-73。https://doi.org/10.1038/nbt.1910

Lister, Ryan, Mattia Pelizzola, Robert H Dowen, R David Hawkins, Gary C Hon, Julian Tonti-Filippini, Joseph R Nery等,2009。“碱基分辨率下的人类DNA甲基组显示出广泛的表观基因组差异。”自然462(7271): 315-22。https://doi.org/10.1038/nature08514

董,珍妮,路易斯·B·巴雷罗,扎卡里·P·约翰逊,卡斯珀·D·汉森,瓦西里基·米科波洛斯,唐娜·图费西斯,凯特琳·米凯里尼,马克·E·威尔逊,约夫·吉拉德。2012。“社会环境与恒河猴免疫系统的基因调节变异有关。”PNAS109(17): 6490-5。https://doi.org/10.1073/pnas.1202734109