A=matrix(c(0,40,70,15,0.3,0,0,0,0,0.4,0,0,0,0,0.55,0), nr=4, byrow = T)
A
##      [,1] [,2]  [,3] [,4]
## [1,]  0.0 40.0 70.00   15
## [2,]  0.3  0.0  0.00    0
## [3,]  0.0  0.4  0.00    0
## [4,]  0.0  0.0  0.55    0
N0=matrix(c(500,200,350,75), ncol=1)
N0
##      [,1]
## [1,]  500
## [2,]  200
## [3,]  350
## [4,]   75
years=15
n.projections=matrix(0,nrow=nrow(A), ncol=years+1)
n.projections
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [3,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [4,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##      [,14] [,15] [,16]
## [1,]     0     0     0
## [2,]     0     0     0
## [3,]     0     0     0
## [4,]     0     0     0
n.projections[,1]=N0
n.projections
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,]  500    0    0    0    0    0    0    0    0     0     0     0     0
## [2,]  200    0    0    0    0    0    0    0    0     0     0     0     0
## [3,]  350    0    0    0    0    0    0    0    0     0     0     0     0
## [4,]   75    0    0    0    0    0    0    0    0     0     0     0     0
##      [,14] [,15] [,16]
## [1,]     0     0     0
## [2,]     0     0     0
## [3,]     0     0     0
## [4,]     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,]  500 33625.0 14487.5 408360.00 456795.00 5055303.750 8926106.62
## [2,]  200   150.0 10087.5   4346.25 122508.00  137038.500 1516591.12
## [3,]  350    80.0    60.0   4035.00   1738.50   49003.200   54815.40
## [4,]   75   192.5    44.0     33.00   2219.25     956.175   26951.76
##             [,8]      [,9]     [,10]      [,11]       [,12]       [,13]
## [1,] 64904999.40 150030058 858844039 2354399537 11630636907 35615614132
## [2,]  2677831.99  19471500  45009017  257653212   706319861  3489191072
## [3,]   606636.45   1071133   7788600   18003607   103061285   282527944
## [4,]    30148.47    333650    589123    4283730     9901984    56683707
##             [,14]        [,15]        [,16]
## [1,] 160194854594 527415575143 2.233024e+12
## [2,]  10684684240  48058456378 1.582247e+11
## [3,]   1395676429   4273873696 1.922338e+10
## [4,]    155390369    767622036 2.350631e+09
matplot(0:years, t(n.projections), type = "l", lty = 1:4,col = 1, ylab = "Abundancia", xlab = "Año")
legend("topleft", legend = c("Semilla", "Adulto pequeño", "Adulto mediano", "Adulto grande"),lty = 1:4, col = 1, bty = "n")

# 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] 1.125000e+03 3.404750e+04 2.467900e+04 4.167742e+05 5.832608e+05
##  [6] 5.242302e+06 1.052446e+07 6.821962e+07 1.709063e+08 9.122308e+08
## [11] 2.634340e+09 1.244992e+10 3.944402e+10 1.724306e+11 5.805155e+11
## [16] 2.412822e+12
# Ahora obtenemos cada Lambda dividiendo todos los Nt+1 por cada Nt.
lambdas=n.totals[-1]/n.totals[-(years+1)]
lambdas
##  [1] 30.2644444  0.7248403 16.8878095  1.3994645  8.9879211  2.0076038
##  [7]  6.4820033  2.5052375  5.3376064  2.8878000  4.7260109  3.1682145
## [13]  4.3715275  3.3666618  4.1563443
#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=100
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] 30.2644444  0.7248403 16.8878095  1.3994645  8.9879211  2.0076038
##   [7]  6.4820033  2.5052375  5.3376064  2.8878000  4.7260109  3.1682145
##  [13]  4.3715275  3.3666618  4.1563443  3.5036366  4.0220371  3.5965587
##  [19]  3.9367487  3.6588581  3.8819931  3.7002974  3.8465928  3.7277166
##  [25]  3.8236021  3.7457958  3.8086270  3.7576892  3.7988542  3.7655014
##  [31]  3.7924685  3.7706278  3.7882926  3.7739896  3.7855603  3.7761931
##  [37]  3.7837719  3.7776372  3.7826011  3.7785833  3.7818345  3.7792031
##  [43]  3.7813325  3.7796091  3.7810038  3.7798750  3.7807885  3.7800492
##  [49]  3.7806475  3.7801633  3.7805552  3.7802380  3.7804947  3.7802870
##  [55]  3.7804551  3.7803190  3.7804291  3.7803400  3.7804121  3.7803538
##  [61]  3.7804010  3.7803628  3.7803937  3.7803687  3.7803889  3.7803725
##  [67]  3.7803858  3.7803751  3.7803838  3.7803767  3.7803824  3.7803778
##  [73]  3.7803815  3.7803785  3.7803810  3.7803790  3.7803806  3.7803793
##  [79]  3.7803803  3.7803795  3.7803802  3.7803796  3.7803801  3.7803797
##  [85]  3.7803800  3.7803798  3.7803800  3.7803798  3.7803799  3.7803798
##  [91]  3.7803799  3.7803798  3.7803799  3.7803799  3.7803799  3.7803799
##  [97]  3.7803799  3.7803799  3.7803799  3.7803799
#Usando ánalysis de valores y vectores "propios" (Eigenanalysis) de la matriz llegamos directamente a la convergencia de lambda
eigs.A=eigen(A)
eigs.A
## $values
## [1]  3.7803799 -3.0594388 -0.5710462 -0.1498949
## 
## $vectors
##             [,1]         [,2]       [,3]        [,4]
## [1,] 0.996830360 -0.995143171 -0.8066003 -0.04893724
## [2,] 0.079105571  0.097580952  0.4237487  0.09794314
## [3,] 0.008370119 -0.012758020 -0.2968227 -0.26136491
## [4,] 0.001217752  0.002293529  0.2858832  0.95901026
dom.pos=which.max(eigs.A[["values"]])
L1 <- Re(eigs.A[["values"]][dom.pos])
L1
## [1] 3.78038
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.918 0.073 0.008 0.001
# 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] 0.0430286 0.5422149 0.8215853 0.1707313
RV <- v/v[1]
round(RV,3)
## [1]  1.000 12.601 19.094  3.968
#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]
## [1,] 0.4618567 0.03665161 0.003878087 0.0005642153
## [2,] 5.8199788 0.46185667 0.048868810 0.0071098267
## [3,] 8.8186603 0.69982335 0.074047939 0.0107730884
## [4,] 1.8325804 0.14542827 0.015387689 0.0022387245
#Las elasticidades son sensibilidades ponderadas por las probabilidades de transición
elas <- (A/L1) * S
round(elas, 3)
##       [,1]  [,2]  [,3]  [,4]
## [1,] 0.000 0.388 0.072 0.002
## [2,] 0.462 0.000 0.000 0.000
## [3,] 0.000 0.074 0.000 0.000
## [4,] 0.000 0.000 0.002 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