1

私は、Rosalind Bioinformatics Web サイト ( http://rosalind.info/problems/cons/ ) で「Consensus nd Profile」という問題に取り組んでいます。Web サイトのサンプル入力を使用してコードを試したところ、出力がサンプル出力と一致しました。しかし、より大きなデータセットを試してみると、ウェブサイトは私の出力が間違っていると言っていました. 私の問題がどこにあるかを特定するのを手伝ってくれる人はいますか? ありがとうございました!

サンプル入力:

>Rosalind_1
ATCCAGCT
>Rosalind_2
GGGCAACT
>Rosalind_3
ATGGATCT
>Rosalind_4
AAGCAACC
>Rosalind_5
TTGGAACT
>Rosalind_6
ATGCCATT
>Rosalind_7
ATGGCACT

DNA 文字列を抽出し、文字列と呼ばれるリストに保存しました (このステップではより大きなデータセットを使用した試行が正しいため、ここではコードを省略しました)。

['ATCCAGCT', 'GGGCAACT', 'ATGGATCT', 'AAGCAACC', 'TTGGAACT', 'ATGCCATT', 'ATGGCACT']

その後の私のコード:

#convert strings into matrix
matrix = []
for i in strings:
    matrix.append([j for j in i])
M = np.array(matrix).reshape(len(matrix),len(matrix[0]))

M は、サンプル入力では次のようになります。

[['A' 'T' 'C' 'C' 'A' 'G' 'C' 'T']
 ['G' 'G' 'G' 'C' 'A' 'A' 'C' 'T']
 ['A' 'T' 'G' 'G' 'A' 'T' 'C' 'T']
 ['A' 'A' 'G' 'C' 'A' 'A' 'C' 'C']
 ['T' 'T' 'G' 'G' 'A' 'A' 'C' 'T']
 ['A' 'T' 'G' 'C' 'C' 'A' 'T' 'T']
 ['A' 'T' 'G' 'G' 'C' 'A' 'C' 'T']]

その後の私のコード:

#convert string matrix into profile matrix
A = []
C = []
G = []
T = []
for i in range(len(matrix[0])):
    A_count = 0
    C_count = 0
    G_count = 0
    T_count = 0
    for j in M[:,i]:
        if j == "A":
            A_count += 1
        elif j == "C":
            C_count += 1
        elif j == "G":
            G_count += 1
        elif j == "T":
            T_count += 1
    A.append(A_count)
    C.append(C_count)
    G.append(G_count)
    T.append(T_count)

profile_matrix = {"A": A, "C": C, "G": G, "T": T}
for k, v in profile_matrix.items():
    print k + ":" + " ".join(str(x) for x in v)

#get consensus string
P = []
P.append(A)
P.append(C)
P.append(G)
P.append(T)
profile = np.array(P).reshape(4, len(A))
consensus = []
for i in range(len(A)):
    if max(profile[:,i]) == profile[0,i]:
        consensus.append("A")
    elif max(profile[:,i]) == profile[1,i]:
        consensus.append("C")
    elif max(profile[:,i]) == profile[2,i]:
        consensus.append("G")
    elif max(profile[:,i]) == profile[3,i]:
        consensus.append("T")
print "".join(consensus)

これらのコードは、正しいサンプル出力を提供します。

A:5 1 0 0 5 5 0 0
C:0 0 1 4 2 0 6 1
T:1 5 0 0 0 1 1 6
G:1 1 6 3 0 1 0 0
ATGCAACT

しかし、より大きなデータセットを試してみると、ウェブサイトは私の答えが間違っていると言っていました.誰かが私が間違っているところを指摘できますか? (初心者ですがよろしくお願いします!)

4

1 に答える 1

1

あなたのアルゴリズムはまったく問題ありません。@C_Z_が指摘したように、「フォーマットがサンプル出力と正確に一致することを確認してください」と残念ながらそうではありません。

print k + ":" + " ".join(str(x) for x in v)

する必要があります

print k + ": " + " ".join(str(x) for x in v)

そして、コンセンサス配列の前ではなく、後に来ます。順序を変更してスペースを追加すると、回答が rosalind に受け入れられます。


それはあなたの質問に対する些細な答えなので、numpy を使用しない同じ問題の代替ソリューションを次に示します。各ヌクレオチドに変数を使用する代わりに、辞書を使用します。23個のアミノ酸で同じことをするのは楽しくありません.

from collections import defaultdict
for i in range(len(strings[0])):
    counter.append(defaultdict(int))
    for seq in seqs:
        counter[i][seq[i]] += 1
    consensus += max(counter[i], key=counter[i].get)

counterdictionaryすべてのベースのすべてのカウントを含む for each position を格納します。ディクショナリのキーは現在のベースです。

于 2016-07-27T22:28:09.667 に答える