1

これは、私の教授が配布し、学生が修正した集団遺伝学プログラムです。

基本的に、特定のサンプル、母集団、および突然変異率 (u) で、予想される突然変異数を 20 回シミュレートすることになっています。ただし、重要な部分は、枝の長さの合計 (L) です。これは、さまざまな短い枝の長さ (branch_length) の合計です。ただし、L を以下のように定義すると、エラーが返され続けます。

  L += branch_length  
NameError: name 'L' is not defined

tree_depth は同じように定義されており、問題なく動作するため、何が問題なのかわかりません。

完全なコードは次のとおりです。

from random import expovariate
from pgen import poidev
K = 77       # sample size (number of gene copies)
twoN = 5000  # population size
u = .001

tree_depth = 0.0 # age of last common ancestor in generations

# Each pass through loop deals with one coalescent interval.

for A in range(20):
    while K > 1:
        h = K*(K-1)/(2.0*twoN) # hazard of a coalescent event
        t = expovariate(h)       # time until next coalescent event
        tree_depth += t
        branch_length = t*K
        K -= 1
        L += branch_length
    S = poidev(u*L)
    print "Simulation:", A+1, "Total Mutations:", S
print "Total tree depth (L):", L, "generations"

本当に、本当に明らかな何かが欠けているだけですか?前もって感謝します。

4

2 に答える 2

4

L += x既存のLにxを追加しますが、Lを初期化していません。おそらく、L = 0ファイルの先頭のどこかに必要です。

于 2011-10-07T22:03:06.247 に答える
1

L = 0を行う前に定義する必要がありますL += x

一般に、変更する前に、変数を定義する必要があります。割り当てについては、Pythonがタイプを推測するため、問題はありません。

いくつかの例:

>>> a += 0 #Invalid
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'a' is not defined
>>> a = 5 #Valid
>>> a += 0 #Now it's valid, because a is defined.
>>> 
>>> my_list.append(5) #Invalid
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'my_list' is not defined
>>> my_list = [] 
>>> my_list.append(5) #Now valid
>>> my_list
[5]
>>>
>>> my_list2 = [1, 2, 3, 4] #Valid, because it's an assignment.
于 2011-10-07T22:22:41.040 に答える