Many phylogenetic inference software packages, such as BEAST2 and RevBayes, can handle trees containing fossil samples. In the zero-edge format, tip samples are represented normally in the tree, but sampled ancestors, i.e fossil samples which have sampled descendants, are represented as tips at the end of edges with length 0.
This format is included in FossilSim
as the SAtree
objects.
SAtree
objects can be built from a fossils
object and the associated tree. Tips (both extinct and extant) will be labelled with the species they were sampled from followed by an index: the oldest sample for a given species will get index 1 and all other samples will be ordered from oldest to youngest. The SAtree
format also includes a field complete
which indicates whether the tree should be considered as including all lineages of the process or only sampled lineages. Note that if the tree is complete, the youngest tip of a given extinct species represents the extinction event for this species and not a fossil sample.
t = ape::rtree(6)
f = sim.fossils.poisson(rate = 2, tree = t)
SAt = SAtree.from.fossils(tree = t, fossils = f)
print(SAt$tree)
##
## Phylogenetic tree with 14 tips and 13 internal nodes.
##
## Tip labels:
## t2_2, t3_1, t6_1, t5_2, t1_2, t4_2, ...
##
## Rooted; includes branch lengths.
print(SAt$fossils)
## sp edge hmin hmax h tip.label
## 1 1 1 0.5164149 0.5164149 0.5164149 t2_1
## 2 4 4 1.4963759 1.4963759 1.4963759 t5_1
## 3 5 5 0.8625391 0.8625391 0.8625391 t1_1
## 4 6 6 0.7586946 0.7586946 0.7586946 t4_1
## 5 9 9 1.1931494 1.1931494 1.1931494 t9_1
## 6 10 10 0.8659673 0.8659673 0.8659673 t10_1
## 8 11 11 1.4948714 1.4948714 1.4948714 t11_1
## 7 11 11 1.4080063 1.4080063 1.4080063 t11_2
## Fossil record with 8 occurrences representing 7 species
## Fossil record not simulated using taxonomy: all speciation events are assumed to be symmetric
print(SAt$tree$complete)
## [1] TRUE
Other functions are present in FossilSim
to modify trees. prune.fossils
will remove all intermediate fossil samples and keep only the first and last occurrences of any species.
SAt_pruned = prune.fossils(tree = SAt$tree)
plot(SAt_pruned)
sampled.tree.from.combined
removes all unsampled lineages from the tree, and can optionally apply a sampling probability to extant samples, or keep only a specified list of extant samples.
SAt_sampled = sampled.tree.from.combined(tree = SAt$tree)
plot(SAt_sampled)
These two functions can be applied to any object of type phylo
, but are designed to work on trees which include fossil samples.