--- title: "Getting started with Quartet" author: "Martin R. Smith" date: "`r Sys.Date()`" output: rmarkdown::html_document: bookdown::pdf_document2: includes: in_header: ../inst/preamble.tex number_sections: false bibliography: ../inst/REFERENCES.bib csl: https://raw.githubusercontent.com/citation-style-language/styles/master/apa-old-doi-prefix.csl vignette: > %\VignetteIndexEntry{Getting started with Quartet} %\VignetteEncoding{UTF-8} %\VignetteEngine{knitr::rmarkdown} --- This document should contain all you need to get started measuring tree distances with 'Quartet'. If you get stuck, please [let me know](https://github.com/ms609/Quartet/issues/new?title=Suggestion:+) so I can improve this documentation. ## Loading trees Instructions for loading phylogenetic trees into R can be found in a [separate vignette](https://ms609.github.io/TreeTools/articles/load-trees.html). For these examples, we'll enter two simple trees by hand: ```{r set-up} tree1 <- ape::read.tree(text = '(A, ((B, (C, (D, E))), ((F, G), (H, I))));') tree2 <- ape::read.tree(text = '(A, ((B, (C, (D, (H, I)))), ((F, G), E)));') ``` ## Calculating distances We can calculate distances between pairs of trees using the 'Quartet' package. First we'll install the package. We can either install the stable version from the CRAN repository: ```r install.packages('Quartet') ``` or the development version, from GitHub -- which will contain the latest features but may not be as extensively tested: ```r devtools::install_github('ms609/Quartet') ``` Then we'll load the package into R's working environment: ```{r load-package, message=FALSE} library('Quartet') ``` Now the package's functions are available within R. Let's proceed to calculate some tree distances. ### Pairs of trees Calculating the distance between two trees is a two stage process. For a quartet distance, we first have to calculate the status of each quartet: ```{r quartet-status} statuses <- QuartetStatus(tree1, tree2) ``` Then we convert these counts into a distance metric (or similarity measure) that suits our needs -- perhaps the Quartet Divergence: ```{r measure-distance} QuartetDivergence(statuses, similarity = FALSE) ``` We can calculate all similarity metrics at once using: ```{r all-metrics} SimilarityMetrics(statuses, similarity = TRUE) ``` It can be instructive to visualize how each split in the tree is contributing to the quartet similarity: ```{r visualize-quartets} VisualizeQuartets(tree1, tree2) ``` Rather than using quartets, we might want to use partitions as the basis of our comparison: ```{r partitions} SimilarityMetrics(SplitStatus(tree1, tree2)) ``` ### Multiple comparisons If you have more than two trees to compare, you can send a list of trees (class: `list` or `multiPhylo`) to the distance comparison function. You can calculate the similarity between one tree and a forest of other trees: ```{r multi-trees} library('TreeTools', quietly = TRUE, warn.conflicts = FALSE) oneTree <- CollapseNode(as.phylo(0, 11), 14) twoTrees <- structure(list(bal = BalancedTree(11), pec = PectinateTree(11)), class = 'multiPhylo') status <- SharedQuartetStatus(twoTrees, cf = oneTree) QuartetDivergence(status) ``` Or between one tree and (itself and) all other trees in the forest: ```{r one-to-many} forest <- as.phylo(0:5, 11) names(forest) <- letters[1:6] status <- SharedQuartetStatus(forest) QuartetDivergence(status) ``` Or between each pair of trees in a forest: ```{r many-to-many} status <- ManyToManyQuartetAgreement(forest) QuartetDivergence(status, similarity = FALSE) ``` Or between one list of trees and a second: ```{r pairwise} status <- TwoListQuartetAgreement(forest[1:4], forest[5:6]) QuartetDivergence(status, similarity = FALSE) ``` ## Trees with different tip labels "Quartet" can compare trees of different sizes or with non-identical sets of taxa. Quartets pertaining to a leaf that does not occur in one tree are treated as unresolved. ```{r different-tips, fig.height = 1.5, fig.width = 4, fig.align = "center"} treeAG <- PectinateTree(letters[1:7]) treeBI <- PectinateTree(letters[2:9]) treeEJ <- PectinateTree(letters[5:10]) par(mfrow = c(1, 3), mar = rep(0.3, 4), cex = 1) plot(treeAG); plot(treeBI); plot(treeEJ) QuartetState(letters[1:4], treeAG) # 3: C is closest to D QuartetState(letters[1:4], treeBI) # 0: unresolved in this tree # Calculate status for all leaves observed in trees: here, A..I QuartetStatus(treeAG, treeBI, nTip = TRUE) # Calculate status for specified number of leaves # Here, we have ten taxa A..J, but J does not occur in either of these trees QuartetStatus(treeAG, treeBI, nTip = 10) # Compare a list of trees with different numbers of leaves to a reference QuartetStatus(c(treeAG, treeBI, treeEJ), cf = treeAG, nTip = TRUE) # Compare all pairs of trees in a list. # "u" shows how many possible quartets are unresolved in both trees ManyToManyQuartetAgreement(c(treeAG, treeBI, treeEJ), nTip = TRUE)[, , "u"] ``` ## Other calculations To calculate how many quartets are unique to a certain tree (akin to the partitionwise equivalent `ape::prop.clades`), use: ```{r in-one-only} interestingTree <- as.phylo(42, 7) referenceTrees <- list(BalancedTree(7), PectinateTree(7)) status <- CompareQuartetsMulti(interestingTree, referenceTrees) ``` `status['x_only']` = `r status['x_only']` quartets are resolved in a certain way in `interestingTree`, but not resolved that way in any `referenceTrees`. ## What next? You may wish to: - [Read more](https://ms609.github.io/Quartet/articles/Quartet-Distance.html) about Quartet distances - Review [alternative distance measures](https://ms609.github.io/TreeDist/index.html) and corresponding [functions](https://ms609.github.io/TreeDist/reference/index.html#section-tree-distance-measures) - [Interpret or contextualize](https://ms609.github.io/TreeDist/articles/using-distances.html) tree distance metrics