0

私の質問はバイオインフォマティクス、特にタンパク質配列に関するものですが、生物学の知識は本当に必要ありません。Perl でこの問題を解決する効率的な方法を見つけようとしています。

タンパク質配列は基本的に、長さの異なる配列または文字列であり、20 個のアミノ酸または文字の組み合わせで構成されています。

したがって、長さが 1 の場合、20 の可能性があります。問題は、文字が 1 つ増えるごとに、可能性の数が大幅に増加することです。

すべての長さのすべてのシーケンスで別の計算を計算したかったのです。タンパク質配列は、数百、さらには数千のアミノ酸である可能性があります。これを行うには、可能なすべてのシーケンスを取得する必要があります。

編集:すべての長さを計算することは不可能であることを認識しています。これを行う必要はありませんが、宇宙の長さの近くにとらない賢明な長さで計算したかったのです。

これをコーディングする最も効率的な方法に関する提案はありますか?

編集: 1000 のシーケンスに対してこれを行う必要はありません。これを行う最も効率的な方法を理解するのに役立つかもしれない、私が気付いていないアイデア、リソース、関数などに興味があっただけです。

4

4 に答える 4

4

推奨されているMath::Combinatoricsモジュールは、置換を伴う順列をサポートしていません。これは、この問題に対して必要なものです。そうしないと、タンパク質が 20 アミノ酸より長くなることはありません。

Algorithm::Combinatorics仕事をし、部分的に C で書かれているので、うまく機能するはずです。

これは、アミノ酸のすべてのペアを生成する例です。これでも 400 のバリエーションが生成されるため、出力の最初の数行のみを示しました。

use strict;
use warnings;

use Algorithm::Combinatorics 'variations_with_repetition';

my @acids = qw/ ala arg asn asp cys gln glu gly his ile leu lys met phe pro ser thr trp tyr val /;

my @proteins = variations_with_repetition(\@acids, 2);

print "@$_\n" for @proteins;

出力

ala ala
ala arg
ala asn
ala asp
ala cys
ala gln
ala glu
ala gly
ala his
ala ile
ala leu
ala lys
ala met
ala phe
ala pro
ala ser
ala thr
ala trp
ala tyr
ala val
arg ala
arg arg
arg asn
arg asp
arg cys
arg gln
arg glu
arg gly
...
于 2012-07-14T16:45:40.463 に答える
3

20^1000非常に 大きな数です。あなたは、すべてのシーケンスに対して何らかの計算を行う必要があると言っていますが、これは複数のコンピューターにスケールアウトしないと実際には不可能です。1 秒間に 100 万回の計算を行っても、計算を完了するには宇宙の年齢の何倍もかかることになります。

于 2012-07-14T15:19:49.647 に答える
2

あなたの言い回しがすべての既知の長さのすべてのシーケンスを含むことを考えると、この問題は決して合理的な結果に収束することはありません.無限の長さに進み続けるでしょう. さらに、あなたの計算には、現実とは関係のない多くの配列、またはジペプチドと巨大分子の比較が含まれます。計算を既知の最大のタンパク質 (タイチン、約 34,350 アミノ酸) の長さに制限したとしても、それでも非常に高価な計算になります.

別の提案として、実際に存在することが知られている、または遺伝子データベースから予測できるタンパク質に限定することを検討しましたか? これにより、作業量が生物学的関連性の数千のシーケンスに削減され、ほとんどのバイオインフォマティクス アプリケーションでは、適切に構造化されたデータベースから遺伝データまたはシーケンス データが広く利用可能になります。

于 2012-07-14T15:30:47.570 に答える
-1

で順列を生成するperlには、通常は を使用Math::Combinatoricsします。1、2、3 のすべての順列を一度に 1 つずつ返すプログラム スニペットを次に示します。

#!/usr/bin/perl -l

use Math::Combinatorics;

$, = " ";

@n = (1 .. 3);
$permuter = Math::Combinatorics->new(data => \@n);

while(@perm = $permuter->next_permutation())
{
  print @perm;
}

出力:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

ただし、他の回答からのアドバイスに注意してください。これは、述べられているように指数関数的に増加する問題であるため、検索スペースを制限する方法が必要です。

于 2012-07-14T16:01:33.107 に答える