我希望將字符狀態從不存在矩陣更改為系統發育。因此,我想確定發生給定“突變”或“變化”的節點和分支的最簡約假設。
我嘗試將每個字符分配給其葉子節點,然後將葉子節點的字符分配給它的葉子節點。姐姐具有相同的字符,我將該字符重新分配給父節點(然後重新工作,直到分配了所有節點)。我使用的是虛設的數據集來嘗試實現這一點:
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()