Vamos a estudiar dos modelos no-lineales que se usan para describir el crecimiento poblacional de organismos, y vamos a usar el ejemplo de crecimiento bacteriano.
La forma general de la función Gompertz, es la siguiente: \[y = ae^{-bc^x}\]
Esta es la forma general de la función de crecimiento logístico:
\[N_t = \frac{K}{1 + (\frac{K - N_0}{N_0})e^{-rt}}\]
Ambas son no-lineales, y antes debemos encontrar valores iniciales de los parámetros.
Utilizaremos los datos de crecimiento de un cultivo de Salmonella sp. (ver proyecto de modelo no-lineal).
library(readxl)
gbac <- read.csv("bacteria19.csv")
library(ggplot2)
ggplot(gbac, aes(x = Time, y = Logc)) + geom_point(alpha=0.7) +
ylim(0,12)
Una forma de la ecuación re-paremetrizada del modelo Gompertz es la siguiente:
\[y = y_0 + (y_{max} - y_0)*exp(-exp(k*(lag - x)/(y_{max} - y_0) + 1))\] Para utilizar el comando nls más fácilmente, primero creamos una función R para la ecuación Gompertz.
Gompertz <- function(x, y0, ymax, k, lag){
result <- y0 + (ymax -y0)*exp(-exp(k*(lag-x)/(ymax-y0) + 1) )
return(result)
}
Luego obtenemos unos valores iniciales para los parámetros, a partir de la gráfico y/o los datos.
y0 = 4.5
ymax = 10.2
lag = 5
k = 0.2
Finalmente se calculan los parámetros del modelo ajustado usando nls.
# modelo
Gomp1 <- nls(Logc ~ Gompertz(Time, y0, ymax, k, lag),
data = gbac,
start = list(y0=y0, ymax=ymax, k=k, lag=lag))
# parámetros y estadisticas
summary(Gomp1)
##
## Formula: Logc ~ Gompertz(Time, y0, ymax, k, lag)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## y0 4.43112 0.07977 55.55 < 2e-16 ***
## ymax 10.35959 0.06175 167.78 < 2e-16 ***
## k 0.87926 0.03772 23.31 < 2e-16 ***
## lag 7.66630 0.50660 15.13 8.96e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1736 on 24 degrees of freedom
##
## Number of iterations to convergence: 10
## Achieved convergence tolerance: 6.197e-06
Se grafican los puntos originales y valores de la predicción con la función y los parámetros calculados.
time.levels <- seq(0, 100, by=0.1)
pred <- predict(Gomp1, list(x=time.levels) )
plot(Logc ~ Time, data=gbac, xlim=c(0,100), ylim=c(0, 12),
xlab="time", ylab="logCFU")
lines(gbac$Time, pred,
lty = 1, col = "red")
library(growthcurver)
Con este método no es necesario estimar valores iniciales, y se puede aplicar a muchas curvas de crecimiento a la vez.
model.bac <- SummarizeGrowth(gbac$Time, gbac$Logc, bg_correct = "none")
model.bac$vals
## k k_se k_p n0 n0_se n0_p
## 10.534 0.171 7e-29 3.491 0.179 1e-16
##
## r r_se r_p sigma df t_mid
## 0.094 0.007 9e-13 0.437 25 7.497
##
## t_gen auc_l auc_e
## 7.406 922.81 915.104
model.bac$model
## Nonlinear regression model
## model: n ~ k/(1 + ((k - n0)/n0) * exp(-r * t))
## data: d
## k n0 r
## 10.53397 3.49142 0.09359
## residual sum-of-squares: 4.769
##
## Number of iterations to convergence: 8
## Achieved convergence tolerance: 1.49e-08
A continuación la lista de parámetros poblacionales que se extraen con el paquete growthcurver y que tienen un significado en el análisis del crecimiento de microorganismos:
plot(model.bac, xlab="time", ylab="logCFU")