写在前面的话: 参考使用的文件资料是由哈佛陈生物信息学核心 (HBC) 教学团队成员开发的。另外也看了多个公众号文章和书籍。 Website: https://hbctraining.github.io/Intro-to-ChIPseq/ Github: https://github.com/hbctraining/Intro-to-ChIPseq
接上游分析结果,这次我们继续探索下游流程。
上游分析:https://mp.weixin.qq.com/s/0KOk_ij29xrqdQzNaeVVvA
$ tree
.
|-- Nanog-rep1-macs2.log
|-- Nanog-rep1_model.r
|-- Nanog-rep1_peaks.narrowPeak
|-- Nanog-rep1_peaks.xls
|-- Nanog-rep1_summits.bed
|-- Nanog-rep2-macs2.log
|-- Nanog-rep2_model.r
|-- Nanog-rep2_peaks.narrowPeak
|-- Nanog-rep2_peaks.xls
|-- Nanog-rep2_summits.bed
|-- Pou5f1-rep1-macs2.log
|-- Pou5f1-rep1_model.r
|-- Pou5f1-rep1_peaks.narrowPeak
|-- Pou5f1-rep1_peaks.xls
|-- Pou5f1-rep1_summits.bed
|-- Pou5f1-rep2-macs2.log
|-- Pou5f1-rep2_model.r
|-- Pou5f1-rep2_peaks.narrowPeak
|-- Pou5f1-rep2_peaks.xls
`-- Pou5f1-rep2_summits.bed
上游分析呢,我们共得到了四组文件,Nanog-rep1, Nanog-rep2, Pou5f1-rep1, Pou5f1-rep2,每组数据又有五个不同类型的文件。
-macs2.log: 日志文件_peaks.narrowPeak:BED6+4 格式文件,包含峰值位置以及峰值峰值、pvalue 和 qvalue_peaks.xls:包含有关峰值信息的表格文件。其他信息包括堆积和折叠富集_summits.bed:每个峰的峰顶位置。要找到结合位点的基序,建议使用此文件_model.R:一个 R 脚本,你可以使用它根据数据和互相关图生成有关模型的 PDF 图像新的开始,先创建目录结构,将需要的数据和未来归档的数据放在该放的位置一定是一个好习惯。这一步在Rstudio中完成,Rstudio中如何创建文件和移动文件就不多说了,网上说的很详细了,这里直接展示成品号,哈哈哈哈。
.
|-- chipseq.Rproj
|-- data
| |-- bams
| `-- peakcalls
|-- figures
|-- meta
`-- results
创建完目录就是将上游分析结果移动过来了,另外我们还需要对我们的样本根据需求编写一个meatdata文件,原始信息链接在这里:https://raw.githubusercontent.com/hbctraining/Intro-to-ChIPseq/master/samplesheet_chr12.csv 我们下载过来就ok。防止链接失效就也直接粘贴过来吧。请严格按照这个格式创建信息!
SampleID,Factor,Replicate,bamReads,ControlID,bamControl,Peaks,PeakCaller,Tissue,Condition
Nanog.Rep1,Nanog,1,data/bams/H1hesc_Nanog_Rep1_aln.bam,Nanog-Input1,data/bams/H1hesc_Input_Rep1_aln.bam,data/peakcalls/Nanog-rep1_peaks.narrowPeak,narrow,NA,NA
Nanog.Rep2,Nanog,2,data/bams/H1hesc_Nanog_Rep2_aln.bam,Nanog-Input2,data/bams/H1hesc_Input_Rep2_aln.bam,data/peakcalls/Nanog-rep2_peaks.narrowPeak,narrow,NA,NA
Pou5f1.Rep1,Pou5f1,1,data/bams/H1hesc_Pou5f1_Rep1_aln.bam,Pou5f1-Input1,data/bams/H1hesc_Input_Rep1_aln.bam,data/peakcalls/Pou5f1-rep1_peaks.narrowPeak,narrow,NA,NA
Pou5f1.Rep2,Pou5f1,2,data/bams/H1hesc_Pou5f1_Rep2_aln.bam,Pou5f1-Input2,data/bams/H1hesc_Input_Rep2_aln.bam,data/peakcalls/Pou5f1-rep2_peaks.narrowPeak,narrow,NA,NA
表格每一列代表信息如下
最后我们的文件和文件结构就是这样的
|-- chipseq.Rproj
|-- data
| |-- bams
| | |-- H1hesc_Input_Rep1_aln.bam
| | |-- H1hesc_Input_Rep1_aln.bam.bai
| | |-- H1hesc_Input_Rep2_aln.bam
| | |-- H1hesc_Input_Rep2_aln.bam.bai
| | |-- H1hesc_Nanog_Rep1_aln.bam
| | |-- H1hesc_Nanog_Rep1_aln.bam.bai
| | |-- H1hesc_Nanog_Rep2_aln.bam
| | |-- H1hesc_Nanog_Rep2_aln.bam.bai
| | |-- H1hesc_Pou5f1_Rep1_aln.bam
| | |-- H1hesc_Pou5f1_Rep1_aln.bam.bai
| | |-- H1hesc_Pou5f1_Rep2_aln.bam
| | `-- H1hesc_Pou5f1_Rep2_aln.bam.bai
| `-- peakcalls
|-- figures
|-- meta
| `-- samplesheet.csv
`-- results
## Load libraries
library(ChIPQC)
## Load sample data
samples <- read.csv('meta/samplesheet.csv')
View(samples)
## Create ChIPQC object
register(SerialParam())
chipObj <- ChIPQC(samples, annotation="hg19")
## Create ChIPQC report
ChIPQCreport(chipObj, reportName="ChIP QC report: Nanog and Pou5f1", reportFolder="ChIPQCreport")
生成的报告首先是一个表格

这个指标表示与“已识别峰”重叠的reads的百分比。它可以被视为一个“信噪比”度量,用于衡量文库中由结合位点的片段组成的比例与背景reads的比例。
RiP(也称为 FRiP)值会根据感兴趣的蛋白质而有所不同:


良好富集的 ChIP 样本将有更高比例的 reads 与已识别的峰重叠。尽管 Nanog 的 RiP 较高,但 Nanog 样本的箱线图显示出与 Pou5f1 相比,不同重复之间有相当大的差异,这可能可以通过 reads 长度和测序深度的差异来解释。
对于 IP 样本,我们预期在某些区域会有reads的富集或高覆盖率,而其他区域则覆盖率较低。对于对照样本,我们预期基因组覆盖率差异较小。一个“好”的或富集的样本通常在某些区域有显著的reads堆积(覆盖率差异较大),因此更高的 SSD 更能表明更好的富集。
SSD 分数对人工高信号区域和真正的 ChIP 富集区域都很敏感。因此,高 SSD 可能是 ChIP 富集的结果,也可能是黑名单区域中某些人工高信号的结果。
在我们的数据集中,Pou5f1 重复样本的分数比 Nanog 重复样本的分数更高。这可能表明 Pou5f1 样本中有更大的富集,但我们需要仔细查看 ChIPQC 的其余输出,以确保 Pou5f1 中的高 SSD 不是由于某些未知的伪影造成的。
可以使用报告中的“覆盖直方图”来可视化 SSD 探索的覆盖均匀性。x 轴表示在碱基对位置的reads堆积高度,y 轴表示有多少位置具有这种堆积高度。该图是对数刻度。

在我们的数据集中,Nanog 样本相比 Pou5f1 样本有相当重的尾部,特别是重复样本 2。“重尾”指的是曲线比指数曲线更重,曲线下面积更大。这表明 Nanog 样本在基因组中有更多位置具有更高的测序深度。然而,SSD 分数对 Pou5f1 来说更高。当 SSD (平方差之和) 很高但覆盖率看起来较低时,这可能是由于存在大面积高深度区域,且可能是基因组区域被列入黑名单的标志。

交叉相关图通常会产生两个峰:一个对应主要片段长度的富集峰(最高相关值),另一个对应读取长度的峰(“幻影”峰)。其实这里不理解也没关系,主要涉及测序相关知识,后续可补充说明吧。
以下是我们的结果出图:

这里也给了三种示例:
强信号
高质量的 ChIP-seq 数据集通常会有一个比读取长度峰更大的片段长度峰。下面的例子展示了在人类细胞中使用 CTCF(锌指转录因子)数据的强信号。使用好的抗体,转录因子通常会产生 45,000 到 60,000 个峰。红色垂直线显示了在真实峰位移处的主要峰,而蓝色垂直线处的小突起代表读取长度。

弱信号
以下是一个使用 Pol2 数据的弱信号示例。在这里,这种特定的抗体效率不高,因此这些峰是宽泛且分散的。我们在交叉相关图中观察到两个峰:一个在真实峰位移处(约 185-200 bp),另一个在读取长度处。对于弱信号的数据集,读取长度峰将开始占主导地位。

无信号
一次失败的实验会类似于仅使用输入数据的交叉相关图,在这种情况下,我们几乎观察不到片段长度的峰值或根本没有峰值。请注意,在下面的示例中,最强的峰值是蓝线(读取长度),并且在图谱中基本没有其他显著的峰值。峰值的缺失是预料之中的,因为在特定目标位点周围不应该有显著的片段聚集(除了可能在开放染色质区域中存在的弱偏差,这取决于所使用的实验方案)。

报告中还有一些其他信息,可自行探索!!!
DiffBind 是一个 R 语言的 Bioconductor 软件包,用于识别在两个或多个样本组之间差异富集的位点。它主要处理峰值调用集(‘peaksets’),这些是代表每个样本的候选蛋白质结合位点的基因组区间集合。DiffBind 包含支持处理峰值集的函数,包括在整个数据集中重叠和合并峰值集、在峰值集中重叠的区间中计数测序读数、以及基于结合亲和力(通过读数密度差异测量)的证据识别统计学上显著的差异结合位点。
DiffBind 的核心功能是差异结合亲和力分析,它可以识别在样本组之间统计学上显著差异结合的结合位点。核心分析程序默认使用 DESeq2 执行,并且可以选择使用 edgeR。每个工具都会为每个候选结合位点分配一个 p 值和 FDR,以指示它们是差异结合的置信度。
# 加载包
library(DiffBind)
library(tidyverse)
# 读取peaks集和相关元数据
samples <- read.csv('meta/samplesheet.csv')
dbObj <- dba(sampleSheet=samples)
# 获取比对文件并计算共识集(在多个样本中都检测到的峰值区域)中的每个峰/区域的计数信息
dbObj <- dba.count(dbObj, bUseSummarizeOverlaps=TRUE)
# 构建比对信息
dbObj <- dba.contrast(dbObj, categories=DBA_FACTOR, minMembers=2)
# 进行差异富集分析
dbObj <- dba.analyze(dbObj, method=DBA_ALL_METHODS)
# 查看结果摘要
dba.show(dbObj, bContrasts=T)
# 提取结果
res_deseq <- dba.report(dbObj, method=DBA_DESEQ2, contrast = 1, th=1)
out <- as.data.frame(res_deseq)
write.table(out, file="results/Nanog_vs_Pou5f1_deseq2.txt", sep="\t", quote=F, row.names=F)
# 为 DESeq2 识别出的每组显著区域创建 BED 文件,并根据富集的增加或减少进行分类
nanog_enrich <- out %>%
filter(FDR < 0.05 & Fold > 0) %>%
select(seqnames, start, end)
write.table(nanog_enrich, file="Nanog_enriched.bed", sep="\t", quote=F, row.names=F, col.names=F)
pou5f1_enrich <- out %>%
filter(FDR < 0.05 & Fold < 0) %>%
select(seqnames, start, end)
write.table(pou5f1_enrich, file="Pou5f1_enriched.bed", sep="\t", quote=F, row.names=F, col.names=F)
我们先看一下差异富集结果
> res_deseq
GRanges object with 6957 ranges and 6 metadata columns:
seqnames ranges strand | Conc Conc_Pou5f1 Conc_Nanog
<Rle> <IRanges> <Rle> | <numeric> <numeric> <numeric>
519 NC_000001.11 214316564-214316964 * | 7.77216 3.25157 8.74039
247 NC_000001.11 84479038-84479438 * | 6.97620 1.47896 7.96014
2168 NC_000005.10 62043581-62043981 * | 7.43368 3.57583 8.38305
3957 NC_000009.12 131531068-131531468 * | 6.59834 0.00000 7.59834
3007 NC_000007.14 24427007-24427407 * | 7.60091 2.99133 8.57106
... ... ... ... . ... ... ...
6935 NC_012920.1 9675-10075 * | 0 0 0
6936 NC_012920.1 10468-10868 * | 0 0 0
6937 NC_012920.1 11068-11468 * | 0 0 0
6938 NC_012920.1 12413-12813 * | 0 0 0
6939 NC_012920.1 13758-14158 * | 0 0 0
Fold p-value FDR
<numeric> <numeric> <numeric>
519 -4.85541 5.36253e-10 3.00568e-06
247 -5.58771 8.64943e-10 3.00568e-06
2168 -4.36111 3.49062e-09 8.08661e-06
3957 -6.64530 6.78297e-09 1.03517e-05
3007 -4.86481 7.44727e-09 1.03517e-05
... ... ... ...
6935 0 1 1
6936 0 1 1
6937 0 1 1
6938 0 1 1
6939 0 1 1
-------
seqinfo: 34 sequences from an unspecified genome; no seqlengths
在这一步中我依旧可以对我们对数据做一些探索性分析。
比如根据识别到的所有共识位点绘制PCA图
dba.plotPCA(dbObj, attributes=DBA_FACTOR, label=DBA_ID)

也可以根据差异分析识别出来的区域绘制 PCA
dba.plotPCA(dbObj, contrast=1, method=DBA_DESEQ2, attributes=DBA_FACTOR, label=DBA_ID)

plot(dbObj)

在进行差异分析的时候,我们使用了Deseq2和edgeR两种方法,我们可以查看一下有多少区域被两个工具都认定为差异区域。
这里我自己运行会报错,是因为在我的数据中edgeR没有发现差异区域,下图仅为示例
dba.plotVenn(dbObj,contrast=1,method=DBA_ALL_METHODS)

MA图用于展示在不同条件下结合位点的差异。MA图通过展示结合位点在不同条件下的平均信号强度(A值)和信号强度差异(M值),帮助识别显著差异结合的位点。
dba.plotMA(dbObj, method=DBA_DESEQ2)

pvals <- dba.plotBox(dbObj)

peaks 可视化有多种形式,我们先学习常见的方式。
要对 BAM 文件执行某些功能,许多工具都需要索引。索引 BAM 文件旨在快速检索与指定区域重叠的对齐,而无需浏览整个对齐文件。
创建文件夹
cd ~/chipseq/results/
mkdir -p visualization/bigWig visualization/figures
for循环创建索引
for file in ./bowtie2/*aln.bam
do
samtools index $file
done
bamCoverage -b bowtie2/H1hesc_Nanog_Rep1_aln.bam \
-o visualization/bigWig/H1hesc_Nanog_Rep1.bw \
--binSize 20 \
--normalizeUsing BPM \
--smoothLength 60 \
--extendReads 150 \
--centerReads \
-p 6 2> ../logs/Nanog_Rep1_bamCoverage.log
bamCoverage -b bowtie2/H1hesc_Nanog_Rep2_aln.bam \
-o visualization/bigWig/H1hesc_Nanog_Rep2.bw \
--binSize 20 \
--normalizeUsing BPM \
--smoothLength 60 \
--extendReads 150 \
--centerReads \
-p 6 2> ../logs/Nanog_rep2_bamCoverage.log
这个BED文件是我们想看的那些区域的信息,可是使用 DiffBind 生成的 BED 文件,看我们差异区域的富集情况。这个根据目的选择适合的信息。
因为后面想看一下整个基因组上的peaks 富集情况,这里即将整个参考基因组gtf注释文件转换为bed格式,这里我们先使用工具转换一下。
cat GCF_000001405.40_GRCh38.p14_genomic.gtf | grep exon | cut -f1,4,5,9 | cut -f1 -d";" | awk '{print $1, $2, $3, $5}' | sed -e 's/ /\t/g' | sed -e 's/\"//g' > GCF_000001405.40_GRCh38.p14_genomic.bed
由于许多顺式调控元件靠近其靶标的 TSS,因此一种常见的可视化技术是使用 bigWig 文件来获得 TSS 周围富集的全局评估。在我们的示例中,我们将评估 TSS 周围的富集情况,
我们先创建一个计数矩阵。computeMatrix命令接受多个 bigWig 文件和多个区域文件(BED 格式)以创建计数矩阵,即中间文件。它还可用于根据区域的分数对其进行过滤和排序。我们的区域文件将是我们刚刚复制的 BED 文件,而我们的 bigWig 文件将是从我们为您提供的完整数据集生成的文件。此外,我们将在基因(-b和-a)的 TSS 周围指定一个 +/- 1000bp 的窗口。对于每个窗口,computeMatrix将根据 bigWig 文件中的读取密度值计算分数。
computeMatrix reference-point --referencePoint TSS \
-b 1000 -a 1000 \
-R reference_data/GCF_000001405.40_GRCh38.p14_genomic.bed \
-S results/visualization/bigWig/*Nanog*.bw \
--skipZeros \
-o results/visualization/matrixNanog_TSS.gz \
-p 6 \
--outFileSortedRegions results/visualization/regionsNanog_TSS.bed
接着根据这个中间文件创建一个密度图
plotProfile -m visualization//matrixNanog_TSS.gz \
-out visualization/figures/TSS_Nanog_profile.png \
--perGroup \
--colors green purple \
--plotTitle "" --samplesLabel "Rep1" "Rep2" \
--refPointLabel "TSS" \
-T "Nanog read density" \
-z ""

然后是热图
plotHeatmap -m visualization//matrixNanog_TSS.gz \
-out visualization/figures/TSS_Nanog_heatmap.png \
--colorMap RdBu \
--whatToShow 'heatmap and colorbar' \
--zMin -4 --zMax 4

最后偷个懒哈,因为我选择查看的区域是整个参考基因组区域,所以跑起来很慢,跑了一下午了,所以这个图只是个例子,最后跑出来会和这个有些许不同,但步骤没问题。在此说明一下,哈哈哈哈。
下次再更新 peaks 基因组注释和富集分析。~~~