Modelo de Proyección Poblacional con Matrices

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.

Datos de Transición

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.

Matrices de Transición

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

Población inicial y proyección a 1 año

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

Proyección de la población a 30 años

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.

Cálculo del parámetro lambda (\(\lambda\))

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.

Lambda para población con estructura de edades estables

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

Valor Reproductivo

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