2017-03-15 10 views
1

Pythonでは、私はEggLibを使用しています。私は、VCFファイルにあるSNPあたりのJostのD値を計算しようとしています。EggLib Pythonの母集団構造を示す

データ

データはVCF形式でhereあります。データセットは小さく、集団は2つ、集団は100個、SNPは6つ(すべて1番染色体)です。

各個人の名前はPp.Iiで、pはそれが属する母集団のインデックスであり、iは個別のインデックスです。

コード

私の難しさは、人口構造の仕様に関係します。ここで私の試験である

### Read the vcf file ### 
vcf = egglib.io.VcfParser("MyData.vcf") 

### Create the `Structure` object ### 
# Dictionary for a given cluster. There is only one cluster. 
dcluster = {}    
# Loop through each population 
for popIndex in [0,1]: 
    # dictionnary for a given population. There are two populations 
    dpop = {}    
    # Loop through each individual 
    for IndIndex in range(popIndex * 100,(popIndex + 1) * 100):  
      # A single list to define an individual 
     dpop[IndIndex] = [IndIndex*2, IndIndex*2 + 1] 
    dcluster[popIndex] = dpop 

struct = {0: dcluster} 

### Define the population structure ### 
Structure = egglib.stats.make_structure(struct, None) 

### Configurate the 'ComputeStats' object ### 
cs = egglib.stats.ComputeStats() 
cs.configure(only_diallelic=False) 
cs.add_stats('Dj') # Jost's D 

### Isolate a SNP ### 
vcf.next() 
site = egglib.stats.site_from_vcf(vcf) 

### Calculate Jost's D ### 
cs.process_site(site, struct=Structure) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/egglib/stats/_cstats.py", line 431, in process_site 
    self._frq.process_site(site, struct=struct) 
    File "/Library/Python/2.7/site-packages/egglib/stats/_freq.py", line 159, in process_site 
    if sum(struct) != site._obj.get_ning(): raise ValueError, 'invalid structure (sample size is required to match)' 
ValueError: invalid structure (sample size is required to match) 

ドキュメントはhere

[構造物]それぞれが辞書される2つの項目を含むタプルであることを示します。最初のものはingroupを表し、2番目のものはoutgroupを表します。

ingroup辞書自体が、より多くの辞書を持つ辞書であり、集団の各クラスタに対して1つです。各クラスタ辞書は母集団の辞書であり、母集団自体が辞書で表されている。人口辞書は、やはり個人の辞書です。幸いにも、個人はリストによって表されます。

個々のリストには、この個人に属するすべてのサンプルのインデックスが含まれています。 1倍体データの場合、個人は1項目のリストになります。他のケースでは、すべての個別のリストには同じ数の項目が必要です(一貫した倍数)。倍数が複数の場合、与えられた個体のサンプルが元のデータ内にグループ化されていることを強制するものはありません。

ingroup辞書のキーは、各クラスタを識別するラベルです。クラスタ辞書内では、キーは人口ラベルです。最後に、母集団辞書内では、キーは個別のラベルです。

第2の辞書はアウトグループを表します。その構造はより簡単です。キーとして個々のラベルを持ち、対応するサンプルインデックスのリストを値として持っています。アウトグループ辞書は、イングループ母集団辞書に似ています。倍数は、すべてのグループとアウトグループの個人に一致する必要があります。

しかし、私はそれを理解できません。提供されている例はfastaフォーマット用ですが、ロジックをVCFフォーマットに拡張するのはわかりません。

答えて

0

2つのエラー

まずエラー構造オブジェクトを返しますがstats以内にそれを保存しないmake_structure

機能があります。したがって、この出力を保存して、機能process_siteで使用する必要があります。

Structure = egglib.stats.make_structure(struct, None) 

第2のエラー

構造オブジェクトは、一倍体を指定しなければなりません。したがって、辞書を

dcluster = {}    
for popIndex in [0,1]: 
    dpop = {}    
    for IndIndex in range(popIndex * 100,(popIndex + 1) * 100):  
     dpop[IndIndex] = [IndIndex] 
    dcluster[popIndex] = dpop 

struct = {0: dcluster} 
と作成してください
関連する問題