A=matrix(c(0,0,0,0,0,322.380,0.966,0,0,0,0,0,0.013,0.010,0.125,0,0,3.448,0.007,0,0.125,0.238,0,30.170, 0.008,0,0,0.245,0.167,0.862,0,0,0,0.023,0.750,0), nr=6, byrow = T)
A
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.000 0.00 0.000 0.000 0.000 322.380
## [2,] 0.966 0.00 0.000 0.000 0.000 0.000
## [3,] 0.013 0.01 0.125 0.000 0.000 3.448
## [4,] 0.007 0.00 0.125 0.238 0.000 30.170
## [5,] 0.008 0.00 0.000 0.245 0.167 0.862
## [6,] 0.000 0.00 0.000 0.023 0.750 0.000
N0=matrix(c(200,150,140,130,110,100), ncol=1)
N0
## [,1]
## [1,] 200
## [2,] 150
## [3,] 140
## [4,] 130
## [5,] 110
## [6,] 100
years=10
n.projections=matrix(0,nrow=nrow(A), ncol=years+1)
n.projections
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0 0 0 0 0 0
## [6,] 0 0 0 0 0 0 0 0 0 0 0
n.projections[,1]=N0
n.projections
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 200 0 0 0 0 0 0 0 0 0 0
## [2,] 150 0 0 0 0 0 0 0 0 0 0
## [3,] 140 0 0 0 0 0 0 0 0 0 0
## [4,] 130 0 0 0 0 0 0 0 0 0 0
## [5,] 110 0 0 0 0 0 0 0 0 0 0
## [6,] 100 0 0 0 0 0 0 0 0 0 0
for (i in 1:years) n.projections[,i+1]=A%*%n.projections[,i]
n.projections
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] 200 32238.00 27560.2662 56110.9869 293968.685 393740.706 954483.146
## [2,] 150 193.20 31141.9080 26623.2171 54203.213 283973.750 380353.522
## [3,] 140 366.40 761.5955 1365.0344 4310.432 9113.664 19306.204
## [4,] 130 3066.84 3580.6072 6391.4643 29595.696 46488.667 104285.201
## [5,] 110 138.02 1106.0215 1432.4696 3040.051 11163.192 18956.060
## [6,] 100 85.49 174.0523 911.8701 1221.356 2960.739 9441.634
## [,8] [,9] [,10] [,11]
## [1,] 3043793.82 5356538.50 13120622.7 34514884.4
## [2,] 922030.72 2940304.83 5174416.2 12674521.6
## [3,] 51179.84 112477.71 253428.8 623143.2
## [4,] 318768.62 604863.75 1423409.3 3692377.1
## [5,] 44490.09 124201.16 246868.3 587215.3
## [6,] 16615.60 40699.25 107062.7 217889.6
# Tasa de crecimiento anual (El lambda general de la población es el valor que converge en el tiempo), lambda=Nt+1/Nt para cada año.
# Primero necesitamos la suma de todos los estados aplicando la función sum a cada columna.
n.totals=(apply(n.projections,2,sum))
n.totals
## [1] 830.00 36087.95 64324.45 92835.04 386339.43
## [6] 747440.72 1486825.77 4396878.69 9179085.20 20325807.99
## [11] 52310031.19
# Ahora obtenemos cada Lambda dividiendo todos los Nt+1 por cada Nt.
lambdas=n.totals[-1]/n.totals[-(years+1)]
lambdas
## [1] 43.479458 1.782436 1.443231 4.161569 1.934674 1.989222 2.957225
## [8] 2.087637 2.214361 2.573577
#Tenemos un lamba menos que años, ploteamos cada lambda en cada t en vez de en cada t+1
plot(0:(years-1),lambdas,type="b",xlab = "Year",ylab = "L")

#Los lambda que obtuvimos no convergen en el tiempo entonces necesitamos más unidades de tiempo
t=60
Nt=N0/sum(N0)
L.t=numeric(t)
#Creamos una iteración (for-loop) que reusa Nt para cada paso del tiempo, asegurandonos que tengamos un vector numerico vacio para sostener las salidas
for (i in 1:t) L.t[i] <- {
Nt1 <- A %*% Nt
L <- sum(Nt1)/sum(Nt)
Nt <- Nt1/sum(Nt1)
L
}
#Comparamos el resultado directamente al punto estimado de lambda
par(mar = c(5, 4, 3, 2))
plot(1:t, L.t, type = "b", main = quote("Convergencia hacia " * lambda))
L.t
## [1] 43.479458 1.782436 1.443231 4.161569 1.934674 1.989222 2.957225
## [8] 2.087637 2.214361 2.573577 2.193714 2.294100 2.424841 2.256220
## [15] 2.318653 2.363861 2.289720 2.324479 2.338667 2.306639 2.324785
## [22] 2.328391 2.314845 2.323915 2.324300 2.318707 2.323095 2.322725
## [29] 2.320479 2.322546 2.322146 2.321275 2.322225 2.321948 2.321624
## [36] 2.322052 2.321887 2.321774 2.321963 2.321873 2.321838 2.321919
## [43] 2.321873 2.321864 2.321898 2.321875 2.321874 2.321888 2.321877
## [50] 2.321878 2.321884 2.321878 2.321879 2.321882 2.321879 2.321880
## [57] 2.321881 2.321880 2.321880 2.321880
#Usando ánalysis de valores y vectores "propios" (Eigenanalysis) de la matriz tambien podemos llegar a la convergencia de lambda
eigs.A=eigen(A)
eigs.A
## $values
## [1] 2.3218801+0.000000i -0.9573856+1.488566i -0.9573856-1.488566i
## [4] 0.1423853+0.198015i 0.1423853-0.198015i -0.1618797+0.000000i
##
## $vectors
## [,1] [,2] [,3]
## [1,] -0.918358907+0i 0.875276087+0.000000000i 0.875276087+0.000000000i
## [2,] -0.382076011+0i -0.258422163-0.401800898i -0.258422163+0.401800898i
## [3,] -0.017554688+0i 0.004411771-0.003094969i 0.004411771+0.003094969i
## [4,] -0.099898451+0i 0.073170651-0.010562731i 0.073170651+0.010562731i
## [5,] -0.017413276+0i -0.006947229-0.009994197i -0.006947229+0.009994197i
## [6,] -0.006614304+0i -0.002599345+0.004041522i -0.002599345-0.004041522i
## [,4] [,5]
## [1,] 1.426564e-01+1.983921e-01i 1.426564e-01-1.983921e-01i
## [2,] 9.678394e-01+0.000000e+00i 9.678394e-01+0.000000e+00i
## [3,] 2.093852e-02-5.537957e-02i 2.093852e-02+5.537957e-02i
## [4,] -4.648716e-03-7.049398e-03i -4.648716e-03+7.049398e-03i
## [5,] 8.511912e-05+2.339139e-04i 8.511912e-05-2.339139e-04i
## [6,] -5.885111e-05+1.752473e-04i -5.885111e-05-1.752473e-04i
## [,6]
## [1,] -1.652062e-01+0i
## [2,] 9.858505e-01+0i
## [3,] -2.787531e-02+0i
## [4,] 5.346755e-03+0i
## [5,] -1.818725e-04+0i
## [6,] 8.295651e-05+0i
dom.pos=which.max(eigs.A[["values"]])
## Warning in which.max(eigs.A[["values"]]): imaginary parts discarded in
## coercion
L1 <- Re(eigs.A[["values"]][dom.pos])
L1
## [1] 2.32188
points(t, L1, pch = 19, cex = 1.5)

#La distribución estable de estados se alcanza cuando la abundancia relativa de los estados es la misma
w <- Re(eigs.A[["vectors"]][, dom.pos])
ssd <- w/sum(w)
round(ssd, 3)
## [1] 0.637 0.265 0.012 0.069 0.012 0.005
# Lo anterior muestra que si la matriz de projección no cambia en el tiempo, estara compuesta de los porcentajes calculados para cada estado
#El valor reproductivo es el número de individuos a nacer de una determinada edad, lo calculamos con la matriz transpuesta de la matriz de proyecciones (A)
M <- eigen(t(A))
v <- Re(M$vectors[, which.max(Re(M$values))])
v
## [1] 1.299554e-03 1.201025e-05 2.788635e-03 4.901038e-02 3.283103e-01
## [6] 9.432926e-01
RV <- v/v[1]
round(RV,3)
## [1] 1.000 0.009 2.146 37.713 252.633 725.858
#La importancia relativa de cada transición del ciclo de vida se hace calculando la "sensibilidad" y "elasticidad" de la matriz
#Las sensibilidades son la contribución directa de cada transición a lambda
vw.s <- v %*% t(w)
(S <- vw.s/as.numeric(v %*% w))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 6.593963e-02 0.027433664 1.260454e-03 7.172867e-03 1.250301e-03
## [2,] 6.094021e-04 0.000253537 1.164889e-05 6.629034e-05 1.155505e-05
## [3,] 1.414959e-01 0.058868245 2.704733e-03 1.539182e-02 2.682945e-03
## [4,] 2.486796e+00 1.034611834 4.753580e-02 2.705119e-01 4.715287e-02
## [5,] 1.665853e+01 6.930649121 3.184324e-01 1.812103e+00 3.158673e-01
## [6,] 4.786284e+01 19.912957587 9.149116e-01 5.206487e+00 9.075415e-01
## [,6]
## [1,] 4.749175e-04
## [2,] 4.389102e-06
## [3,] 1.019097e-03
## [4,] 1.791067e-02
## [5,] 1.199798e-01
## [6,] 3.447229e-01
#Las elasticidades son sensibilidades ponderadas por las probabilidades de transición
elas <- (A/L1) * S
round(elas, 3)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.000 0 0.000 0.000 0.000 0.066
## [2,] 0.000 0 0.000 0.000 0.000 0.000
## [3,] 0.001 0 0.000 0.000 0.000 0.002
## [4,] 0.007 0 0.003 0.028 0.000 0.233
## [5,] 0.057 0 0.000 0.191 0.023 0.045
## [6,] 0.000 0 0.000 0.052 0.293 0.000
#Dos propiedades importantes tienen estas elasticidades, transiciones imposibles tienen elasticidades iguales a cero y todas las elasticidades de la matriz suman uno
#Así es facil comparar elasticidades para diferentes matrices y diferentes organismos
#Lo anterior es importante en el manejo de especies invasoras o en peligro donde buscamos tener el maximo impacto con el mínimo esfuerzo