Last chance! 50% off unlimited learning
Sale ends in
root.time
) to the
present.yule.time(phy, birth, BIRTH = NULL, root.time = 0, opti = "nlm", start = 0.01)
"phylo"
.birth
."nlm"
, "nlminb"
, or "optim"
, or any unambiguous
abbreviation of these."yule"
(see yule
).yule.cov
). Rather than having
heterogeneity among lineages, the speciation probability is the same
for all lineages at a given time, but can change through time. The function birth
must meet these two requirements: (i)
the parameters to be estimated are the formal arguments; (ii) time is
named t
in the body of the function. However, this is the
opposite for the primitive BIRTH
: t
is the formal
argument, and the parameters are used in its body. See the examples.
It is recommended to use BIRTH
if possible, and required if
speciation probability is constant on some time interval. If this
primitive cannot be provided, a numerical integration is done with
integrate
.
The standard-errors of the parameters are computed with the Hessian of the log-likelihood function.
branching.times
, ltt.plot
,
birthdeath
, yule
, yule.cov
,
bd.time
### define two models...
birth.logis <- function(a, b) 1/(1 + exp(-a*t - b)) # logistic
birth.step <- function(l1, l2, Tcl) { # 2 rates with one break-point
ans <- rep(l1, length(t))
ans[t > Tcl] <- l2
ans
}
### ... and their primitives:
BIRTH.logis <- function(t) log(exp(-a*t) + exp(b))/a + t
BIRTH.step <- function(t)
{
out <- numeric(length(t))
sel <- t <= Tcl
if (any(sel)) out[sel] <- t[sel] * l1
if (any(!sel)) out[!sel] <- Tcl * l1 + (t[!sel] - Tcl) * l2
out
}
data(bird.families)
### fit both models:
yule.time(bird.families, birth.logis)
yule.time(bird.families, birth.logis, BIRTH.logis) # same but faster
yule.time(bird.families, birth.step) # fails
yule.time(bird.families, birth.step, BIRTH.step,
opti = "nlminb", start = c(.01, .01, 100))
Run the code above in your browser using DataLab