アミノ酸・塩基の出現頻度

タンパク質を構成する各アミノ酸の出現頻度を調べることにより、そのタンパク質の構造や性能の推定に役立つ。例えば、球状タンパク質と繊維状タンパク質のアミノ酸構成を調べることによって新たな知見が得られるかもしれません。また、塩基配列については、ほとんどの場合は複数のコドンが 1 つのアミノ酸をコードする。各生物種によってどのコドンがよく利用されているかを調べることによって、生物の進化について何らかの知見が得られるかもしれません。

以下に、Perl を利用して文字列(アミノ酸配列または塩基配列)の出現頻度を調べるプログラムの例を示す。

use strict;
 
## countString 関数
## 文字列($seq)と調べるパターンの長さ($leng)を受け取り、$seqを長さ$lengずつ
## 読み込んでいき、出現頻度を調べていく。
sub countString {
  # 引数を受け取る
  my ($seq, $leng) = @_;

  # 頻度を保存するためのハッシュリファレンスを宣言
  my $count = {};

  # 文字配列をすべて小文字に変換する
  $seq =~ tr/A-Z/a-z/;
  my $seq_len = length($seq);
 
  # 読み込み開始位置を1ずつずらしながらパターンの頻度を調べる
  for (my $i = 0; $i < $seq_len; $i++) {
    # パターンを$str変数に保存
    my $str = substr($seq, $i, $leng);
    #「accac」を3文字に区切った場合はacc,cca,cac,ac,cのようになる。
    # 3文字を満たないacとcを除くには次のように、if文をつけて不適な
    # 長さを持つ配列をカウントしないようにする。
    if (length($str) == $leng) {
      $count->{absolute}->{$str}++;
    }
  }
  # 出現確率を計算するために、実際にカウントした回数を$count_sumに保存する
  my $count_sum = $seq_len - $leng + 1;
  # 出現確率を計算する
  foreach my $key (sort keys %{$count->{absolute}}) {
    $count->{relative}->{$key} = sprintf("%.5f", $count->{absolute}->{$key} / $count_sum);
  }
  return $count;
}
 

## countString 関数を利用してコドンの利用頻度(%)を調べる
my $nt_seq = 'AGTAGTA';
my $nt_result = &countString($nt_seq, 3);
foreach my $key (keys %{$nt_result->{relative}}) {
  print "$key :  $nt_result->{relative}->{$key}\n";
}


## アミノ酸の利用頻度(%)を調べる
my $aa_seq = 'TPEMPVLENK';
my $aa_result = &countString($aa_seq, 1);
foreach my $key (keys %{$aa_result->{relative}}) {
  print "$key :  $aa_result->{relative}->{$key}\n";
}

実行結果は次のようになる。

tag :  0.20000
gta :  0.40000
agt :  0.40000
e :  0.20000
n :  0.10000
v :  0.10000
m :  0.10000
l :  0.10000
p :  0.20000
k :  0.10000
t :  0.10000