題:
如何繪製從存在狀態矩陣到系統發育的字符狀態變化
Gloom
2018-10-08 16:13:07 UTC
view on stackexchange narkive permalink

我希望將字符狀態從不存在矩陣更改為系統發育。因此,我想確定發生給定“突變”或“變化”的節點和分支的最簡約假設。

我嘗試將每個字符分配給其葉子節點,然後將葉子節點的字符分配給它的葉子節點。姐姐具有相同的字符,我將該字符重新分配給父節點(然後重新工作,直到分配了所有節點)。我使用的是虛設的數據集來嘗試實現這一點:

  Matrix>Dme_0011110000000000111>Dme_0021110000000000011>Cfa_0010110000000000011>Mms_0010110000000000011>Hsa_0010110000000000010>Ptr_0020110000000000011>Mmu_0020110000000000011>Hsa_0020110000000000011>Ptr_0010110000000000011>Mmu_0010110000000000011Phylogeny((Dme_001,Dme_002),(((Cfa_001,Mms_001),((Hsa_001,Ptr_001),Mmu_001)),( Ptr_002,(Hsa_002,Mmu_002)))));  

我使用ete3分配內部節點,所以我的輸出應該是:

  BranchID CharacterState ChangeNode_1:0 0->1Hsa_001:15 1->0  

當我的代碼遇到丟失時,會根據其姐妹的角色狀態分配字符狀態,從而使輸出混亂,從而使得:

  BranchID CharacterState ChangeNode_1:0 0->1Node_3 15 0->1Node_5 15 0->1Node_ 8 15 0->1  

我正在python 2.7中進行編碼,歡迎您的幫助。

我的代碼:

  from ete3 import PhyloTreefrom collections import Counterimport itertoolsPAM = open('PAM','r')gene_tree ='(((Dme_001,Dme_002),( ((Cfa_001,Mms_001),(((Hsa_001,Ptr_001),Mmu_001)),(Ptr_002,(Hsa_002,Mmu_002))))));'NodeIDs = [] tree = PhyloTree(gene_tree)edge = 0對於tree.traverse( ):如果不是,則node.is_leaf():node.name =“ Node_%d”%edge edge + = 1 NodeIDs.append(node.name)如果node.is_leaf():NodeIDs.append(node.name)
f = open('PAM','r')taxa = [] pap = []對於f中的行:term = line.strip()。split('\ t')taxa.append(term [0])p = [在項[1]中為p表示p]] pap.append(p)statesD = dict(zip(taxa,pap))def PlotCharacterStates():情節= []事件= []對於鍵,狀態D中的值):對於s的值,計數= -1:如果s ==字符狀態:a =鍵,則計數+ = 1;對事件進行計數。append(a)Round3_events = []而len(events)> 0:對於關係中的rel:node_store = [] sis_store = []用於事件中的事件:如果rel [0] == event [0]:node_store.append(event [1])如果rel [1] == event [0]:sis_store.append(event [ 1])如果(len(node_store)> 0)和(len(sis_store)> 0):place = rel,node_store,sis_store Round3_events.append(place)= [] for placeme Round3_events中的nt:截距=(set(placement [1])& set(placement [2]))node_plot =(set(placement [1])-set(placement [2]))sis_plot =(set(placement [2 ])-如果len(node_plot)則設置(placement [1]))> 0:對於node_plot中的x:y =展示位置[0] [0],如果len(node_plot)被移動,則x Plots.append(y).append(y) sis_plot)> 0:表示sis_plot中的x:y =放置[0] [1],x如果Plots.append(y)已移動。append(y),如果len(intercept)> 0:表示x在截距中:y =放置[ 0] [2],x y1 =展示位置[0] [0],x y2 =展示位置[0] [1],x個事件中的x move.append(y1)moving.append(y2)events.append(y)事件:如果event [0] ==“ Node_0”:
Plots.append(event)移動.append(event)events2 =(set(events)-set(moved))events = []對於events2中的事件:events.append(event)pl = set(Plots)Plots = []對於pl中的p:Plots.append(p)打印CharacterState,將Plots'''分配給葉子的姐妹,internals'''e = [] round1b_e = [] round2a_e = [] placements = [] Relationships = [] Rounds = [ ] for tree.traverse()中的節點:姐妹= node.get_sisters()父= node.up cycle1 = [] if node.is_leaf():對於姐妹中的姐妹:if sister.is_leaf():round1a = [“ Round1a “,node.name,sister.name,parent.name] node_names = node.name,sister.name Rounds.append(round1a)e.append(node_names)x = node.name,sister.name,parent.name,”樹葉” Relationships.append(x)(如果不是sister.is_leaf()):round1b = [“ Round1b”,node.name,sister.name,parent.name] node_names = node.name,sister.name Rounds.append(round1b)round1b_e.append(node_names)x = node.name,sister.name,parent.name,“ node-leaf” Relationships.append(x)不是節點。 is_leaf():如果不是node.is_root():對於姐妹中的姐妹:如果不是sister.is_leaf():node_names = node.name,sister.name round2a_e.append(node_names)x = node.name,sister.name, parent.name,“節點-節點” Relationships.append(x)x = [] CharacterStates = []用於鍵,狀態中的值D.iteritems():用於值中的值:x.append(value)y =已排序(設置(x))對於y中的x:CharacterStates.append(x),對於CharacterStates中的CharacterState:PlotCharacterStates() 
我的代碼已添加,謝謝您的建議。我正在使用python 2.7,但我還沒有使用biopython,但很高興在有解決方案的情況下使用它。我正在嘗試從TnT(Goloboff 2008)複製-apo函數(如果您對此很熟悉)
請[編輯]問題以包括此信息,這可能對其他人有所幫助(抱歉,我不熟悉這些領域)。
二 答案:
Jonathan Moore
2019-08-12 16:30:56 UTC
view on stackexchange narkive permalink

要對您正在做的事情說一些正式的話,我想這聽起來像是您正在嘗試重建祖先狀態。對此已經做了一些工作,Fitch在1970年代設計了與您類似的算法:Fitch W:試圖定義進化的過程:特定樹形拓撲的最小變化。 Syst Zool 1971,20:406-416。 10.2307 / 2412116

從您的方法來看,缺失的部分是,一旦Fitch到達樹的根部,他便會返回到葉子,解決了沿途的歧義(如果兩個姐妹節點具有不同的狀態,您如何確定父母的身份是什麼?惠譽的想法是,一旦您紮根,您就可以下來並使用父母狀態來設置子狀態(在模棱兩可的情況下)。

R phangorn程序包中有一個很好的Fitch算法實現,使重構成為單線(給定有根樹對象和葉節點狀態矩陣):

  anc。 mpr = ancestral.pars(rooted_tree,tree_samples_data_matrix.phyDat,“ MPR”) 

如果您不想使用R包本身,則可以將其用作偽代碼以移植到python。

Michael
2019-08-13 05:57:08 UTC
view on stackexchange narkive permalink

OP可以使用Rpy2庫將Python連接到R,但是直接使用R通常更好。

另一種選擇是簡單地使用MacClade 4.0,儘管您需要一台舊的Mac。這是一個GUI界面,可讓您確定係統發育中每個節點的簡約字符狀態。 API使您可以按點交互式地瀏覽系統發育,然後單擊在樹上移動分支。然後將根據“數字字符步長”對樹進行評估,並針對每個已加載的拓撲自動計算該樹。輸出非常多彩,因此易於理解大數據集。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...