ATACseq 分析流程

ATACseq 基本原理如下图所示。真核生物 DNA 与核小体结合形成染色质,结合的紧密程度是动态变化的。当 DNA 需要复制或转录时,结合变得松散让 DNA 暴露。暴露的 DNA 能被 Tn5 转座酶切割,与核小体紧密结合的 DNA 无法被切割。Tn5 转座酶切割 DNA 时插入测序接头,经过 PCR 扩增等步骤就完成了测序建库。


ATACseq 建库

如下图所示,因为间隔的核小体数目不同,ATACseq 测序插入片段(fragments)分布会呈现多个峰的分布。在约 <100,200,400,600bp 处有峰,分别对应着 NER (nucleosome-free regions) 和 单、双、三核小体区域的 reads. 因此我认为常用的 2*150 的双端测序不适合 ATACseq. 因为最需要的 NER 区域 reads 是很短的,用 2*150 等于浪费许多的测序通量。


核小体数目不同产生片段长度不同

ATACseq 一般人种要求 50M 以上比对的 fragments (reads), 因为线粒体 DNA 没有核小体结合,测序出现大量线粒体数据是正常的,线粒体数据占比在 20-80% 都有可能。

ATACseq 分析流程如下图所示。质控、比对、peak calling 是必须的上游分析,Motif 等下游分析是个性化的。


流程示意图

准备工作

下载参考基因组、建立索引、移除不需要区域等。参考基因组在 GENCODE 下载。
一般用 bowtie2 比对,建立 bowtie2 索引。

bowtie2-build -f GRCh38.primary_assembly.genome.fa GRCh38

一般只分析常染色体,并移除 Blacklist 和线粒体。因此将基因组区域分为两个 bed 文件,一个是需要的区域一个是移除的区域。

# include bed
samtools faidx GRCh38.primary_assembly.genome.fa
awk -v FS="\t" -v OFS="\t" '{print $1 FS "0" FS ($2-1)}' GRCh38.primary_assembly.genome.fa.fai | \
grep -e "^chr[0-9]" > GRCh38.primary_assembly.genome.bed.temp
bedtools subtract -a GRCh38.primary_assembly.genome.bed.temp -b ${Blacklist} > GRCh38.primary_assembly.atac_included.bed
rm GRCh38.primary_assembly.genome.bed.temp

# exclude bed
# grep -v
awk -v FS="\t" -v OFS="\t" '{print $1 FS "0" FS ($2-1)}' GRCh38.primary_assembly.genome.fa.fai | \
grep -v -e "^chr[0-9]" > GRCh38.primary_assembly.genome.bed.temp
cat GRCh38.primary_assembly.genome.bed.temp ${Blacklist} | bedtools sort -i - | \
bedtools merge -i - > GRCh38.primary_assembly.atac_excluded.bed
rm GRCh38.primary_assembly.genome.bed.temp

fastq 质控

缠绕核小体 DNA 约 147bp 与相邻核小体连接的 DNA 约 20-90bp. 加上测序接头等约 135bp 长度会达到 200bp 左右,因此最后文库片段长度可能是 200-1000bp 左右,并且主要的部分在 600bp 一下,但 ATACseq 建库片段分布可能因为样本类型、细胞数量、处理过程等有关,也许文库片段分布有所差异。


文库质控

原始 fastq 用 fastqc 生成质控报告,然后用 fastp 进行过滤。

fastqc -t 4 *fq.gz

fastp -i ${raw_dir}/${sample}_1.fq.gz -o ${clean_dir}/${sample}_R1.fq.gz \
-I ${raw_dir}/${sample}_2.fq.gz -O ${clean_dir}/${sample}_R2.fq.gz \
--compression 6 --json ${clean_dir}/${sample}_fastp.json --report_title ${sample}

用 multiqc 将质控报告汇总。

multiqc -o fastqc_report *fastqc.zip
multiqc -o fastp_report *fastp.json

bowtie2 比对

因为下一步 peak calling 用 genrich 支持多比对 reads 分析,所以 bowtie2 比对设置 -k 10 参数,-X 2000 允许插入片段最大 2000bp, 默认值 500. 注意 genrich 要求 -n 排序。

# bed 文件是移除了 blacklist 和线粒体的常染色体区域
bowtie2 --very-sensitive -k 10 -X 2000 --threads 6 -x ${GRCh38} \
-1 ${clean_dir}/${sample}_R1.fq.gz -2 ${clean_dir}/${sample}_R2.fq.gz \
-S ${bam_dir}/${sample}.sam

# -n
samtools view --threads 4 -F 524 -L ${atac_included.bed} -b ${bam_dir}/${sample}.sam \
| samtools sort -n --threads 4 -O BAM -o ${bam_dir}/${sample}_nSorted.bam

# -p
samtools sort --threads 4 -O BAM ${bam_dir}/${sample}_pSorted.bam ${bam_dir}/${sample}_nSorted.bam
gatk --java-options "-Xmx64G -Xms8G" MarkDuplicates --INPUT ${bam_dir}/${sample}_pSorted.bam \
--OUTPUT ${bam_dir}/${sample}_MD.bam --METRICS_FILE  ${bam_dir}/${sample}_MD.txt
samtools index ${bam_dir}/${sample}_MD.bam

同时考虑有一些下游分析不适合用 -k 10 的比对,同步做一个没有 -k 参数设置的比对,并按照 -p 排序。

bowtie2 --very-sensitive -X 2000 --threads 6 -x ${GRCh38} \
-1 ${clean_dir}/${sample}_R1.fq.gz -2 ${clean_dir}/${sample}_R2.fq.gz \
-S ${bam_dir}/${sample}.nk.sam

samtools view --threads 4 -F 524 -q 30 -L ${atac_included.bed} -b ${bam_dir}/${sample}.nk.sam \
| samtools sort --threads 4 -O BAM -o ${bam_dir}/${sample}_Sorted.nk.bam

gatk --java-options "-Xmx64G -Xms8G" MarkDuplicates --INPUT ${bam_dir}/${sample}_Sorted.nk.bam \
--OUTPUT ${bam_dir}/${sample}_MD.nk.bam --METRICS_FILE ${bam_dir}/${sample}_md.metrics
samtools index ${bam_dir}/${sample}_MD.nk.bam

samtools view --threads 4 -F 1024 -b -o ${bam_dir}/${sample}_RD.nk.bam ${bam_dir}/${sample}_MD.nk.bam 
samtools index ${bam_dir}/${sample}_RD.nk.bam

# 为了计算线粒体 Reads 占比,将原始 sam 进行排序和建立索引
samtools view --threads 4 -b ${bam_dir}/${sample}.nk.sam | samtools sort \
--threads 4 -O BAM -o ${bam_dir}/${sample}_Raw_Sorted.nk.bam
samtools index ${bam_dir}/${sample}_Raw_Sorted.nk.bam

samtools view 命令 -F 524 -q 30 移除不合格的比对。

$ samtools flags 524
0x20c   524     UNMAP,MUNMAP,QCFAIL

$ samtools flags 1024
0x400   1024    DUP

检查比对报告,可能 "aligned concordantly >1 times" 比例会比较高,原因一是 --very-sensitive 参数,让比对质量稍低于最佳比对的仍保留,第二是 ATACseq 数据线粒体含量高,线粒体有许多区域序列类似。

前面说了 ATACseq 插入片段应该在约 <100,200,400,600bp 大小有峰,用 gatk CollectInsertSizeMetrics 命令分析比对后插入片段分布。

 gatk CollectInsertSizeMetrics -H ${bam_dir}/${sample}_InsertSize.pdf \
 -I ${bam_dir}/${sample}_MD.bam -O ${bam_dir}/${sample}_InsertSize.txt
检查片段分布

(可选步骤)移动 Reads

如下面示意图所示,Tn5 建库时会插入 9bp 的序列,所以比对到正链(+)的 reads 移动 +4 bp, 比对负链(-)的 reads 移动 -5 bp.


Tn5 9bp

这个移动可以用 deeptools 的 alignmentSieve 命令完成。

alignmentSieve --numberOfProcessors 8 --ATACshift -b \
${bam_dir}/${sample}_nSorted.bam -o ${bam_dir}/${sample}_Shift.bam

一般的分析这点 reads 位移没影响,不需要进行这个步骤。

Genrich peak calling

Genrich peak calling 过程:

  • 从比对结果计算实验样本和对照样本的每个位置覆盖度,并计算每一组 pileup 结果。
  • 计算信号背景水平,如果有对照从对照样本计算,如果没有从实验样本计算。背景计算是总的 read/fragment/interval 长度除以基因组长度(从 SAM/BAM 表头计算),如果有 -e-E 等参数,会扣除相应长度。
  • 每个位置计算 p 值和 q 值。
  • 计算 p 值和 q 值显著的区域的 AUC.
  • 合并相邻近区域并计算总 AUC 是否超过设置的阈值进行 call peak.
genrich

Genrich 的 -j 参数表示 ATAC 模式,默认调整 reads/fragments 5bp 位置。ATACseq 跟 ChIP-Seq 不同,一般没有 control input. 所以实验组和对照组分开用 Genrich 进行分析,得到各自的 peak 继续下游分析。

Genrich -t ${bam_dir}/${sample1}_nSorted.bam,${bam_dir}/${sample2}_nSorted.bam,${bam_dir}/${sample3}_nSorted.bam \
-o ${genrich_dir}/${group}.narrowPeak -f ${genrich_dir}/${group}_pq.bed \
-k ${genrich_dir}/${group}_pileup_p.bed -b ${genrich_dir}/${group}_reads.bed \
-E ${rm_bed} -m 30 -q 0.05 -a 500 -r -j

同一组的重复样品 -t 参数输入并且逗号分隔;-r 移除 PCR 重复;-m 过滤比对 MAPQ 值,Bowtie2 比对一般取 30 阈值;-b 将 reads/fragments 输出到 bed 文件;-f 输出每个区间每个样本及合并后的 p 值和显著性;-k 输出每个样本 pileups 和 p 值。

因为 -a 参数不好确定,可以先设置 -X 参数让 genrich 输出分析日志文件,但不进行 peak calling, 然后用不同的 -a 参数用 -P 参数模式进行 peak calling.

Genrich -t ${bam_dir}/${group}_1_nSorted.bam,${bam_dir}/${group}_2_nSorted.bam,${bam_dir}/${group}_3_nSorted.bam \
-f ${genrich_dir}/${group}_pq.bed -k ${genrich_dir}/${group}_pileup.bed \
-b ${genrich_dir}/${group}_reads.bed -E ${ex_bed} -m 30 -q 0.05 -r -j -X

# 用不同 -a 参数进行 peak calling
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a300.narrowPeak -a 300 -l 40 -q 0.05 -P
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a400.narrowPeak -a 400 -l 40 -q 0.05 -P
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a500.narrowPeak -a 500 -l 40 -q 0.05 -P
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a600.narrowPeak -a 600 -l 40 -q 0.05 -P
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a700.narrowPeak -a 700 -l 40 -q 0.05 -P
Genrich -f ${genrich_dir}/${group}_pq.bed -o ${genrich_dir}/${group}_a800.narrowPeak -a 800 -l 40 -q 0.05 -P

默认结果输出为 narrowPeak 格式。第五列 score 是平均 AUC (total AUC / bp) * 1000, 最大值 1000. 最后一列是 peak 信号最显著位置与 peak 起始距离,可视为 summit 位置。

chr1    9963    10500   peak_0  1000    .       2459.160400     11.532567       8.601989        93
chr1    11141   11518   peak_1  1000    .       1298.728394     10.535641       7.766460        207
chr1    13230   13959   peak_2  1000    .       1910.681885     10.124692       7.418398        290

FRiP 计算

Fraction of reads in peaks (FRiP) 指落入峰区域的 reads 占比,应该要高于 0.3 较好。这个指标非强制性,不同数据表现并不相同,计算也不用追求精确。

分别计算 BAM 文件总 fragments 数和处于 peak 区域的 fragments 数,再相除。

samtools view -c ${bam_dir}/${sample}_MD.nk.bam
samtools view -c -L ${genrich_dir}/${group}.narrowPeak ${bam_dir}/${sample}_MD.nk.bam

两命令得到的 fragments 数目相除便是 FRiP.
或者将峰文件转换为 SAF 文件,然后用 featureCounts 计算 counts/fragments. 其报告的 assigned reads 比例可视为 FRIP.
或者 DiffBind 分析时得到。

ChIPseeker 注释

ChIPseeker 对 peaks 进行基因组注释,这个注释是按照 peak 与基因位置关系给的,所以如果位置重合了,默认按照以下优先度分配:Promoter > 5UTR > 3UTR > Exon > Intron > Downstream > Intergenic.


基因注释

ChIPseeker 读取数据后 annotatePeak 函数进行注释,注释结果用 as.data.frame 转换为数据框再保存到文件。参数 addFlankGeneInfoflankDistance 报告所有在 peak 一定范围内的的基因。

library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(org.Hs.eg.db)
library(ChIPseeker)

txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene
peaks <- readPeakFile(peak_path)
peak_anno <- annotatePeak(peaks, tssRegion = c(-3000, 3000), TxDb = txdb, 
                        annoDb = "org.Hs.eg.db", level = "gene", 
                        addFlankGeneInfo = TRUE, flankDistance = 1000)

DiffBind 差异分析

ATACseq 差异分析是比较困难的步骤,DiffBind 用得比较多,但它的结果也不一定那么可靠。DiffBind 原理是把数据当作 RNAseq 差异表达分析,只是把 RNAseq 分析的基因修改为 peak. 每一个 consensus peak 等于一个基因。明白了这个原理甚至可以自己手动去做,先从所有样本 peakset 取得 consensus peakset. 然后 featureCount 计算每个 peak reads 数,最后输入 DESeq2 进行差异分析。

DiffBind 输入是 csv 或 excel 格式的信息表,表里包含了分析的样品、数据路径、分组等等。
以下是表里可接受的列,只填自己需要填的列,缺少的列 DiffBind 会填充 NA.

  • SampleID
  • Tissue
  • Factor
  • Condition
  • Treatment
  • Replicate | Replicate number of sample
  • bamReads | file path for bam file containing aligned reads for ChIP sample
  • bamControl | ile path for bam file containing aligned reads for control sample
  • Spikein
  • ControlID
  • Peaks | path for file containing peaks for sample
  • PeakCaller
    • raw | text file file; peak score is in fourth column
    • bed
    • narrow | default peak.format: narrowPeaks file
    • macs | MACS .xls file
    • swembl | SWEMBL .peaks file
    • bayes | bayesPeak file
    • peakset | peakset written out using pv.writepeakset
    • fp4 | FindPeaks v4
  • PeakFormat
  • ScoreCol | column in peak files that contains peak scores
  • LowerBetter | logical indicating that lower scores signify better peaks
  • counts | file path for externally computed read counts

准备好信息表后 dba 函数读取信息创建 "dba" 对象。

library(DiffBind)
library(tidyverse)

info_path <- file.path(diffbind_dir, "kLEC.csv")
dba1 <- dba(sampleSheet = info_path)

第二步计算 counts 矩阵。DiffBind 首先从输入的 peaks 分析出 consensus peakset. 也可以自己通过 peaks 参数提供自己计算的 consensus peakset. 然后计算每个 peak 的 summit 位置,从 summit 向上下游延申相同长度(由 summits 参数决定)得到相同 peak 长度的 peakset 计算 counts 矩阵并下游分析。
默认 summits 是 200 最后每个 peak 长度是 401. ATAC-Seq peak 较小应设为 100 或更小。参数 bRemoveDuplicates 移除重复 reads. 但一些情况下软件计算的重复并不准确,比如双端测序,为了准确计算需要设置 bUseSummarizeOverlaps 参数为 TRUE.

dba2 <- dba.count(DBA = dba1, bRemoveDuplicates = TRUE, bUseSummarizeOverlaps = TRUE, 
                  bParallel = TRUE, peaks = merged_peaks, summits = 100, filter = 1)

因为会进行过滤移除一些 peaks (如 counts 太少),用 dba.peakset 函数获取最终 consensus peakset 和 binding affinity matrix. 后者由 dba.countscore 参数设定。这个函数也用于修改 DBA 的 peakset.

cons_peaks <- dba.peakset(DBA = dba2, bRetrieve = TRUE)

# 查看
> cons_peaks[1:2]
GRanges object with 2 ranges and 6 metadata columns:
    seqnames      ranges strand |     CTR_1     CTR_2     CTR_3    TM_1    TM_2    TM_3
       <Rle>   <IRanges>  <Rle> | <numeric> <numeric> <numeric> <numeric> <numeric> <numeric>
  1     chr1 10019-10219      * |   305.641   320.698   261.559   692.019   855.200   699.159
  2     chr1 11240-11440      * |   197.586   304.026   375.066   125.906   169.172   165.673
  -------
  seqinfo: 22 sequences from an unspecified genome; no seqlengths

DiffBind 有多种均一化方法,建议先查看帮助文档选择合适自己数据的方法。
均一化重要的一步是计算文库大小,DiffBind 支持用 full, RiP, background. full 指用完整文库大小,从 BAM 文件计算;RiP 指仅计算落入 consensus peaksets 的 reads; backgroud 指根据背景信号进行均一化,原理是 ATAC-Seq 得到的 peak 区域是比较小的,大约在 100-600bp. 如果将基因组分成大的 bin 比如 15000bp 大小,理论上这种大小 bin 的信号差异应该是技术误差而不是生物学差异。设置 background 参数后包含 consensus peakset 的染色体将被分 bin 计算背景信号差异。

dba3 <- dba.normalize(DBA = dba2, method = "DESeq2", library = "full")

根据实验设计的分组,分析差异的 peak.

dba_contrast <- dba.contrast(dba3, design = ~ Treatment, 
                             contrast = c("Treatment", "CTR", "TM"))
dba_diff <- dba.analyze(dba_contrast, method = "DESeq2", bBlacklist = FALSE, 
                        bGreylist = FALSE)

查看 contrast 信息和样品相关系数。

> dba.show(dba_diff, bContrasts = TRUE)
     Factor Group Samples Group2 Samples2 DB.DESeq2
1 Treatment  TM       3    CTR        3     34640

提取差异数据结果。从 dba.show 函数结果知道需要的 contrast 编号是 1.

diff_peaks1 <- dba.report(dba_diff, contrast = 1)

默认返回 Granges 结构数据,Conc 是所有样本平均 log reads 数,Fold 是 log2 差异倍数。
保存结果到 BED 和 CSV 格式。

# 转换到 tibble 包含了 P 值等全部信息
diff_peaks2 <- bind_cols(as_tibble(granges(diff_peaks1)), as_tibble(mcols(diff_peaks1)))

# 保存到文件
rtracklayer::export(diff_peaks1, con = diff_bed, format = "BED")
write_csv(diff_peaks2, diff_csv)

MEME-ChIP motif 分析

转录因子结合到开放的染色质区域调控基因表达,转录因子结合需要识别出特定的序列,这个特定序列称之为 motif, 结合的位点称为 TFBS (TF binding sites)。转录因子可以允许 TFBS 有一定的可塑性 (variations/flexible),所以 motif 序列不完全是固定死的。Motif 大部分不长,6-12 bp 左右。人类大约有 1600 个转录因子,其中超过 2/3 已鉴定了 motif.


TFs

motif 序列一般有两种模式,一是回文序列,比如 CACGTG 其反向互补序列也是 CACGTG. 二是两段保守序列被一段非保守序列分隔,这往往是因为结合的转录因子是二聚体,分别识别两段保守序列。

motif 的分析往往受假阳性困扰,这称为无效定理(Futility Theorem)。比如说往往在基因组序列中观察到大量的潜在转录因子结合位点,其中很少是真正起作用的,大部分预测的转录因子结合位点是无效的。所以 motif 分析后,要想办法进行人工筛选。

MEME-ChIP 主要执行以下步骤:

  1. 在输入序列的中间区域(默认 100bp)进行 motif 发现(MEME, STREME)
  2. CentriMo 分析哪些 motif 是富集在区域中心的
  3. Tomtom 分析他们与已知 motif 相似性
  4. 根据 motif 相似性对显著结果归类
  5. motif spacing analysis (SpaMo) (分析 motif 与结合在相邻位置 motif 的物理作用) (-spamo-skip 参数跳过这步分析)
  6. 分析 motif 结合位置(FIMO),默认选取每一类别最显著的 motif 进行分析

MEME-ChIP 默认输入序列是约 500bp 长且中间 100bp 是 motif 区域。
ATAC-Seq 分析得到 peak 是长度不一的,因此取 summit 向两边各延申 250bp 得到 500bp 序列。

awk -v FS="\t" -v OFS="\t" '{midpos=$2+$10;print $1,midpos-250,midpos+250;}' \
${genrich_dir}/${group}.narrowPeak > ${meme_dir}/${group}.bed

bedtools getfasta -fo ${meme_dir}/${group}.fa -fi ${GRCh38} \
-bed ${meme_dir}/${group}.bed

考虑 motif 分析假阳性问题和转录因子一般结合到启动子区,只取注释到启动子区的 peaks 进行 motif 分析,是值得尝试的。上面命令取所有 peaks.

MEME-ChIP 将各步骤封装了,因此运行命令很简单:

meme-chip -meme-maxw 30 -meme-p 6 -oc ${meme_dir}/${group} \
-db ${meme_db} ${meme_dir}/${group}.fa

motif 数据库在 https://meme-suite.org/meme/db/motifs 下载。
MEME-ChIP 输出结果在 meme.html 查看;结果的汇总在 summary.tsv 文件;combined.meme 文件包含所有被鉴定出的 Motif.
motif E value 表示该 motif 多大概率是统计错误出现,而不是真的 motif. E 值越小说明发现的 motif 越大概率为真。

MEME-ChIP 的结果如果发现不方便批量提取结果,也可以自己单独运行它的子分析。比方说它 FIMO 只分析了部分 motif 而你需要分析全部的,那么可以单独进行 FIMO 分析。

fimo --parse-genomic-coord -oc ${fimo_dir} --bgfile ${meme_dir}/background --motif SP1_HUMAN.H11MO.1.A ${meme_db} ${meme_dir}/${group}.fa

可视化

可视化是个非常宽泛的概念,同时许多工具会自带一些可视化方法,这里介绍 deptools 和 EnrichedHeatmap 生成信号热图。

deeptools
deeptools 提供了 bam, bigwig 处理、QC、画图等许多工具。本教程介绍 plotHeatmap 画 ATACseq 信号热图。

第一步 bamCoverage 命令将 Bam 文件转换成 bigwig 文件。

bamCoverage --numberOfProcessors 8 --effectiveGenomeSize 2747877777 --normalizeUsing RPGC \
--outFileFormat bigwig -b ${bam_dir}/${sample}_MD.bam -o ${bw_dir}/${sample}.bw

参数 --effectiveGenomeSize 的设置值在 Effective Genome Size — deepTools 3.4.3 documentation 查看。

RPGC 计算方法:
number\ of\ reads\ per\ bin/scaling\ factor\ for\ 1X\ average\ coverage

Scale factor 计算方法:
(total number of mapped reads * fragment length) / effective genome size

第二步 computeMatrix 命令生成画图矩阵。但是先用 R 语言提取包含 peak 的启动子区域。注意输出的 BED 要包含 strand 列,computeMatrix 命令会正确处理 strand 信息。

library(rtracklayer)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)

txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene

promoter <- promoters(genes(txdb), upstream = 3000, downstream = 3000)
peak <- import(peak_path, format = "narrowPeak")
overlap_index <- findOverlaps(promoter, peak)
keep_promoter <- unique(promoter[queryHits(overlap_index)])
export.bed(keep_promoter, bed_path)

从 bigwig 文件生成用于热图的矩阵,多个 bigwig 文件用空格分隔。

computeMatrix scale-regions --regionsFileName ${bw_dir}/${group}_promoter.bed --regionBodyLength 6000 \
--outFileName ${bw_dir}/${group}_matrix.gz --binSize 60 --numberOfProcessors 4 \
--scoreFileName ${bw_dir}/${group}_1.bw ${bw_dir}/${group}_2.bw ${bw_dir}/${group}_3.bw

最后 plotHeatmap 命令画图。

plotHeatmap --matrixFile ${bw_dir}/${group}_matrix.gz --outFileName ${bw_dir}/${group}_heatmap.pdf \
--zMin 0 --zMax 8 --xAxisLabel Promoter --startLabel 3Kb --endLabel 3Kb
plotHeatmap

EnrichedHeatmap
EnrichedHeatmap 基于 ComplexHeatmap 的信号富集热图 R 包。其原理是将 peakset 信号转换为矩阵并热图可视化。

library(rtracklayer)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(ChIPseeker)
library(EnrichedHeatmap)
library(circlize)

取得基因组启动子区域,注意用 genes(txdb) 而不是 txdb 限制为基因的启动子,否则条目将非常多。

txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene
promoter <- promoters(genes(txdb), upstream = 3000, downstream = 3000)
> promoter[1:3]
GRanges object with 3 ranges and 1 metadata column:
      seqnames            ranges strand |     gene_id
         <Rle>         <IRanges>  <Rle> | <character>
    1    chr19 58359752-58365751      - |           1
   10     chr8 18388282-18394281      + |          10
  100    chr20 44649234-44655233      - |         100
  -------
  seqinfo: 595 sequences (1 circular) from hg38 genome

用 ChIPseeker 包的 readPeakFile 函数读取 narrowPeak 文件。或者如果是 rtracklayer 包的 import 函数,它支持读取更多的格式,比如 bigwig,bed 等。

peak <- readPeakFile(peakPath)

将启动子区 peakset 数据转换为画图矩阵。注意将没信号的启动子区数据移除。

mat <- normalizeToMatrix(peak, promoter, extend = 0, value_column = "V5", k = 100, mean_mode = "w0")
# 移除没信号启动子区
mat <- mat[rowSums(mat) > 0,]

读取后 narrowPeak 数据 "V5" 列为峰信号强度值,所以 value_column 参数设置 "V5".
参数 k 决定 bins/windows 数目(矩阵的列数)。参数 mean_mode 决定计算平均信号强度方法,可选以下方法:

Following illustrates different settings for mean_mode (note there is one signal region overlapping with other signals):

      40      50     20     values in signal regions
    ++++++   +++    +++++   signal regions
           30               values in signal region
         ++++++             signal region
      =================     a window (17bp), there are 4bp not overlapping to any signal regions.
        4  6  3      3      overlap

    absolute: (40 + 30 + 50 + 20)/4
    weighted: (40*4 + 30*6 + 50*3 + 20*3)/(4 + 6 + 3 + 3)
    w0:       (40*4 + 30*6 + 50*3 + 20*3)/(4 + 6 + 3 + 3 + 4)
    coverage: (40*4 + 30*6 + 50*3 + 20*3)/17 

最后 EnrichedHeatmap 函数画图。

hm_color <- colorRamp2(breaks = c(0, 1000), colors = c("#fff5f0", "#cb1c1d"))
top_anno <- HeatmapAnnotation(enriched = anno_enriched(gp=gpar(col="black", lwd = 1.2)))
enrich_hm <- EnrichedHeatmap(mat = mat, col = hm_color, axis_name = c(-3000, 3000), 
                               top_annotation = top_anno, show_heatmap_legend = FALSE, use_raster = FALSE)
EnrichHeatmapExample

参考资料

ATAC-Seq data analysis
ATAC-seq Guidelines - Harvard FAS Informatics
ATAC-seq 150bp reads
ChIP-seq Peak Annotation and Functional Analysis | Introduction to ChIP-Seq using high-performance computing
Library QC for ATAC-Seq and CUT&Tag AKA “Does My Library Look Okay?”
Make Enriched Heatmaps
Using EnrichedHeatmap for visualization of NGS experiments
An Introduction to the GenomicRanges Package
MEME-ChIP - MEME Suite
Ma, Wenxiu, William S. Noble, and Timothy L. Bailey. "Motif-based analysis of large nucleotide data sets using MEME-ChIP." Nature protocols 9.6 (2014): 1428-1450.
Yan, Feng, et al. "From reads to insight: a hitchhiker’s guide to ATAC-seq data analysis." Genome biology 21.1 (2020): 22.
Brouilette, Scott, et al. "A simple and novel method for RNA‐seq library preparation of single cell cDNA analysis by hyperactive Tn5 transposase." Developmental Dynamics 241.10 (2012): 1584-1590.
Gontarz, Paul, et al. "Comparison of differential accessibility analysis strategies for ATAC-seq data." Scientific reports 10.1 (2020): 1-13.
Yin, Senlin, et al. "Transcriptomic and open chromatin atlas of high-resolution anatomical regions in the rhesus macaque brain." Nature communications 11.1 (2020): 1-13.
Buenrostro, Jason D., et al. "ATAC‐seq: a method for assaying chromatin accessibility genome‐wide." Current protocols in molecular biology 109.1 (2015): 21-29.
Yan, Feng, et al. "From reads to insight: a hitchhiker’s guide to ATAC-seq data analysis." Genome biology 21.1 (2020): 22.
Buenrostro, Jason D., et al. "Transposition of native chromatin for multimodal regulatory analysis and personal epigenomics." Nature methods 10.12 (2013): 1213.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容