2016-09-09 8 views
1

아마도 제목을 더 잘 표현할 수 있었지만 계통 발생 트리 내에서 클레 드를 붕괴시키고 싶습니다 (클레이드에 멤버가 하나 있더라도). 팁 레이블이 " foo "라고 표시 한 다음 특정 클레 드에서 떨어 뜨린 팁 수를 세고 팁 레이블이 35 개를 표시하는 가지를 만듭니다.계통 발생 위치를 유지하면서 팁 레이블로 클 래드 접기

계산 부분이 쉽습니다. 그러나 내가 사용할 때

drop.tip(rooted.tree,tip=which(rooted.tree$tip.label=='foo'),subtree=TRUE) 

떨어진 팁은 트리에서 그 위치를 유지하지 않습니다. 오히려 그들은 모두 끝에 그룹화됩니다 (그러나 적절하게 계산됩니다). 어쨌든 팁 레이블을 사용하여 클레이드를 붕괴시키고 트리에서의 위치를 ​​유지할 수 있습니까?

답변

0

까다로운 부분은 당신이 가진 얼마나 많은 개별 monophyletic clades를 결정합니다. 이 함수는 트릭을 수행해야합니다.

collapse_identical_tips <- function(phy,tip_label){ 
    matching_tips <- which(phy$tip.label==tip_label) 
    nt <- length(phy$tip.label) # number of tips in tree 
    nm <- length(matching_tips) # Number of tips matching the label 
    keep <- numeric(nm) 

    cur_tip <- 1 
    while(cur_tip<=nm){ 
    if(cur_tip == nm){ 
     keep[cur_tip] <- 1 
     break 
    } 
    next_tip <- cur_tip + 1 
    mrca_ <- getMRCA(phy,c(matching_tips[cur_tip],matching_tips[next_tip])) 
    descendants <- getDescendants(phy, mrca_) 
    descendant_tips <- descendants[descendants<=nt] 
    if(all(descendant_tips %in% matching_tips)){ 
     keep[cur_tip] <- 1 
     cur_tip <- cur_tip + length(descendant_tips) 
    }else{ 
     keep[cur_tip] <- 1 
     cur_tip <- cur_tip + 1 
    } 
    } 
    to_drop <- matching_tips[!keep] 
    new_phy <- drop.tip(phy,to_drop) 
    return(new_phy) 
} 

테스트를 아웃 :

tc <- "(A:3.135206161,(B:2.757615245,(((C:0.5796267872,((foo:0.1917981792,(foo:0.08246947568,foo:0.08246947568):0.1093287035):0.2328473818,(D:0.3107268924,E:0.3107268924):0.1139186686):0.1549812262):0.3387382152,F:0.9183650024):1.172666972,(((G:0.02437174382,H:0.02437174382):0.4727952475,foo:0.4971669913):0.8701228492,(foo:1.124632261,(foo:0.6503599778,foo:0.6503599778):0.4742722831):0.2426575797):0.7237421344):0.6665832698):0.3775909166);" 
phy <- read.tree(textConnection(tc)) 

plot(phy) 

enter image description here

plot(collapse_identical_tips(phy,"foo")) 

enter image description here

+0

귀하의 방법을 작동합니다 그러나, 그것을 사용하여, 나는 붕괴 후 'foos'를 계산하는 방법을 잘 모르겠습니다. 예를 들어, 팁은 "2 foo 's, 1 foo, 1 foo, 2 foo 's"가됩니다. 어떤 식 으로든 코드를 편집하여이 작업을 수행하거나 수행 방법에 대한 아이디어를 얻을 수 있습니까? –