
做ChIP-seq或ATAC-seq数据分析peak calling绝对是一道绕不过去的坎。当年我第一次处理ChIP-seq数据时整个人被各种工具和参数搞得晕头转向MACS2这个名字反复出现在各类流程和论文里几乎成了peak calling的代名词。后来跟着项目做了几十套样本、踩了无数坑之后才真正弄明白这个工具的脾气。这篇就专门聊聊MACS2做peak calling的完整实操从原理到命令、从参数到排错把我积累下来的经验全部摊开讲。1. Peak calling是什么为什么我最终选了MACS21.1 Peak calling在生信流程中的定位先给刚入门的同学把概念捋清楚。Peak calling峰识别是染色质免疫共沉淀测序ChIP-seq数据分析的核心环节通俗讲就是回答一个问题蛋白质通常是转录因子或组蛋白修饰到底结合在基因组的哪些区域整个ChIP-seq分析流程大致可以分成四步原始测序数据质控与比对QC and alignment、peak calling、差异分析、下游注释与可视化。比对完成之后你手里的是BAM文件记录了每一条reads在基因组上的位置。但这些reads存在基因组各处有真实信号也有背景噪音——剪切碎片、非特异性结合、PCR重复等等都会产生干扰。Peak calling的任务就是用统计学方法把这些散落的reads聚成一个个显著的富集区域也就是所谓的峰。MACS2Model-based Analysis of ChIP-Seq版本2是目前这个环节使用最广泛的工具之一。它从2011年发布以来经过大量项目验证无论是转录因子这种尖锐的窄峰还是组蛋白修饰这种跨度较大的宽峰都能给出可靠的结果。1.2 为什么是MACS2而不是其他工具Peak calling工具有不少选择比如SICER、PeakSeq、GEM还有近年的Genrich、MACS3等等。用了这么多我依然习惯MACS2原因有三点。第一算法有明确的物理含义。MACS2核心思路是建模——它利用双端测序或单端测序中正负链reads的偏移来建模DNA片段长度然后根据这个模型把reads朝3方向延伸形成完整的片段覆盖图。这个过程比单纯固定窗口扫描要精确得多尤其是对转录因子ChIP-seq这种峰型比较尖锐的数据。第二生态成熟上下游工具链完整。MACS2输出的bed文件可以直接被ChIPseeker、HOMER、deepTools等下游分析工具读取社区资料丰富遇到问题基本都有现成答案。第三参数灵活处理多场景适应性强。从窄峰到宽峰、从单端到双端、从有对照到无对照一套工具全覆盖而且命令行选项非常直观。用个生活化的类比MACS2就像一把瑞士军刀虽然不是所有场景下都绝对最优但它在大多数常见场景下都够用、好用、可靠对新手足够友好。2. 准备数据BAM文件、对照样本和有效基因组大小2.1 输入文件的基本要求MACS2最常用的输入格式是BAM或BED文件。这里要明确一点MACS2本身不做reads比对它消费的是比对后的结果。前期比对通常用BWA、Bowtie2或STAR完成。实际操作中我几乎总是直接喂BAM文件因为可以从比对结果中保留更多信息比如比对质量值、双端片段信息。MACS2的-f参数用来指定输入格式常用值包括AUTO自动检测默认选项BAM普通BAM文件BAMPE双端测序且同时保留paired-end信息的BAM文件BEDBED格式BEDPE包含双端配对信息的BED格式这里有个容易忽视的重点如果你拿的是双端测序数据强烈建议指定-f BAMPE。原因是双端reads本身就隐含了DNA片段的真实长度插入片段不需要MACS2去建模估算而如果你用默认的AUTO或BAMMACS2会把它当作单端数据来处理还得先去估计片段长度增加了不确定因素。2.2 对照样本到底要不要很多刚接触ChIP-seq的同学会纠结我没有做input或IgG对照能不能直接call peak答案是可以但结果是裸奔状态。对照样本在这里扮演的角色是背景基线。ChIP实验里抗体非特异性结合、染色质开放性差异、测序深度不均都会造成reads富集的假象。没有对照MACS2只能假设整个基因组的背景信号是均一的这在小规模分析时勉强可用但遇到高背景区域就容易误报。如果条件允许一定要加对照。格式上只需多传一个-c参数、指定对照BAM文件。MACS2会动态计算每个窗口的背景信号用泊松分布模型评估处理组与对照组之间的差异显著性这才是ChIP-seq分析的标准做法。2.3 有效基因组大小一个不能乱填的数字MACS2有个参数-g叫effective genome size有效基因组大小这个值非常关键经常有人在这里出错。它不是你直接查到的基因组总碱基数而是该基因组中可以被测序reads可靠比对的碱基数——需要把N碱基区、高重复区等排除在外。不同物种常用参考值物种有效基因组大小人类 Homo sapiens2.7e9 或 hs小鼠 Mus musculus1.87e9 或 mm线虫 C. elegans9e7 或 ce果蝇 D. melanogaster1.2e8 或 dm大鼠 R. norvegicus2.5e9 或 rn这里有个很常见的坑默认值恰好是hs人类如果你跑的是小鼠数据但忘了改峰值筛查的背景模型就会偏大或偏小直接影响p值估计和峰数量。我见过不止一个项目因为这个参数跑出了几千个幽灵峰排查时让人抓狂。3. 核心命令与参数每条参数背后的逻辑3.1 最标准的MACS2命令长什么样以一个典型的转录因子ChIP-seq项目为例最常用的命令是macs2 callpeak \ -t treatment.bam \ -c input.bam \ -f BAMPE \ -g hs \ -n WT_TF \ -q 0.05 \ -B --SPMR \ --outdir ./macs2_out逐条拆开讲-t处理组ChIP样本的BAM文件-c对照组input或IgG的BAM文件-f BAMPE输入是双端配对BAM-g hs有效基因组大小人类数据-n输出文件前缀项目命名尽量有意义比如细胞类型加处理条件-q 0.05q值阈值即多重假设校正后的p值默认是0.05-B输出bedGraph格式的覆盖度信号文件--SPMR按每百万测序reads数scaled per million reads标准化信号重点说下-B --SPMR。如果不加-BMACS2只会输出peak calls加上之后会额外生成两个bedGraph文件_treat_pileup.bdg处理组信号和_control_lambda.bdg背景模型。这两个文件可以直接载入IGV做可视化也可以后续转成bigWig用于epigenome浏览器展示。--SPMR则是对这两个信号做了文库大小标准化这样不同样本之间信号强度才有可比性。3.2 窄峰与宽峰q值、mfold、extend等参数的选择逻辑ChIP-seq的生物学问题不同峰的形态差异很大。转录因子如CTCF、FOXA1结合位点往往是几百bp内尖锐的单峰而组蛋白修饰如H3K27me3、H3K36me3则覆盖范围更大可能横跨几kb到几十kb。MACS2默认模式适合窄峰如果要处理组蛋白修饰这样的宽峰建议打开--broad模式macs2 callpeak -t H3K27me3.bam -c input.bam -f BAMPE -g hs -n H3K27me3 \ --broad --broad-cutoff 0.1 -B --SPMR--broad会把距离相近的显著性区域合并成大区域同时重新计算一个宽峰范围的显著性。对组蛋白修饰数据我一般把--broad-cutoff放宽到0.1因为宽峰的信号强度通常不如转录因子尖锐用太严格的阈值会丢失真实区域。还有个参数容易被忽视--extsize。当使用--nomodel时MACS2不再根据双峰分布建模估计片段长度而是直接用--extsize指定的值将reads朝3端方向延伸。什么时候需要比如转录因子ChIP-seq中双峰模式不明显或者做ATAC-seq时此时建议用BAMPE直接读插入片段。以我的经验单端50bp的reads做转录因子分析--extsize设100200之间都算合理。另外--mfold和--pvaluemfold控制富集倍数筛选范围默认5-50意思是在建模型时只使用富集倍数在5到50之间的候选峰。对于深度较低的数据可以把下界调到3比如--mfold 3 50模型会更稳健。3.3 输出文件详解每个文件都有什么用跑完MACS2输出目录里会出现一堆文件新手常常看得一头雾水。我整理了最常见的几个文件后缀内容与用途_peaks.narrowPeak核心结果窄峰列表BED64格式染色体、起始、结束、名称、峰值分数、链、富集倍数、p值、q值、峰顶位置_peaks.broadPeak宽峰结果格式类似narrowPeak但不含峰顶位置_peaks.xlsExcel可读的峰表格包含更详细的注释列_summits.bed每个peak的最高点summit位置做motif分析时通常用这个文件_treat_pileup.bdg处理组reads覆盖度信号可转bigWig_control_lambda.bdg对照组背景模型的λ值信号_model.rR脚本重现MACS2建模的图形_peaks.gappedPeak宽峰模式的另一种输出格式记录peak内部的gap.narrowPeak的前几列长这样chr1 10500 10850 WT_TF_peak_1 142 . 9.85212 24.52421 35.11421 168第7到第10列分别对应富集倍数fold enrichment、-log10(p-value)、-log10(q-value)、相对于peak起始位置的峰顶点偏移量。信号越强这几列的数字越大。3.4 有生物学重复怎么办项目做得正规了肯定会有生物学重复——这是ChIP-seq实验的基本要求。处理重复样本的策略有两种策略一合并BAM文件后再callpeak。适合重复样本间相关性高、信号一致性好的情况简单直接信号强度叠加后更容易识别出弱峰。策略二每个样本单独callpeak然后对peak集合取交集或并集。适合考察重复样本间的一致性实际分析中常用至少在两个重复里出现或在50%以上的重复里出现来筛选稳健的peak。就我个人而言如果没有特殊要求更倾向于先把重复样本的BAM合并然后再做peak calling之后用IDRIrreproducible Discovery Rate分析来评估重复样本间的可重复性。如果你手头有两个以上的重复样本IDR是目前最被认可的重复评估方法通过idr工具就能完成。4. 实操流程从BAM到可视化完整走一遍4.1 分析流程总览标准流程大致包括数据比对、过滤与排序、MACS2 peak calling、peak注释与可视化。下面以实际项目常用的命令串一遍。假设比对用的Bowtie2把原始reads比对到人类参考基因组bowtie2 -p 8 -x /path/to/hg38/index -1 sample_R1.fastq.gz -2 sample_R2.fastq.gz -S sample.sam samtools view -bS sample.sam sample.bam samtools sort - 8 -o sample.sorted.bam sample.bam samtools index sample.sorted.bam对ChIP-seq数据比对前建议先用fastp或Trimmomatic去除adapter和低质量碱基比对后可以加-F 1804过滤掉unmapped、secondary、QC fail等比对记录。这一步能明显减少MACS2计算量。4.2 跑MACS2把每一步都跑明白数据处理完毕正式进入peak calling环节。下面这一段是ChIP-seq分析中非常典型的命令组合# 创建一个输出目录 mkdir -p macs2_out # 双端数据有对照窄峰模式 macs2 callpeak \ -t WT_rep1.sorted.bam WT_rep2.sorted.bam \ -c input.sorted.bam \ -f BAMPE \ -g hs \ -n WT_TF \ -q 0.05 \ -B --SPMR \ --outdir macs2_out 2 macs2_out/macs2.log命令里-t后面可以同时接多个BAM文件MACS2会先合并再分析这样就不用自己预先合并。2 macs2.log把运行日志保存下来方便排查问题。运行结束在macs2_out目录下查看输出ls -lh macs2_out/ wc -l macs2_out/WT_TF_peaks.narrowPeakwc -l会告诉你一共识别出多少个peaks。我习惯先看这个数字再判断是否合理。一般转录因子在人类样本中能识别出几千到几万个peak如果一眼望去几十万个甚至上百万八成是参数或输入数据有问题。4.3 下游处理把bedGraph转成bigWig用于可视化要拿到UCSC Genome Browser或者IGV里看信号图bigWig比bedGraph更高效——前者是二进制索引格式加载快、支持远程访问。转换工具推荐bedGraphToBigWig需要准备一个基因组染色体大小文件# 生成染色体长度文件hg38 samtools faidx /path/to/hg38.fa cut -f1,2 /path/to/hg38.fa.fai hg38.chrom.sizes # 将bedGraph转换为bigWig bedGraphToBigWig macs2_out/WT_TF_treat_pileup.bdg hg38.chrom.sizes WT_TF_treat.bw这个文件载入IGV后就能看到每个位点上的reads信号分布非常直观。4.4 Peak注释找到峰对应的基因和功能区域拿到peak列表只是第一步更重要的生物学问题是这些peak落在哪些基因上在启动子还是增强子区域常用的注释工具是R包ChIPseeker。library(ChIPseeker) library(TxDb.Hsapiens.UCSC.hg38.knownGene) peakfile - macs2_out/WT_TF_peaks.narrowPeak peak - readPeakFile(peakfile) txdb - TxDb.Hsapiens.UCSC.hg38.knownGene peakAnno - annotatePeak(peak, TxDb txdb, annoDb org.Hs.eg.db, level gene) plotAnnoPie(peakAnno)运行后能得到一个饼图展示peak在启动子、外显子、内含子、基因间区等不同区域的分布占比。如果做的是转录因子通常启动子和增强子区域的比例会偏高这也是一种质量验证手段。5. 常见问题排查与经验总结5.1 问题速查表这些年在多个项目里踩过的坑整理成一张表给需要的同学参考。现象可能原因解决方案Peak数量异常多上百万有效基因组-g设置错误未加对照reads比对质量差核对-g值确认是否有对照比对后过滤低质量readsPeak数量几乎为0q值阈值过严read深度太低比对出了问题放宽-q到0.1检查BAM比对效率确认样本测序深度双端数据跑出来峰形状怪异未使用-f BAMPEMACS2错误估算了片段长度显式指定-f BAMPE输出huge信号、IGV里看起来全是背景没有加--SPMR标准化或者样本间测序深度差异太大加--SPMR必要时做downsampling染色体显示不一致明比对率很高但peak很少BAM和参考基因组染色体命名不一致chr1 vs 1统一命名samtools view替换染色体名或用--keep-dup检查宽峰类型数据peak被切割成很多小碎段没有开--broad模式加--broad --broad-cutoff 0.1内存报错或运行极慢--nomodel--extsize重复扫描窗口比对文件过大增加服务器内存过滤PCR重复考虑按染色体分块结果中对照样本的peak也很多抗体特异性差背景过高检查QC指标考虑换抗体或者增加对照深度5.2 三个必须养成的习惯第一跑之前先做染色体命名检查。samtools view sample.bam | head看一下染色体名是否是chr1格式再对比参考基因组的fasta序列两边不一致就先统一否则MACS2可能什么都跑不出来或者跑出来一堆无意义的跨染色体富集。第二不要迷信默认参数但也不要乱调参数。默认参数适合大多数标准ChIP-seq数据可一旦你的数据来源特殊比如低深度、单端、无对照就要主动调整。一个简单方法是同一份数据分别用-q 0.05和-q 0.01跑一次对比peak数量和peak长度分布判断结果是否稳定。第三一定要看_model.r脚本对应的模型图。MACS2会根据reads分布估计片段长度这个分布是否合理直接反映数据质量。如果MACS2日志里报duplicate reads过多就要回到上游过滤步骤重新处理。5.3 踩过的一次幽灵峰大坑讲一个真实案例。有一年做某转录因子的ChIP-seq样品是双端测序。第一次跑MACS2我用的是默认-f AUTO结果峰数量高达30多万个——这明显不科学。当时百思不得其解后来比对IGV里的信号才发现因为没用BAMPE模式MACS2把成对的reads当成两个独立单端reads处理导致每个真正的富集区域被拆成两个相距约150-250bp的峰整体上峰数量被翻倍很多峰没有完整生物学区域。改成-f BAMPE之后峰数量降到约1.5万个再看信号分布每个富集区域只有一个完整的峰这才算正常。这次教训也让我深刻理解了一个事参数设置的本质是让分析算法更贴近实验数据的真实生成过程。双端测序的DNA片段在测序时已经天然告诉了片段长度强行让算法去猜当然会出错。5.4 信号可视化别只看表格眼睛比统计量更诚实MACS2给的峰列表再准确也不能替代肉眼看IGV。建议每次跑完peak后随机挑10-20个peak在IGV里人工核对一下信号形态。真正可靠的峰应该是处理组信号明显高于对照峰形比较规整且落在合理的基因组位置比如基因启动子或已知增强子区域。另外推荐一个小工具——deepTools里面的plotHeatmap和plotProfile。把所有peak对齐后画信号热图能一眼看出数据整体质量。如果绝大多数peak的信号都很弱、或者在不同样本间没有规律那说明实验或分析链路上还有问题先别急着做下游功能富集。以下是一段生成average profile的常用命令# 先对BAM建立索引再用deepTools计算信号矩阵 computeMatrix scale-regions \ -S WT_TF_treat.bw \ -R macs2_out/WT_TF_peaks.narrowPeak \ -b 1000 -a 1000 \ --missingDataAsZero \ -o matrix.gz plotProfile -m matrix.gz -o profile.png --dpi 150看到比较锐利、居中的信号峰基本可以说明peak calling结果可用。5.5 做组蛋白修饰宽峰分析时的独家经验组蛋白修饰数据的peak calling和转录因子完全是两类玩法。我处理H3K27me3和H3K36me3这类宽峰修饰时有几个经验心得。一是不要直接用默认的narrowPeak结果做差异分析。宽峰修饰的差异信号往往是区域的整体强弱变化而不是峰的有无。最好用--broad模式输出的大区域再结合multiBigwigSummary或RSEG这类工具做后续差异。二是阈值放宽不等于随便。有些文献会用--broad-cutoff 0.5来call宽峰但根据我的测试在很多细胞系数据里0.5会产生大量背景噪音区。稳妥的做法是先以0.1跑通流程用IGV抽检几个已知基因座比如HOX基因簇、发育相关基因确认peak确实覆盖了已知增强子区域再决定是否调整。三是注意组蛋白修饰的peak反向分布特性。H3K27me3往往在基因体上成片分布MACS2会在基因体上输出多个连续的小peak并用broad模式合并成一个大区域。如果你后续要做peak分配annotation建议把相邻500bp以内的peak合并为一个区域否则下游功能富集会被同一个基因反复计数。5.6 无参考基因组数据怎么处理有的同学可能会碰到模式物种之外的样本比如自己养的某个非模式生物细胞系。这时不能直接用-g hs或-g mm建议自己估算有效基因组大小。常见做法是取基因组所有N碱基以外的比对区域总长作为有效值或者直接用基因组总长度减去已知的重复区域长度用RepeatMasker输出。一个应急做法是把fasta中所有非ATCG字符剔除后计算长度# 粗略估算有效基因组长度的思路 zcat genome.fa.gz | grep -v ^ | tr -d Nn | wc -c这个值虽然粗糙但作为MACS2的-g参数已经够用。如果你做的是植物比如拟南芥参考基因组TAIR10的常用值是1.19e8水稻则约为3.6e8这些在网上也都能查到经验值。结尾想说的几句实在话MACS2用到现在快五年我的体会是这个工具本身并不复杂难的是理解实验设计、比对数据和统计学假设之间的关联。同样的命令有人能跑出漂亮的生物学故事有人跑出来的结果完全没法用差别往往就在细节上——有效基因组设对没有、双端模式用对没有、对照样本加没加、重复样本怎么处理。做数据分析的科学态度应该是先跑通再跑好最后跑明白。不要急着炫技先确保每一步的处理都符合数据本身的生成逻辑结果自然经得起推敲。希望这篇MACS2实战分享能帮你少踩几个坑。如果后续在参数调整或者下游分析上有什么迷惑欢迎交流。