View source: R/fit_hbd_pdr_on_best_grid_size.R
fit_hbd_pdr_on_best_grid_size | R Documentation |
Given an ultrametric timetree, estimate the pulled diversification rate of homogenous birth-death (HBD) models that best explains the tree via maximum likelihood, automatically determining the optimal time-grid size based on the data. Every HBD model is defined by some speciation and extinction rates (\lambda
and \mu
) over time, as well as the sampling fraction \rho
(fraction of extant species sampled). “Homogenous” refers to the assumption that, at any given moment in time, all lineages exhibit the same speciation/extinction rates. For any given HBD model there exists an infinite number of alternative HBD models that predict the same deterministic lineages-through-time curve and yield the same likelihood for any given reconstructed timetree; these “congruent” models cannot be distinguished from one another solely based on the tree.
Each congruence class is uniquely described by the “pulled diversification rate” (PDR; Louca et al 2018), defined as PDR=\lambda-\mu+\lambda^{-1}d\lambda/d\tau
(where \tau
is time before present) as well as the product \rho\lambda_o
(where \lambda_o
is the present-day speciation rate). That is, two HBD models are congruent if and only if they have the same PDR and the same product \rho\lambda_o
. This function is designed to estimate the generating congruence class for the tree, by fitting the PDR on a grid of discrete times as well as the product \rho\lambda_o
. Internally, the function uses fit_hbd_pdr_on_grid
to perform the fitting. The "best" grid size is determined based on some optimality criterion, such as AIC.
fit_hbd_pdr_on_best_grid_size(tree,
oldest_age = NULL,
age0 = 0,
grid_sizes = c(1,10),
uniform_grid = FALSE,
criterion = "AIC",
exhaustive = TRUE,
min_PDR = -Inf,
max_PDR = +Inf,
min_rholambda0 = 1e-10,
max_rholambda0 = +Inf,
guess_PDR = NULL,
guess_rholambda0 = NULL,
fixed_PDR = NULL,
fixed_rholambda0 = NULL,
splines_degree = 1,
condition = "auto",
relative_dt = 1e-3,
Ntrials = 1,
Nbootstraps = 0,
Ntrials_per_bootstrap = NULL,
Nthreads = 1,
max_model_runtime = NULL,
fit_control = list(),
verbose = FALSE,
verbose_prefix = "")
tree |
A rooted ultrametric timetree of class "phylo", representing the time-calibrated phylogeny of a set of extant sampled species. |
oldest_age |
Strictly positive numeric, specifying the oldest time before present (“age”) to consider when calculating the likelihood. If this is equal to or greater than the root age, then |
age0 |
Non-negative numeric, specifying the youngest age (time before present) to consider for fitting. If |
grid_sizes |
Numeric vector, listing alternative grid sizes to consider. |
uniform_grid |
Logical, specifying whether to use uniform time grids (equal time intervals) or non-uniform time grids (more grid points towards the present, where more data are available). |
criterion |
Character, specifying which criterion to use for selecting the best grid. Options are "AIC" and "BIC". |
exhaustive |
Logical, whether to try all grid sizes before choosing the best one. If |
min_PDR |
Numeric vector of length Ngrid (= |
max_PDR |
Numeric vector of length Ngrid, or a single numeric, specifying upper bounds for the fitted PDR at each point in the age grid. If a single numeric, the same upper bound applies at all ages. Use |
min_rholambda0 |
Strictly positive numeric, specifying the lower bound for the fitted |
max_rholambda0 |
Strictly positive numeric, specifying the upper bound for the fitted |
guess_PDR |
Initial guess for the PDR at each age-grid point. Either |
guess_rholambda0 |
Numeric, specifying an initial guess for the product |
fixed_PDR |
Optional fixed (i.e. non-fitted) PDR values. Either |
fixed_rholambda0 |
Numeric, optionally specifying a fixed value for the product |
splines_degree |
Integer between 0 and 3 (inclusive), specifying the polynomial degree of the PDR between age-grid points. If 0, then the PDR is considered to be piecewise constant, if 1 then the PDR is considered piecewise linear, if 2 or 3 then the PDR is considered to be a spline of degree 2 or 3, respectively. The |
condition |
Character, either "crown", "stem", "auto", "stemN" or "crownN" (where N is an integer >=2), specifying on what to condition the likelihood. If "crown", the likelihood is conditioned on the survival of the two daughter lineages branching off at the root at that time. If "stem", the likelihood is conditioned on the survival of the stem lineage, with the process having started at |
relative_dt |
Strictly positive numeric (unitless), specifying the maximum relative time step allowed for integration over time, when calculating the likelihood. Smaller values increase integration accuracy but increase computation time. Typical values are 0.0001-0.001. The default is usually sufficient. |
Ntrials |
Integer, specifying the number of independent fitting trials to perform, each starting from a random choice of model parameters. Increasing |
Nbootstraps |
Integer, specifying an optional number of bootstrap samplings to perform, for estimating standard errors and confidence intervals of maximum-likelihood fitted parameters. If 0, no bootstrapping is performed. Typical values are 10-100. At each bootstrap sampling, a random timetree is generated under the birth-death model according to the fitted PDR and |
Ntrials_per_bootstrap |
Integer, specifying the number of fitting trials to perform for each bootstrap sampling. If |
Nthreads |
Integer, specifying the number of parallel threads to use for performing multiple fitting trials simultaneously. This should generally not exceed the number of available CPUs on your machine. Parallel computing is not available on the Windows platform. |
max_model_runtime |
Optional numeric, specifying the maximum number of seconds to allow for each evaluation of the likelihood function. Use this to abort fitting trials leading to parameter regions where the likelihood takes a long time to evaluate (these are often unlikely parameter regions). |
fit_control |
Named list containing options for the |
verbose |
Logical, specifying whether to print progress reports and warnings to the screen. Note that errors always cause a return of the function (see return values |
verbose_prefix |
Character, specifying the line prefix for printing progress reports to the screen. |
It is generally advised to provide as much information to the function fit_hbd_pdr_on_best_grid_size
as possible, including reasonable lower and upper bounds (min_PDR
, max_PDR
, min_rholambda0
and max_rholambda0
) and a reasonable parameter guess (guess_PDR
and guess_rholambda0
).
A list with the following elements:
success |
Logical, indicating whether the function executed successfully. If |
best_fit |
A named list containing the fitting results for the best grid size. This list has the same structure as the one returned by |
grid_sizes |
Numeric vector, listing the grid sizes as provided during the function call. |
AICs |
Numeric vector of the same length as |
BICs |
Numeric vector of the same length as |
Stilianos Louca
S. Louca et al. (2018). Bacterial diversification through geological time. Nature Ecology & Evolution. 2:1458-1467.
S. Louca and M. W. Pennell (2020). Extant timetrees are consistent with a myriad of diversification histories. Nature. 580:502-505.
simulate_deterministic_hbd
loglikelihood_hbd
fit_hbd_model_parametric
fit_hbd_model_on_grid
fit_hbd_pdr_parametric
fit_hbd_pdr_on_grid
fit_hbd_psr_on_grid
fit_hbd_psr_on_best_grid_size
model_adequacy_hbd
evaluate_spline
## Not run:
# Generate a random tree with exponentially varying lambda & mu
Ntips = 10000
rho = 0.5 # sampling fraction
time_grid = seq(from=0, to=100, by=0.01)
lambdas = 2*exp(0.1*time_grid)
mus = 1.5*exp(0.09*time_grid)
sim = generate_random_tree( parameters = list(rarefaction=rho),
max_tips = Ntips/rho,
coalescent = TRUE,
added_rates_times = time_grid,
added_birth_rates_pc = lambdas,
added_death_rates_pc = mus)
tree = sim$tree
root_age = castor::get_tree_span(tree)$max_distance
cat(sprintf("Tree has %d tips, spans %g Myr\n",length(tree$tip.label),root_age))
# Fit PDR on grid, with the grid size chosen automatically between 1 and 5
fit = fit_hbd_pdr_on_best_grid_size(tree,
max_PDR = 100,
grid_sizes = c(1:5),
exhaustive = FALSE,
uniform_grid = FALSE,
Ntrials = 10,
Nthreads = 4,
verbose = TRUE,
max_model_runtime = 1)
if(!fit$success){
cat(sprintf("ERROR: Fitting failed: %s\n",fit$error))
}else{
best_fit = fit$best_fit
cat(sprintf("Fitting succeeded:\nBest grid size=%d\n",length(best_fit$age_grid)))
# plot fitted PDR
plot( x = best_fit$age_grid,
y = best_fit$fitted_PDR,
main = 'Fitted PDR',
xlab = 'age',
ylab = 'PDR',
type = 'b',
xlim = c(root_age,0))
# get fitted PDR as a function of age
PDR_fun = approxfun(x=best_fit$age_grid, y=best_fit$fitted_PDR)
}
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.