2021年开年第一篇笔记~
这篇笔记主要记录DiffBind包的学习。在很久以前我写过一篇ATAC-seq分析流程(ATAC-seq分析练习),里面没有涉及到差异peak的分析。现在补起来。参考的是DiffBind的一份官方文档:这里。关于差异peaks的提取,不同的实验室可能有着自己的分析流程。下面的说法来自实验室刚毕业的一个七年的博士(仅代表其个人看法):ChIP-seq通常用DESeq2来获取differential peaks。而对于ATAC-seq,可以使用DESeq2,也可以用DiffBind。当然在这个DiffBind文档里,官方也使用了这个包来进行ChIP-seq差异peak的分析,所以到底使用哪种方法还是看自己的经验和分析出的结果能不能通过实验的验证。
前言:DiffBind介绍
该包的主要重点是确定样本之间有差异的位点。它包括支持峰集处理的功能,包括重叠和合并峰集,在峰集里进行重叠区间的测序read计数,以及基于结合亲和的证据(通过read密度的差异测定)识别统计上显著的差异结合位点。为此,它使用了在RNA-Seq环境中开发的统计包(edgeR和DESeq2)。此外,这个包构建在Rgraphics的基础上,提供了一组标准化的图来帮助进行结合分析。
DiffBind主要对峰集(peaksets)进行分析,峰集是一组代表候选蛋白质结合位点的基因组区间(也适用于ATAC-seq的峰集)。每个区间包括一个染色体,一个开始和结束位置,通常还有一个表示对峰的confidence或强度的分数。与每个峰集相关联的是与产生峰集的实验相关的metadata。此外,包含比对上的测序read文件(.bam文件)可以与每个峰集关联。
通常的,DiffBind处理数据一般是五个部分:
读取峰集:第一步是读取一组峰集和相关的metadata。峰集要么来自ChIP-Seq的peak callers,如MACS,要么使用其他标准(如基因组窗口,或基因组中的所有启动子区域)。读取峰集的最简单方法是使用逗号分隔值(csv)列表,每个峰集一行(也接受带有.xls或.xlsx后缀的Excel格式的电子表格)。单个样本可以有多个相关峰集。例如,如果使用多个peak callers进行比较,每个样本将在列表中多出一行。
Occupancy分析:峰集,特别是由peak callers产生的,提供了对特定基因组位点上某个蛋白质的潜在 occupancy的结果。peaksets已加载后,可以执行一些探索性绘图,确定这些occupancy图谱在实验重复之间的一致性。如实验之间的重复,在同一实验中使用不同peak callers。DiffBind提供了能够检查重叠的功能,以及确定相似样本聚集在一起的函数。此外,峰可能基于blacklists过滤,以及自定义greylists来源于control track特定的实验(见第6节)。除了质量控制,Occupancy的分析可以是一个共识峰集,代表一组整体的候选结合位点用于进一步分析。
reads计数:一旦一个共识的峰集已经被推导出来,DiffBind可以使用提供的测序read文件来计算每个样本的每个区间有多少reads重叠。默认情况下,为了提供更多标准化的峰值区间,共识峰集中的峰会根据其峰值(最大读重叠点)重新调整中心点和trimmed。计数的最终结果是一个结合亲和矩阵,其中包含每个样本在每个共识结合位点的read count,无论它是否被识别为该样本中的一个峰。有了这个矩阵,样本可以使用affinity重新聚类,而不是occupancy数据。结合亲和矩阵用于QC绘图以及随后的差异分析。
差异结合亲和分析:DiffBind的核心功能是差异结合亲和分析,它可以识别样本间显著的差异结合位点。这一步骤包括将实验数据标准化,建立模型设计和对比(或contrasts)。接下来执行底层的核心分析,默认情况下使用DESeq2。这将为每个候选结合位点分配一个p值和FDR,表明它们的差异结合置信度。
画图和reporting:一旦运行了一个或多个contrasts,DiffBind就提供了许多用于报告和绘制结果的函数。MA和火山图给出了分析结果的概述,而相关性热图和PCA图显示了如何基于不同的结合位点的组聚类。箱形图显示了reads在差异结合位点内的分布,对应于它们在两个样本组之间是否获得或失去亲和力。reporting机制能够提取差异结合位点进行进一步处理,如注释、motif和通路分析。
数据分析
(一)DiffBind的安装
> BiocManager::install("DiffBind")
> library(DiffBind)
(二)准备sample sheet
sample sheet是一个列表,需要包括以下几列:"SampleID", "Tissue", "Factor", "Condition" ,"Treatment","Replicate", "bamReads" ,"ControlID" ,"bamControl" ,"Peaks"和"PeakCaller"。
这个列表可以是dataframe,或者是从csv文件读取,比如:
NOTE: 我用的数据是ATAC-seq数据,如果是ChIP-seq数据的话上面这个表里需要填写的内容会有些不同。具体请参考官网:https://www.bioconductor.org/packages/release/bioc/vignettes/DiffBind/inst/doc/DiffBind.pdf
(三)读取峰集(peaksets)
> DBA_object <- dba(sampleSheet = samples)
> DBA_object #这里得到的就是上面提到的共识峰集
NOTE: 这一步有很多可选参数,我就直接用的都是默认值了,如果有特殊需要的,请参考DiffBind官网说明书。
使用peak calls的数据,可以生成一个相关热图,通过结合矩阵的每一行的相互关系给出样本的初始聚类:
> plot(DBA_object)
(四)计算reads
下一步是根据每个样本的read计数(亲和力分数)计算一个带有分数的结合矩阵,而不是仅针对特定样本中call的那些峰(occupancy分数)计算置信分数。这些reads是使用dba.count
功能获得的:
> DBA_object <- dba.count(DBA_object,bUseSummarizeOverlaps=TRUE)
> DBA_object
这里同样有很多参数可以选择,这里我只选择一个参数:bUseSummarizeOverlaps
。
这个参数会使得运行比较缓慢,但是是一个更标准的计算功能。如果你把它设置为TRUE,所有的read文件必须是bam,并且必须有其自己的索引文件(.bam.bai)。另外fragmentSize参数必须是缺省值。
结果如下:
这里添加了两个新列。第一个显示了每个样本的比对的reads的总数(“完整”文库大小)。第二个是标记的FRiP,它代表在峰的Fraction of Reads。这是共识峰集中与这个样品里某一重叠的峰所占reads的比例,可以用来表示总体上哪个样品富集程度更高。
这时可以画个PCA plot:
> dba.plotPCA(DBA_object, attributes=DBA_TREATMENT, label=DBA_ID)
这时候的相关性热图就不一样了:
> plot(DBA_object)
(五)构建design和contrast模型
> DBA_object <- dba.contrast(DBA_object,categories=DBA_TREATMENT,minMembers = 2)
(六)差异分析
> DBA_object <- dba.analyze(DBA_object, method=DBA_DESEQ2)
> dba.show(DBA_object, bContrasts=T) #这里我有4组不同的处理,那么两两比较就有6种组合,这里还要注意的是Group2是baseline
Group1 Members1 Group2 Members2 DB.DESeq2
1 two 2 one 2 16216
2 two 2 four 2 21686
3 two 2 three 2 25708
4 one 2 four 2 2827
5 one 2 three 2 1382
6 four 2 three 2 1231
> plot(DBA_object, contrast=6) #这里的contrast就是上面6行里最开始的一列“1-6”的数字,这里设置6,是针对第六组组合比较:我的“four”处理组合“three”处理组的相关性热图
还可以画个MA-plot看一下:
> dba.plotMA(DBA_object,contrast = 6)
(七)提取差异分析结果
这一部分你可以设置提取哪些组比较的差异结果,如果你只有两个组比较,就很容易,用默认值就好了。如果你的数据和我一样,我是4个组比较,上面提到就有6组比较组合,这时我可以设置提取哪两个实验条件的组合结果:
> DBA_object.DB <- dba.report(DBA_object,contrast = 6)
> DBA_object.DB
GRanges object with 1231 ranges and 6 metadata columns:
seqnames ranges strand | Conc Conc_four Conc_three Fold p-value FDR
<Rle> <IRanges> <Rle> | <numeric> <numeric> <numeric> <numeric> <numeric> <numeric>
302 chr1 24612300-24613350 * | 13.35 13.02 13.62 -0.60 2.86e-13 1.11e-08
6232 chr11 57091050-57091850 * | 5.91 2.05 6.86 -4.81 5.55e-13 1.11e-08
15938 chr16 67435750-67437100 * | 7.36 8.02 6.11 1.91 1.15e-09 9.66e-06
10844 chr13 73455700-73456600 * | 5.74 6.60 3.31 3.29 1.15e-09 9.66e-06
25740 chr3 151351500-151352350 * | 7.48 6.42 8.08 -1.66 1.21e-09 9.66e-06
... ... ... ... . ... ... ... ... ... ...
12086 chr14 20765350-20766300 * | 6.76 6.13 7.20 -1.08 0.00153 0.0497
5266 chr10 116739900-116740500 * | 5.19 4.11 5.80 -1.69 0.00153 0.0497
29648 chr5 129974800-129975450 * | 5.20 3.79 5.90 -2.10 0.00154 0.0498
30836 chr6 47920250-47921000 * | 5.92 5.10 6.44 -1.34 0.00154 0.0498
2950 chr1 183905150-183905850 * | 6.41 5.70 6.88 -1.18 0.00154 0.0499
-------
seqinfo: 20 sequences from an unspecified genome; no seqlengths
metadata列显示了所有样本的平均read浓度(默认计算使用log2标准化read计数)和第4(four)组和第3(three)组中每个样本的平均read浓度。Fold列显示了DESeq2分析计算的两组之间的log Fold changes (LFCs)。正数表示four组的结合亲和力增加(对于ATAC-seq数据来说就是DNA的可接近性增加),负数表示three组的结合亲和力增加。最后两列给出了识别这些位点为差异位点的置信度,是原始p值和经过多次测试修正的FDR(同样由DESeq2分析计算)。
保存你的结果:
> result <- as.data.frame(DBA_object.DB)
> write.table(result, file="four_vs_three_diffbind.txt", sep="\t", quote=F, col.names = NA)
#看一下升高和降低的差异峰的数量
> sum(DBA_object.DB$Fold>0)
[1] 155
> sum(DBA_object.DB$Fold<0)
[1] 1076
这时可以针对four组和three组的样品画PCA plot:
> dba.plotPCA(DBA_object, contrast= 6, attributes=DBA_TREATMENT, label=DBA_ID)
火山图:
> dba.plotVolcano(DBA_object,contrast = 6)
把某两个组所有的差异峰用热图表示出来:
> hmap <- colorRampPalette(c("red", "black", "green"))(n = 13)
> readscores <- dba.plotHeatmap(DBA_object, contrast=6, correlations=FALSE,scale="row", colScheme = hmap)
当然你也可以把所有的样品都画出来:
> readscores <- dba.plotHeatmap(DBA_object,correlations=FALSE,scale="row",colScheme = hmap)
但是这里有一个问题,它把我的同一个Treatment的样品分隔开了。我尝试过调整列的顺序,但是貌似在dba.plotHeatmap
这个函数里没有类似的参数可以调整。于是我试着用pheatmap将这个热图进行可视化。
使用pheatmap进行调整:
#reorder sample sequences(using pheatmap)
> reorder_matrix = readscores@elementMetadata[c(3,2,1,4,5,6,7,8)]
> color <- colorRampPalette(c("green","black", "red"))(n = 50)
> annotation_col = data.frame(group = c("one","one","three","three","two","two","four","four"), replicates = c("1","2"))
> rownames(annotation_col) = colnames(reorder_matrix)
# set the range of scale legend bar
> n=t(scale(t(reorder_matrix)))
> n[n> 1.5]=1.5 #限定上限
> n[n< -1.5]= -1.5 #限定下限
# plot
> pheatmap(n,
color = color,
cluster_cols=FALSE,
annotation_col = annotation_col)
参考文章:
1.ATAC-Seq 差异分析 DiffBind
2.第9篇:差异peaks分析——DiffBind
3.colorspace