在 GitHub 上編輯此頁面

Biopython 中的 Genepop 支援

Genepop 模組允許使用 Python 介面存取 Genepop 功能。這表示現在可以從 Python 存取 Genepop 的絕大多數方法(哈迪-溫伯格平衡的精確檢定、族群分化、基因型不平衡、F 統計、無效等位基因頻率、微衛星的等位基因大小統計等等)。由於程式碼只是一個封裝器,因此需要安裝 Genepop 才能使用。

一個 Genepop 檔案的解析器也可用(並在教學文件中說明)。可以處理 Genepop 格式的檔案,而無需 Genepop

提供了兩個介面:一個通用、更複雜且更有效率的介面(GenePopController),以及一個簡化、更易於使用、不完整且效率較低的介面(EasyController)。由於其介面特性,EasyController 可能無法處理非常大的檔案。另一方面,它提供了實用函式來計算一些非常簡單的統計資料,例如等位基因計數,這些在通用介面中無法直接使用。

較複雜的介面假設使用者是更熟練的 Python 開發人員(例如,透過使用迭代器),而且目前尚未有相關文件。但即使對於經驗豐富的 Python 開發人員來說,只要所需的功能在 EasyController 中公開且其效能被認為可以接受,EasyController 仍然可以很方便。

有關計算方法詳細資訊,請參閱 Genepop 文件,其中提供了所有推導計算的論文連結。

EasyController 教學

安裝

為了使用控制器,必須在系統中安裝 Genepop,可以從 此處 下載。

在開始之前,讓我們測試安裝(為此您需要一個 Genepop 格式的檔案)

from Bio.PopGen.GenePop.EasyController import EasyController

ctrl = EasyController(your_file_here)
print(ctrl.get_basic_info())

your_file_here 替換為您檔案的名稱和路徑。如果您收到 IOError: Genepop not found,則表示 Biopython 找不到您的 Genepop 執行檔。如果 Genepop 不在 PATH 中,您可以將其新增到建構函式行中,即:

ctrl = EasyController(your_file_here, path_to_genepop_here)

如果一切正常,現在我們可以繼續使用 Genepop。對於以下範例,我們將使用 Genepop 檔案 big.gen,該檔案隨單元測試一起提供。我們也假設有一個 ctrl 物件已使用所選的相關檔案初始化。

我們先取得一些基本資訊

pop_names, loci_names = ctrl.get_basic_info()

返回檔案中可用的族群名稱和基因座名稱清單。

注意:大多數現有的 Genepop 檔案都提供關於族群名稱的錯誤資料。在許多情況下,該資訊可能不可信。評估族群資訊大多數時候是根據族群在檔案中的相對位置,而不是名稱。因此,檔案中的第一個族群索引為 0,第二個索引為 1,依此類推…

統計資料

異質合子性

讓我們取得特定族群和特定等位基因的異質合子性資訊

(exp_homo, obs_homo, exp_hetero, obs_hetero) = ctrl.get_heterozygosity_info(0, "Locus2")

將取得族群 0 和基因座 2 的預期和觀察到的同質合子性和異質合子性(如果您使用另一個檔案,請相應調整族群位置和基因座名稱)。

現有的等位基因

可以取得特定族群中特定基因座的所有等位基因清單

allele_list = ctrl.get_alleles(0, "Locus2")

allele_list 將為 [3, 20](即等位基因 3 和 20 在該族群中)。

等位基因的數量只需使用 len(allele_list) 即可取得。

也可以取得所有族群中特定基因座的所有等位基因清單

all_allele_list = ctrl.get_alleles_all_pops("Locus2")

all_allele_list 將為 [3, 20]。

等位基因和基因型頻率

可以取得特定族群中等位基因的頻率

allele_data = ctrl.get_allele_frequency(0, "Locus2")

allele_data 將為 (62, {3: 0.88700000000000001, 20: 0.113})。也就是說,有 62 個基因。88.7% 是 3,11.3% 是 20。

我們可以取得類似的基因型資訊(雙倍體資料)。也會回報預期頻率

genotype_list = ctrl.get_genotype_frequency(0, "Locus2")

genotype_list 將為:[(3, 3, 24, 24.3443), (20, 3, 7, 6.3114999999999997), (20, 20, 0, 0.34429999999999999)]

讓我們解釋第一個元素:有 24 個個體的基因型為 (3, 3),而預期具有該基因型的個體數為 24.2443。

F 統計

讓我們從一般多基因座 F 統計開始

Fis, Fst, Fit = ctrl.get_multilocus_f_stats()

這將取得多基因座 Fis、Fst 和 Fit。

讓我們取得每個基因座的統計資料(以及更多)

Fis, Fst, Fit, Qintra, Qinter = ctrl.get_f_stats("Locus2")

這將取得單基因座 Fis、Fst 和 Fit、Qintra 和 Qinter。

下方有 Fst 和 Fis 的特定章節(其中引入了成對變體和族群特定變體)。在 Fis 章節中會解釋 Qintra 和 Qinter。

Fst

讓我們取得特定基因座的成對 Fst

pair_fst = ctrl.get_avg_fst_pair_locus("Locus4")

將返回一個對應表,其中鍵是由 population1population2(族群 ID)組成的對。population2 始終小於 population1。例如:族群 0 和族群 3 之間 Locus4 的成對 Fst 由 pair_fst[(3,0)] 給出。

您也可以取得多基因座成對 Fst 估計值

multilocus_fst = ctrl.get_avg_fst_pair()

這將返回與上述相同的資料結構,但具有多基因座成對 Fst。

Fis

我們現在將取得特定基因座/族群的 Fis 以及其他一些統計資料

allele_dict, summary_fis = ctrl.get_fis(0, "Locus2")

讓我們詳細查看 get_fis 的輸出

summary_fis = (62, -0.1111, -0.11269999999999999)

allele_dict = {3: (55, 0.8871, -0.1111), 20: (7, 0.1129, -0.1111)}

summary_fis 保存一個三元組,包含:等位基因總數、Cockerham 和 Weir Fis、Robertson 和 Hill Fis。

allele_dict 保存每個等位基因(每個等位基因都是鍵)的等位基因重複次數、頻率和 Cockerham 和 Weir Fis。

因此,從上述結果可以讀出以下資訊:有 62 個具有 2 個不同等位基因的基因(55 個是 3 型,7 個是 20 型)。3 型的頻率為 0.89,20 型的頻率為 0.11。所有 CW Fis 都是 -0.111,RH Fis 是 -0.112。

現在讓我們取得多基因座 Fis

pop_list = ctrl.get_avg_fis()

pop_list 將為每個族群返回一個元素。每個元素都是一個包含以下內容的四元組

  1. 族群名稱(再次說明,族群名稱不可信)
  2. 1 - QIntra:個體之間的基因多樣性
  3. 1 - QInter:族群內個體之間的基因多樣性
  4. Fis

遷徙

我們可以取得遷徙數量的估計值

samp_size, priv_allele_freq, mig10, mig25, mig50, migcorr = ctrl.estimate_nm()

samp_size 是平均樣本大小,priv_allele_freq 是私有等位基因的平均頻率,mig10 是 Ne=10 的遷徙數量,mig25 是 Ne=25 的遷徙數量,mig50 是 Ne=50 的遷徙數量,migcorr 是在校正預期大小後的遷徙數量。

檢定

檢定通常是計算密集型的,因為它們通常基於馬可夫鏈演算法。在某些情況下,可以使用完整列舉方法,但這些方法只能應用於等位基因數量非常少的基因座。這表示大多數檢定將需要相當長的時間才能完成

有關以下馬可夫鏈參數(預熱、分批和迭代)的更多詳細資訊,請參閱 Genepop 手冊。也請參閱手冊以了解何時適用完整列舉。

哈迪-溫伯格平衡

讓我們開始測試每個族群中每個基因座的哈迪-溫伯格平衡

loci_map = ctrl.test_hw_pop(1, "excess")

第二個參數可以是 probabilityexcessdeficiencyprobability 是標準的 Haldane HW 檢定。如果您對異質合子缺乏感興趣,請使用 deficiency;如果您對過剩感興趣,請使用 excess

輸出是一個對應表,其中鍵是基因座名稱。內容是一個元組,包含 P 值、標準誤差、Fis (Weir 和 Cockerham)、Fis (Robertson 和 Hill) 以及步驟。

pop_test, loc_test, all_test = ctrl.test_hw_global("deficiency")

如果您對異質合子缺乏感興趣,請使用 deficiency;如果您對過剩感興趣,請使用 excessprobability 在這裡不適用,就像在 test_hw_pop 中一樣。

輸出是一個三元組

  1. pop_test 是一個列表,其中每個族群都有一個元素,包括 P 值、標準誤差和開關。
  2. loc_test 是相同的列表,但每個基因座都有一個元素,包括基因座名稱、P 值、標準誤差和開關。
  3. all_test 是整體結果,包含一個三元組 P 值、標準誤差和開關。

連鎖不平衡

我們可以利用對數似然比統計量 (G 檢定) 來檢定 2 個基因座是否處於連鎖不平衡狀態。

chi2, df, pval = ctrl.test_ld_all_pair(
    "Locus1", "Locus2", dememorization=1000, batches=10, iterations=100
)

返回 G 統計的卡方值、自由度和 P 值。

距離隔離 (IBD)

距離隔離 (IBD) 分析需要 Genepop 檔案的特殊形式

  1. 每個族群一個個體
  2. 個體的名稱必須是其座標

範例

...
Pop
0 15, 0201  0303 0102 0302 1011
Pop
0 30, 0202  0301 0102 0303 1111
Pop
0 45, 0102  0401 0202 0102 1010
Pop
0 60, 0103  0202 0101 0202 1011
Pop
0 75, 0203  0204 0101 0102 1010
POP
15 15, 0102 0202 0201 0405 0807
...

請注意,我們正在使用的範例檔案不能用於此情況

只有單次呼叫 IBD 分析

estimate, distance, (a, b), (bb, bblow, bbhigh) = ctrl.calc_ibd(
    self, is_diplo=True, stat="a", scale="Log", min_dist=0.00001
)

只有高於 min_dist 的成對比較才會用於計算回歸係數。

該方法返回

三角矩陣的解釋方式應該如下:Python 方式,矩陣是使用數字列表的列表實現的,如下所示

[[0.1], [0.2, 0.3], [0.4, 0.5, 0.6]]

上述資料結構對應於以下三角矩陣

      1    2    3
2   0.1
3   0.2  0.3
4   0.4  0.5  0.6