はじめに
ゲノム研究の世界へようこそ!近年、次世代シーケンサー(NGS)技術の急速な発展により、膨大な量のゲノムデータが日々生成されています。これらのデータを効率的に解析し、生物学的な意味を見出すためには、強力なバイオインフォマティクスツールが不可欠です。
bedtools
は、まさにそのようなツールの一つです。ゲノム上の領域(フィーチャー)を比較したり、操作したりするための多機能ツールキットであり、ゲノム研究における「スイスアーミーナイフ」のような存在と言えるでしょう。特に、BED (Browser Extensible Data) 形式のファイルを扱うことに長けていますが、BAM, GFF/GTF, VCF など、ゲノム研究で広く使われている様々なファイル形式に対応しています。
bedtools
を使うことで、例えば以下のようなことが可能になります:
- 2つのフィーチャーセット間で重複する領域を見つける (intersect)
- 重複または近接するフィーチャーを統合する (merge)
- あるフィーチャーセットから別のフィーチャーセットを除く (subtract)
- 指定した領域のゲノムカバレッジを計算する (coverage, genomecov)
- ゲノム上の最も近いフィーチャーを探す (closest)
- BEDファイルで指定した領域の配列を取得する (getfasta)
このブログ記事では、bedtools
の基本的な使い方から、主要なサブコマンドの機能と実践的な使用例までを詳しく解説していきます。この記事を通して、bedtools
を使いこなし、ゲノムデータ解析の効率を飛躍的に向上させるための一歩を踏み出しましょう!
BEDフォーマットについて
bedtools
を理解する上で、まずBEDフォーマットについて知っておく必要があります。BEDフォーマットは、ゲノム上のフィーチャーやアノテーションを表現するためのシンプルで柔軟なテキスト形式です。UCSC Genome Browser で開発され、ゲノム研究コミュニティで広く使われています。
BEDファイルはタブ区切りのテキストファイルで、各行が1つのフィーチャーを表します。最低3つの必須列と、最大9つのオプション列、合計12列まで持つことができます。
必須列
列 | フィールド名 | 説明 |
---|---|---|
1 | chrom | 染色体またはスキャフォールド名 (例: chr1, chrX, scaffold10671) |
2 | chromStart | フィーチャーの開始位置 (0-based)。ゲノム上の最初の塩基は 0 と数えられます。 |
3 | chromEnd | フィーチャーの終了位置 (1-based)。chromEnd 自身はフィーチャーに含まれません(半開区間 [start, end))。例えば、chromStart=9, chromEnd=20 は塩基番号 9 から 19 までの領域を指します (UCSCの定義では 1-based end で、塩基番号 10 から 20 を含むと解釈されることもあります。bedtoolsは 0-based start, 1-based end を採用しています)。 |
オプション列
列 | フィールド名 | 説明 |
---|---|---|
4 | name | フィーチャー名 (例: GeneA, Exon3) |
5 | score | スコア (0-1000)。bedtools では任意の文字列も許容されます。 |
6 | strand | ストランド (+, -, .) |
7 | thickStart | 太く表示する領域の開始位置 (CDS開始位置など) |
8 | thickEnd | 太く表示する領域の終了位置 (CDS終了位置など) |
9 | itemRgb | RGB値 (例: 255,0,0) |
10 | blockCount | ブロック(エクソンなど)の数 |
11 | blockSizes | 各ブロックのサイズ (カンマ区切り) |
12 | blockStarts | 各ブロックの開始位置 (chromStartからの相対位置、カンマ区切り) |
bedtools
の多くのツールは、最初の3列(chrom, chromStart, chromEnd)があれば動作します。ただし、intersectBed
, coverageBed
, genomeCoverageBed
, bamToBed
などの一部のツールでは、-split
オプションを使用することで、BED12形式のブロック情報(エクソンなど)を考慮した解析が可能です。
座標系の注意点: BEDフォーマットは 0-based start, 1-based end を採用しています。これは、ゲノム上の最初の塩基を 0 とし、開始位置はその塩基を含み、終了位置はその塩基を含まないことを意味します。例えば、chr1 0 100
は染色体1の最初の100塩基(0番目から99番目まで)を表します。他のフォーマット(GFFなど)は1-based start, 1-based end を使うことがあるため、フォーマット変換時には注意が必要です。
インストール
bedtools
のインストールは非常に簡単です。いくつかの方法がありますが、ここでは代表的な方法を紹介します。
Conda を使う方法 (推奨)
バイオインフォマティクス分野で広く使われているパッケージマネージャー Conda (特に Bioconda チャンネル) を利用するのが最も簡単で推奨される方法です。
まず、Conda がインストールされていることを確認してください。まだの場合は、Miniconda または Anaconda をインストールします。
次に、ターミナルで以下のコマンドを実行して Bioconda チャンネルを設定します(初回のみ)。
設定後、以下のコマンドで bedtools
をインストールできます。
これで bedtools
が利用可能になります。特定のバージョンをインストールしたい場合は、conda install bedtools=<バージョン番号>
のように指定します。
ソースコードからコンパイルする方法
最新の開発版を使いたい場合や、Conda を使わない環境では、ソースコードからコンパイルすることも可能です。
-
bedtools の GitHub リポジトリから最新版のソースコードをダウンロードするか、
git clone
します。 -
ソースコードディレクトリ内で
make
コマンドを実行します。 コンパイルには C++ コンパイラ (g++ など) が必要です。Linux では通常build-essential
パッケージ、macOS では Xcode Command Line Tools をインストールすることで導入できます。 -
コンパイルが成功すると、
bin/
ディレクトリ内にbedtools
実行ファイルが生成されます。このディレクトリにパスを通すか、実行ファイルをパスの通ったディレクトリ(例:/usr/local/bin
)にコピーします。
インストールが完了したら、ターミナルで以下のコマンドを実行して、バージョン情報が表示されれば成功です。
基本的な使い方
bedtools
は、単一の実行ファイルですが、多くのサブコマンドを持っています。基本的なコマンドの形式は以下の通りです。
- <サブコマンド>: 実行したい操作を指定します (例:
intersect
,merge
)。 - [オプション]: 各サブコマンドに固有の動作を制御するためのフラグです (例:
-wa
,-c
)。 - -a <入力ファイルA>: プライマリ(またはクエリ)となる入力ファイル。通常、BED, GFF, VCF, BAM 形式など。
- -b <入力ファイルB> …: 比較対象(またはデータベース)となる入力ファイル。複数指定できるサブコマンドもあります。
多くのサブコマンドは、標準入力 (stdin) からのデータを受け付け、標準出力 (stdout) に結果を出力します。これにより、パイプ (|
) を使って複数の bedtools
コマンドや他のUNIXコマンドを連結し、複雑な解析パイプラインを構築することが可能です。
bedtools
は、入力ファイルがタブ区切りであることを想定しています(BAMファイルを除く)。また、UNIX の改行コードを使用していることが前提です。
パフォーマンス向上のため、多くのサブコマンドでは入力ファイルを事前にソートしておくことが推奨されます(特にゲノムサイズが大きい場合)。ソートには sort -k1,1 -k2,2n
コマンドや bedtools sort
サブコマンドを使用します。ソート済みのファイルを使用する場合、-sorted
オプションを指定することで、メモリ使用量を抑え、処理速度を向上させることができます。
主要なサブコマンド詳説
bedtools
には多くのサブコマンドがありますが、ここでは特によく使われるものをいくつかピックアップして、その機能と使用例を詳しく見ていきましょう。
例として、以下の2つのBEDファイルを使用します。
exons.bed (エクソン領域):
repeats.bed (リピート領域):
genome.txt (ゲノムファイル – 染色体サイズ):
1. intersect 重複検出
intersect
は、bedtools
の中でも最もよく使われるサブコマンドの一つで、2つ以上のファイル間でフィーチャーが重複する領域を見つけます。
基本的な使い方:
出力:
デフォルトでは、ファイルAのフィーチャーのうち、ファイルBのいずれかのフィーチャーと少なくとも1塩基対重複する部分が出力されます。
よく使われるオプション:
-wa
: ファイルAの元のフィーチャー全体を出力します。-wb
: ファイルBの元のフィーチャー全体を出力します。-c
: ファイルAの各フィーチャーについて、ファイルBと重複したフィーチャーの数を報告します。-v
: ファイルBと全く重複しないファイルAのフィーチャーを出力します(いわゆる「not intersect」)。-f <fraction>
: ファイルAのフィーチャーのうち、重複部分がフィーチャー長の指定した割合以上の場合のみ出力します。-F <fraction>
: ファイルBのフィーチャーのうち、重複部分がフィーチャー長の指定した割合以上の場合のみ出力します。-r
:-f
,-F
と共に使用し、重複が reciprocal(相互的)に指定割合以上の場合のみ出力します。-s
: ストランドを考慮して重複を判定します(両方のファイルにストランド情報が必要です)。-loj
: Left Outer Join。ファイルAの各フィーチャーについて、重複するファイルBのフィーチャー(なければNULL)を報告します。
使用例:
2. merge 領域結合
merge
は、入力ファイル内の重複する、または指定した距離内にあるフィーチャーを結合して、1つの大きなフィーチャーにします。入力ファイルは事前にソートされている必要があります。
基本的な使い方:
出力 (repeats.bed をマージした場合):
よく使われるオプション:
-i <input>
: 入力ファイル (デフォルトは stdin)。-d <distance>
: 指定した距離(塩基対数)以内にあるフィーチャーも結合します。デフォルトは 0(つまり重複のみ)。-c <columns>
: マージされるフィーチャーの指定列に対して適用する操作を指定します。-o <operations>
:-c
で指定した列に対する操作(例: sum, min, max, collapse, count)。-s
: ストランドごとにマージします。-n
: マージされたフィーチャーの数を報告します。
使用例:
3. subtract 領域除去
subtract
は、ファイルAのフィーチャーから、ファイルBのフィーチャーと重複する部分を取り除きます。
基本的な使い方:
出力:
ファイルAのフィーチャーがファイルBのフィーチャーによって完全にカバーされる場合は、そのフィーチャーは出力されません。部分的に重複する場合は、重複しない部分が出力されます(フィーチャーが分割されることもあります)。
よく使われるオプション:
-A
: ファイルBと全く重複しないファイルAのフィーチャーのみを出力します(intersect -v
と同様)。-f <fraction>
: ファイルAのフィーチャーのうち、重複部分がフィーチャー長の指定した割合以上の場合にのみ、そのフィーチャー全体を削除(出力しない)。-s
: ストランドを考慮して除去します。
使用例:
4. complement 補集合領域
complement
は、指定されたゲノム全体から、入力ファイルで定義されたフィーチャー領域を除いた領域(補集合)を計算します。ゲノムのサイズ情報が必要です。
基本的な使い方:
出力:
よく使われるオプション:
-i <input>
: 入力ファイル。-g <genome>
: ゲノムファイル(染色体名とサイズをタブ区切りで記述)。
使用例: イントロン領域や遺伝子間領域を定義するのに使えます。
5. closest 最近傍領域
closest
は、ファイルAの各フィーチャーに対して、ファイルBの中で最も近いフィーチャー(重複していてもよい)を見つけます。
基本的な使い方:
出力 (一部):
出力には、ファイルAのフィーチャーと、それに最も近いファイルBのフィーチャー、そしてその間の距離が含まれます(重複する場合は -1)。
よく使われるオプション:
-d
: 距離情報も出力します(デフォルト)。-D a|b|ref|user
: 距離の計算方法を指定します。-s
: ストランドを考慮して最も近いフィーチャーを探します(逆ストランドのものは無視)。-t first|last|all
: 最も近いフィーチャーが複数(同距離)ある場合の挙動を指定します(デフォルトは all)。-N
: 重複しないフィーチャーのみを考慮します。
使用例:
6. genomecov ゲノムカバレッジ
genomecov
は、入力フィーチャーがゲノム全体をどれだけカバーしているかを計算します。ヒストグラム形式や塩基ごとのカバレッジ深度を出力できます。ゲノムサイズ情報が必要です。
基本的な使い方 (ヒストグラム):
出力 (ヒストグラム):
出力は、染色体(またはゲノム全体)、カバレッジ深度、その深度を持つ塩基数、ゲノムサイズ、その深度がゲノム全体に占める割合、を示します。
よく使われるオプション:
-ibam <input>
: BAMファイルを入力とします。-d
: 各塩基ごとのカバレッジ深度を出力します (BEDGRAPH形式に似る)。-bga
: カバレッジ深度が変化する区間を出力します (BEDGRAPH形式)。-split
: BAMファイルやBED12ファイルを扱う際に、スプライスジャンクション(イントロン)を考慮します。-pc
: ペアエンドリードを考慮し、フラグメント全体でカバレッジを計算します(BAM入力時)。-fs
: フラグメントサイズを指定します(シングルエンドリードでペアエンドのようにカバレッジ計算する場合)。-strand +|-
: 指定したストランドのみを考慮します。
使用例:
7. sort ソート
bedtools sort
は、BEDファイルをゲノム座標に基づいてソートします。多くのbedtools
コマンドはソートされた入力を要求したり、ソートされていると効率が向上するため、重要な前処理ステップです。
基本的な使い方:
これは、UNIX の sort -k1,1 -k2,2n
とほぼ同等の処理を行いますが、ゲノムファイル (-g
) を指定することで、辞書順でない染色体順序(例: chr1, chr2, …, chrX, chrY, chrM)にも対応できます。
よく使われるオプション:
-i <input>
: 入力ファイル。-g <genome>
: ゲノムファイル。染色体の順序を定義します。-faidx <fasta.fai>
: FASTAインデックスファイル (.fai
) をゲノムファイルとして使用します。
8. slop 領域伸縮
slop
は、BEDファイルの各フィーチャーのサイズを、指定した塩基数だけ両端または片側に拡張(または縮小)します。ゲノムサイズ情報が必要です。
基本的な使い方 (両側に50bp拡張):
出力 (exon1 の例):
よく使われるオプション:
-i <input>
: 入力ファイル。-g <genome>
: ゲノムファイル。染色体の境界を超えないように調整します。-b <bases>
: 両側に拡張/縮小する塩基数。負の値で縮小。-l <bases>
: 左側(ゲノム座標が小さい方)に拡張/縮小する塩基数。-r <bases>
: 右側(ゲノム座標が大きい方)に拡張/縮小する塩基数。-s
: ストランドを考慮します。-l
は上流、-r
は下流に対応します。-pct
:-b
,-l
,-r
で指定する値を塩基数ではなく、フィーチャー長の割合として解釈します。
使用例:
9. window ウィンドウ内重複
window
は、intersect
に似ていますが、ファイルAの各フィーチャーの周囲に指定したサイズの「ウィンドウ」を設定し、そのウィンドウ内にファイルBのフィーチャーが重複するかどうかを判定します。
基本的な使い方 (各エクソンの上下1000bpのウィンドウでリピートを検索):
よく使われるオプション:
-w <bases>
: ウィンドウサイズ(フィーチャーの両側に適用)。-l <bases>
: 左側(上流)のウィンドウサイズ。-r <bases>
: 右側(下流)のウィンドウサイズ。-l
,-r
は-w
より優先されます。-sw
: ストランドを考慮したウィンドウ(-l
が上流、-r
が下流)。-wa
,-wb
,-c
,-v
など、intersect
と同様のオプションも多く利用可能です。
使用例:
10. getfasta 配列取得
getfasta
は、BED/GFF/VCFファイルで指定されたゲノム領域に対応するDNA配列を、FASTAファイルから抽出します。
基本的な使い方:
よく使われるオプション:
-fi <fasta>
: 入力FASTAファイル。-bed <bed/gff/vcf>
: 領域を指定するファイル。-fo <output>
: 出力FASTAファイル。-name
: 出力FASTAのヘッダーに、BEDファイルのname列(4列目)を使用します。-s
: ストランド情報を考慮し、マイナスストランドの場合は相補鎖の配列を返します。-split
: BED12ファイルのブロック(エクソン)ごとに配列を抽出します。-tab
: 出力形式をタブ区切り(ヘッダー\t配列)にします。
使用例:
応用例
bedtools
は、その多様なサブコマンドとパイプラインによる組み合わせにより、様々なゲノム解析タスクに応用できます。
- ChIP-seq 解析:
- ピークコール結果(BED形式)と遺伝子アノテーション(GFF/BED形式)を
intersect
し、どの遺伝子の近くにタンパク質が結合しているかを調べる。 closest
を使って、各ピークに最も近い遺伝子を特定する。merge
を使って、近接するピークを結合する。- 複数のサンプルのピークデータ間で
intersect
やjaccard
を行い、共通または特異的なピークを特定する。 genomecov
やcoverage
を使って、特定の領域(プロモーター領域など)におけるリードのカバレッジを計算する。
- ピークコール結果(BED形式)と遺伝子アノテーション(GFF/BED形式)を
- バリアント解析 (VCF):
- VCFファイルと遺伝子アノテーションファイルを
intersect
し、エクソン領域やイントロン領域に存在するバリアントを抽出する。 window
を使って、特定の遺伝子の周辺(例: ±5kb)にあるバリアントを探す。- 複数のVCFファイル間で
intersect
を行い、サンプル間で共通するバリアントや、特定のサンプルに固有のバリアントを見つける。 subtract
を使って、既知のバリアントデータベース(dbSNPなど)に含まれるバリアントを除外し、新規候補バリアントを絞り込む。
- VCFファイルと遺伝子アノテーションファイルを
- RNA-seq 解析:
- アライメント結果(BAM形式)を
genomecov -split
で処理し、スプライシングを考慮した遺伝子発現量のカバレッジを計算する。 coverage
を使って、各エクソンや遺伝子ごとのリードカウントを行う。intersect -split
を使って、リードがどのエクソンにマップされているかを詳細に調べる。
- アライメント結果(BAM形式)を
- ゲノムアノテーション:
complement
を使って、遺伝子領域以外のゲノム領域(遺伝子間領域)を定義する。merge
を使って、重複するアノテーションフィーチャーを統合する。slop
を使って、遺伝子のプロモーター領域(例: TSSの上流2kb)を定義する。getfasta
を使って、特定のフィーチャータイプの配列を一括で取得する。
これらはほんの一例です。bedtools
の各サブコマンドのオプションを深く理解し、UNIX のパイプや他のコマンドラインツールと組み合わせることで、さらに複雑で高度な解析を行うことができます。
他のフォーマットとの連携
bedtools
は BED フォーマットを基本としますが、ゲノム研究で一般的に使用される他の主要なファイルフォーマットともシームレスに連携できます。
- BAM (Binary Alignment/Map):
- シーケンスリードのアライメント情報を格納するバイナリ形式。
- 多くの
bedtools
サブコマンド (intersect
,coverage
,genomecov
,window
など) は、-abam
オプションで BAM ファイルを直接入力として扱えます。 bamtobed
サブコマンドで BAM を BED または BEDPE (Paired-End BED) 形式に変換できます。bedtobam
で BED を BAM 形式に変換できます(主に視覚化目的)。bamtofastq
で BAM を FASTQ 形式に変換できます。- CRAM 形式もバージョン 2.28.0 以降サポートされています(htslib経由)。
- GFF/GTF (General Feature Format / Gene Transfer Format):
- 遺伝子や転写産物などのゲノムフィーチャーをアノテーションするためのタブ区切りテキスト形式。
- 多くの
bedtools
サブコマンドは GFF/GTF ファイルを入力として直接扱えます。 - 座標系が 1-based である点に注意が必要です。
bedtools
は内部で適切に処理しますが、他のツールとの連携時には意識する必要があります。
- VCF (Variant Call Format):
- ゲノム上のバリアント(SNP, Indel など)情報を格納するためのテキスト形式。
- 多くの
bedtools
サブコマンドは VCF ファイルを入力として直接扱えます。通常、染色体と位置情報 (POS列) を基に領域として解釈されます。 - VCF ファイルを BED ファイルに変換したい場合は、
awk
などのテキスト処理ツールを使うのが一般的です。例えば、SNP を1塩基の領域として BED に変換する場合:
- FASTA:
- ゲノム配列や遺伝子配列などを格納するテキスト形式。
getfasta
サブコマンドは、BED/GFF/VCF で指定された領域の配列を FASTA ファイルから抽出します。maskfasta
は、BED/GFF/VCF で指定された領域を FASTA ファイル上でマスク(Nなどに置換)します。nuc
は、指定領域内のヌクレオチド組成(A/C/G/T/N の割合など)を計算します。
このように、bedtools
は様々なフォーマットに対応しているため、異なる種類のデータセット間での比較や統合を容易に行うことができます。
まとめ
bedtools
は、ゲノム領域の比較、操作、アノテーションを行うための非常に強力で柔軟なコマンドラインツールスイートです。その多様なサブコマンドと、UNIX パイプラインとの親和性の高さにより、単純なタスクから複雑なゲノム解析パイプラインの構築まで、幅広いニーズに対応できます。
この記事では、bedtools
の基本的な概念、インストール方法、BEDフォーマットの概要、そして主要なサブコマンド (intersect
, merge
, subtract
, complement
, closest
, genomecov
, sort
, slop
, window
, getfasta
など) の使い方と応用例を紹介しました。また、BAM, GFF/GTF, VCF, FASTA といった他の標準的なゲノムファイルフォーマットとの連携についても触れました。
bedtools
を使いこなすことで、ChIP-seq、RNA-seq、バリアント解析など、様々なゲノム研究プロジェクトにおけるデータ解析の効率と質を大幅に向上させることが期待できます。
さらに深く学びたい方は、以下のリソースを参照することをお勧めします。
- bedtools 公式ドキュメント: https://bedtools.readthedocs.io/en/latest/ (非常に詳細で包括的な情報源です)
- bedtools GitHub リポジトリ: https://github.com/arq5x/bedtools2 (最新のコードやイシューを確認できます)
- bedtools 論文 (Quinlan & Hall, 2010): Bioinformatics, 26(6):841-2 (引用する際はこちら)
ぜひ bedtools
を活用して、ゲノムデータの中に隠された秘密を解き明かしてください! Happy analyzing!