简介

本插图描述了ChIP-seq数据的基本分析步骤。为了举例说明本教程,我们使用ChIP-seq数据进行组蛋白H3(即H3K27ac)的赖氨酸27乙酰化。

本教程的目标

完成本小插图后,您将能够:
1.读一个ChIP-seq实验R
2.扩展读取并保存数据(稍后讨论细节和相关性)
3.生成.bedGraph文件
4.可视化ChIP-seq数据R
5.对ChIP-seq峰值进行基本分析
6.生成围绕一组注释的基因组位点的ChIP-seq富集的平均剖面和热图
在附录部分中,我们将展示如何下载、预处理和评估.fastq文件的质量。

数据

H3K27ac是一种与活性启动子和增强子相关的组蛋白修饰。我们下载了与ChIP-seq实验相对应的数据,其中有两个小鼠胚胎干细胞(mESC)的生物重复,以及输入的对照样本组蛋白H3K27ac分离活性增强子和稳定增强子并预测发育状态由Creyghton., pnas 2010。

数据预处理

ChIP-seq分析工作流的第一部分是读预处理。在这里,我们将不关注这些最初的步骤,我们将概述它们并在附录小插图的一部分。下面简要介绍预处理中的三个主要步骤。

初始质量评估

序列读取保存在.fastq文件中。测序结果分析的第一步是质量评估。的RShortRead提供了一个质量保证执行此分析。读者可以找到生成对象所需的代码超文本标记语言阅读质量控制报告附录小插图的一部分。

外部R数据opperations

分析序列读取的初始部分包括:对齐、滤波和寻峰。它们可以使用工具来执行Bowtie2samtools苹果电脑.中提供了所有必要的代码附录小插图的一部分。

额外的注意事项

从这个小插图(可视化和读取分布分析)需要两个步骤biomart通过互联网查询数据库。为了避免多次下载,我们在数据包中提供了必要的对象EpigeneticsCSAMA.生成这些对象的代码可以在附录小插图。

此外,为了减少内存需求,我们将分析限制在映射到6号染色体的过滤读取。

数据包

由上述步骤生成的数据文件被放置在名为EpigeneticsCSAMA,我们现在加载。(注意,在本课程中使用这样的数据包是为了方便,但通常情况下,您不会以这种方式打包中间数据。)

库(EpigeneticsCSAMA) dataDirectory =系统。文件(“bedfiles”,包=“EpigeneticsCSAMA”)

的变量dataDirectory显示包含此小插图所需的数据对象的目录。

dataDirectory
## [1] "/home/msmith/Applications/R/R-devel/library/EpigeneticsCSAMA/bedfiles"

为了研究这些文件,可以使用文本编辑器或终端模拟器查看它们。

读取过滤后的ChIP-seq读取

我们需要装载GenomicRangesrtracklayer而且IRanges包。将.bam文件读入R,我们使用import.bed函数从rtracklayer包中。结果是农庄对象。这是一个非常有用和强大的对象类,读者已经很熟悉了。每一个过滤后的读数在这里表示为一个基因组区间。

库(GenomicRanges)
##加载所需的包:stats4
##加载所需的包:BiocGenerics
##加载所需的包:并行
## ##附加包:“BiocGenerics”
以下对象将从'package:parallel'中屏蔽:## ## clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, ## clusterExport, clusterMap, parApply, parCapply, parApply, ## parapplylb, parRapply, parSapply, parSapplyLB
以下对象从'package:stats'中屏蔽:## ## IQR, mad, xtabs
下面的对象从'package:base'中屏蔽:## ## anyduplication, append, as.data.frame, cbind, colnames, ## do。call, duplicate, eval, evalq, Filter, Find, get, grep, ## grepl, intersect, is。unsorted, lapply, lengthmap, mapply, ## match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, ## Position, rank, rbind, Reduce, rownames, sapply, setdiff, ## sort, table, tapply, union, unique, unsplit, which, which。Max, ## which.min
##加载所需的包:S4Vectors
## ##附加包:“S4Vectors”
以下对象从'package:base'中屏蔽:## ## colMeans, colsum, expand。grid, rowMeans, rowsum
##加载所需的包:IRanges
##加载所需包:GenomeInfoDb
library(rtracklayer) library(IRanges) input = import.bed(文件。path(dataDirectory, 'ES_input_filtered_ucsc_chr6.bed')) rep1 = import.bed(文件。path(dataDirectory, 'H3K27ac_rep1_filtered_ucsc_chr6.bed')) rep2 = import.bed(文件。路径(dataDirectory H3K27ac_rep2_filtered_ucsc_chr6.bed))

的对象输入rep1而且rep2分别持有输入样本和ChIP-seq复制1和复制2的过滤reads的基因组注释。我们显示rep1对象。我们看到链信息,读取名称以及对齐分数都包括在每次读取的信息中。

rep1
##具有481412个范围和2个元数据列的GRanges对象:## seqnames ranges strand | name ##    |  ## [1] chr6 [85222462,85222497] - | SRR066766.303 ## [2] chr6 [134189439,134189474] + | SRR066766.374 ## [3] chr6 [47920826,47920861] + | SRR066766.397 ## [5] chr6 [3939262,39392727] - | SRR066766.438 ## ... ... ... ... . ...## [481408] chr6 [86800209, 86800244] - | SRR066766.14657325 ## [481409] chr6 [91422497, 91422532] - | srr066766.146573340 ## [481410] chr6 [120020286, 120020321] + | SRR066766.14657362 ## [481411] chr6 [120020286, 120020321] - | SRR066766.14657382 ## [481412] chr6 [85113322, 85113357] - | SRR066766.14657387 ## score ## <数字> ## [1]40 ## [2]42 ## [3]42 ## [4]42 ## [5]42 ## # ... ...## [481408] 42 ## [481409] 42 ## [481410] 42 ## [481411] 42 ## [481412] 42 ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths

我们看到,在输入和IP-ed实验中,我们有大致相同的读取数量。

长度(输入)
## [1] 465823
长度(rep1)
## [1] 481412
长度(rep2)
## [1] 506287

ChIP-seq和对照样品的制备:读扩展

读取对应于每个IP-ed片段结尾的序列(单端测序数据)。我们需要扩展这些读取,以表示每个ip编码的DNA片段。

我们估计平均读取长度使用estimate.mean.fraglen函数chipseqpackege。方法将读取扩展到推断的读取长度调整函数。我们删除任何在扩展后坐标超过染色体长度的读。这三个分析步骤封装在一个函数中prepareChIPseq函数,我们在下面定义。

库(chipseq)
##加载所需的包:ShortRead
##加载所需的包:BiocParallel
##加载所需的包:生物strings
##加载所需的包:XVector
##加载所需的包:Rsamtools
##加载所需的包:基因组校准
##加载所需包:摘要实验
##加载所需的包:Biobase
##欢迎访问Bioconductor ## ##小插图包含介绍性材料;查看## 'browseVignettes()'。要引用Bioconductor,请参见##“citation(“Biobase”)”,以及软件包的“citation(“pkgname”)”。
prepareChIPseq = function(reads){fragg .;len = median(estimate.mean.fraglen(reads)) cat(paste0('此库的中位数片段大小为',round(fragf .len)))读取。Extended = resize(reads, width = fragr .len) return(trim(reads. Extended))}

接下来,我们将其应用于输入和ChIP-seq样本。

输入= prepareChIPseq(输入)
这个库的中位数片段大小是236
rep1 = prepareChIPseq(rep1)
这个库的中位数片段大小是122
rep2 = prepareChIPseq(rep2)
这个库的中位数片段大小是107

与上面的比较,看看如何rep1已经改变了。

rep1
##具有481412个范围和2个元数据列的GRanges对象:## seqnames ranges strand | name ##    |  ## [1] chr6 [85222376, 85222497] - | SRR066766.303 ## [2] chr6 [134189439,134189560] + | SRR066766.374 ## [3] chr6 [47920826,47920947] + | SRR066766.393 ## [4] chr6 [143565148, 143565269] + | SRR066766.397 ## | SRR066766.438 ## ... ... ... ... . ...## [481408] chr6 [86800123, 86800244] - | SRR066766.14657325 ## [481409] chr6 [91422411,91422532] - | srr066766.146573340 ## [481410] chr6 [120020200,120020321] - | SRR066766.14657362 ## [481412] chr6 [85113236, 85113357] - | SRR066766.14657387 ## score ## <数字> ## [1]40 ## [2]42 ## [3]42 ## [4]42 ## [5]42 ## # ... ...## [481408] 42 ## [481409] 42 ## [481410] 42 ## [481411] 42 ## [481412] 42 ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths

对ChIP-seq和control进行装箱

分析的下一步是计算有多少reads映射到每个预先建立的基因组间隔(箱)。

箱子的生成

我们将把基因组平铺成大小为200 bp的不重叠的容器。为此,我们需要小鼠基因组(组装)中染色体大小的信息mm9).在数据包中,我们提供对象如果(链信息),用于保存这些数据。对象创建所需的代码如果对象中的获得Si *对象为*mm9**的附录

数据(si) si
## Seqinfo对象,21个序列来自mm9基因组:## seqnames seqlengthiscircular genome ## chr1 197195432 FALSE mm9 ## chr2 181748087 FALSE mm9 ## chr3 159599783 FALSE mm9 ## chr4 155630120 FALSE mm9 ## chr5 152537259 FALSE mm9 ## ... ... ... ...## chr17 95272651 FALSE mm9 ## chr18 90772031 FALSE mm9 ## chr19 61342430 FALSE mm9 ## chrX 166650296 FALSE mm9 ## chrY 15902555 FALSE mm9

接下来,我们使用tileGenome函数从GenomicRanges包来生成农庄对象,其间隔以200 bp大小的瓦片(箱)覆盖基因组。

binsize = 200 bins = tileGenome(si['chr6'], tilewidth=binsize, cut.last.tile.in.chrom=TRUE) bins
##具有747586范围和0个元数据列的GRanges对象:## seqnames ranges strand ##    ## [1] chr6 [1,200] * ## [2] chr6 [201,400] * ## [3] chr6 [401, 600] * ## [4] chr6 [601, 800] * ## [5] chr6 [801,1000] * ## ... ... ... ...## [747582] chr6 [149516201, 149516400] * ## [747583] chr6 [149516401, 149516600] * ## [747584] chr6 [149516601, 149516800] * ## [747585] chr6 [149516801, 149517000] * ## [747586] chr6 [149517001, 149517037] * ## ------- ## seqinfo:来自mm9基因组的1个序列

装箱

我们现在计算每个bin中有多少读取。为此,我们定义了函数BinChIPseq.它需要两个参数,读取而且垃圾箱这是农庄对象。

BinChIPseq =函数(读取,箱子){mcols(箱子)$score = countOverlaps(箱子,读取)返回(箱子)}

现在我们把它应用到对象上输入rep1而且rep2.我们获得input.200binsrep1.200bins而且rep2.200bins,分别是农庄对象,包含输入和ChIP-seq实验的二进制读覆盖。

input.200bins= BinChIPseq( input, bins ) rep1.200bins = BinChIPseq( rep1, bins ) rep2.200bins = BinChIPseq( rep2, bins ) rep1.200bins
##具有747586范围和1个元数据列的GRanges对象:## seqnames ranges strand | score ##    |  ## [1] chr6 [1,200] * | 0 ## [2] chr6 [201,400] * | 0 ## [3] chr6 [401, 600] * | 0 ## [4] chr6 [601, 800] * | 0 ## [5] chr6 [801,1000] * | 0 ## ... ... ... ... . ...## [747582] chr6 [149516201, 149516400] * | 0 ## [747583] chr6 [149516401, 149516600] * | 0 ## [747584] chr6 [149516601, 149516800] * | 0 ## [747585] chr6 [149516801, 149517000] * | 0 ## [747586] chr6 [149517001, 149517037] * | 0 ## ------- ## seqinfo: 1个来自mm9基因组的序列

我们可以画出1000个箱子的覆盖率,从20万个箱子开始。

Plot (200000:201000, rep1.200bins$score[200000:201000], xlab="chr6", ylab="每箱计数")

下面,我们将看到更复杂的绘制覆盖率的方法。

导出二进制数据

在分析的这个步骤中,数据可以被可视化和共享了。共享ChIP-seq数据的最常用方法之一是生成.wig、. binwig或. bedgraph文件。它们是存储和大小有效的文件,保存了基因组中有关信号的信息。此外,这些文件可以在IGV和IGB等基因组浏览器中可视化。我们将展示如何将已打包的数据导出为. bedgraph文件。

出口(输入。200箱,= ' input_chr6监狱。bedGraph', format = "bedGraph") export(rep1.200bins, con='H3K27ac_rep1_chr6. exe ')bedGraph', format = "bedGraph") export(rep2.200bins, con='H3K27ac_rep2_chr6. bin '), format = "bedGraph")

在下一节中,我们将看到如何使用可视化床图文件R

ChIP-seq数据可视化Gviz

现在,我们有了想要展示基因组的数据。R为多种类型的基因组数据可视化提供了灵活的基础设施。这里,我们用Gviz为这些目的包装。

库(Gviz)
##加载所需的包:网格
## ##附件:“Gviz”
以下对象从'package:ShortRead'中屏蔽:## ##染色体,位置

工作的原则Gviz依赖于轨迹的生成,例如沿着基因组的ChIP-seq信号,ChIP-seq峰值,基因模型或任何类型的其他数据,如基因组中CpG岛的注释。我们从装载6号染色体的基因模型开始,从位置122,530,000开始,到位置122,900,000结束。我们关注这一地区,因为它拥有Nanog这种基因在胚胎干细胞中强烈表达。

我们使用biomaRt包中。一起工作biomaRt包依赖于查询biomart数据库。在附录,我们展示了如何获得档案小鼠基因组组装(mm9)的蛋白质编码基因的基因模型,以及如何生成bm持有所有RefSeq基因注释的对象。

数据(bm) bm
GeneRegionTrack 'RefSeq' ## |基因组:mm9 ## |活性染色体:chr6 ## |注释特征:102

我们包括GenomeAxisTrack对象,该对象是一个坐标轴,显示所分析区域的基因组跨度。

AT = GenomeAxisTrack()

函数绘制结果plotTracks函数。选择要放大的区域而且参数。的transcriptAnnotation参数允许将基因符号放入图中。

plotTracks(c(bm, AT), from=122530000, to=122900000, transcriptAnnotation="symbol", window="auto", cex。Title =1, fontsize=10

接下来,我们将两条数据轨迹添加到图形中。我们首先生成DataTrack对象与DataTrack函数。我们包括关于轨道如何被标记和着色的信息。我们获得input.trackrep1.track而且rep2.track对象。

input.track= DataTrack(input.200bins, strand="*", genome="mm9", col.histogram='gray', fill.histogram='black', name="Input", col.axis="black", cex.axis=0.4, ylim=c(0,150)) rep1.track = DataTrack(rep1.200bins, strand="*", genome="mm9", col.histogram='steelblue', fill.histogram='black', name="Rep. 1", col.axis='steelblue', cex.axis=0.4, ylim=c(0,150)) rep2.track = DataTrack(rep2.200bins, strand="*", genome="mm9", col.histogram='steelblue', fill.histogram='black', name="Rep. 2", col.axis='steelblue', cex.axis=0.4, ylim=c(0,150))

最后,我们将这些轨迹与基因组特征一起绘制。我们观察到输入轨迹覆盖均匀,启动子区和基因间区富集H3K27ac的峰值明显。重要的是,H3K27ac富集区很容易识别。

plotTracks (c(输入。跟踪rep1。追踪,rep2。track, bm, AT), from=122530000, to=122900000, transcriptAnnotation="symbol", window="auto", type="histogram", cex.title=0.7, fontsize=10)

ChIP-seq山峰

ChIP-seq实验的设计目的是分离富集感兴趣因子的区域。富集区域的识别,通常被称为峰值发现,本身就是一个研究领域。有许多算法和工具用于寻找峰值。方法的选择受到所分析的因素类型的强烈影响。例如,转录因子ChIP-seq产生了明确的窄峰,而组蛋白修饰ChIP-seq实验如H3K36me3产生了高覆盖区域。最后,带有识别聚合酶II的核酸体的ChIP-seq结果是窄峰和扩展的富集区域。

峰的识别

正如我们在本教程的前一节中看到的,H3K27ac标记显示了明确的峰值。在这种情况下,苹果电脑是最常用的寻峰软件之一。ChIP-seq峰值通话也可以在RBayesPeak包中。但是,我们在这里只讨论最常用的方法和用法苹果电脑.我们跑苹果电脑并在数据包中提供结果。中可以找到获取峰值所需的代码附录小插图。

峰的基本分析R

接下来,我们从数据包中导入隔离峰值的.bed文件。

峰值。rep1= import.bed(file.path(dataDirectory,'Rep1_peaks_ucsc_chr6.bed')) peaks.rep2 = import.bed(file.path(dataDirectory,'Rep2_peaks_ucsc_chr6.bed'))

分析已识别的峰值的第一步是简单地将它们与ChIP-seq和输入轨道一起显示在浏览器中。为此,我们使用AnnotationTrack函数。我们将峰值显示为蓝色的方框。

peaks1。track = AnnotationTrack(峰值。rep1,genome="mm9", name='Peaks Rep. 1', chromosome='chr6', shape='box',fill='blue3',size=2) peaks2.track = AnnotationTrack(peaks.rep2, genome="mm9", name='Peaks Rep. 2', chromosome='chr6', shape='box',fill='blue3',size=2)

我们想象Nanog轨迹。

plotTracks (c(输入。跟踪rep1。追踪,peaks1。追踪,rep2。追踪,peaks2。track, bm, AT), from=122630000, to=122700000, transcriptAnnotation="symbol", window="auto", type="histogram", cex.title=0.7, fontsize=10)

我们可以看到苹果电脑成功识别出H3K27ac信号高的区域。我们看到两种生物复制都很一致,然而,在某些情况下,只有一个样本才称为峰值。在下一节中,我们将分析如何经常看到峰之间的重叠和孤立的可重复的峰。

维恩图

我们首先找到两个重复的峰值集之间的重叠。

ovlp = findOverlaps(峰值。rep1峰值。Rep2) ovlp
##命中2528次,0元数据列的对象:## queryHits subjectHits ##   ## [1] 1 1 ## [2] 2 2 ## [3] 3 3 ## [4] 4 4 ## [5] 5 5 ## ... ... ...## [2524] 3025 3025 ## [2525] 3026 3026 ## [2526] 3029 3027 ## [2527] 3030 3028 ## [2528] 3031 3030 ## ------- ## queryLength: 3032 / subjectLength: 3032

如果一个复制中的峰值与另一个复制中的多个峰值重叠,则它将在中出现多次ovlp.为了查看有多少峰与另一个副本中的某物重叠,我们计算的两列中的每一列中的唯一峰的数量ovlp取这两个数中较小的数作为共有峰数。

ov = min(长度(唯一的(queryHits(ovlp))),长度(唯一的(subjectHits(ovlp))))

我们把它画成维恩图,用draw.pairwise.venn函数从维恩图包中。

库(文氏图)
##加载所需的包
draw.pairwise.venn( area1=length(peaks.rep1), area2=length(peaks.rep2), cross.area=ov, category=c("rep1", "rep2"), fill=c("steelblue", "blue3"), cat.cex=0.7)

# #(多边形[GRID.polygon。100年],[GRID.polygon多边形。101年],[GRID.polygon多边形。102年],[GRID.polygon多边形。103年],[GRID.text文本。104年],[GRID.text文本。105年],[GRID.text文本。106年],[GRID.text文本。107),文本[GRID.text.108])

我们将只关注在两个重复中确定的峰值(以下称为富集区)。丰富的区域用绿色表示。

充实。区域=减少(subsetByOverlaps, list(峰值。rep1峰值。rep2)) enr.reg.track = AnnotationTrack(enriched.regions, genome="mm9", name='Enriched regions', chromosome='chr6', shape='box',fill='green3',size=2) plotTracks(c(input.track, rep1.track, peaks1.track, rep2.track, peaks2.track, enr.reg.track, bm, AT), from=122630000, to=122700000, transcriptAnnotation="symbol", window="auto", type="histogram", cex.title=0.5, fontsize=10 )

H3K27ac峰重叠启动子的分离

ChIP序列分析的问题之一是ChIP富集区域与选定的特征类型(如启动子或富集其他修饰的区域)重叠的范围。为此,本文分析了ChIP-seq信号峰值与感兴趣特征之间的重叠。

我们通过测试有多少H3K27ac富集区域重叠启动子区域来举例说明这种分析。

启动子的鉴定

如附录所示,我们已经使用了biomaRt来获取所有小鼠基因的起始和结束坐标。(这些是最外层UTR边界的坐标。)的结果biomaRt从数据包中查询。它在对象中给出egs,一个data.frame包含运用小鼠基因的ID、基因符号、基因组坐标和定位。

数据(egs)头(egs)
# # 1 # # ensembl_gene_id external_gene_id chromosome_name start_position ENSMUSG00000030270 Cpne9 6 113232301 # # 2 ENSMUSG00000001632 Brpf1 6 113257175 # # 3 ENSMUSG00000030271 Ogg1 6 113276966 # # 4 ENSMUSG00000030272 Camk1 6 113284118 # # 5 ENSMUSG00000048930 Tada3 6 113316019 # # 6 ENSMUSG00000079426 Arpc4 6 113328107 # # end_position链# # 1 113328107 1 # # 2 113274851 1 # # 3 113285062 1 # # 4 113285062 1 # # 5 113327877 1 # # 6 113327877 1

我们接下来确定转录起始位点(TSS),考虑到基因取向。

egs$TSS = ifelse(egs$strand == "1", egs$start_position, egs$end_position) head(egs)
# # 1 # # ensembl_gene_id external_gene_id chromosome_name start_position ENSMUSG00000030270 Cpne9 6 113232301 # # 2 ENSMUSG00000001632 Brpf1 6 113257175 # # 3 ENSMUSG00000030271 Ogg1 6 113276966 # # 4 ENSMUSG00000030272 Camk1 6 113284118 # # 5 ENSMUSG00000048930 Tada3 6 113316019 # # 6 ENSMUSG00000079426 Arpc4 6 113328107 # # end_position链TSS # # 1 113328107 1 113232301 # # 2 113232301 1 113232301 # # 3 113285062 113276966 # # 4 113276966 1 113285062 # # 5 113327877 1 113327877 # # 6 113327877 1113328107

我们考虑的是\ 200下午(\ \)bp围绕TSS作为启动子。

promoter_regions = GRanges(seqnames = Rle(paste0('chr', egs$chromosome_name)), ranges = IRanges(start = egs$TSS - 200, end = egs$TSS + 200), strand = Rle(rep("*", nrow(egs))), gene = egs$external_gene_id) promoter_regions
|基因##    |  ## [1] chr6 [113232101, 113232501] * | Cpne9 ## [2] chr6 [113256975, 113257375] * | Brpf1 ## [3] chr6 [113276766, 113277166] * | Ogg1 ## [4] chr6 [113293778, 113294178] * | Camk1 ## [5] chr6 [113327677, 113328077] * | Tada3 ## ... ... ... ... . ...## [1969] chr6 [30119537,30119937] * | Mir183 ## [1970] chr6 [93743566, 93743966] * | U6 ## [1971] chr6 [116321886, 116322286] * | SNORA17 ## [1972] chr6 [76150072,76150472] * | U1 ## [1973] chr6 [106951246, 106951646] * | U6 ## ------- # seqinfo: 1个来自未知基因组的序列;没有seqlengths

启动子与H3K27ac富集区重叠

现在我们想知道有多少启动子与H3K27ac的富集区重叠。

ovlp2 = finoverlaps(丰富的。区域,promoter_regions) cat(sprintf("%d的%d启动子被一个丰富的区域重叠。",length(unique(subjectHits(ovlp2))), length(promoter_regions)))))
1973启动子中的## 634被富集区域重叠。

我们也可以反过来问:

ovlp2b = findOverlaps(promoter_regions,。区域)cat(sprintf(“%d的%d富集区域重叠启动子。”,长度(唯一的(subjectHits(ovlp2b))),长度(富集。地区)))
2301个富集区域中的546个与一个启动子重叠。

这是一个重大的充实吗?为了了解这一点,我们首先计算6号染色体有多少是启动子区域的一部分。下面的命令将启动子列表缩减为不重叠的间隔,并将它们的宽度相加

Promotor_total_length = sum(width(reduce(promoter_regions)
## [1] 766386

这是染色体的哪一部分?

Promotor_fraction_of_chromosome_6 = promotor_total_length / seqlength (si)["chr6"]

近四分之一的启动子与h3k27ac富集区域重叠,尽管它们只占染色体的0.5%。显然,这是一种强烈的丰富。二项式检验证实了这一点:

binom。test(长度(唯一的(subjectHits(ovlp2b)))),长度(充实。(区域),promotor_fraction_of_chromosome_6)
## ##精确的二项式测试## ##数据:长度(唯一的(subjectHits(ovlp2b)))和长度(.regions) ##成功次数= 546,试验次数= 2301,p值< ## 0.00000000000000022 ##替代假设:真正成功的概率不等于0.005125744 ## 95%置信区间:## 0.2200317 0.2552159 ##样本估计:##成功的概率## 0.2372881

哪些启动子与H3K27ac峰重叠?让我们来看一些例子:

pos.TSS = egs[unique(queryHits(finoverllaps (promoter_regions,。),] post . tss [1:3,]
## ENSMUSG00000030271 Ogg1 6 113276966 ## 4 ENSMUSG00000030272 Camk1 6 113284118 ## end_position strand TSS ## 2 113274851 1 113257175 ## 3 113285062 1 113276966 ## 4 113293978 -1 113293978

被鉴定为与H3K27ac峰重叠的前三个启动子包括:Brpf1Ogg1而且Camk1位点

H3K27ac基因启动子的分布分析

在这一部分的分析中,我们展示了如何生成显示ChIP-seq信号在某些基因组位置周围分布的图,这里是一组启动子区域。这些包括热图表示和H3K27ac信号在启动子重叠的H3K27ac峰的平均剖面苹果电脑.这些是ChIP-seq实验中最常执行的分析步骤之一。

在前一节中,我们已经确定了重叠H3K27ac峰的启动子pos.TSS对象)。为了全面了解H3K27ac在相应TSS周围的分布情况,我们将分析区域扩展到\ 1000下午(\ \)bp围绕TSS。我们将每个2000 bp的区域分成20个长度为100 bp的箱子,并对箱子进行排序,“+”链上的基因的位置增加,“-”链上的基因的位置降低。

接下来,我们对启动子区域进行连续的100bp瓷砖拼接。对于每个区域,我们根据基因取向对瓦片进行排序。我们在每个启动子区域创建20个磁贴。

tiles = sapply(1:nrow(pos.TSS),函数(i) if(pos.TSS$strand[i] == "1") pos.TSS$TSS[i] + seq(-1000, 900,长度。out=20) else post .TSS$TSS[i] + seq(900, -1000,长度。out=20)) tiles = GRanges(tilename = paste(rep(post . tss $ensembl_gene_id, each=20), 1:20, sep="_"), seqnames = Rle(rep(paste0('chr', post . tss $chromosome_name), each=20)), ranges = IRanges(start = as.vector(tiles), width = 100), strand = Rle(rep("*", length(as.vector(tiles)))), seqinfo=si) tiles
##具有12680范围和1个元数据列的GRanges对象:## seqnames ranges strand | tilename ##    |  ## [1] chr6 [113256175, 113256274] * | ENSMUSG00000001632_1 ## [2] chr6 [113256275, 113256374] * | ENSMUSG00000001632_2 ## [3] chr6 [113256375, 113256474] * | ENSMUSG00000001632_3 ## [4] chr6 [113256475, 113256574] * | ENSMUSG00000001632_4 ## [5] chr6 [113256575, 113256674] * | ENSMUSG00000001632_5 ## ... ... ... ... . ...## [12676] chr6 [30119137, 30119236] * | ENSMUSG00000065619_16 ## [12677] chr6 [30118937, 30119036] * | ENSMUSG00000065619_18 ## [12679] chr6 [30118837, 30118936] * | ENSMUSG00000065619_19 ## [12680] chr6 [30118737, 30118836] * | ENSMUSG00000065619_20 ## ------- ## seqinfo:来自mm9基因组的21个序列

接下来,我们计算映射到每个tile的读取数。得到的向量H3K27ac.p下一个用于创建矩阵(H3K27ac.p.matrix),其中每一行都是h3k27ac富集启动子。每个柱对应一个连续的100bp瓦,在TSS周围的2000bp区域重叠一个H3K27ac峰值。由于我们将每个启动子区域划分为21个瓦,我们得到了一个21列634行的矩阵(H3K27ac峰重叠启动子的数量)。

H3K27ac.p= countOverlaps( tiles, rep1) + countOverlaps( tiles, rep2 ) H3K27ac.p.matrix = matrix( H3K27ac.p, nrow=nrow(pos.TSS), ncol=20, byrow=TRUE )

最后,我们将结果绘制为热图,并将所有包含的启动子的每个瓦的平均值绘制为图。

颜色= colorRampPalette (c(“白”、“红”、“灰色”,“黑色”))(100)布局(垫=矩阵(c(1 2 0 3), 2, 2),宽度= c(2 2 2),高度= c(0.5, 5, 0.5, 5),真的)标准(mar = c(4 4、1.5、1)图像(seq(0,最大值(H3K27ac.p.matrix) length.out = 100), 1,矩阵(seq(0,最大值(H3K27ac.p.matrix) length.out = 100), 100年,1),坳=颜色,xlab =距离TSS, ylab = ",主要=数量的读取,yaxt = ' n ', lwd = 3,轴= TRUE)框(col =‘黑’,lwd = 2)图像(x = seq(-1000、1000、length.out = 20), y = 1: nrow (H3K27ac.p.matrix),z=t(H3K27ac.p.matrix[order(rowsum (H3K27ac.p.matrix)),]), col=colors, xlab='距离TSS (bp)', ylab='Promoters', lwd=2) box(col='black', lwd=2) abline(v=0, lwd=1, col='gray') plot(x=seq(- 1000,1000, length.out=20), y=colMeans(H3K27ac.p.matrix), ty='b', pch=19, col='red4',lwd=2, ylab='Mean tag count', xlab='距离TSS (bp)') abline(h=seq(1100,by=5), v=seq(- 1000,1000, length.out=20), lwd=0.25, col='gray') box(col='black', lwd=2)

我们观察到在TSS之后H3K27ac修饰的强烈富集,在TSS的上游区域有一个较弱的H3K27ac修饰峰。

会话信息

sessionInfo ()
## R正在开发中(不稳定)(2016-05-17 r70629) ##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 14.04.4 LTS下## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_US。utf - 8 LC_COLLATE = en_US。UTF-8 ## [5] LC_MONETARY=de_DE。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=de_DE。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=de_DE。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:##[1]网格并行stats4统计图形grDevices utils ##[8]数据集方法基础## ##其他附加包:# # # # [1] VennDiagram_1.6.17 futile.logger_1.4.1 [3] Gviz_1.16.1 chipseq_1.22.0 # # [5] ShortRead_1.31.0 GenomicAlignments_1.9.3 # # [7] SummarizedExperiment_1.3.5 Biobase_2.33.0 # # [9] Rsamtools_1.25.0 Biostrings_2.41.4 # # [11] XVector_0.13.2 BiocParallel_1.7.4 # # [13] rtracklayer_1.33.7 GenomicRanges_1.25.4 # # [15] GenomeInfoDb_1.9.1 IRanges_2.7.6 # # [17] S4Vectors_0.11.5 BiocGenerics_0.19.1 # # [19] EpigeneticsCSAMA_0.0.3 # # # #通过加载一个名称空间(而不是附加):## [1] Rcpp_0.12.5 biovizBase_1.21.0 ## [5] lattice_0.20-33 digest_0.6.9 ## [5] mime_0.4 R6_2.1.2 ## [9] RSQLite_1.0.0 evaluate_0.9 ## [13] BiocInstaller_1.23.5 httr_1.2.0 ## [15] ggplot2_2.1.0 zlibbioc_1.19.0 ## [17] genome features_1 .25.12 data.table_1.9.6 ## [19] rpart_4.1-10 Matrix_1.2-6 ## [25] rmarkdown_0.9.6 splines_3.4.0 ## [25] string_1 .0.0 foreign_0.8-66 ## [27][39] bitops_1.0-6 xtable_1.8-2 ## [41] gtable_0.2.0 DBI_0.4-1 ## [43] magrittr_1.5 formatr1.4 ## [45] scales_0.4.0 stringi_1.1.1 ## [47] hwriter_1.3.2 latticeExtra_0.6-28 ## [49] Formula_1.2-1 lambda.r_1.1.7 ## b[51] RColorBrewer_1.1-2 ensembldb_1.5.8 ## [35] nnet_7.3-12 gridExtra_2.2.1 ## [35] interactiveDisplayBase_1.11.3 hmisc_3.17 ## [37] matrixStats_0.50.2 XML_3.98-1.4 ## [39] bitops_1.0-6 xtable_0.2.0 DBI_0.4-1[57] yaml_2.1.13 AnnotationDbi_1.35.3 ## [59] colorspace_1.2-6 cluster_2.0.4 ## [61] VariantAnnotation_1.19.2 knitr_1.13

附录

从欧洲核苷酸档案获取数据

欧洲核苷酸档案(http://www.ebi.ac.uk/ena)提供多种类型的原始测序数据、序列组装信息和功能注释。我们下载了小鼠胚胎干细胞(mES细胞)中H3K27ac组蛋白修饰的ChIP-seq实验对应的数据以及该研究的输入对照样本组蛋白H3K27ac分离活性增强子和稳定增强子并预测发育状态由Creyghton

wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR066/SRR066787/SRR066787.fastq.gz。wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR066/SRR066766/SRR066766.fastq.gz。wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR066/SRR066767/SRR066767.fastq.gz。

阅读质量

读取质量是所有序列读取分析的第一步。这个包ShortRead提供了一个函数,将从ENA数据库下载的.fastq文件作为输入。我们首先用fastq文件名生成一个向量。

FLS =列表。文件(dataDirectory,”。fastq$", full=TRUE) names(fls) = sub("。Fastq ", "", basename(fls))

我们读取这些文件并应用qas函数评估每个文件中的读取质量。最后,我们生成一个超文本标记语言质量报告。

library(ShortRead) qas = lapply(seq_along(fls), function(i, fls) qa(readFastq(fls[i]), names(fls)[i]), fls) qa = do。call(rbind, qas) rpt = report(qa,dest = 'QA_report.html')

外部文件准备

下一步是将reads与mm9小鼠基因组组装对齐。这是用Bowtie2工具。生成的.sam文件接下来转换为.bam文件,并使用samtools.去除PCR重复序列。BAM文件接下来转换为床文件。为了与其他工具保持一致,在数据预处理的最后一步中,我们在使用的染色体名称前添加了一个' chr '前缀awk

gunzip SRR066767.fastq.gz gunzip SRR066767.fastq.gz

对齐

bowtie2 -p 8 -q NCBIM37.67 SRR066787。fastq -S ES_input。sam bowtie2 -p 8 -q NCBIM37.67 SRR066766。fastq -S H3K27ac_rep1。sam bowtie2 -p 8 -q NCBIM37.67 SRR066767。fastq -S H3K27ac_rep2.sam

只保留最佳对齐

samtools view -bS -q 40 ES_input. xmlsam > ES_input_bestAlignment。bam samtools view -bS -q 40 H3K27ac_rep1。sam > H3K27ac_rep1_bestAlignment。bam samtools view -bS -q 40 H3K27ac_rep2。sam > h3k27ac_rep2_bestalignments .bam

PCR重复去除

samtools rmdup -s ES_input_bestAlignment。bam ES_input_filtered。bam samtools rmdup -s H3K27ac_rep1_bestAlignment。bam H3K27ac_rep1_filtered。bam samtools rmdup -s H3K27ac_rep2_bestAlignment。bam H3K27ac_rep2_filtered.bam

将读取转换为.bed格式

bedtools bamtobed -i ES_input_filteredbam > ES_input_filtered. .bed bedtools bamtobed -i H3K27ac_rep1_filtered。bam > H3K27ac_rep1_filtered。bed bedtools bamtobed -i H3K27ac_rep2_filtered。bam > H3K27ac_rep2_filtered.bed

额外的准备工作

awk '$0="chr"$0' ES_input_filtered. .bed > ES_input_filtered_ucsc. bedbed awk '$0="chr"$0' H3K27ac_rep1_filtered。bed > H3K27ac_rep1_filtered_ucsc。bed awk '$0="chr"$0' H3K27ac_rep2_filtered。床> H3K27ac_rep2_filtered_ucsc.bed

最后,为了本实验室的目的,我们仅分离了一条染色体(chr6)的数据。

awk '{if($1=="chr6") print $0}' ES_input_filtered_ucsc. awk '{if($1=="chr6") print $0}'bed > ES_input_filtered_ucsc_chr6。' H3K27ac_rep1_filtered_ucsc '{if($1=="chr6") print $0}'bed > H3K27ac_rep1_filtered_ucsc_chr6。bed awk '{if($1=="chr6") print $0}' H3K27ac_rep2_filtered_ucsc。床> H3K27ac_rep2_filtered_ucsc_chr6.bed

获取对象如果mm9

我们从染色体中获得染色体长度BSgenome.Mmusculus.UCSC.mm9包中。的染色体名称如果文件在运用格式,我们在染色体名称前加上前缀“chr”。

library(BSgenome.Mmusculus.UCSC.mm9) genome = BSgenome.Mmusculus.UCSC. BSgenome.Mmusculus.UCSC.mm9)mm9 si = seqinfo(基因组)si = si[paste0('chr', c(1:19, 'X', 'Y'))]

获取对象bmmm9

library(biomaRt) mart = useMart(biomaRt =" ENSEMBL_MART_ENSEMBL", dataset =" mmusculus_gene_ensembl", host="may2012.archive.ensembl.org") fm = Gviz:::.getBMFeatureMap() fm["symbol"] =" external_gene_id"

接下来,我们得到6号染色体从122530000位置开始到122900000位置结束的结果快照。在其他区域中,这个区域编码高度ES细胞特异性Nanog基因。我们首先分离出这个区间的基因模型。结果bm保存在data目录下。

bm = BiomartGeneRegionTrack(染色体='chr6',基因组="mm9", start=122530000, end = 122900000, biomart=mart,filter=list("with_ox_refseq_mrna"=TRUE), size=4, name="RefSeq", utr5="red3", utr3="red3", protein_coding="black", col.line=NULL, cex=7, collapseTranscripts="longest", featureMap=fm)

苹果电脑

macs14 -t H3K27ac_rep1_filtered。-c ES_input_filtered_ucsc.使用实例bed -f bed -g mm——nommodel -n Rep1 macs14 -t H3K27ac_rep2_filtered。-c ES_input_filtered_ucsc.使用实例bed -f bed -g mm——nommodel -n Rep2 awk '$0="chr"$0' Rep1_peaks。bed > Rep1_peaks_ucsc。bed awk '$0="chr"$0' Rep2_peaks。bed > Rep2_peaks_ucsc。{if($1=="chr6") print $0}' Rep1_peaks_ucsc. bed awk '{if($1=="chr6")bed > Rep1_peaks_ucsc_chr6。* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。Rep2_peaks_ucsc_chr6.bed >

启动子分离

在这里,我们提供了必要的代码,以隔离基因模型从biomart数据基础。的对象egs包含每个基因模型的最外部5和3 ' utr的注释。

listAttributes(mart)[1:3,] ds = useDataset('mmusculus_gene_ensembl', mart=mart) chroms = 6 egs = getBM(attributes =c ('ensembl_gene_id','external_gene_id', 'chromosome_name','start_position', 'end_position','strand'), filters='chromosome_name', values=chroms, mart=ds)