BioF3 组学数据分析

03 DiffBind 差异结合分析

导出日期:2026年6月27日

03 DiffBind 差异结合分析

ChIP-seq 的差异分析和 RNA-seq 思路一样:把每个 peak 在每个样本里的 reads 数当作"表达量",用 DESeq2 或 edgeR 做统计检验。DiffBind 把这条流程封装成几个函数,从 peak 文件 + BAM 到差异结合位点一步到位。

本章用 DiffBind 自带的 tamoxifen 数据演示:11 个乳腺癌细胞系的 ER(雌激素受体)ChIP-seq,分为 Responsive(对他莫昔芬敏感)和 Resistant(耐药)两组。

真实示例

配套脚本 epi03_diffbind_sci.R 在 tamoxifen 数据上跑完整的差异结合分析:

Rscript scripts/epigenomics/epi03_diffbind_sci.R

每张图看什么

Sample correlation 图 1:样本间 binding affinity 的相关性热图。同一条件的样本应该聚在一起。

PCA 图 2:PCA 按条件着色。Responsive 和 Resistant 在 PC1 上分开。

MA plot 图 3:MA plot。红点是 FDR < 0.05 的差异结合位点。

Volcano 图 4:火山图。横轴 log2FC,纵轴 -log10(FDR)。

DB heatmap 图 5:差异结合位点的 binding affinity 热图。每行一个 peak,每列一个样本。

Gained vs Lost 图 6:差异位点按方向分:Gained(Responsive 里更强)vs Lost(Resistant 里更强)。

核心代码

library(DiffBind)
data(tamoxifen_counts)

# 设置对比
tamoxifen <- dba.contrast(tamoxifen, categories = DBA_CONDITION)

# 差异分析(DESeq2 后端)
tamoxifen <- dba.analyze(tamoxifen, method = DBA_DESEQ2)

# 提取结果
db_report <- dba.report(tamoxifen)

为什么不直接用 DESeq2 而要走 DiffBind

DESeq2 输入要"行 = 基因"的固定矩阵,而 ChIP / ATAC 不同样本的 peak 集合是不一样的。要做差异分析必须先建一个所有样本共用的 consensus peak set,再在每个 peak 上数 reads。DiffBind 把这一步封装了:

  1. dba() 读 sample sheet → 知道每个样本的 BAM + peak
  2. dba.count() 在 consensus peaks 上数 reads,得到 peak × sample 矩阵
  3. dba.analyze() 把这个矩阵交给 DESeq2 / edgeR 做差异

后端就是 DESeq2 / edgeR — 你也可以自己跑,但 DiffBind 处理了 consensus peak 构建、normalization(reads-in-peak vs library-size)、blacklist 过滤等细节。新项目直接用 DiffBind,自己拼这套很容易出错。

常见坑

坑 1:sample sheet 的 BAM 路径写错

DiffBind 的 sample sheet 里要求 bamReads 列指向已经去重 / 过滤好的 BAM。不是原始 BAM,否则 reads-in-peak 计数被 PCR duplicate / 低 MAPQ reads 污染。先做完 Picard MarkDuplicates + samtools view -q 30 再喂给 DiffBind。

坑 2:normalization 选错

DiffBind 默认按 library size 归一化,但 ChIP-seq 一些情况下应该按 reads-in-peak 归一化(spike-in 实验、或样本间总信号变化大时)。dba.normalize(method = DBA_NORM_RLE / DBA_NORM_TMM / DBA_NORM_LIB) 三个选项各有适用场景,看 vignette 不要直接用默认。

坑 3:consensus peaks 用了所有样本的并集

默认 minOverlap = 2 意味着一个 peak 至少在 2 个样本里出现才进 consensus。如果你只想保留高置信 peak,提高到 minOverlap = (n_samples / 2) + 1,结果更稳。

坑 4:FDR 阈值不区分 ChIP / ATAC

ChIP-seq DB 通常 FDR < 0.05 + |FC| > 1 就够;ATAC-seq 信号更稀疏,可以放到 FDR < 0.1。死磕 0.05 在 ATAC 上经常 0 个 DB peak,不是分析做错了。

坑 5:Greylist 没用

Greylist(区域级别的"看上去像 peak 但其实是噪声"区域)和 Blacklist 不同。DiffBind 默认会调用 GreyListChIP,需要联网下载参考。国内有时下载慢,可以预先下载好 cached。

下一步

接着深入

横向延伸

下载资源

参考资源