paleobuddy {paleobuddy} | R Documentation |
paleobuddy: Simulating diversification dynamics
Description
paleobuddy
provides users with flexible scenarios for species
birth-death simulations. It also provides the possibility of generating
phylogenetic trees (with extinct and extant species) and fossil records
(with a number of preservation scenarios) from the same underlying process.
Birth-death simulation
Users have access to a large array of scenarios to use and combine for
species birth-death simulation. The function bd.sim
allows for
constant rates, rates varying as a function of time, or time and/or an
environmental variable, as well as age-dependent rates by using a shape
parameter from a Weibull distribution (which can itself also be
time-dependent). Extinction and speciation rates can be supplied
independently, so that one can combine any types of scenarios for birth and
death rates. The function find.lineages
separates birth-death
simulations into monophyletic clades so one can generate fossil records and
phylogenies (see below) for clades with a specific mother species. This is
particularly useful for simulations with multiple starting species. See
?bd.sim
and ?find.lineages
for more information.
All birth-death simulation functions return a sim
object, which is a
list of vectors containing speciation times, extinction times, status
(extant or extinct) and parent identity for each species of the simulation.
We supply methods for summarizing and printing sim
objects in a more
informative manner (see Visualization below). See ?sim
for more
information.
Fossil record simulation
The package provides users with a similarly diverse array of scenarios for
preservation rates in generating fossil records from birth-death
simulations. The function sample.clade
accepts constant,
time-varying, and environmentally dependent rates. Users might also supply a
model describing the distribution of fossil occurrences over a species
duration to simulate age-dependent sampling. See ?sample.clade
for
more information.
Phylogeny generation
We believe it is imperative to be able to generate fossil records and
phylogenetic trees from the same underlying process, so the package provides
make.phylo
, a function that takes a simulation object of the form
returned by bd.sim
and generates a phylo
object from the APE
package. One can then use functions such as ape::plot.phylo
and
ape::drop.fossil
to plot the phylogeny or analyze the
phylogeny of extant species. Since APE is not required for any function in
the package, it is a suggested but not imported package. Note that, as
above, the function find.lineages
allows users to separate clades
with mother species of choice, the results of which can be passed to
make.phylo
to generate separate phylogenies for each clade. See
?make.phylo
and ?find.lineages
for more information.
Note: If a user wishes to perform the opposite operation - transform a
phylo
object into a sim
object, perhaps to use paleobuddy for
sampling on phylogenies generated by other packages, see
?phylo.to.sim
.
Visualization
paleobuddy
provides the user with a number of options for visualizing
a sim
object besides phylogenies. The sim
object returned by
birth-death simulation functions (see above) has summary and plot methods.
summary(sim)
gives quantitative details of a sim
objective,
namely the total and extant number of species, and summaries of species
durations and speciation times. plot(sim)
plots births, deaths, and
diversity through time for that realization. The function draw.sim
draws longevities of species in the simulation, allowing for customization
through the addition of fossil occurrences (which can be time points or
ranges), and vertical order of the drawn longevities.
Utility functions
The package makes use of a few helper functions for simulation and testing
that we make available for the user. rexp.var
aims to emulate the
behavior of rexp
, the native R function for drawing an exponentially
distributed variate, with the possibility of supplying a time-varying
rate. The function also allows for a shape parameter, in which case the
times drawn will be distributed as a Weibull, possibly with time-varying
parameters, for age-dependent rates. var.rate.div
calculates the
expected diversity of a birth-death process with varying rates for any time
period, which is useful when testing the birth-death simulation functions.
Finally, binner
takes a vector of fossil occurrence times and a
vector of time boundaries and returns the number of occurrences within each
time period. This is mostly for use in the sample.clade
function. See
?rexp.var
, ?var.rate.div
and ?binner
for more
information.
Author(s)
Bruno do Rosario Petrucci, Matheus Januario and Tiago B. Quental
Maintainer: Bruno do Rosario Petrucci <petrucci@iastate.edu>
Examples
# here we present a quick example of paleobuddy usage
# for a more involved introduction, see the \code{overview} vignette
# make a vector for time
time <- seq(0, 10, 0.1)
# speciation rate
lambda <- function(t) {
0.15 + 0.03*t
}
# extinction rate
mu <- 0.08
# these are pretty simple scenarios, of course
# check the examples in ?bd.sim for a more comprehensive review
# diversification
d <- function(t) {
lambda(t) - mu
}
# calculate how many species we expect over 10 million years
div <- var.rate.div(rate = d, n0 = 1, t = time)
# note we are starting with 3 species (n0 = 3), but the user
# can provide any value - the most common scenario is n0 = 1
# plot it
plot(time, rev(div), type = 'l', main = "Expected diversity",
xlab = "Time (My)", ylab = "Species",
xlim = c(max(time), min(time)))
# we then expect around 9 species
# alive by the present, seems pretty good
# set seed
set.seed(1)
# run the simulation
sim <- bd.sim(n0 = 1, lambda = lambda, mu = mu,
tMax = 10, nFinal = c(20, Inf))
# nFinal controls the final number of species
# here we throw away simulations with less than 20 species generated
# draw longevities
draw.sim(sim)
# from sim, we can create fossil records for each species
# rho is the fossil sampling rate, see ?sample.clade
samp <- sample.clade(sim = sim, rho = 0.75, tMax = 10,
bins = seq(10, 0, -1))
# note 7 out of the 31 species did not leave a fossil - we can in this way
# simulate the incompleteness of the fossil record
# we can draw fossil occurrences as well, and order by extinction time
draw.sim(sim, fossils = samp, sortBy = "TE")
# take a look at the phylogeny
if (requireNamespace("ape", quietly = TRUE)) {
ape::plot.phylo(make.phylo(sim), root.edge = TRUE)
ape::axisPhylo()
}