今後のバイオインフォマティクス コースの準備として、rosalind.info からいくつかの課題を行っています。私は現在、課題「メンデルの第一法則」で立ち往生しています。
私はこれで力ずくで自分自身を攻撃できると思いますが、それはどういうわけか私の考えが複雑すぎるに違いありません. 私のアプローチは次のとおりです。
3 つのレベルを持つ確率ツリーを作成します。交配する 2 つのクリーチャー、クリーチャー A とクリーチャー B があります。最初のレベルは、クリーチャー A がホモ接合優性 (k)、ヘテロ接合 (m)、またはホモ接合劣性 (n) として選択される確率です。たとえば、ホモ接合ドミナントの場合、合計で (k+m+n) の生物が存在し、そのうちの k がホモ接合ドミナントであるため、確率は k/(k+m+n) となるようです。
次に、このツリーでは、これらのそれぞれの下に、クリーチャー A がどのクリーチャーとして選ばれたかがわかっている場合、クリーチャー B が k / m / n である確率が表示されます。たとえば、クリーチャー A がヘテロ接合体 (m) として選択された場合、クリーチャー B もヘテロ接合体である確率は (m-1)/(k+m+n-1) になります。これは、ヘテロ接合体が 1 つ少ないためです。
これにより、2 レベルの確率が得られ、ここまで到達するためだけに多くのコードが必要になります。文字通りツリー構造を構築し、各ブランチに対してその部分のコードを手動で記述しているからです。
クリーチャー A と B を選択すると、それぞれに 2 つの染色体があります。これらの染色体の 1 つをランダムに選択できます。したがって、A の場合は染色体 1 または 2 を選択でき、B の場合も同じです。したがって、4 つの異なるオプションがあります: A の 1 つ、B の 1 つを選択します。A の 2 つ、B の 1 つを選択します。 A の 2 つ、B の 2 つ。これらのそれぞれの確率は 1/4 になります。最終的に、このツリーはこれらの葉の確率を持つことになります。
そこから何らかの方法で魔法を使ってこれらの確率を合計し、2 つの生物が優性対立遺伝子を持つ生物を生み出す確率を調べます。
この課題が解決するのに何時間もかかるように設計されているとは思えません。私は何を考えすぎているのですか?
アップデート:
可能な限り最もばかげた力ずくの方法でこれを解決しました。何千ものシミュレートされた交配を実行し、割り当てを通過するのに十分な精度が得られるまで、最終的に優性対立遺伝子を持つことになる部分を見つけ出しました.
import random
k = 26
m = 18
n = 25
trials = 0
dominants = 0
while True:
s = ['AA'] * k + ['Aa'] * m + ['aa'] * n
first = random.choice(s)
s.remove(first)
second = random.choice(s)
has_dominant_allele = 'A' in [random.choice(first), random.choice(second)]
trials += 1
if has_dominant_allele:
dominants += 1
print "%.5f" % (dominants / float(trials))