2

今後のバイオインフォマティクス コースの準備として、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))
4

6 に答える 6

5

優性対立遺伝子を持つ種は、 または のいずれAAAaです。

あなたの総人口k + n + mは、k( hom) を持つホモ接合性優性生物AAm( het) を持つヘテロ接合性優性生物、Aaおよびn( rec) を持つホモ接合性劣性生物で構成されていaaます。これらのそれぞれは、他の任意のものと交配できます。

優性対立遺伝子を持つ生物の確率は次のとおりです。

P_dom = n_dominant/n_total or 1 - n_recessive/n_total

これらの組み合わせごとにパネット方陣を行うことは悪い考えではありません。

  hom + het

  |  A | a
-----------
A | AA | Aa
a | Aa | aa


  het + rec

  |  a | a
-----------
A | Aa | Aa
a | aa | aa

どうやら、2つの生物の交配により、4人の子供が生まれる可能性があります。hom+hetは、劣性対立遺伝子を持つ 4 つの生物のうち 1 つを生成し、het+は、劣性対立遺伝子recを持つ 4 つの生物のうち 2 つを生成します。

他の組み合わせについても同様に行うことができます。

生物を 1 対 1 で交配させるのではなく、k + m + nたくさんの生物を一緒に交配させるので、子孫の総数と特定の対立遺伝子を持つ「子供」の数を知っておくとよいでしょう。

Python が少しでも気にならない場合は、ここでcombfromscipy.miscが役立つかもしれません。4計算では、(a) 各組み合わせから子を取得すること、および (b) 組み合わせから劣性 (または優性) の子孫を決定するために (パネット平方からの) 因子が必要であることを忘れないでください。

アップデート

    # total population
    pop_total = 4 * comb(hom + het + rec, 2)

    # use PUNNETT squares!

    # dominant organisms         
    dom_total = 4*comb(hom,2) + 4*hom*het + 4*hom*rec + 3*comb(het,2) + 2*het*rec

    # probability for dominant organisms
    phom = dom_total/pop_total
    print phom

    # probability for dominant organisms + 
    # probability for recessive organisms should be 1
    # let's check that:
    rec_total = 4 * comb(rec, 2) + 2*rec*het + comb(het, 2)
    prec = totalrec/totalpop
    print 1 - prec
于 2014-08-04T16:45:07.787 に答える
1

これは、コーディングよりも確率/カウントの問題です。最初に劣性形質のみを持つ子孫の確率を計算する方が簡単です。理解に苦しむことがあれば教えてください。次のコードを実行すると、出力が rosalind grader に合格しました。

def mendel(x, y, z):
    #calculate the probability of recessive traits only
    total = x+y+z
    twoRecess = (z/total)*((z-1)/(total-1))
    twoHetero = (y/total)*((y-1)/(total-1))
    heteroRecess = (z/total)*(y/(total-1)) + (y/total)*(z/(total-1))

    recessProb = twoRecess + twoHetero*1/4 + heteroRecess*1/2
    print(1-recessProb) # take the complement

#mendel(2, 2, 2)

with open ("rosalind_iprb.txt", "r") as file:
    line =file.readline().split()
    x, y, z= [int(n) for n in line]
    print(x, y, z)
file.close()
print(mendel(x, y, z))

于 2017-07-19T03:32:15.647 に答える