El ciclo de vida de un organismo se puede representar gráficamente utilizando un diagrama de clases de edades o etapas y los ‘flujos’ o transiciones entre ellos.
tomado de Geib & Galen (2012)
Figura 1. Diagrama del ciclo de vida de una especie de Trifolium (Fabaceae).
Para realizar el análisis poblacional de una especie con ciclo de vida conocido y que cuente con los parámetros demográficos, podemos utilizar un modelo basado en una matriz de transición. Una vez que se obtenga la matriz, podemos proyectar el crecimiento poblacional (no denso-dependiente), y simular escenarios con variaciones de las transiciones entre etapas. Los datos para construir el modelo (transiciones, fertilidad), y las proyecciones son discretos, basados en iteraciones temporales.
Los datos de supervivencia entre o dentro de las etapas, que vamos a utilizar provienen de dos poblaciones artificiales (cartones con dibujos) de cuatro etapas: plántulas, juveniles, adultos no-reproductivos y adultos reproductivos.
library(readxl)
# población 1
hierbap1 <- read_excel("data/poblacion1.xlsx", col_names = FALSE)
hierbap1 <- as.matrix(hierbap1)
A <- hierbap1
A
## ...1 ...2 ...3 ...4
## [1,] 0.000 0.000 0.000 4.000
## [2,] 0.636 0.188 0.000 0.250
## [3,] 0.000 0.250 0.333 0.250
## [4,] 0.000 0.125 0.250 0.375
# población 2
hierbap2 <- read_excel("data/poblacion2.xlsx", col_names = FALSE)
hierbap2 <- as.matrix(hierbap2)
B <- hierbap2
B
## ...1 ...2 ...3 ...4
## [1,] 0.000 0.000 0.000 2.000
## [2,] 0.548 0.417 0.250 0.111
## [3,] 0.000 0.083 0.167 0.111
## [4,] 0.000 0.167 0.167 0.444
Ahora creamos el vector de población inicial (\(N_0\)), y proyectamos la población multiplicando por la matriz de transición:
# población 1
N0 <- matrix(c(22,16,12,8), ncol=1)
sprintf("Vector población 1 inicial N0")
## [1] "Vector población 1 inicial N0"
N0
## [,1]
## [1,] 22
## [2,] 16
## [3,] 12
## [4,] 8
N1 <- A %*% N0
sprintf("Vector población 2 a t=1")
## [1] "Vector población 2 a t=1"
N1
## [,1]
## [1,] 32.000
## [2,] 19.000
## [3,] 9.996
## [4,] 8.000
# población 2
N0 <- matrix(c(22,16,12,8), ncol=1)
sprintf("Vector población 2 inicial N0")
## [1] "Vector población 2 inicial N0"
N0
## [,1]
## [1,] 22
## [2,] 16
## [3,] 12
## [4,] 8
N1 <- B %*% N0
sprintf("Vector población 2 a t=1")
## [1] "Vector población 2 a t=1"
N1
## [,1]
## [1,] 16.000
## [2,] 22.616
## [3,] 4.220
## [4,] 8.228
Podemos hacer la proyección a varios años, asumiendo que las transiciones se mantienen constantes, y graficarla para cada población:
years <- 30
# población 1
N.projections1 <- matrix(0, nrow=nrow(A), ncol=years+1)
N.projections1[,1] <- N0
for(i in 1:years) N.projections1[,i+1] <- A%*%N.projections1[,i]
matplot(0:years, t(N.projections1), type="l", lty=1, col=1:4,
ylab="Stage Abundance", xlab="Year")
legend('topleft', legend=c("plant","juv", "adulNoR", "adulR"),
lty=1,col=1:4, bty='n')
Figura 2. Proyección poblacional para las etapas (‘stages’) del ciclo de vida de la población 1.
years <- 30
# población 2
N.projections2 <- matrix(0, nrow=nrow(B), ncol=years+1)
N.projections2[,1] <- N0
for(i in 1:years) N.projections2[,i+1] <- B%*%N.projections2[,i]
matplot(0:years, t(N.projections2), type="l", lty=1, col=1:4,
ylab="Stage Abundance", xlab="Year")
legend('topright', legend=c("plant","juv", "adulNoR", "adulR"),
lty=1, col=1:4, bty='n')
Figura 3. Proyección poblacional para las etapas (‘stages’) del ciclo de vida de la población 2.
A continuación calculamos \(\lambda\) para cada iteración (anual, usualmente) y la graficamos:
N.totals <- apply(N.projections1, 2, sum)
Rs <- N.totals[-1] / N.totals[-(years+1)]
plot(0:(years-1), Rs, type="b", xlab="año", ylab="lambda")
Figura 4. Gráfica del parámetro \(\lambda\) para cada iteración en la población 1.
N.totals <- apply(N.projections2, 2, sum)
Rs <- N.totals[-1] / N.totals[-(years+1)]
plot(0:(years-1), Rs, type="b", xlab="año", ylab="lambda")
Figura 5. Gráfica del parámetro \(\lambda\) para cada iteración en la población 2.
Hemos realizado proyecciones utilizando el modelo de matriz de transición, y observamos que \(\lambda\) alcanzó un valor estable. Si este es el caso, ocurrirá cuando la población tenga una estructura de edades o etapas estable (proporciones constantes). Podemos obtener estos valores finales de \(\lambda\) y el vector de estructura estable, calculando los autovalores (‘eigenvalues’).
eigs.A <- eigen(A)
dom.pos <- which.max( eigs.A[["values"]] )
Lambdap1 <- Re(eigs.A[["values"]][dom.pos])
sprintf("Lambda_p1")
## [1] "Lambda_p1"
Lambdap1
## [1] 1.075538
w <- Re(eigs.A[["vectors"]][,dom.pos])
ssd <- w/sum(w)
sprintf("Proporción de Etapas Estable")
## [1] "Proporción de Etapas Estable"
round(ssd, 3)
## [1] 0.413 0.328 0.148 0.111
eigs.B <- eigen(B)
dom.pos <- which.max( eigs.B[["values"]] )
Lambdap2 <- Re(eigs.B[["values"]][dom.pos])
sprintf("Lambda_p2")
## [1] "Lambda_p2"
Lambdap2
## [1] 0.9467494
w <- Re(eigs.B[["vectors"]][,dom.pos])
ssd <- w/sum(w)
sprintf("Proporción de Etapas Estable")
## [1] "Proporción de Etapas Estable"
round(ssd, 3)
## [1] 0.345 0.423 0.068 0.163
Otra cantidad importante en el análisis del modelo de matriz de transición es el cálculo del valor reproductivo, una medida de la capacidad de cada etapa de aportar a la reproducción en la población.
M <- eigen(t(A))
v <- Re(M$vectors[,which.max(Re(M$values))])
RV <- v/v[1]
sprintf("Valores Reproductivos p1")
## [1] "Valores Reproductivos p1"
RV
## [1] 1.000000 1.691098 2.415884 7.175547
M <- eigen(t(B))
v <- Re(M$vectors[,which.max(Re(M$values))])
RV <- v/v[1]
sprintf("Valores Reproductivos p2")
## [1] "Valores Reproductivos p2"
RV
## [1] 1.000000 1.727645 1.561438 4.704308