[BioRuby-ja] Fwd: Bio::Alignment::EnumerableExtension#consensus
Naohisa GOTO
ngoto @ gen-info.osaka-u.ac.jp
2007年 7月 26日 (木) 15:29:14 UTC
後藤@阪大です。
On Thu, 26 Jul 2007 20:50:46 +0900
"遠藤大二" <dendoh @ rakuno.ac.jp> wrote:
> degenerated nuclotide は、consensus_iupac メソッドを使ってください。
>
> ffconsensus = ffa.alignment.consensus_iupac
>
> これで、今回障害になっていた問題は全て解決しました。
> .consensus_iupac のメソッド一つを理解できるか否かで2日分の作業が違ってしまいます。
>
> とりあえず、お礼申し上げます。
お役に立てて幸いです。
ドキュメントが、いまいち、わかりにくいのは、徐々に直していきたいと思います。
> 加えて、質問なのですが、mafftでは"-"で示されている
> ギャップがconsensusでは?にされています。この文字の選択については背景に意味があるのでしょうか。
BioPerlの実装に合わせただけで、深い意味はなかったと思います、たぶん。
実は、consensus_iupac は以下のようなギャップの取扱いを指定するための
オプションを取ります。consensus_string も同様のオプションを取りますが、
consensus_stringの第一引数は閾値である点は注意してください。
consensus_iupacでは、 :gap_mode => 0 と :gap_mode => 1 の
場合で、文字が?と-である点以外は違いがわからないのですが、
閾値の計算が絡む consensus_string では違いがわかると思います。
a = Bio::Alignment.new([
'aaaaaaaaccccgg',
'aaccggttggtttt',
'a-a-a-a-c-c-g-' ])
### consensus_string で閾値 1 と 0.5 の場合の例
# ギャップも普通の文字として扱う(ギャップを閾値計算時の分母分子両方にカウント)
# これがデフォルトの動作
p a.consensus_string(1.0, {:gap_mode => 0})
# "a?????????????"
# 閾値0.5
p a.consensus_string(0.5, {:gap_mode => 0})
# "aaa?a?a?c?c?g?"
# ギャップがあるサイトはギャップとして扱う(ギャップがあるサイトは必ず-になる)
p a.consensus_string(1.0, {:gap_mode => 1})
# "a-?-?-?-?-?-?-"
p a.consensus_string(0.5, {:gap_mode => 1})
# "a-a-a-a-c-c-g-"
# ギャップは計算から除外する(ギャップは閾値計算時に分母分子両方から除外)
p a.consensus_string(1.0, {:gap_mode => -1})
# "aa????????????"
p a.consensus_string(0.5, {:gap_mode => -1})
# "aaaaaaaaccccgg"
### consensus_iupac の例
# ギャップも普通の文字として扱う(よって、ギャップがあるサイトは?になる)
# これがデフォルトの動作
p a.consensus_iupac({:gap_mode => 0})
# "a?m?r?w?s?y?k?"
# ギャップがあるサイトはギャップとして扱う(ギャップがあるサイトは必ず-になる)
p a.consensus_iupac({:gap_mode => 1})
# "a-m-r-w-s-y-k-"
# ギャップは計算から除外する
p a.consensus_iupac({:gap_mode => -1})
# "aammrrwwssyykk"
> degenerated nuclotide は、mafft alignment で一件でも −
> が有ると ? になってしまいます。alignment の状況によっては −
> があっても善意に解釈したいときもあります。
という場合には、
a.consensus_iupac(:gap_mode => -1)
を使えば、とりあえずは、大丈夫だと思います。
もちろん、ギャップが何個以下だったら救出するが、それ以上だったら
ギャップ扱い、のような複雑なことをしようと思えば、自分独自の
ルーチンを組む必要があります。
このとき、each_site というイテレータを使えば便利と思います。
# さきほどのプログラムの続きとします
a.each_site { |x| p x }
これを実行すると
["a", "a", "a"]
["a", "a", "-"]
["a", "c", "a"]
["a", "c", "-"]
["a", "g", "a"]
["a", "g", "-"]
["a", "t", "a"]
["a", "t", "-"]
["c", "g", "c"]
["c", "g", "-"]
["c", "t", "c"]
["c", "t", "-"]
["g", "t", "g"]
["g", "t", "-"]
と表示されます。つまり、各サイトの内容をArray (より正確には、Arrayを
継承した Bio::Alignment::Site クラスのオブジェクト)に入れた内容で、
繰り返し実行してくれます。
--
後藤 直久 ngoto @ gen-info.osaka-u.ac.jp
大阪大学微生物病研究所 遺伝情報実験センター ゲノム情報解析分野(安永研)
Phone: 06-6879-8365 / FAX: 06-6879-2047
BioRuby-ja メーリングリストの案内