跳转至

ChIP-seq分析全流程

一句话概述

ChIP-seq(染色质免疫沉淀测序)通过抗体富集特定蛋白结合的DNA片段来定位转录因子结合位点或组蛋白修饰区域,分析流程包括比对、peak calling(MACS2/MACS3)、差异binding分析(DiffBind)和motif发现(HOMER)。


核心知识点表格

知识点说明
ChIP-seq原理交联→超声→免疫沉淀→测序,定位蛋白-DNA互作位点
Input/IgG对照背景对照样本,用于识别非特异性信号
MACS2/MACS3Model-based Analysis of ChIP-Seq,最常用的peak caller(MACS3是活跃开发版本)
Narrow peakTF结合位点(窄峰,~200bp),用于转录因子
Broad peak组蛋白修饰区域(宽峰,数kb-Mb),用于H3K27me3等
DiffBind差异binding分析(条件间peak差异)
HOMERMotif发现和peak注释工具
FRiPFraction of Reads in Peaks,质控核心指标
IDRIrreproducible Discovery Rate,评估重复间一致性
BigWig归一化后的信号轨迹文件,用于可视化

各步骤详解

第一步:实验设计与数据质控

白话解释: ChIP-seq实验需要"处理组"(用目标抗体富集)和"对照组"(Input或IgG),必须有生物学重复(至少2个,ENCODE标准3个)。数据质控除了看测序质量,还要关注ChIP特有的指标如fragment size分布。

技术细节: - 实验设计:至少2个生物学重复 + Input对照 - 测序策略:通常single-end 50bp或paired-end 75bp - 测序深度:TF ChIP ~20M reads;Histone ~40M reads - Fragment size:200-500bp(通过超声控制) - Cross-contamination检查:确保reads比对到正确物种

代码示例:

# 质控
fastqc -t 8 -o qc/ *.fastq.gz
multiqc qc/ -o multiqc_report/

# 接头去除
fastp --in1 chip_R1.fastq.gz --in2 chip_R2.fastq.gz \
  --out1 chip_clean_R1.fastq.gz --out2 chip_clean_R2.fastq.gz \
  --json chip_fastp.json --thread 8

# 同样处理Input对照
fastp --in1 input_R1.fastq.gz --in2 input_R2.fastq.gz \
  --out1 input_clean_R1.fastq.gz --out2 input_clean_R2.fastq.gz \
  --json input_fastp.json --thread 8

第二步:序列比对与后处理

白话解释: 把reads比对到参考基因组,然后去重、过滤低质量比对和黑名单区域。这些步骤对ChIP-seq尤其重要,因为PCR重复和mapping artifacts会产生假peak。

技术细节: - 比对工具:Bowtie2(推荐)或BWA - 需要去除PCR duplicates(Picard/sambamba) - 过滤MAPQ<20的reads - 移除ENCODE blacklist regions(已知的artifact区域) - Paired-end需要正确处理mate对

代码示例:

# 建索引(只需一次)
bowtie2-build /ref/GRCh38.fa /ref/bt2_hg38

# 比对(single-end)
bowtie2 -x /ref/bt2_hg38 \
  -U chip_clean.fastq.gz \
  -S chip.sam \
  -p 16 \
  --very-sensitive \
  --no-mixed \
  --no-discordant

# 比对(paired-end)
bowtie2 -x /ref/bt2_hg38 \
  -1 chip_clean_R1.fastq.gz \
  -2 chip_clean_R2.fastq.gz \
  -S chip.sam \
  -p 16 \
  --very-sensitive \
  -X 1000  # 最大fragment长度

# 转BAM + 排序
samtools view -bS -q 20 -F 1804 chip.sam | \
  samtools sort -@ 8 -o chip_sorted.bam -
samtools index chip_sorted.bam

# 去重
picard MarkDuplicates \
  I=chip_sorted.bam \
  O=chip_dedup.bam \
  M=chip_dup_metrics.txt \
  REMOVE_DUPLICATES=true
samtools index chip_dedup.bam

# 移除blacklist区域
bedtools intersect -v -abam chip_dedup.bam \
  -b /ref/hg38-blacklist.v2.bed > chip_final.bam
samtools index chip_final.bam

# 同样处理Input对照
bowtie2 -x /ref/bt2_hg38 -U input_clean.fastq.gz -S input.sam -p 16 --very-sensitive
samtools view -bS -q 20 -F 1804 input.sam | samtools sort -@ 8 -o input_sorted.bam -
picard MarkDuplicates I=input_sorted.bam O=input_dedup.bam M=input_dup.txt REMOVE_DUPLICATES=true
bedtools intersect -v -abam input_dedup.bam -b /ref/hg38-blacklist.v2.bed > input_final.bam
samtools index input_final.bam

# 比对统计
samtools flagstat chip_final.bam

第三步:Peak Calling(MACS2/MACS3)

白话解释: MACS2/MACS3把基因组分成小窗口,统计每个窗口里ChIP样本的reads数和Input样本的reads数,通过泊松分布检验找出显著富集的区域——这就是"peak"(蛋白结合位点或修饰区域)。

技术细节: - MACS2/MACS3核心peak calling算法相同:基于泊松分布的富集检验 - 自动估计fragment size(通过正负链reads的shift distance) - Narrow peak模式:适合TF(尖锐的结合位点,<500bp) - Broad peak模式:适合组蛋白修饰(宽阔的修饰域,可达数十kb) - 输出:narrowPeak/broadPeak(BED6+4格式)、summit坐标、p/q值

代码示例:

# 注意:以下命令中macs2可替换为macs3(核心callpeak算法一致,结果几乎相同)
# MACS3新增功能:HMMRATAC(ATAC-seq专用)、cutoff-analysis、callvar(变异检测)
# 安装:pip install macs3

# === Narrow peak(转录因子)===
macs2 callpeak \
  -t chip_final.bam \        # treatment(ChIP样本)
  -c input_final.bam \       # control(Input对照)
  -f BAM \                    # 输入格式
  -g hs \                     # 基因组大小(hs=人,mm=鼠)
  -n TF_sample1 \             # 输出前缀
  --outdir peaks/ \
  -q 0.05 \                   # FDR阈值
  --keep-dup all \            # 已去重,保留所有reads
  --call-summits              # 输出summit坐标

# === Broad peak(组蛋白修饰 H3K27me3/H3K36me3)===
macs2 callpeak \
  -t chip_H3K27me3.bam \
  -c input_final.bam \
  -f BAM \
  -g hs \
  -n H3K27me3_sample1 \
  --outdir peaks/ \
  --broad \                   # broad peak模式
  --broad-cutoff 0.1 \       # broad peak FDR
  -q 0.05 \
  --keep-dup all

# === Paired-end数据 ===
macs2 callpeak \
  -t chip_final.bam \
  -c input_final.bam \
  -f BAMPE \                  # paired-end BAM
  -g hs \
  -n TF_PE_sample1 \
  --outdir peaks/ \
  -q 0.05

# === 生成BigWig信号轨迹(用于可视化)===
# 使用deeptools
bamCoverage -b chip_final.bam \
  -o chip_signal.bw \
  --binSize 10 \
  --normalizeUsing RPGC \
  --effectiveGenomeSize 2913022398 \
  --extendReads 200 \
  -p 16

# Input归一化的信号(log2ratio)
bamCompare -b1 chip_final.bam \
  -b2 input_final.bam \
  -o chip_vs_input.bw \
  --binSize 50 \
  --normalizeUsing RPGC \
  --effectiveGenomeSize 2913022398 \
  --scaleFactorsMethod readCount \
  -p 16

# 统计peak数量和FRiP
echo "Peak count: $(wc -l < peaks/TF_sample1_peaks.narrowPeak)"

# 计算FRiP(Fraction of Reads in Peaks)
total_reads=$(samtools view -c chip_final.bam)
reads_in_peaks=$(bedtools intersect -a chip_final.bam -b peaks/TF_sample1_peaks.narrowPeak -u | samtools view -c)
echo "FRiP: $(echo "scale=4; $reads_in_peaks/$total_reads" | bc)"

第四步:质控与重复间一致性(IDR)

白话解释: ENCODE用IDR(不可重复发现率)来评估两个重复之间peak的一致性。核心思想:如果两个重复排名靠前的peak高度重叠,说明实验重复性好。

代码示例:

# === IDR分析 ===
# 需要每个重复独立call的peak(按p-value排序)
# 注意:IDR输入需要用-p (p-value cutoff较宽松,如0.01)以获得更多候选peak

macs2 callpeak -t rep1.bam -c input.bam -f BAM -g hs -n rep1 -p 0.01 --keep-dup all
macs2 callpeak -t rep2.bam -c input.bam -f BAM -g hs -n rep2 -p 0.01 --keep-dup all

# 按p-value排序
sort -k8,8nr rep1_peaks.narrowPeak > rep1_sorted.narrowPeak
sort -k8,8nr rep2_peaks.narrowPeak > rep2_sorted.narrowPeak

# 运行IDR
idr --samples rep1_sorted.narrowPeak rep2_sorted.narrowPeak \
    --input-file-type narrowPeak \
    --rank p.value \
    --output-file idr_output.txt \
    --plot \
    --log-output-file idr.log

# IDR < 0.05的peak是高置信度peak
awk '$5 >= 540' idr_output.txt | wc -l  # IDR 0.05对应-log10编码的540

# === deepTools质控可视化 ===
# 多样本相关性热图
multiBamSummary bins -b rep1.bam rep2.bam input.bam \
  -o results.npz -p 16
plotCorrelation -in results.npz --corMethod spearman \
  -o correlation_heatmap.pdf --plotFileFormat pdf

# 指纹图(Fingerprint plot)
plotFingerprint -b chip_rep1.bam chip_rep2.bam input.bam \
  --labels "ChIP_rep1" "ChIP_rep2" "Input" \
  -o fingerprint.pdf -p 16

# TSS处的信号富集
computeMatrix reference-point --referencePoint TSS \
  -b 3000 -a 3000 \
  -R /ref/genes.bed \
  -S chip_signal.bw \
  -o matrix.gz -p 16

plotHeatmap -m matrix.gz -o tss_heatmap.pdf
plotProfile -m matrix.gz -o tss_profile.pdf

第五步:差异Binding分析(DiffBind)

白话解释: 如果有多个条件/处理(如处理vs对照、不同时间点),DiffBind可以找出在不同条件间"结合强度"显著变化的peak——哪些基因组区域的蛋白结合在条件间发生了改变。

技术细节: - DiffBind整合了DESeq2/edgeR进行统计检验 - 输入:各样本的peak文件 + BAM文件 + 样本信息表 - 流程:建立consensus peak set → 对每个peak计数reads → 差异分析 - 输出:差异binding位点列表(log2FC, FDR)

代码示例:

library(DiffBind)

# 创建样本信息表
samples <- data.frame(
  SampleID = c("Ctrl_rep1", "Ctrl_rep2", "Treat_rep1", "Treat_rep2"),
  Condition = c("Control", "Control", "Treatment", "Treatment"),
  Replicate = c(1, 2, 1, 2),
  bamReads = c("ctrl_rep1.bam", "ctrl_rep2.bam", "treat_rep1.bam", "treat_rep2.bam"),
  bamControl = c("input.bam", "input.bam", "input.bam", "input.bam"),
  Peaks = c("ctrl_rep1_peaks.narrowPeak", "ctrl_rep2_peaks.narrowPeak",
            "treat_rep1_peaks.narrowPeak", "treat_rep2_peaks.narrowPeak"),
  PeakCaller = rep("narrow", 4)
)

# 创建DiffBind对象
dba_obj <- dba(sampleSheet = samples)

# 计算读数(在consensus peaks中计数)
# DiffBind 3.x默认使用summarizeOverlaps,无需显式设置bUseSummarizeOverlaps
dba_obj <- dba.count(dba_obj)

# 归一化
dba_obj <- dba.normalize(dba_obj)

# 建立对比(DiffBind 3.x API)
dba_obj <- dba.contrast(dba_obj, categories = DBA_CONDITION)

# 差异分析(使用DESeq2)
dba_obj <- dba.analyze(dba_obj, method = DBA_DESEQ2)

# 获取结果
db_results <- dba.report(dba_obj, th = 0.05)
print(db_results)

# 可视化
# MA plot
dba.plotMA(dba_obj)

# 火山图
dba.plotVolcano(dba_obj)

# PCA
dba.plotPCA(dba_obj, DBA_CONDITION)

# 热图
dba.plotHeatmap(dba_obj, contrast = 1, correlations = FALSE)

# 导出差异peak
export(db_results, "diff_binding_peaks.bed")

第六步:Motif分析(HOMER)

白话解释: 在peak区域中搜索过度出现的短序列模式(motif)——这些就是转录因子的"DNA识别密码"。如果你ChIP的蛋白是已知TF,应该能找到它的canonical motif;还可能发现共结合的其他TF的motif。

技术细节: - HOMER使用de novo motif发现 + 已知motif数据库比对 - 输入:peak区域的BED文件 - 背景:随机基因组区域(GC含量匹配)或自定义background - 输出:富集motif列表 + HTML报告

代码示例:

# === 安装HOMER ===
# conda install -c bioconda homer
# 或手动:
# perl /path/to/homer/configureHomer.pl -install homer
# perl /path/to/homer/configureHomer.pl -install hg38

# === Motif发现 ===
# 对peak summit区域(±100bp)做motif分析
findMotifsGenome.pl peaks/TF_sample1_summits.bed \
  hg38 \
  motif_results/ \
  -size 200 \          # summit周围±100bp
  -mask \              # 屏蔽重复序列
  -p 16 \             # 线程数
  -preparsedDir /tmp/homer_preparsed/

# 对narrowPeak全区域做motif
findMotifsGenome.pl peaks/TF_sample1_peaks.narrowPeak \
  hg38 \
  motif_full_results/ \
  -size given \        # 使用peak的实际大小
  -mask \
  -p 16

# 自定义背景(如:所有开放染色质区域)
findMotifsGenome.pl diff_peaks.bed \
  hg38 \
  motif_custom_bg/ \
  -size 200 \
  -bg all_peaks.bed \  # 自定义背景
  -mask -p 16

# === Peak注释(HOMER)===
annotatePeaks.pl peaks/TF_sample1_peaks.narrowPeak \
  hg38 \
  -annStats peak_annotation_stats.txt \
  > peak_annotations.txt

# 注释统计包含:promoter/exon/intron/intergenic比例

# === 基因组分布可视化(R: ChIPseeker)===
# R: ChIPseeker peak注释
library(ChIPseeker)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(org.Hs.eg.db)

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

# 读取peak文件
peaks <- readPeakFile("peaks/TF_sample1_peaks.narrowPeak")

# 注释
peakAnno <- annotatePeak(peaks, TxDb = txdb, annoDb = "org.Hs.eg.db",
                          tssRegion = c(-3000, 3000))

# 可视化
plotAnnoPie(peakAnno)           # 饼图
plotAnnoBar(peakAnno)           # 条形图
plotDistToTSS(peakAnno)         # 到TSS距离分布

# 导出注释结果
anno_df <- as.data.frame(peakAnno)
write.csv(anno_df, "peak_annotation_table.csv")

# GO/KEGG富集分析(peak关联的基因)
library(clusterProfiler)
genes <- anno_df$geneId[!is.na(anno_df$geneId)]
ego <- enrichGO(gene = genes, OrgDb = org.Hs.eg.db, ont = "BP", readable = TRUE)
dotplot(ego, showCategory = 20)

实战命令(可复制)

# ===== 完整ChIP-seq流水线 =====

SAMPLE="TF_rep1"
INPUT="Input_rep1"
REF="/ref/GRCh38.fa"
BT2_IDX="/ref/bt2_hg38"
BLACKLIST="/ref/hg38-blacklist.v2.bed"
THREADS=16

# 1. 质控+trim
fastp --in1 ${SAMPLE}.fastq.gz --out1 ${SAMPLE}_clean.fastq.gz --thread 8 --json ${SAMPLE}.json
fastp --in1 ${INPUT}.fastq.gz --out1 ${INPUT}_clean.fastq.gz --thread 8 --json ${INPUT}.json

# 2. 比对
bowtie2 -x ${BT2_IDX} -U ${SAMPLE}_clean.fastq.gz -p ${THREADS} --very-sensitive | \
  samtools view -bS -q 20 -F 1804 | samtools sort -@ 8 -o ${SAMPLE}_sorted.bam -
bowtie2 -x ${BT2_IDX} -U ${INPUT}_clean.fastq.gz -p ${THREADS} --very-sensitive | \
  samtools view -bS -q 20 -F 1804 | samtools sort -@ 8 -o ${INPUT}_sorted.bam -

# 3. 去重
picard MarkDuplicates I=${SAMPLE}_sorted.bam O=${SAMPLE}_dedup.bam M=${SAMPLE}_dup.txt REMOVE_DUPLICATES=true
picard MarkDuplicates I=${INPUT}_sorted.bam O=${INPUT}_dedup.bam M=${INPUT}_dup.txt REMOVE_DUPLICATES=true

# 4. 去blacklist
bedtools intersect -v -abam ${SAMPLE}_dedup.bam -b ${BLACKLIST} > ${SAMPLE}_final.bam
bedtools intersect -v -abam ${INPUT}_dedup.bam -b ${BLACKLIST} > ${INPUT}_final.bam
samtools index ${SAMPLE}_final.bam; samtools index ${INPUT}_final.bam

# 5. Peak calling
macs2 callpeak -t ${SAMPLE}_final.bam -c ${INPUT}_final.bam \
  -f BAM -g hs -n ${SAMPLE} --outdir peaks/ -q 0.05 --call-summits --keep-dup all

# 6. BigWig
bamCoverage -b ${SAMPLE}_final.bam -o ${SAMPLE}.bw --binSize 10 \
  --normalizeUsing RPGC --effectiveGenomeSize 2913022398 --extendReads 200 -p ${THREADS}

# 7. Motif
findMotifsGenome.pl peaks/${SAMPLE}_summits.bed hg38 motifs/${SAMPLE}/ -size 200 -mask -p ${THREADS}

# 8. 质控统计
echo "Total reads: $(samtools view -c ${SAMPLE}_final.bam)"
echo "Peaks: $(wc -l < peaks/${SAMPLE}_peaks.narrowPeak)"
echo "FRiP: $(echo "scale=4; $(bedtools intersect -a ${SAMPLE}_final.bam -b peaks/${SAMPLE}_peaks.narrowPeak -u | samtools view -c) / $(samtools view -c ${SAMPLE}_final.bam)" | bc)"

面试常问点

Q1: ChIP-seq为什么需要Input对照?

A: Input对照反映基因组背景信号——某些区域(如开放染色质、高GC、重复区)即使没有抗体也容易被测到更多reads("mapability bias"和"open chromatin bias")。没有Input,MACS2无法区分真正的蛋白结合富集和这些背景偏差。IgG对照类似但还反映非特异性抗体结合。

Q2: Narrow peak和Broad peak的选择依据?

A: Narrow peak(默认):转录因子(点状结合,~200bp peak)、H3K4me3(启动子标记,尖锐peak)、H3K27ac(增强子标记)。Broad peak(--broad):H3K27me3(多梳体抑制,宽阔域)、H3K36me3(gene body标记)、H3K9me3(异染色质,超宽域)。判断依据是生物学上该标记的分布模式。

Q3: FRiP的合格标准是多少?

A: ENCODE标准:FRiP > 1%(最低要求),高质量数据通常>5%。不同抗体差异大:TF ChIP通常FRiP 1-5%(结合位点少),H3K4me3/H3K27ac可达20-40%。FRiP过低(<1%)通常表示ChIP效率差或抗体质量问题。

Q4: MACS2/MACS3的q-value和p-value有什么区别?该用哪个?

A: p-value是单个位点的统计显著性;q-value是BH(Benjamini-Hochberg)校正后的FDR。推荐使用q-value(-q 0.05-q 0.01),因为全基因组检验涉及数百万次比较,需要多重校正。如果用p-value(-p),需要更严格的阈值(如1e-5)。IDR分析时用较宽松的p-value(0.01)以获得更多候选peak。注意:MACS3的callpeak核心算法与MACS2相同,参数也完全兼容。

Q5: DiffBind的统计原理?

A: DiffBind先定义consensus peak set(所有样本中至少N个样本有peak的区域),然后对每个consensus peak区域在所有样本中计数reads(类似RNA-seq对gene区域计数),归一化后用DESeq2或edgeR的负二项模型检验条件间差异。本质是把ChIP-seq差异分析转化为类似RNA-seq差异表达的框架。

Q6: HOMER findMotifsGenome的背景模型是什么?

A: 默认背景:从基因组中随机采样相同数量、相同大小的区域,并匹配GC含量分布。这确保发现的motif富集不是因为GC含量差异而是真正的序列特异性。可以用-bg指定自定义背景(如所有open chromatin peak,这样找到的是"在你的peak中比一般开放区域更富集"的motif)。

Q7: ChIP-seq需要多大的测序深度?

A: ENCODE推荐:TF ChIP每个重复至少20M uniquely mapped reads(10M绝对最低)。组蛋白修饰需要更多:H3K4me3约20M,broad marks如H3K27me3约40-60M。Input对照应与ChIP深度相当或更高。判断标准:peak数量随深度增加是否饱和(saturation analysis)。

Q8: spike-in normalization是什么,什么时候需要?

A: 在ChIP实验中加入已知量的外源染色质(如果蝇染色质做人样本ChIP),测序后用外源reads数归一化。用途:当怀疑全局组蛋白修饰水平变化时(如药物处理导致全基因组H3K27me3整体下降),传统归一化(如总reads数)无法检测这种全局变化,spike-in可以。


易错点

1. 没有Input对照就做peak calling

问题: 无对照时MACS2使用局部背景估计,在高比对性区域产生大量假peak。 正确做法: 每次ChIP实验必须做Input或IgG对照,且对照需要足够深度。

2. 未去除blacklist区域

问题: ENCODE blacklist区域(高度重复、难比对区域)会产生极高的假peak信号。 正确做法: 在peak calling前或后移除blacklist区域。hg38 blacklist文件:hg38-blacklist.v2.bed

3. 对broad peak数据使用narrow模式

问题: H3K27me3等broad marks用narrow模式会把一个大域碎片化成很多小peak,丢失生物学意义。 正确做法: 使用--broad参数,且设置合适的--broad-cutoff(如0.05或0.1)。

4. PCR重复未去除导致假peak

问题: PCR过度扩增的片段在某个位置堆积,模拟出假的"富集"信号。 正确做法: 必须在peak calling前去除PCR duplicates。WES/ATAC/ChIP-seq中这一步都是必须的。

5. 不同样本比对参数不一致

问题: ChIP样本和Input样本用不同参数比对,导致系统偏差。 正确做法: 所有样本(ChIP和Input)使用完全相同的比对和过滤参数。

6. DiffBind中consensus peak set太严格或太宽松

问题: 要求所有样本都有peak(太严格,丢失条件特异peak)或只要1个样本有(太宽松,引入噪声)。 正确做法: 设置合理阈值:通常要求至少在一个条件的大多数重复中出现(如2/3)。


补充知识

ENCODE质控标准汇总

指标合格标准方法
Uniquely mapped reads>10M (TF), >20M (histone)samtools flagstat
FRiP>1%bedtools intersect
NRF (Non-Redundant Fraction)>0.8Picard metrics
PBC1 (PCR Bottleneck Coefficient)>0.8自定义计算
NSC (Normalized Strand Coefficient)>1.05 (TF), >1.02 (histone)phantompeakqualtools
RSC (Relative Strand Correlation)>0.8phantompeakqualtools
IDR (Reproducibility)IDR<0.05 peaks > overlap with pooledidr

工具生态

步骤推荐工具替代选择
比对Bowtie2BWA-MEM, chromap
Peak callingMACS2/MACS3HOMER, SEACR, SICER2(broad)
差异bindingDiffBind (3.x)MAnorm2, csaw
MotifHOMERMEME-ChIP, DREME
注释ChIPseekerHOMER annotatePeaks
可视化deepTools, IGVpyGenomeTracks
QCdeepTools, phantompeakqualtoolsChIPQC(R)

CUT&RUN/CUT&Tag替代方案

  • CUT&RUN和CUT&Tag是ChIP-seq的新一代替代技术
  • 所需细胞数更少(可至单细胞水平)、背景更低
  • 分析流程类似但peak calling推荐用SEACR(不需要Input)
  • 正在逐步替代传统ChIP-seq

本教程覆盖ChIP-seq从原始数据到motif发现的完整分析流程,遵循ENCODE质控标准,适合转录因子和组蛋白修饰ChIP-seq分析。