Crecimiento denso-dependiente. Aplicación en R (paquete primer).

2. Modelos denso-dependientes



Aplicación en R: Paquete "primer". Crecimiento logístico (denso-dependiente) discreto

######## 1) CRECIMIENTO DENSO-DEPENDIENTE DISCRETO
#podemos descompones lambda en dos partes lambda=1+rd donde rd es el factor de crecimiento discreto, por tanto: Nt+1=Nt+rd*Nt. Para agregar DD podemos construir SSen el cambio proporcional rdNt. Representamos el efecto negativo de cada individuo en la población mediante una constante llamada alfa, donde alfa*Nt es el efecto negativo total de todos los individuos en la población. Un factor de escalamiento es: Incremento per cápita=rd*(1-alfa*Nt), donde alfa es el efecto negativo per cápita de un individuo en el aumento del crecimiento per cápita. Qué valor de N hará que el crecimiento per cápita sea cero? resolver 0=rd*(1-alfa*Nt) y obtener Nt=1/alfa. Los supuestos (alfa y rd constante) asumen una relación entre ellos (rd[1-alfa*Nt]), donde la población deja de cambiar cuando N=1/alfa=K (atractor=N se mueve de manera determinística hacia K).
dlogistic = function(alpha = 0.01, rd = 1, N0 = 2, t = 15) { N=c(N0, numeric(t)); for (i in 1:t){ N[i + 1]= N[i] + rd * N[i] * (1 - alpha * N[i]) }; return(N) }
Nts=dlogistic(); t =15; a=0.01; plot(0:t, Nts); abline(h = 1/a, lty = 3)
#relacion entre tasa de crecimiento y densidad: cómo aumenta el crecimiento per cápita y el crecimiento poblacional al variar el tamaño poblacional.
total.incr=Nts[1:t + 1] - Nts[1:t]; per.capita.incr=total.incr/Nts[1:t]; plot(Nts[1:t], total.incr); plot(Nts[1:t], per.capita.incr) #el crecimiento per cápita (deltaNt/Nt) tiene relación lineal con el tamaño poblacional (DD lineal!), lo cual proviene de nuestro supuesto de que el efecto negativo per cápita es constante (alfa).
#efecto del tamaño poblacional en la dinámica de crecimiento: aprox. por simulación o aprox. analítica. Realizamos una evaluación numérica de las condiciones iniciales.
N0s=c(0, runif(30) * 1.1 * 1/a); N=sapply(N0s, function(n) dlogistic(N0 = n)); matplot(0:t, N, type = "l", lty = 1, lwd = 0.75, col = 1); text(t, 1/a, expression(italic("K") == 1/alpha), adj = c(1, 0)) #dibujamos 30No de una distribución uniforme entre 0 y 1.2K.
#efecto de alfa. Realizamos una evaluación numérica.
a.s= 1/runif(30, min = 50, max = 1000)
N=sapply(a.s, function(a) dlogistic(alpha = a, t = 15)); matplot(0:t, N, type = "l", ylim = c(0, 1000), lty = 1, lwd = 0.75, col = 1); text(8, 1/min(a.s), bquote(italic(alpha) == .(round(min(a.s), 3))), adj = c(1, 0.5)); text(10, 1/max(a.s), bquote(italic(alpha) == .(round(max(a.s), 3))), adj = c(0, 1.2)) #dibujamos 30K aleatorios de una distribución uniforme desde 50 a 1000 y los convertimos a alfa.
#efecto de rd. Evaluación numérica simple de rd.
rd.v=seq(1.3, 2.8, by = 0.3); t=15; Ns=data.frame(sapply(rd.v, function(r) dlogistic(rd = r, t = t))); matplot(0:t, Ns, type = "l", col = 1) #variamos rd y creamos una secuencia sistemática de sus valores. Seleccionamos t=50 y creamos la trayectoria para cada rd. Vemos que muchas poblaciones no vuelven a la normalidad en K. Si examinamos cada proyección de manera separada observamos un patrón emergente interesante: bajos rd (la pobl crece gradualmente hacia K y permanece ahí), para rd=1.6-1.9 (overshoots K creando oscilaciones que vuelven a K), rd=2.2 (la población se mueve dentro de 2 valores), rd=2.5 (N se mueve entre 4 valores diferentes), rd=2.8 (n se mueve entre diferentes valores que cambian cada tiempo).
tmp=data.frame(rd = as.factor(rd.v), t(Ns)); Ns2=reshape(tmp, varying = list(2:ncol(tmp)), idvar = "rd", v.names = "N", direction = "long"); str(Ns2); library(lattice); print(xyplot(N ~ time | rd, data = Ns2, type = "l", layout = c(3, 2, 1), col = 1)) #presentación de los límites del ciclo: emergen ciclos límites estables y caos.
#bifurcaciones: graficar los límites estables o atractores vs. rd. para rd<2 existe un único N (1atractor), con 1zrdz2.45 hay 2 diferentes N (2puntos estables), con rd=s las oscilaciones entre los dos puntos alrededor de K es pequeña, pero al aumentar rd los puntos se alejan. el punto en el cual el ciclo límite emerge en rd=2 se llama bifurcación. en rd=2.45 existe otro bifurcación con 4 N. en rd=2.53 hay 8 N. todos estos puntos son atractores periódicos. Al aumentar rd aumentan geométricamente los atractores. Este patrón completamente determinístico no-repetido en N es una propiedad del caos. El caos no es un fenómeno aleatorio , sino el resultao de mecanismos determinísticos generados por patrones no-repetidos. un pequeño cambio en el parámetro continuo resulta en un cambio en el número de atractores (e.g. un punto de equilibrio estable a un ciclo límite de 2 puntos estables) lo cual se llama bifurcación. The key point here is that very simple models, and therefore potentially simple mechanisms, can generate very complex dynamics.
num.rd=201; t=400; rd.s=seq(1, 3, length = num.rd); tmp=sapply(rd.s, function(r) dlogistic(rd = r, N0 = 99, t = t)); tmp.s=stack(as.data.frame(tmp)); names(tmp.s)=c("N", "Old.Column.ID")
tmp.s$rd=rep(rd.s, each = t + 1); tmp.s$time=rep(0:t, num.rd); N.bif=subset(tmp.s, time>0.5 * t); plot(N ~ rd, data = N.bif, pch = ".", xlab = quote("r"["d"]))
#sensibilidad a condiciones iniciales: otra característica importante de las poblaciones caóticas es que son muy sensibles a las condiciones iniciales.
N.init=c(97, 98, 99); t=30; Ns=sapply(N.init, function(n0) dlogistic(rd = 2.7, N0 = n0, t = t)); matplot(0:t, Ns, type = "l", col = 1)
# boundedness y otros descriptores: la población puede tener dinámica compleja pero podemos caracterizarla dado sus límites superior e inferior
#podemos describir la forma de la DD (lineal o no-lineal), las características de n (media, varianza, periodicidad, los límites superior e inferior) y el color (i.e. el grado de auto-correlación temporal.


Comentarios