GC%の分布のほかにもDNA配列の並びのパターンといいますか性質を調べるのに様々な測定量があります。たとえば、GC-skewですが、これは一本鎖DNAにおけるG含有量とC含有量のバイアスを表す指標で、(C-G)/(C+G) の式で表される測定量で、バクテリアの種によってはバイアス傾向が変わる個所が複製開始・終結地点と一致することが多いという指摘がなされていまして、積極的に生物学的意義付けもされています[2]。さて今回は、別の視点・方向からDNA配列の性質に迫ってみたいと思います。例によって前回のスクリプトを叩き台にして発展させます。
この連載の最初の方でPerlの導入に伴い、また世界物理年を祝ってw、ブラウン運動を取り上げました。その際にランダムウォークモデルを使って数値計算実験をして、拡散現象と正規分布の関係すなわちアインシュタインの関係式について論じました。要約しますと、ブラウン運動の実験事実の一つ「平均ニ乗変位σ^2が時間tに比例する」がアインシュタインの関係式であり、ブラウン粒子が原点からどれくらい離れたかという目安であるσは√tに比例します。
それでは、前回のヌクレオチド頻度を計算するスクリプトの以下の箇所を見てください。
foreach $base (@DNA){
if ($base eq 'a'){
++$count_a;
}elsif ( $base eq 't' ){
++$count_t;
}elsif ( $base eq 'g' ){
++$count_g;
}elsif ( $base eq 'c' ){
++$count_c;
}else{
print "Error! Can't recognize: $base\n";
++$errors;
}
}
という箇所です。これはDNA配列データを一文字ずつ読み、各塩基ごとにその数をカウントしています。このカウント作業を少しいじって、次の測定量を計算します。
一次元の仮想的な粒子を考えて、これをはじめ原点におく。DNA配列データを順に読み込み、ピリミジン (塩基T or C)が出現したら粒子を+1だけ動かし、プリン (塩基A or G)が出現したら粒子を-1だけ動かす。この操作をDNA配列の端から端まで行い、一次元の仮想粒子の軌道としてマッピングする。
すなわちゲノムのポジションを各時刻tとみなしたときに、DNA配列の並びによって仮想粒子の位置x(t)を順次決めていくという作業です。この手法はDNA walkとも呼ばれ、いかに各塩基組成 (この場合A+G or T+C)が局所的に変化するかを調べることに相当しています。DNA walkを計算するにはさきほどのカウントサブルーチンに手を加えることで実現できます。
1 #!/usr/bin/perl -w
2 # DNA walk
3
4 use strict;
5 use warnings;
6
7 my $DNA = '';
8 $DNA = read_gbk();
9 DNA_walk($DNA);
10
11 exit;
12
13 ##########################
14 # gbkファイルからDNAの読み込み
15 ##########################
16 sub read_gbk{
17 my $str;
18 my $DNA = '';
19 while(<>){ # 標準入力からデータ読み込む
20 if($_ =~ /^ORIGIN/){
21 while(<>){
22 if($_ =~ /^\/\//){last;} # "//"がファイルの最後
23 $str = $_;
24 $str =~ s/[0-9]//g; # 数字は取り除く
25 $str =~ s/\s//g; # 空白文字を取り除く
26 $DNA = $DNA.$str; # $strを1つの文字列$DNAへと連結する
27 }
28 }
29 }
30
31 return $DNA
32 }
33
34 ##########################
35 # DNA walk の計算
36 ##########################
37 sub DNA_walk{
38
39 my $t = 0;
40 my $x = 0;
41
42 my $errors = 0; # 塩基以外の文字エラーの数
43 my $base;
44
45 my ($DNA) = @_;
46 my @DNA = split( '', $DNA);
47
48 foreach $base (@DNA){
49 if ($base eq 'a'){
50 --$x;
51 }elsif ( $base eq 't' ){
52 ++$x;
53 }elsif ( $base eq 'g' ){
54 --$x;
55 }elsif ( $base eq 'c' ){
56 ++$x;
57 }else{
58 print "Error! Can't recognize: $base\n";
59 ++$errors;
60 }
61 printf("%d\t%d\n", $t, $x);
62 $t++;
63 }
64 }
実行結果
$ perl DNA_walk.pl < HUMHBB.gbk > HUMHBB.dw
$ head HUMHBB.dw
0 -1
1 -2
2 -3
3 -2
4 -1
5 0
6 1
7 0
8 -1
9 0
...
...
...
これを一次元のランダムウォークt-x(t)図になぞらえてプロットしますと、以下のように
なります。

おお、なんじゃこりゃ!!なんだか意味深なグラフが得られました。GC-skewのように塩基組成のバイアスをよく表していそうです。なぜなら仮想粒子は、塩基A or Gが固まって出現したときには一次元x軸上でプラス方向へ動き続けるからです。反対に、T or Cが連続して出現すればマイナス方向へ動き続け、結果として局所的な塩基組成の変化がこのt-x(t)グラフから読み取れることになります。
また、上のスクリプトでは A or Gという塩基に着目していますが、これも任意に変えることが
できます。そのマッピングルールとしては以下のようなものも考えられます。
---------------
SW C or G
RY A or G
KM G or T
---------------
蛇足ですが、DNA配列などのデータにはヌクレオチドのシンボルとして
以下のようなコード表が用いられていることが多いです。(詳細)
----------------------------
A アデニン (Adenine)
T チミン (Thymine)
G グアニン (Guanine)
C シトシン (Cytosine)
U ウラシル (Uracil)
M A or C
R A or G
W A or T
S C or G
Y C or T
K G or T
N 任意のヌクレオチド
----------------------------
References
[1] バイオインフォマティクスのためのPerl入門
[2] J.R. Lobry (1999) "Genomic Landscapes", Microbiology Today 26: 164-165.
http://www.socgenmicrobiol.org.uk/pubs/micro_today/pdf/049906.pdf