Adams() returns the Adams consensus (Adams 1972)
, a
summary of a set of rooted trees.
Value
Adams() returns the consensus tree, an object of class phylo,
rooted by construction. (A tree whose root is multifurcating reports
ape::is.rooted() == FALSE, which tests only for a two-child root; the Adams
tree is rooted regardless.)
Details
The Adams consensus is defined recursively. At the top level, the leaves are partitioned into the coarsest grouping that every input tree refines: two leaves fall in the same block if and only if, in every input tree, they sit below the same child of the most recent common ancestor of the full leaf set. Each block becomes a child of the consensus root, and the construction repeats within each block.
Unlike the split-based methods (Strict(), Majority(), Loose(),
Greedy(), MajorityPlus(), Frequency()), the Adams consensus can
contain a cluster that appears in no individual input tree, and it depends on
how the input trees are rooted: it is a statement about nesting, not about
unrooted bipartitions. Input trees are treated as rooted on their current
root; root the trees as you intend before calling Adams().
This implementation employs the asymptotically efficient \(O(kn \log n)\)
algorithm of (Jansson et al. 2017)
(their
New_Adams_consensus_k, from the FACT toolkit of Jansson and colleagues, used
with permission), realised in C++. Rather than recomputing Adams' partition
from scratch at every recursion level, it follows a centroid path through each
input tree in unison, expanding the shared "spine" of the consensus
iteratively and recursing only on the off-spine blocks (each at most half the
leaves). The Adams consensus tree is unique, so the result is identical to the
classical recursive definition; only the running time differs.
References
Adams EN (1972).
“Consensus techniques and the comparison of taxonomic trees.”
Systematic Zoology, 21(4), 390–397.
doi:10.2307/2412432
.
Jansson J, Li Z, Sung W (2017).
“On finding the Adams consensus tree.”
Information and Computation, 256, 334–347.
doi:10.1016/j.ic.2017.08.002
.
See also
Closely related: Strict(), Majority(), Loose(),
Greedy(), MajorityPlus(), Frequency().
Other consensus methods:
Average(),
Frequency(),
Greedy(),
Local(),
Loose(),
Majority(),
MajorityPlus(),
Quartet(),
RStar(),
Strict()
Examples
# Two rooted trees that disagree only on the position of one leaf
trees <- c(ape::read.tree(text = "(((a, b), c), d);"),
ape::read.tree(text = "(((a, b), d), c);"))
Adams(trees) # keeps the clade (a, b); leaves c, d unresolved at the root
#>
#> Phylogenetic tree with 4 tips and 2 internal nodes.
#>
#> Tip labels:
#> d, c, b, a
#>
#> Unrooted; no branch length.