CmhaDSO ChIP-seqデータ解析


ChIP-seqデータ解析手順の大略を示す。

chip
  1. ゲノム配列に対するリードの対応付けを行う(NGSデータ解析共通手順)。
  2. ゲノム上に対応付けられたリード分布情報から峰(peaksまたはdomains)と称する領域を検出する。
  3. 検出された峰に対して下流解析(モチーフ解析や注釈付与など)を行う。
本章ではデータの品質管理に関する考慮事項と上記項目2, 3(峰検出と下流解析)について略述する。

品質管理

シーケンス深度

シーケンス深度を十分に確保しないと峰検出がうまくいかないことは容易に想像できるであろう。 シーケンス深度がどのくらい必要とされるかは対照生物のゲノムサイズと対象タンパクの結合部位サイズに依存する。 ENCODEプロジェクトのデータ基準値に従えば、解析対象が マウス・ヒトの転写因子では20Mリード(またはリード対、以下同様)、 マウス・ヒトのヒストンでは Narrow Marks (H2AFZ, H3ac, H3K27ac, H3K4me2, H3K4me3, H3K9ac) の場合には20Mリード、 Broad Marks (H3F3A, H3K27me3, H3K36me3, H3K4me1, H3K79me2, H3K79me3, H3K9me1, H3K9me2, H4K20me1)やH3K9me3の場合には45Mリードを確保する必要があるとされる (これらのリード総数はゲノム上に対応付け後、品質管理のための各種フィルタリング後に残ったリードのみを算出対象としている)。 シーケンス深度が十分であるか否かは飽和解析を行うことで実験的に判断することができる。 シーケンス深度が不十分である場合にはtechnical replicatesデータどうしを合わせることなどを検討するとよい。

PCR duplicatesとライブラリの複雑さ

duplicate
[PMID:22955991]

ゲノム上の同一位置に対応付けられるリード(またはリード対)をduplicatesといい、natural duplicatesとPCR duplicatesに区別される。 前者はゲノム上の同一位置に由来するが相異なるDNA断片から得られたものであり、 後者はライブラリ調製時のPCR増幅過程で導入された同一DNA断片由来のコピーである。 すなわちChIP-seq実験結果において前者はシグナルであり、後者はノイズである。 免疫沈降効率が悪く、少量のDNA試料からPCR増幅して調製したライブラリ試料などは後者を多く含んでいる可能性が考えられる。 計算上、実データから両者を区別し後者のみを除外することは困難である。

ライブラリ中のPCR duplicatesの割合が多くなればなるほど、シーケンス深度を十分に確保しても有意義なデータが得られなくなっていくことが分かる。 そこでライブラリの複雑さを反映したduplicates率が品質管理の指標として利用されている(下図)。

complexity

complexity
[ENCODE: Terms and Difinitions]

duplicatesがPCRに由来するものか否かを判断する手段としてはBAMファイルをゲノムブラウザで可視化するとよい。 duplicates除去はPCR duplicates除去過程として一般的に確立されている。 BAMファイルを座標軸整序後にPicard MarkDuplicatesを適用することでデータファイル中のduplicatesを検出・除去することができる。

対照試料

control
PMID: 19122651

対照試料#のリードがゲノム上で完全にランダムに分布するならば対照試料は必要とされない。 すなわち背景分布として統計分布モデルを想定するだけで本来十分なはずである。 しかしながら実際には上図で端的に例示されているように、ChIP-seq実験には対照試料が必要である。 明らかに対照試料(input DNA)のリードは完全にランダムに分布せず多くの峰を確認することができ、 各峰と一致した位置に目的試料(Pol II免疫沈降試料やSTAT1免疫沈降試料)の峰を確認することができる。 それゆえ目的試料における峰がシグナルであるかノイズであるかの判断には対照試料が必要とされることが分かる。 対照試料が有効な背景分布情報を提供するためには目的試料と同程度以上のシーケンス深度が要求される。

# 対照試料には断片化後DNA(input DNA)やそれをIgGで免疫沈降した試料(IgG control)などが使用される。 IgG controlの方がinput DNAよりも実験操作をより模倣しているが、免疫沈降後のDNA回収量が十分でなければ新たなバイアスを導入する原因となりうる。

Exclusion list regions

ゲノム中にはクロマチンアクセシビリティが他と著明に異なる領域やアライメント不明瞭領域などの偽シグナル源となる特殊領域が知られており、これらも峰検出等を行う前に除去すべきである。 そのような領域の包括的な一覧がENCODEから提供されている ENCODE DAC Exclusion List Regions)。

品質指標

strand cross-correlation

峰検出とは独立して、S/N比を評価することができる代表的な手法にstrand cross-correlationがある。 これは免疫沈降後DNA断片のクラスター形成度を測定する指標であり、次の事実観察に基づいている。

  1. ChIP-seq実験がうまくいっている場合には、目的のタンパクの結合部位にDNAシーケンスタグの有意なクラスター形成がみられる。
  2. 正・負鎖上に濃縮されたDNAシーケンスタグは結合部位中央からDNA断片長分布に依存する距離だけ隔てて位置する。

この指標の測定値は正・負鎖間の相互相関、すなわち負鎖をk塩基ずつシフトさせていく過程における正鎖のカバレッジと負鎖のカバレッジとの間におけるピアソン線形相関係数として算出される。

cross_cor
[ChIP-seq Quality Assessment]

シフト値を横軸方向、係数値を縦軸方向にとりプロットすると、リード長やDNA断片長に対応するシフト位置に峰が形成されるのが一般的である。 断片長位置の係数値と背景係数値との間の比率をNSC(normalized strand cross-correlation coefficient)、 背景係数値で補正後の断片長位置の係数値とリード長位置の係数値との間の比率をRSC(relative strand cross-correlation coefficient)といい、 これらはS/N比を反映する品質指標として利用されている。 NSC>1.05, RSC>0.8が良好な結果の目安とされている。

cross_cor1 cross_cor2
[PMID:22955991]

replicatesの取扱い

bedtools
IDR

Irreproducible Discovery Rate(IDR): 順位付けされた峰一覧のペアを比較

Output file format (narrowPeakが入力ファイルの場合)

はじめの10列はnarrowPeakと同形式であり、2つのreplicateのmerged peaksに関するものである。 7-10列目はランキングに使用したもののみその値が設定され、他は-1に設定される。

  1. 染色体名
  2. 始端位置
  3. 終端位置
  4. ピーク名
  5. scaled IDR: min(int(log2(-125IDR)), 1000), idr=0.05のスコア値は540である。
  6. シグナル値
  7. p値
  8. q値
  9. peakの頂点
  10. local IDR: irrepproducible noiseに属するピークの事後確率に相当する。
  11. global IDR: scaled IDRの算出に使用される値であり、多重検定補正の際にFDRを計算するために使用されるp値と同類である。
  12. rep1 始端位置
  13. rep1 終端入り
  14. rep1 シグナル値
  15. rep1 頂点
  16. rep2 始端位置
  17. rep2 終端位置
  18. rep2 シグナル値
  19. rep2 頂点

Bedtools

IDR

Irreproducible Discovery Rate(IDR): 順位付けされたpeak listのペアを比較 replicatesの処理

Output file format (narrowPeakが入力ファイルの場合)

はじめの10列はnarrowPeakと同形式であり、2つのreplicateのmerged peaksに関するものである。 7-10列目はランキングに使用したもののみその値が設定され、他は-1に設定される。

  1. 染色体名
  2. 始端位置
  3. 終端位置
  4. ピーク名
  5. scaled IDR: min(int(log2(-125IDR)), 1000), idr=0.05のスコア値は540である。
  6. シグナル値
  7. p値
  8. q値
  9. peakの頂点
  10. local IDR: irrepproducible noiseに属するピークの事後確率に相当する。
  11. global IDR: scaled IDRの算出に使用される値であり、多重検定補正の際にFDRを計算するために使用されるp値と同類である。
  12. rep1 始端位置
  13. rep1 終端位置
  14. rep1 シグナル値
  15. rep1 頂点
  16. rep2 始端位置
  17. rep2 終端位置
  18. rep2 シグナル値
  19. rep2 頂点

峰検出

ゲノム上に対応付けられたリードの領域毎カウントまたは分布形状の情報に基づき峰(ピーク)が定義・検出される。 前者は定義された領域に属するリード数を数え、統計的に有意なリード数を有する領域を峰とする。 後者はリードの空間的分布をモデル化し、リード分布が結合部位近傍の期待分布に適合する場合に峰とする。

MACS2

峰の位置の特定
peak_shift
[PMID:20628599]
MACS2 predictdによるフラグメント長の推測

正鎖上の峰と逆鎖上の峰との距離dを定義し、全リードd/2だけ3'端側にシフトすることで正確な結合部位の位置特定を改善する。

峰の対を検出し、シフトモデルを構築するためにmacs2 predictdはデータ全域を走査する。 区間中のfold-enrichmentを-m 5,20のように指定すれば背景分布に対して5-20倍濃縮されたものを峰とする。

macs2 predictd -i xxx.bed -g hs -m 5 20
MACS2 callpeak

macs2 callpeakはduplication除去、断片長予測、ピークコールの全てを実行するラッパー関数である。

# For help: macs2 callpeak -h

# For ChIP-seq
macs2 callpeak   \
  -t in.bam      \
  -g hs          \
  -p 1e-5        \
  -f BAM         \
  -B             \
  -n prefix      \
  --outdir outdir

  # 既定ではnarrow peakを検出する。
  # broad peaksを検出する場合は--broadを付与する。
  # コントロール試料がある場合は-c CONTROL.bamを付与する。 
  # -g 生物種(mm|hs)
  # -B: bigbed出力


# For ATAC-seq
macs2 callpeak    \
  -t in.bam       \
  -g hs           \
  -p 1e-5         \
  -f BAM          \
  -B              \
  -n prefix       \
  --outdir outdir \
  --nomodel               \
  --shift -read_length    \
  --extsize 2xread_length

  # リード長50bpなら--nomodel --shift -50 --extsize 100を追加する。

MACSの出力結果
_peaks.narrowPeak:
峰の位置情報を表すBED6+4形式ファイル(頂点位置、p値やq値も含む)。
_peaks.xls:
峰情報に関するファイルでpileupやfold enrichmentの情報も含む。
_summits.bed:
各峰の頂点位置を表す。
_model.r:
解析モデルに関するPDFイメージを出力するためのRスクリプト。
_control_lambda.bdg:
対照試料(bedGraph形式)
_treat_pileup.bdg:
目的試料(bedGraph形式)

下流解析

峰の重なり抽出

別章で述べたように範囲データの操作にはbedtoolsを利用する。

# AのうちBと重なるものを標準出力する
bedtools intersect -u -a A.narrowPeak -b B.narrowPeak

# AのうちBと重ならないものを標準出力する
bedtools intersect -v -a A.narrowPeak -b B.narrowPeak

BAM-BIGWIG変換

IgGで可視化するなどの目的のためにBAM-BIGWIG変換を行う。 BAMファイルは座標軸で整序され、索引付けされたものである必要がある。

# BAM/BIGWIG変換 (bamCoverage from deeptools)
bamCoverage -b in.bam              \
            -o out.bw              \
            -of bigwig             \
            --normalizeUsing CPM

ピーク分布の可視化

deeptoolsを利用しTSSなどの周りのピーク分布を確認する。

# 前処理/ TSS周囲のピーク分布を調べる場合
computeMatrix scale-regions \
              --regionsFileName genome.gtf \
              --scoreFileName xxx.bw \
              --outFileName xxx.gz \
              --upstream 1000 \
              --downstream 1000 \
              --skipZeros

# 前処理/ 参照頂点を指定しその周囲のピーク分布を調べる場合
computeMatrix reference-point \
              --referencePoint center \
              --regionsFileName refPoint.summits.bed \
              --scoreFileName xxx.bw \
              --outFileName xxx.gz \
              --upstream 1000 \
              --downstream 1000 \
              --skipZeros

# Metagene Plot
plotProfile -m xxx.gz -out xxx.pdf

# Heatmap
plotHeatmap -m xxx.gz -out xxx.pdf

スーパーエンハンサー検出

ROSEを利用してSuperEnhancer検出を実行する。 cmhadsoシステムの参照項目(-r)からROSE.1.tar.gzを検索・入手・展開する。 また依存ソフトウェア(samtools, R version > 3.4, bedtools > 2, Python2) を導入する。 入力データであるBAMファイル及びピーク情報ファイル(MACS2などの出力: xxx_peaks.narrowPeak)をROSE.1配下に置く。 両ファイルとも染色体名は"chr"から始まる必要がある。 前準備として、peak2gff.1.shスクリプトを編集・実行しピーク情報をROSEプログラムの入力ファイル形式に合わせる。

# peak2gff.1.shスクリプト
INF=xxx_peaks.narrowPeak
OUTF=xxx_peaks.gff

cat $INF |
awk 'BEGIN{FS=OFS="\t"}{
	print $1,$4,"*",$2,$3,$5,$6,0,$4
}' > $OUTF

現状のファイル構成は以下の通りである。

ROSE.1
├── ROSE_main.py
├── ROSE_bamToGFF.py
├── ROSE_callSuper.R
├── ROSE_utils.py
├── annotation
│   ├── README
│   ├── hg38_refseq.ucsc
│   ├── hg38_refseq_select.ucsc
│   ├── mm39_refseq.ucsc
│   └── mm39_refseq_select.ucsc
├── peak2gff.1.sh
├── ROSE.1.sh
├── xxx.bam
├── xxx_peaks.narrowPeak
└── xxx_peaks.gff

ROSE.1.shスクリプトからROSEプログラムを実行する。

# ROSE.1.sh: ROSEプログラム実行スクリプト
# Required software
#   samtools
#   R version > 3.4
#   bedtools > 2
#   python2

# INPUT/OUTPUT
INPUT_CONSTITUENT_GFF=xxx_peaks.gff
RANKING_BAM=xxx.bam
OUTPUT_DIRECTORY=xxx
#CONTROL_BAM=xxx.bam    # if needed

# Annotatipn
GENOME_BUILD=mm39s
  # mm39: mm39_refseq.ucsc
  # mm39s:mm39_refseq_select.ucsc
  # hg38: hg38_refseq.ucsc
  # hg38s:hg38_refseq_select.ucsc

# パラメータ
STITCHING_DISTANCE=12500
TSS_EXCLUSION_ZONE_SIZE=2500

# 実行
python ROSE.py                \
  -g $GENOME_BUILD            \
  -i $INPUT_CONSTITUENT_GFF   \
  -r $RANKING_BAM             \
  -o $OUTPUT_DIRECTORY        \
  -s $STITCHING_DISTANCE      \
  -t $TSS_EXCLUSION_ZONE_SIZE
  
  # -c $CONTROL_BAM   # if needed

xxx_peaks_AllEnhancers.table.txtが主要な出力データである。 その他、N_peaks_12KB_STITCHED_TSS_DISTAL_ENHANCER_REGION_MAP.txt, xxx_peaks_SuperEnhancers.table.txt, xxx_peaks_Enhancers_withSuper.bedなどはこれを抽出することで得られるため不要である。 タブ区切り9列構成(1:SE (stitched enhancer)ID, 2:chr, 3:SE start, 4:SE end, 5:stitchedされた構成エンハンサー数, 6:constituents size? , 7:N.BAM?, 8:enhancer rank, 9:isSuper)である。

峰の比較

モチーフ解析

MEME suite

MEME suiteは結合モチーフ解析ツールの一式であり、新規モチーフ探索にはMEMEやSTREME、モチーフエンリッチメント解析にはSEA、モチーフ走査にはFIMO、モチーフ比較にはTomTom、これらの統合解析にはXSTREMEやMEME-ChIPという専用ツールが提供されている。 MEME suiteではMEME形式( 仕様および 実例 )でモチーフデータの入出力を行う。

SEA

SEA (Simple Enrichment Analysis)は調査対象の塩基配列中に、どんな既知モチーフが多く含まれているかを調べるツールである。

sea --text --p input.fa --m MOTIF1.meme --m MOTIF2.meme ... > output.tsv

出力データはタブ区切りの17列(1:RANK, 2:DB, 3:ID, 4:ALT_ID, 5:CONSENSUS, 6:TP, 7:TP%, 8:FP, 9:FP%, 10:ENR_RATIO, 11:SCORE_THR, 12:PVALUE, 13:LOG_PVALUE, 14:EVALUE, 15:LOG_EVALUE, 16:QVALUE, 17:LOG_QVALUE)からなり、例えば以下のようにして必要な情報を取り出すとよい。

cat output.tsv |
grep .                |
grep -v '#'           |
awk 'BEGIN{FS=OFS="\t"}{
  print $1, $3, $4, $16, $5	
}'

ヒトやマウスにおける既知モチーフデータはCMHADSOシステムの参照データ(HOCOMOCO_12.tar.gzやJASPAR2024.tar.gz)から入手することができる。 その他の生物種やバージョンのものについてはJASPARやHOCOMOCOのWEBページから入手するとよい。

STREME

STREMEは調査対象の塩基配列中で頻出するモチーフを新たに発見するためのツールである。

streme --dna --text --p input.fa > output
FIMO

FIMO (Find Individual Motif Occurrences)は塩基配列を走査し、既知モチーフに対して個々マッチするか調べるツールである。

FIMO

Tomtomは調査対象のモチーフ群を既知のモチーフ群と比較し、順位付けするためのツールである。

fimo --oc OUTDIR MOTIF1.meme input.fa
tomtom --text qry.meme MOTIF1.meme MOTIF2.meme ...

注釈付与

ChIPpeakAnnoを利用する。

# 入力データ
gr <- toGRanges("xxx.narrowPeak", format = "narrowPeak", header = F)

# 遺伝子モデル
BiocManager::install("TxDb.....")
library(TxDb....)
gr_ann <- toGRanges(TxDb....)
seqlevels(gr) <- seqlevelsStyle(gr_ann)

# 峰を最近接TSSに対応させる
out <- annotatePeakInBatch(gr, AnnotationData = gr_ann)

# Pie chart
pie(table(out$insideFeature))

# 峰重なり領域の探索
ol <- findOverlapsOfPeaks(gr1, gr2)
makeVennDiagram(ol, NameOfPeaks = C("A", "B"))

overlaps <- ol$peaklist[["gr1", "gr2"]]
out <- assignChrmosomeRegion(
  overlaps,
  nucleotideLevel=F,
  precedence = c(
                  "Promoters",
                  "immediate Downstream",
                  "fiveUTRs",
                  "threeUTRs",
                  "Exons",
                  "Introns"),
  TxDb = TxDb....)

pie(out$percentage)

機能解析

ピーク座標(xxx.narrowPeakなど)をBED形式に変換し、GREATの入力データとする。 ピークに対する遺伝子の割付けはTwo nearest genesを選択すればよい。

遺伝子制御ネットワーク

既存データ(ChIP-atlas)の利用

CMHADSOシステムの参照データ(chipatlas_20240806.tar.gz)

素材

Lander-Waterman式[PMID: 3294162]: カバレッジの重複度の理論値はLN/G (Lはリード長、Nはリード数、Gはパプロイドゲノム長)

ゲノム上においてリードを一意的に対応づけ可能な配列の割合をmappabilityという。 当然リードが長いほどmappabilityが増加する。