2015-12-21 1 views
5

मैंने एक प्रोटीन परिवार के लिए एक फाईलोजेनेटिक पेड़ बनाया है जिसे अलग-अलग समूहों में विभाजित किया जा सकता है, प्रत्येक को इसके प्रकार के रिसेप्टर या प्रतिक्रिया के प्रकार से वर्गीकृत किया जा सकता है। पेड़ में नोड्स को रिसेप्टर के प्रकार के रूप में लेबल किया जाता है।अपने नोड्स या पत्तियों में लेबल द्वारा एक फाईलोजेनेटिक पेड़ में शाखाओं को कैसे पतन करें?

फाईलोजेनेटिक पेड़ में मैं देख सकता हूं कि एक ही समूह या रिसेप्टर के प्रकार वाले प्रोटीन एक ही शाखा में एक साथ क्लस्टर हो गए हैं। इसलिए मैं उन शाखाओं को ध्वस्त करना चाहता हूं जिनमें लेबल सामान्य हैं, उन्हें कीवर्ड की दी गई सूची द्वारा समूहित करना।

आदेश कुछ इस तरह होगा:

./collapse_tree_by_label -f phylogenetic_tree.newick -l list_of_labels_to_collapse.txt -ओ collapsed_tree.eps (या पीडीएफ)

मेरे list_of_labels_to_collapse.txt इस तरह होगा : एक बी सी डी

मेरे Newick पेड़ इस तरह होगा: (A_1: 0.05, A_2: 0.03, A_3: 0.2, A_4: 0.1): 0.9, (((B_1: 0.05, B_2 : 0.02, B_3: 0.04): 0.6, (C_1: 0.6, C_2: 0.08): 0। 7): 0.5, (D_1: 0.3, D_2: 0.4, D_3: 0.5, D_4: 0.7, D_5: 0.4): 1.2)

उत्पादन छवि गिर के बिना इस तरह है:

उत्पादन छवि गिर इस (collapsed_tree.eps) की तरह होना चाहिए: http://i.stack.imgur.com/TLXd0.png

त्रिकोण की चौड़ाई शाखा लंबाई का प्रतिनिधित्व करना चाहिए, और त्रिकोण के उच्च शाखा में नोड्स की संख्या का प्रतिनिधित्व करना चाहिए।

मैं आर में "बंदर" पैकेज मैं एक वंशावली पेड़ साजिश कर रहा था के साथ खेल रहे हैं, लेकिन मैं अभी भी समझ नहीं कैसे लेबल में कीवर्ड द्वारा शाखाओं संक्षिप्त करने के लिए:

require("ape") 

इस पेड़ लोड होगा:

+०१२३५१६४१०६:

cat("((A_1:0.05,A_2:0.03,A_3:0.2,A_4:0.1):0.9,(((B_1:0.05,B_2:0.02,B_3:0.04):0.6,(C_1:0.6,C_2:0.08):0.7):0.5,(D_1:0.3,D_2:0.4,D_3:0.5,D_4:0.7,D_5:0.4):1.2):0.5);", file = "ex.tre", sep = "\n") 
tree.test <- read.tree("ex.tre") 

यहाँ संक्षिप्त करने के लिए

इस पेड़ साजिश होगा कोड होना चाहिए

plot(tree.test) 

उत्तर

4

आपके पेड़ के रूप में आर में संग्रहीत किया गया है, पहले से ही पॉलीटॉमीज़ के रूप में संग्रहीत युक्तियां हैं। यह केवल पेड़ की साजिश के साथ पेड़ को साजिश करने का मामला है।

ape में कोई समारोह ऐसा करने के लिए नहीं है, कि मैं के बारे में पता कर रहा हूँ, लेकिन अगर आप अंकन समारोह के साथ गड़बड़ एक छोटा सा आप इसे हटा सकते हैं

# Step 1: make edges for descendent nodes invisible in plot: 
groups <- c("A", "B", "C", "D") 
group_edges <- numeric(0) 
for(group in groups){ 
    group_edges <- c(group_edges,getMRCA(tree.test,tree.test$tip.label[grepl(group, tree.test$tip.label)])) 
} 
edge.width <- rep(1, nrow(tree.test$edge)) 
edge.width[tree.test$edge[,1] %in% group_edges ] <- 0 


# Step 2: plot the tree with the hidden edges 
plot(tree.test, show.tip.label = F, edge.width = edge.width) 

# Step 3: add triangles 
add_polytomy_triangle <- function(phy, group){ 
    root <- length(phy$tip.label)+1 
    group_node_labels <- phy$tip.label[grepl(group, phy$tip.label)] 
    group_nodes <- which(phy$tip.label %in% group_node_labels) 
    group_mrca <- getMRCA(phy,group_nodes) 

    tip_coord1 <- c(dist.nodes(phy)[root, group_nodes[1]], group_nodes[1]) 
    tip_coord2 <- c(dist.nodes(phy)[root, group_nodes[1]], group_nodes[length(group_nodes)]) 
    node_coord <- c(dist.nodes(phy)[root, group_mrca], mean(c(tip_coord1[2], tip_coord2[2]))) 

    xcoords <- c(tip_coord1[1], tip_coord2[1], node_coord[1]) 
    ycoords <- c(tip_coord1[2], tip_coord2[2], node_coord[2]) 
    polygon(xcoords, ycoords) 
} 

तो फिर तुम सिर्फ पाश के माध्यम से है समूह त्रिकोण जोड़ने के लिए

for(group in groups){ 
    add_polytomy_triangle(tree.test, group) 
} 
+0

आपको बहुत बहुत धन्यवाद! यह काम किया! – RDlady

+0

बस एक और सवाल। क्या यह एल्गोरिदम विभिन्न शाखाओं को एक उप-धारा में ढहने के लिए काम करेगा (जैसे दो त्रिकोणों को विलय करना)? – RDlady

+0

@RDlady यदि आप का मतलब है कि आप विलय करना चाहते हैं, उदाहरण के लिए, समूह बी और सी को एक समूह में जोड़ना चाहते हैं, तो आप समूह निर्दिष्ट करते समय रेगेक्स का उपयोग कर सकते हैं: 'समूह <- सी ("ए", "बी | सी", "डी") '। वैकल्पिक रूप से, आप टिप लेबल्स का नाम बदल सकते हैं ताकि वे उन समूहों से मेल खा सकें जिन्हें आप चाहते हैं –

1

मुझे लगता है कि स्क्रिप्ट आखिर में जो चाहता था वह कर रही है। उत्तर से @CactusWoman प्रदान किया गया, मैंने कोड को थोड़ा सा बदल दिया ताकि स्क्रिप्ट एमआरसीए को खोजने का प्रयास करे जो मेरी खोज पैटर्न से मेल खाने वाली सबसे बड़ी शाखा का प्रतिनिधित्व करती है।इसने गैर-पॉलीटॉमिक शाखाओं को विलय करने या पूरे पेड़ को तोड़ने की समस्या को हल नहीं किया क्योंकि एक मिलान नोड सही शाखा के बाहर गलती से था।

इसके अतिरिक्त, मैंने एक पैरामीटर शामिल किया जो किसी दिए गए शाखा में पैटर्न बहुतायत अनुपात की सीमा का प्रतिनिधित्व करता है, इसलिए हम खोज पैटर्न से मेल खाने वाली कम से कम 90% युक्तियों का चयन और संक्षिप्त/समूह कर सकते हैं, क्योंकि उदाहरण।

library(geiger) 
library(phylobase) 
library(ape) 

#functions 
find_best_mrca <- function(phy, group, threshold){ 

    group_matches <- phy$tip.label[grepl(group, phy$tip.label, ignore.case=TRUE)] 
    group_mrca <- getMRCA(phy,phy$tip.label[grepl(group, phy$tip.label, ignore.case=TRUE)]) 
    group_leaves <- tips(phy, group_mrca) 
    match_ratio <- length(group_matches)/length(group_leaves) 

     if(match_ratio < threshold){ 

      #start searching for children nodes that have more than 95% of descendants matching to the search pattern 
      mrca_children <- descendants(as(phy,"phylo4"), group_mrca, type="all") 
      i <- 1 
      new_ratios <- NULL 
      nleaves <- NULL 
      names(mrca_children) <- NULL 

      for(new_mrca in mrca_children){ 
       child_leaves <- tips(tree.test, new_mrca) 
       child_matches <- grep(group, child_leaves, ignore.case=TRUE) 
       new_ratios[i] <- length(child_matches)/length(child_leaves) 
       nleaves[i] <- length(tips(phy, new_mrca)) 
       i <- i+1 
      } 



      match_result <- data.frame(mrca_children, new_ratios, nleaves) 


      match_result_sorted <- match_result[order(-match_result$nleaves,match_result$new_ratios),] 
      found <- numeric(0); 

      print(match_result_sorted) 

      for(line in 1:nrow(match_result_sorted)){ 
       if(match_result_sorted$ new_ratios[line]>=threshold){ 
        return(match_result_sorted$mrca_children[line]) 
        found <- 1 
       } 

      } 

      if(found==0){return(found)} 
     }else{return(group_mrca)} 




} 

add_triangle <- function(phy, group,phylo_plot){ 

    group_node_labels <- phy$tip.label[grepl(group, phy$tip.label)] 
    group_mrca <- getMRCA(phy,group_node_labels) 
    group_nodes <- descendants(as(tree.test,"phylo4"), group_mrca, type="tips") 
    names(group_nodes) <- NULL 

    x<-phylo_plot$xx 
    y<-phylo_plot$yy 


    x1 <- max(x[group_nodes]) 
    x2 <-max(x[group_nodes]) 
    x3 <- x[group_mrca] 

    y1 <- min(y[group_nodes]) 
    y2 <- max(y[group_nodes]) 
    y3 <- y[group_mrca] 

    xcoords <- c(x1,x2,x3) 
    ycoords <- c(y1,y2,y3) 

    polygon(xcoords, ycoords) 

    return(c(x2,y3)) 

} 



#main 

    cat("((A_1:0.05,E_2:0.03,A_3:0.2,A_4:0.1,A_5:0.1,A_6:0.1,A_7:0.35,A_8:0.4,A_9:01,A_10:0.2):0.9,((((B_1:0.05,B_2:0.05):0.5,B_3:0.02,B_4:0.04):0.6,(C_1:0.6,C_2:0.08):0.7):0.5,(D_1:0.3,D_2:0.4,D_3:0.5,D_4:0.7,D_5:0.4):1.2):0.5);", file = "ex.tre", sep = "\n") 
tree.test <- read.tree("ex.tre") 


# Step 1: Find the best MRCA that matches to the keywords or search patten 

groups <- c("A", "B|C", "D") 
group_labels <- groups 

group_edges <- numeric(0) 
edge.width <- rep(1, nrow(tree.test$edge)) 
count <- 1 


for(group in groups){ 

    best_mrca <- find_best_mrca(tree.test, group, 0.90) 

    group_leaves <- tips(tree.test, best_mrca) 

    groups[count] <- paste(group_leaves, collapse="|") 
    group_edges <- c(group_edges,best_mrca) 

    #Step2: Remove the edges of the branches that will be collapsed, so they become invisible 
    edge.width[tree.test$edge[,1] %in% c(group_edges[count],descendants(as(tree.test,"phylo4"), group_edges[count], type="all")) ] <- 0 
    count = count +1 

} 


#Step 3: plot the tree hiding the branches that will be collapsed/grouped 

last_plot.phylo <- plot(tree.test, show.tip.label = F, edge.width = edge.width) 

#And save a copy of the plot so we can extract the xy coordinates of the nodes 
#To get the x & y coordinates of a plotted tree created using plot.phylo 
#or plotTree, we can steal from inside tiplabels: 
last_phylo_plot<-get("last_plot.phylo",envir=.PlotPhyloEnv) 

#Step 4: Add triangles and labels to the collapsed nodes 
for(i in 1:length(groups)){ 

    text_coords <- add_triangle(tree.test, groups[i],last_phylo_plot) 

    text(text_coords[1],text_coords[2],labels=group_labels[i], pos=4) 

} 
1

मैं भी उम्र के लिए उपकरण के इस प्रकार के लिए खोज कर दिया गया है स्पष्ट समूहों टूट के लिए इतना नहीं है, लेकिन एक संख्यात्मक समर्थन मूल्य के आधार पर आंतरिक नोड्स टूट के लिए।

di2multi एपे पैकेज में फ़ंक्शन पॉलीटॉमीज़ में नोड्स को पतन कर सकता है, लेकिन वर्तमान में यह केवल शाखा की लंबाई सीमा से ही ऐसा कर सकता है। यहां एक मोटा अनुकूलन है जो इसके बजाय नोड समर्थन मान थ्रेसहोल्ड (डिफ़ॉल्ट थ्रेसहोल्ड = 0.5) द्वारा ध्वस्त करने की अनुमति देता है।

अपने जोखिम पर प्रयोग करें, लेकिन यह मेरे मूल बेयसियन पेड़ पर मेरे लिए काम करता है।

di2multi4node <- function (phy, tol = 0.5) 
    # Adapted di2multi function from the ape package to plot polytomies 
    # based on numeric node support values 
    # (di2multi does this based on edge lengths) 
    # Needs adjustment for unrooted trees as currently skips the first edge 
{ 
    if (is.null(phy$edge.length)) 
    stop("the tree has no branch length") 
    if (is.na(as.numeric(phy$node.label[2]))) 
    stop("node labels can't be converted to numeric values") 
    if (is.null(phy$node.label)) 
    stop("the tree has no node labels") 
    ind <- which(phy$edge[, 2] > length(phy$tip.label))[as.numeric(phy$node.label[2:length(phy$node.label)]) < tol] 
    n <- length(ind) 
    if (!n) 
    return(phy) 
    foo <- function(ancestor, des2del) { 
    wh <- which(phy$edge[, 1] == des2del) 
    for (k in wh) { 
     if (phy$edge[k, 2] %in% node2del) 
     foo(ancestor, phy$edge[k, 2]) 
     else phy$edge[k, 1] <<- ancestor 
    } 
    } 
    node2del <- phy$edge[ind, 2] 
    anc <- phy$edge[ind, 1] 
    for (i in 1:n) { 
    if (anc[i] %in% node2del) 
     next 
    foo(anc[i], node2del[i]) 
    } 
    phy$edge <- phy$edge[-ind, ] 
    phy$edge.length <- phy$edge.length[-ind] 
    phy$Nnode <- phy$Nnode - n 
    sel <- phy$edge > min(node2del) 
    for (i in which(sel)) phy$edge[i] <- phy$edge[i] - sum(node2del < 
                  phy$edge[i]) 
    if (!is.null(phy$node.label)) 
    phy$node.label <- phy$node.label[-(node2del - length(phy$tip.label))] 
    phy 
} 
1

यह phytools::phylo.toBackbone कार्य के आधार पर मेरा उत्तर है, http://blog.phytools.org/2013/09/even-more-on-plotting-subtrees-as.html, और http://blog.phytools.org/2013/10/finding-edge-lengths-of-all-terminal.html देखते हैं। सबसे पहले, कोड के अंत में फ़ंक्शन लोड करें।

library(ape) 
library(phytools) #phylo.toBackbone 
library(phangorn) 

cat("((A_1:0.05,E_2:0.03,A_3:0.2,A_4:0.1,A_5:0.1,A_6:0.1,A_7:0.35,A_8:0.4,A_9:01,A_10:0.2):0.9,((((B_1:0.05,B_2:0.05):0.5,B_3:0.02,B_4:0.04):0.6,(C_1:0.6,C_2:0.08):0.7):0.5,(D_1:0.3,D_2:0.4,D_3:0.5,D_4:0.7,D_5:0.4):1.2):0.5);", file = "ex.tre", sep = "\n") 

phy <- read.tree("ex.tre") 
groups <- c("A", "B|C", "D") 

backboneoftree<-makebackbone(groups,phy) 
# tip.label clade.label N  depth 
# 1  A_1   A 10 0.2481818 
# 2  B_1   B|C 6 0.9400000 
# 3  D_1   D 5 0.4600000 

par(mfrow=c(2,2), mar=c(0,2,2,0)) 
plot(phy, main="Complete tree") 
plot(backboneoftree) 

makebackbone<-function(groupings,phy){ 
    listofspecies<-phy$tip.label 
    listtopreserve<-list() 
    lengthofclades<-list() 
    meandistnode<-list() 
    newedgelengths<-list() 
    for (i in 1:length(groupings)){ 
    groupings<-groups 
    bestmrca<-getMRCA(phy,grep(groupings[i], phy$tip.label)) 
    mrcatips<-phy$tip.label[unlist(phangorn::Descendants(phy,bestmrca, type="tips"))] 
    listtopreserve[i]<- mrcatips[1] 
    meandistnode[i]<- mean(dist.nodes(phy)[unlist(lapply(mrcatips, 
    function(x) grep(x, phy$tip.label))),bestmrca]) 
    lengthofclades[i]<-length(mrcatips) 
    provtree<-drop.tip(phy,mrcatips, trim.internal=F, subtree = T) 
    n3<-length(provtree$tip.label) 
    newedgelengths[i]<-setNames(provtree$edge.length[sapply(1:n3,function(x,y) 
     which(y==x),y=provtree$edge[,2])], 
     provtree$tip.label)[provtree$tip.label[grep("tips",provtree$tip.label)] ] 
    } 
    newtree<-drop.tip(phy,setdiff(listofspecies,unlist(listtopreserve)), 
        trim.internal = T) 
    n<-length(newtree$tip.label) 
    newtree$edge.length[sapply(1:n,function(x,y) 
    which(y==x),y=newtree$edge[,2])]<-unlist(newedgelengths)+unlist(meandistnode) 
    trans<-data.frame(tip.label=newtree$tip.label,clade.label=groupings, 
        N=unlist(lengthofclades), depth=unlist(meandistnode)) 
    rownames(trans)<-NULL 
    print(trans) 
    backboneoftree<-phytools::phylo.toBackbone(newtree,trans) 
    return(backboneoftree) 
} 

enter image description here

संपादित करें: मैं इस प्रयास नहीं किया है, लेकिन यह एक और जवाब हो सकता है: "स्क्रिप्ट और एक पेड़ की नोक शाखाओं को बदलने के लिए, मोटाई यानी या त्रिकोण के लिए कार्य करते है, साथ दोनों को कुछ पैरामीटरों वाले सम्बंधित की चौड़ाई (जैसे, क्लेड की प्रजातियों संख्या) (tip.branches.R) " http://www.sysbot.biologie.uni-muenchen.de/en/people/cusimano/use_r.html http://www.sysbot.biologie.uni-muenchen.de/en/people/cusimano/tip.branches.R

संबंधित मुद्दे