In general, the doubling time is only constant for an exponential curve and for the logistic and other curves we can only calculate an instantaneous doubling time which varies from point to point as opposed to being a single value.
The situation is similar to that of the slope which is only constant for a line. For other (differentiable) curves we can only calculate the slope of the tangent at each point and that varies from point to point as opposed to being a single value.
In general the instantaneous doubling time at point t equals
1/(log2 f(t))'
i.e. the reciprocal of the derivative of log base 2 of f(t) with respect to t evaluated at t. Here f(t) is the logistic or other curve. Note that because log2(x) = log(x) / log(2) and because of the rule for evaluating the derivative of the log of a function the instantaneous doubling time equals the following where log is log base e and f is short for f(t) and f' is short for the derivative of f(t) with respect to t evaluated at t.
log(2) * f / f'
Logistic curve
In the case of the logistic it satisfies a well known differential equation which can help us calculate the doubling time.
f = SSlogis(Time, Asym, xmid, scal) # Asym / (1 + exp((xmid - x)/scal))
f' = (1/scal) * f * (1 - f / Asym)
doubling time = log(2) * f / f' = log(2) * scal / (1 - f/Asym)
In R consider the Chickwt.1 data example used in example(SSlogis)
. With that we can carry out the R calculations:
# example data
Chick.1 <- ChickWeight[ChickWeight$Chick == 1, ] # ChickWeight comes with R
Asym <- 368; xmid <- 14; scal <- 6
Time <- Chick.1$Time
f <- SSlogis(Time, Asym, xmid, scal)
fderiv <- (1/scal) * f * (1-f/Asym)
log(2) * f / fderiv # doubling time
# or equivalently
log(2) * scal / (1 - f/Asym) # doubling time
plot(log(2) * scal / (1 - f/Asym) ~ Time, type = "o", pch = 20,
ylab = "Instantaneous Doubling Time")
This is the instantaneous doubling time of f at each time point in the vector Time.
In particular, consider three situations:
- when f is small relative to Asym the denominator of log(2) * scal / (1 - f/Asym) is approximately 1 so the doubling time is about log(2) * scal. This expression is the same as for the exponential (see next section).
- at the inflection point of the logistic f = Asym/2 so the doubling time is 2 * log(2) * scal.
- when f is near Asym the denominator of log(2) * scal / (1 - f/Asym) is close to 0 so the doubling time approaches infinity.
(continued after plot)

Exponential curve
As another example, the definition and differential equation of the exponential curve are:
f = Asym * exp((xmid - Time)/scal)
f' = (1/scal) * f
so without even using R, given the cancellations in the numerator and denominator, we can calculate the doubling time as:
log(2) * f / f'
= log(2) * scal
Fitting
We can estimate the parameters of the logistic using nls
and SSlogis
for the Chick.1 data:
fm.nls <- nls(weight ~ SSlogis(Time, Asym, xmid, scal), Chick.1)
fm.nls # displays coefficients
log(2) * coef(fm.nls)[["scal"]] # doubling time in initial portion of curve
In the case of this data it actually appears exponential. Plotting log2(weight) vs. Time gives approximately a straight line if it is exponential and that is the case here. In that case the doubling time is the reciprocal of the slope of the line of best fit.
fm.lm <- lm(log2(weight) ~ Time, Chick.1)
1/coef(fm.lm)[2] # doubling time
# seems like a straight line
plot(log2(weight) ~ Time, Chick.1)
abline(fm.lm)
