*はじめに [#n431f325]
開発中の相同性検索ツール(配列が類似しているたんぱく質を検索するツール)の性能を評価するために,シロイヌナズナのたんぱく質データを人工的に生成しました.
たんぱく質の数は30,000,長さはすべて1,000としています.
*生起確率のみに基づく生成プログラム [#c9a7cdf6]
FASTAフォーマットで保存されている''At_GB_all_prot.gz''を読み込んで,各アミノ酸の生起確率に基づいて人工的に生成した長さ1,000のたんぱく質30,000本をFASTAフォーマットで出力し,''At_GB_all_prot_art.gz''に保存します.
FASTAフォーマットで保存されている''At_GB_all_prot.gz''を読み込んで,各アミノ酸の生起確率に基づいて人工的に生成した配列をFASTAフォーマットで出力し,''At_GB_all_prot_art.gz''に保存します.
Ruby 1.9用です.
#geshi(ruby){{
require 'zlib'
h = Hash.new # ハッシュ
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c|
h[c] = 0 # カウントを0に初期化
end
sum = 0 # 合計
Zlib::GzipReader.open('At_GB_all_prot.gz') do |gz| # 入力ファイル
gz.each do |l|
next if (l[0] == '>') # ヘッダ行はスキップ
l.chomp!.each_char do |c| # データ行から一文字ずつ取り出す
h[c] += 1
sum += 1
end
end
end
h.each do |key,value|
h[key] /= sum.to_f # 確率に変換
end
orig_name = "At_GB_all_prot_art" # 出力ファイルの名前
Zlib::GzipWriter.open(orig_name+".gz", Zlib::BEST_COMPRESSION) do |gz| # gzip圧縮
gz.mtime = Time.now
gz.orig_name = orig_name
30000.times do |i| # たんぱく質の数
gz.printf(">id|%08d\n", i);
1000.times do |j| # たんぱく質の長さ
r = rand
sum = 0
h.each do |key, value|
sum += value
if r <= sum then
gz.print key # アミノ酸を出力
gz.print "\n" if j % 80 == 79 # 80アミノ酸ごとに改行
break
end
end
end
gz.print "\n"
end
end
}}
*開始アミノ酸の生起確率と条件付き生起確率に基づく生成プログラム [#be4cbedd]
FASTAフォーマットで保存されている''At_GB_all_prog.gz''を読み込んで,開始アミノ酸の生起確率と直前のアミノ酸を条件とする条件付き生起確率に基づいて人工的に長さ1,000のたんぱく質30,000本をFASTAフォーマットで出力し,''At_GB_all_prot_art.gz''に保存します.
FASTAフォーマットで保存されている''At_GB_all_prog.gz''を読み込んで,開始アミノ酸の生起確率と直前のアミノ酸を条件とする条件付き生起確率に基づいて人工的に生成した配列をFASTAフォーマットで出力し,''At_GB_all_prot_art.gz''に保存します.
これも,Ruby 1.9用です.
#geshi(ruby){{
require 'zlib'
# 初期化
h = Hash.new # ハッシュ
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c1|
h[c1] = 0 # カウントを0に初期化
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c2|
h[c1+c2] = 0 # カウントを0に初期化
end
end
# カウント
sum = 0 # 合計
first = false;
Zlib::GzipReader.open('At_GB_all_prot.gz') do |gz|
gz.each do |l|
c = l[0]
if (c == '>') # ヘッダ行はスキップ
first = true
next
end
if first then # ヘッダ行の次の行
h[c] += 1 # 開始アミノ酸のカウント
sum += 1
first = false
end
for i in 0..(l.chomp!.length-2) do
token = l[i]+l[i+1] # バイグラムのトークン
h[token] += 1
end
end
end
# 確率計算
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c|
h[c] /= sum.to_f # 開始アミノ酸の生起確率に変換
end
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c1|
sum = 0 # 合計
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c2|
sum += h[c1+c2] # 合計
end
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c2|
h[c1+c2] /= sum.to_f # 条件付き確率に変換
end
end
# データ生成
orig_name = "At_GB_all_prot_art" # 出力ファイルの名前
Zlib::GzipWriter.open(orig_name+".gz", Zlib::BEST_COMPRESSION) do |gz| # gzip圧縮
gz.mtime = Time.now
gz.orig_name = orig_name
30000.times do |i| # たんぱく質の数
gz.printf(">id|%08d\n", i);
r = rand
sum = 0
c1 = "c"
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c|
sum += h[c]
if r <= sum then
gz.print c # 開始アミノ酸を出力
c1 = c
break
end
end
2.upto(1000) do |j| # たんぱく質の長さ
999.times do |j| # たんぱく質の長さ(開始アミノ酸を除く)
r = rand
sum = 0
"ABCDEFGHIKLMNPQRSTUVWXYZ".each_char do |c2|
sum += h[c1+c2]
if r <= sum then
gz.print c2 # アミノ酸を出力
c1 = c2
gz.print "\n" if j % 80 == 0 # 80アミノ酸ごとに改行
gz.print "\n" if j % 80 == 78 # 80アミノ酸ごとに改行
break
end
end
end
gz.print "\n"
end
end
}}
*参考情報 [#kfde024e]
-[[アミノ酸の生起確率を調べる>バイオ・データ・マイニング/アミノ酸の生起確率を調べる]] | とうごろうぃき
-[[アミノ酸の条件付き生起確率を調べる>バイオ・データ・マイニング/アミノ酸の条件付き生起確率を調べる]] | とうごろうぃき