BioGeography 是由 Nick Matzke 開發的模組,用於 Google 程式碼夏令營 2009 專案。它是透過 NESCENT 的 系統發生資訊學程式碼夏令營 2009 執行。請參閱專案提案:BioPython 的生物地理系統發生學。指導老師為 Stephen Smith(主要)、Brad Chapman 和 David Kidd。原始碼位於 GitHub 上 nmatzke 分支的 Geography 分支的 Bio/Geography 目錄中,您可以在這裡查看模組正在進行的開發時間表和其他資訊。新的模組正在 BioPython 維基上以 BioGeography 的形式記錄。
摘要:建立一個 BioPython 模組,讓使用者可以自動存取和剖析來自線上生物多樣性資料庫的物種棲息地記錄;將這些記錄連結到使用者指定的系統發生樹;計算基本的 α 和 β 系統發生多樣性摘要統計量;產生用於輸入各種可用於推斷歷史生物地理學的推斷演算法的輸入檔;將這些程式的輸出轉換為適合繪製的檔案,例如在 Google 地球中(KML 檔案)。
所有類別和函數都已使用標準文檔字串記錄。程式碼可在這裡的最新 GitHub commit 中取得:http://github.com/nmatzke/biopython/commits/Geography
Bio.Geography 是一個用於收集和處理生物地理數據的模組。該模組的主要動機是協助演化生物地理學的分析。有多種推斷演算法可用於此類分析,例如 DIVA 和 lagrange。這些程式的輸入通常是 (a) 系統發生樹和 (b) 系統發生樹頂端物種居住的區域。收集到特定群體資料的研究人員可能會直接存取物種位置資料,但許多大規模分析可能需要收集大量的出現資料。自動收集/處理出現資料還有其他各種應用,包括物種繪圖、生態位建模、博物館記錄的錯誤檢查和監測範圍變化。
出現資料主要來自博物館收藏。此類資料的主要來源是全球生物多樣性資訊機構 (GBIF)。GBIF 提供全球數百家博物館記錄的出現資料。可以手動搜尋GBIF 出現資料,並以各種格式下載結果(請參閱 GBIF 網站上的範例):試算表、Google 地球 KML 或 XML DarwinCore 格式。
也可以透過 API 存取 GBIF。Bio.Geography 可以處理手動下載的 DarwinCore 結果,或直接存取 GBIF。
了解 Bio.Geography 中類別的整體組織很有用。GbifXml 模組中有四個類別
對於 GBIF 的一次性使用,您可能會發現以試算表格式(用於分析)或 KML 格式(用於繪圖)下載出現資料最容易。但對於多個群體的分析,或隨著新資料添加到 GBIF 而重複更新分析,自動化是理想的。
在 GBIF 網站上進行的手動搜尋可以傳回符合 DarwinCore 資料標準的 XML 檔案形式的結果。範例檔案可以在 Biopython 的 Tests/Geography 目錄中找到,名稱為 utric_search_v2.xml。此檔案包含超過 1000 個 Utricularia(一種食肉植物屬)的出現記錄。
將 utric_search_v2.xml 檔案儲存在您的工作目錄中(或從 GBIF 下載類似的檔案)。以下是建議使用 Bio.Geography 的 GbifXml 模組剖析檔案的步驟。首先,匯入必要的類別和函數,並指定輸入檔案的檔名。
from Bio.Geography.GbifXml import GbifXmlTree, GbifSearchResults
from Bio.Geography.GeneralUtils import fix_ASCII_file
xml_fn = "utric_search_v2.xml"
其次,為了在 Python 中向螢幕顯示結果,我們需要將檔案轉換為純 ASCII(GBIF 結果包含許多來自不同語言的不尋常字元,並且沒有對斜體引號等進行標準化;這可能會在嘗試在 Python 或 ipython 中列印到螢幕時導致崩潰)。
xml_fn_new = fix_ASCII_file(xml_fn)
這會建立一個新檔案,檔名中會新增字串「_fixed.xml」。
接下來,我們會將 XML 檔案剖析為 ElementTree(一個 Python 物件,其中包含來自 XML 檔案的資料,作為巢狀的清單和字典系列)。
from xml.etree import ElementTree as ET
xmltree = ET.parse(xml_fn_new)
然後,我們可以將元素樹儲存為 Class GbifXmlTree 的物件
gbif_recs_xmltree = GbifXmlTree(xmltree)
然後,將 xmltree 儲存後,我們會將其剖析為個別記錄(儲存在 GbifObservationRecord 類別的個別物件中),然後將這些記錄作為一組儲存在 GbifSearchResults 類別的物件中。
recs = GbifSearchResults(gbif_recs_xmltree)
recs.extract_occurrences_from_gbif_xmltree(recs.gbif_recs_xmltree)
個別觀測記錄的清單可以在 recs.obs_recs_list 中存取。這將顯示前五個記錄的參考
recs.obs_recs_list[0:4]
若要取得第一個個別記錄的資料
rec = recs.obs_recs_list[0]
dir(rec)
rec.lat 將傳回緯度,rec.long 將傳回經度,依此類推。某些資料屬性並非所有 GBIF 記錄中都存在;如果它們遺失,相關欄位將包含「None」。
若要以 Tab 分隔表格格式列印所有記錄
recs.print_records()
在我們費力下載數千個記錄之前,我們可能希望先知道 GBIF 中有多少個記錄。使用者必須設定一個字典,其中包含欄位和搜尋詞作為鍵和項目。也就是說,
from GbifXml import GbifXmlTree, GbifSearchResults
params = {"format": "darwin", "scientificname": "Genlisea*"}
「'format':'darwin'」指定 GBIF 應以 DarwinCore 格式傳回結果。
「'scientificname'」指定要搜尋的屬名稱。在名稱後新增「*」將傳回以「Genlisea」開頭的任何內容。
完整的搜尋詞清單可以在 GBIF 的出現記錄資料服務中找到,該連結來自從 GBIF 入口網站使用資料。
指定搜尋參數後,初始化新的 GbifSearchResults 物件並執行 get_numhits 以取得命中次數
params = {"format": "darwin", "scientificname": "Genlisea*"}
recs = GbifSearchResults()
numhits = recs.get_numhits(params)
截至 2009 年 8 月,GBIF 中有 169 筆與「Genlisea*」匹配的記錄
為了形成對比,請在沒有星號(「*」)的情況下執行相同的搜尋
params = {"format": "darwin", "scientificname": "Genlisea"}
numhits = recs.get_numhits(params)
我們只會獲得約 10 個結果 – 大概是只有鑑定到屬且沒有進一步鑑定的標本記錄。
可以透過金鑰下載個別記錄。若要下載個別記錄
rec = recs.obs_recs_list[0]
key = rec.gbifkey
# (or manually)
# key = 175067484
xmlrec = recs.get_record(key)
print(xmlrec)
如果您想要列印 xmlrec ElementTree 物件,請將 xmlrec 儲存在 GbifXmlTree 物件中,然後執行 print_xmltree
GbifXmlTree(xmlrec).print_xmltree()
生物地理區域的特徵通常是 α 和 β 多樣性統計量:基本上,這些是區域內或區域之間發現的物種數量的指數。給定一個區域中生物的系統發生樹,可以計算系統發生 α 和 β 多樣性統計量。Webb 等人已在 phylocom 套件中以徹底的方式實作此功能,但對於某些目的而言,直接在 Python 中計算統計量很有用。
在這裡,我們需要從 Newick 樹字串開始
trstr2 = "(((t9:0.385832, (t8:0.445135,t4:0.41401)C:0.024032)B:0.041436, t6:0.392496)A:0.0291131, t2:0.497673, ((t0:0.301171, t7:0.482152)E:0.0268148, ((t5:0.0984167,t3:0.488578)G:0.0349662, t1:0.130208)F:0.0318288)D:0.0273876);"
to2 = Tree(trstr2)
然後,我們建立樹摘要物件
ts = TreeSum(to2)
函數 test_Tree 將執行度量(MPD = 平均系統發生距離、NRI = 淨相關性指數、MNPD = 平均最近鄰居系統發生距離、NTI = 最近分類單元指數、PD = 總系統發生距離),並輸出到螢幕
ts.test_Tree()
透過將樹子集化為僅存在於區域內的分類單元,可以按區域計算統計量。
GBIF 一次最多只允許下載 1000 個觀測記錄(KML 記錄為 10,000 個)。若要取得更多記錄,我們需要分階段下載和處理它們。
我們將再次設定參數字典,以及指定每個伺服器請求下載的記錄數量的「inc」變數。
params = {"format": "darwin", "scientificname": "Genlisea*"}
inc = 100
recs3 = GbifSearchResults()
gbif_xmltree_list = recs3.get_all_records_by_increment(params, inc)
與 Biopython 與 NCBI 伺服器的互動一樣,GbifSearchResults 模組會追蹤上次發出 GBIF 請求的時間,並且需要在發出新請求之前等待 3 秒。
每個伺服器請求都會傳回一個 XML 字串;這些字串會剖析為 GbifXmlTree 物件,並且會將傳回的 GbifXmlTree 物件清單傳回至 gbif_xmltree_list。個別記錄也已剖析
recs3.print_records()
生物地理分析通常會要求您確定分類單元居住在哪些區域。區域的劃分並非總是顯而易見,分析師可能希望嘗試幾種不同的可能區域集,並查看這如何影響他們的分析。
在下方,我們設定一個包含北半球緯度/經度座標的多邊形,然後將每個匹配記錄的「area」屬性設定為「NorthernHemisphere」
ul = (-180, 90)
ur = (180, 90)
ll = (-180, 0)
lr = (180, 0)
poly = [ul, ur, ll, lr]
polyname = "NorthernHemisphere"
recs3.print_records()
可以針對所有感興趣的多邊形重複此程序,直到所有 GBIF 記錄都已分類(除了 GBIF 記錄一開始就缺少緯度/經度資料的情況,這種情況有時會發生)。
GeogUtils 還包含用於處理 shapefile/dbf 檔案的開放存取程式庫 – 這些是標準 GIS 檔案格式,各種公開可存取的 shapefile 檔案可以用作多邊形的來源。
警告:如果您的多邊形跨越國際換日線,則點在多邊形內的操作會嚴重失敗。在這種情況下,最好的解決方案是將任何跨越換日線的多邊形分割成兩個多邊形,一條線的每一側各一個多邊形。
GBIF 搜尋結果通常包含非 ASCII 字元(例如,國際地名)和其他令人困惑的項目,例如,如果將 GBIF 搜尋結果讀取為 ASCII,然後嘗試剖析它,則角括號中的網頁連結可能會被誤解為不匹配的 XML 標籤。
一般而言,如果在背景處理結果,Geography 模組會處理得很好;但是若要將結果列印到螢幕,則會使用 GeneralUtils 中的一系列函數將字串轉換為純 ASCII。這可以避免在將資料列印到螢幕時發生崩潰。因此,這些列印到螢幕的結果可能會稍微改變原始搜尋結果的內容。