La mayoría de estudios que han usado ENM/SDM para generar proyecciones a futuro bajo escenarios de cambio climático o de uso de suelo ignoran aspectos de historia de vida de las especies, particularmente limitaciones por dispersión y aspectos demográficos. Dependiendo de la fragmentación del hábitat y las capacidades de dispersión de las especies, estos supuestos suelen ser inadecuados y generan proyecciones con mucha incertidumbre.

En este ejercicio usaremos un modelo que fue conceptualizado en el 2009 por Robin Engler y Antoine Guisan llamado MigClim. El modelo fue utilizado para evaluar la distribución potencial futura de los hipopótamos invasores en Colombia que se encuentran en la cuenca del río Magdalena. El modelo permite integrar la tasa a la que el clima cambia, fragmentación del paisaje, capacidades de dispersión de las especies, y potencial reproductivo. MigClim está basado en autómatas celulares (von Neumann circa 1950), que es un modelo matemático y computacional de evolución en una serie de pasos discretos. En el caso particular de la modelación de nicho, los valores de favorabilidad (“suitability”) de cada celda evolucionan en el tiempo de acuerdo a una serie de reglas (e.g., cambio climático) y que están influenciadas por el vecindario de celdas. El modelo simula dispersión, colonización, crecimiento y extinción de una especie en el paisaje.

Para simular la distribución potencial de los hipopótamos invasores en Colombia necesitamos varios parámetros:

Antes de comenzar hay que instalar el paquete y es un poco tedioso. La versión que se usó para el artículo de Castelblanco-Martínez et al. (2020) es la 1.6.

# Instalar paquetes

# primero instalar SDMTools 
# install.packages("remotes")
# remotes::install_version("SDMTools", "1.1-221")

# luego instalar MigClim versión 1.6
# véase https://cran.r-project.org/src/contrib/Archive/MigClim/
# install_version("MigClim", version = "1.6", repos = "http://cran.us.r-project.org")

library(MigClim)
## Loading required package: SDMTools
## Loading required package: raster
## Loading required package: sp
library(raster)

# Funciones para ver cuáles funciones y la ayuda de cada paquete
lsf.str("package:MigClim")
## MigClim.genClust : function (hsMap = "hsMap", barrier = "barrier", nrClusters = 4, nrIterations = 1, 
##     threshold = 445, outFile = "out", initFile = "")  
## MigClim.migrate : function (iniDist = "InitialDist", hsMap = "HSmap", rcThreshold = 0, envChgSteps = 1, 
##     dispSteps = 1, dispKernel = c(1, 1), barrier = "", barrierType = "strong", 
##     iniMatAge = 1, propaguleProd = c(1), lddFreq = 0, lddMinDist = NULL, 
##     lddMaxDist = NULL, simulName = "MigClimTest", replicateNb = 1, overWrite = FALSE, 
##     testMode = FALSE, fullOutput = FALSE, keepTempFiles = FALSE)  
## MigClim.plot : function (asciiFile, outDir = "", fileFormat = "jpeg", fullOutput = FALSE)  
## MigClim.userGuide : function ()  
## MigClim.validate : function (validateFile = "Validation.txt", nrPoints = 0, simFile = "out1.asc", 
##     nrClusters = 4)
help(package = MigClim)

Vamos a cargar los datos pre-fabricados para ahorrar tiempo. Esta tabla de datos muestra para cada pixel en la región geográfica la presencia/ausencia (0-1) de los hipopótamos y los valores de favorabilidad (suitability) obtenidos de un ensamble de modelos. Los valores de favorabilidad fueron estandarizados de 0 a 1000. Hay una columna al final que indica si en la región un pixel determinado es accessible (1) o no (0).

Para ajustar el modelo hay que primero obtener los parámetros de los hipopótamos de la literatura.

Descargue los datos de aquí: https://www.dropbox.com/sh/btys7ucruafoemd/AAARkElKrvUqUeQbiaXlnP6na?dl=0

# Cargar los datos pre-fabricados
MigClim.Data.v1 <- read.csv("./Datos/Dataset_Hippos_MigClim.csv", row.names = 1)
rounds <- round(MigClim.Data.v1[c(-1,-2)], digits = 0)
MigClim.Data.v1 <- cbind(MigClim.Data.v1[,c(1,2)], rounds)

# Explorar los datos 
head(MigClim.Data.v1)
##           X        Y InitialDist hsmap1 hsmap2 hsmap3 hsmap4 hsmap5 hsmap6
## 1 -74.85417 11.10417           0    303    284    302    257    127    367
## 2 -74.81250 11.06250           0    378    390    305    257    128    362
## 3 -74.77083 11.06250           0    392    385    272    257    128    287
## 4 -74.89583 11.02083           0    418    183    236    325     99    224
## 5 -74.85417 11.02083           0    450    181    236    257     99    219
## 6 -74.81250 11.02083           0    600    189    236    257     99    219
##   hsmap7 hsmap8 hsmap9 hsmap10 hsmap11 hsmap12 hsmap13 hsmap14 hsmap15 hsmap16
## 1    253    199    222     222     100     337     185     268     179     284
## 2    258    155    286     225     130     341     165     269     183     223
## 3    263    155    286     225     130     341     165     269     183     223
## 4    260    158    290     175     132     226     137     268     126     226
## 5    191    155    286     172     130     272     134     268     126     222
## 6    191    155    286     145     130     223     147     268     126     222
##   hsmap17 hsmap18 hsmap19 hsmap20 hsmap21 hsmap22 hsmap23 hsmap24 hsmap25
## 1     102     376     101     363     307     257     122     102     171
## 2     132     396     102     285     388     298      81      85     190
## 3     132     396     102     285     388     260      96      81     209
## 4     102     327      79     363     387     173      60      81     171
## 5     132     355      79     359     388     178      85      80     171
## 6     117     508      79     359     388     171      85      80     171
##   hsmap26 hsmap27 hsmap28 hsmap29 hsmap30 hsmap31 hsmap32 hsmap33 hsmap34
## 1     103     333     206     226     279     140     288     303     162
## 2      91     337     208     263     285     134     295     238     186
## 3      92     337     239     263     286     111     253     238     186
## 4      51     260     161     232     374     109     227     238     140
## 5      69     290     208     229     455     116     224     234     139
## 6      71     263     208     150     475     111     224     299     141
##   hsmap35 hsmap36 hsmap37 hsmap38 hsmap39 hsmap40 hsmap41 hsmap42 hsmap43
## 1      87     391     324     117     268     204     193     309     190
## 2      88     396     440     119     272     265     195     360     192
## 3      88     396     440     119     272     265     195     359     192
## 4      68     311     280     119     242     265     195     269     153
## 5      68     305     336     119     249     265     195     268     192
## 6      68     309     344     131     253     266     195     225     192
##   hsmap44 hsmap45 hsmap46 hsmap47 hsmap48 hsmap49 hsmap50 hsmap51 hsmap52
## 1     277     247     204     193     284     324     323     187     108
## 2     360     288     209     224     285     377     281     146     125
## 3     361     250     206     195     285     328     324     146     126
## 4     429     253     162     227     285     289     258     146     101
## 5     460     251     159     224     322     290     260     146     101
## 6     490     276     204     196     281     292     263     187     102
##   hsmap53 hsmap54 hsmap55 hsmap56 hsmap57 hsmap58 hsmap59 hsmap60 hsmap61
## 1     158     145     236     273     150     275     273     146     326
## 2     183     145     272     276     117     277     351     174     308
## 3     183     133     272     276     117     282     351     174     308
## 4     143     147     245     217     119     279     351     183     268
## 5     142     145     275     240     117     275     352     164     269
## 6     182     145     254     330     117     275     352     229     271
##   hsmap62 hsmap63 hsmap64 hsmap65 hsmap66 hsmap67 hsmap68 hsmap69 hsmap70
## 1     136     187     133     201     174     355     199     394     348
## 2     137     210     126     199     143     358     201     483     300
## 3     137     210     126     229     143     360     201     398     326
## 4     137     252     110     242     144     362     243     399     448
## 5     167     243     126     243     176     371     246     394     584
## 6     167     244     110     244     179     356     246     394     736
##   hsmap71 hsmap72 hsmap73 hsmap74 hsmap75 hsmap76 hsmap77 hsmap78 hsmap79
## 1     196     186     152     229     153      82     161     220     252
## 2     226     178     125     220     127      78     133     209     207
## 3     197     178     143     220     127      83     136     214     207
## 4     196     155     128     191     130      82     166     208     208
## 5     196     155     126     190     158      82     169     263     255
## 6     196     155     154     194     165      82     180     320     255
##   hsmap80 hsmap81 hsmap82 hsmap83 hsmap84 hsmap85 hsmap86 hsmap87 hsmap88
## 1     170     176     212     264     183     246     104     138     112
## 2     161     144     178     223     225     234      86     113     113
## 3     172     165     178     225     224     234      86     113     114
## 4     170     175     203     160     210     235     108     141     115
## 5     170     176     208     237     225     235     110     141     118
## 6     171     178     227     301     227     211     114     143     127
##   hsmap89 hsmap90 hsmap91 hsmap92 hsmap93 hsmap94 hsmap95 Barrier
## 1     134     186     294     197      87     109     192       0
## 2     127     153     232     199     107     110     193       0
## 3     127     153     232     200     107     110     193       0
## 4     113     186     295     197      87     113     192       0
## 5     113     186     295     199     104     114     195       0
## 6     138     187     297     225     106     118     207       0

PRIMER PASO:

  1. Crear un kernel de dispersión (dispKernel)

Distribución de probabilidad de la dispersión para un periodo de 95 años Uniforme - Aplanado. Asume que la dispersión es constante a través del tiempo.

dispKernel.flat <- runif(95, min=1, max=1)
plot(dispKernel.flat) # n1

Decaimiento exponencial en la probabilidad de dispersión a través de los pasos de dispersión (dispSteps) en un periodo de 95 años. Primero creamos una función que simule una distribución exponencial que vaya cayendo a través del tiempo (Y = Yo * Exp(-beta*t)).

# decaimiento exponencial en la probabilidad de dispersión
alpha <- 1 # dispersión inicial
beta <- -0.05 # tasa de decaimiento

n <- 95 # años
x <- seq(n) # secuencia de años
dispKernel.expdecay <- alpha * exp(beta * x)

plot(dispKernel.expdecay) # n2

Producción de propágulos (plantas) o crías (animales)

propaguleProdProb <- c(0.02, 0.1, 0.3, 0.5, 0.9)

# Información reproductiva tomada de Tabla 1 (Castelblanco-Martínez et al 2020)
initMatAge=5 # Edad inicial de madurez sexual (hembras)
maxMatAge=43 # Edad máxima de madurez sexual (hembras)

Crearemos una distribución uniforme de la probabilidad de reproducción (entre 0.9 y 1) de los hipopótamos en función de la duración de la etapa reproductiva (43 años) una vez han colonizado una celda en particular.

# distribución aplanada o uniforme
pp1 <- runif(43, min=0.9, max=1)

plot(pp1, ylim=c(0,1))

Crearemos una distribución exponencial de la probabilidad de reproducción de los hipopótamos en función de la duración de la etapa reproductiva (43 años) una vez han colonizado una celda en particular.

# distribución exponencial
alpha <- 0.1 # probabilidad de reproducción apenas coloniza una celda
beta <- 0.05 # tasa de crecimiento

n <- 43 # años
x <- seq(n) # secuencia de años
pp2 <- alpha * exp(beta * x) # n2

plot(pp2)

Ahora vamos a simular las probabilidades de dispersión, colonización, y extinción de los hipopótamos en la región de la cuenca del Madgalena. Se crearon cuatro escenarios. Vamos a generar uno solo y les queda de tarea los otros tres.

PRIMER ESCENARIO:

Probabilidad de dispersión uniforme a través del tiempo (dispKernel.flat) y probabilidad de reproducción exponencial de los hipopótamos una vez colonicen una celda (pp2), y una barrera geográfica fuerte.

Explicación breve de los parámetros:

  1. iniDist: Distribución inicial de la especies (presencia-ausencia)

  2. hsMap: Favorabilidad (suitability) para cada paso del tiempo. Como son 95 años, estos valores de favorabilidad se obtuvieron de proyecciones de un ensamble de modelos (recuerden el ejercicio pasado con el ratón del género Neotoma).

  3. rcThreshold: Si el hsMap es continuo, entonces este parámetro indica a partir de cuál valor de favorabilidad los hipopótamos pueden colonizar una celda en particular. Recuerden el ejercicio donde se selecciona el umbral y se binarizan los mapas.

  4. envChgSteps: Número de pasos ambientales. 95 pasos (años) para este caso.

  5. dispSteps: Indica cuántos eventos de dispersión habrá por año (5 eventos) en un periodo de 95 años, lo que indica que serán 950 pasos de dispersión en la simulación completa.

  6. dispKernel: El kernel de dispersión es una función que indica la probabilidad que un propágulo/cría se disperse a cierta distancia de la fuente. Debe ser expresado en unidades de celda y por lo tanto da la probabilidad que se disperse a 1, 2, 3, 4, 5, 6 celdas.

  7. barrier: Indica cuáles celdas puede o no colonizar una especie (binario: 0-1)

  8. lddFreq: Frecuencia de long distance dispersal (LDD): rango entre 0 y 1. Un valor de 0.01 indica que, en promedio, 1 celda entre 100 generarán un evento de LDD definido por su distancia mínima y máxima.

  9. lddMinDist: 96 (celdas de 5 km2; 2.23 x 2.23 km; 96 x 2.23 = 480 km) # basado en datos de mvto.

  10. lddMaxDist: 1000 (celdas de 5 km2: 2.23 x 2.23 km; 96 x 2.23 = 2230 km) # hipótetico.

  11. propaguleProd: Probabilidad que una celda ocupa produzca propágulos/crías en función del tiempo desde que fue colonizada.

  12. iniMatAge: Edad inicial de madurez sexual (hembras)

Correr la simulación con 1 repetición:

n1 <- MigClim.migrate (iniDist=MigClim.Data.v1[,1:3],
                         hsMap=MigClim.Data.v1[,4:98], rcThreshold=64,
                         envChgSteps=95, dispSteps=95, dispKernel=dispKernel.flat,
                         barrier=MigClim.Data.v1[,99], barrierType="strong",
                           iniMatAge=5, propaguleProd=pp2,
                         lddFreq=0.01, lddMinDist=96, lddMaxDist=1000,
                         simulName="SimA", replicateNb=1, overWrite=TRUE,
                         testMode=FALSE, fullOutput=TRUE, keepTempFiles=FALSE)
## Converting data to ascii grid format... 
## Starting simulation for  SimA ...
## Running MigClim simulation SimA.
##   1...
##   2...
##   3...
##   4...
##   5...
##   6...
##   7...
##   8...
##   9...
##   10...
##   11...
##   12...
##   13...
##   14...
##   15...
##   16...
##   17...
##   18...
##   19...
##   20...
##   21...
##   22...
##   23...
##   24...
##   25...
##   26...
##   27...
##   28...
##   29...
##   30...
##   31...
##   32...
##   33...
##   34...
##   35...
##   36...
##   37...
##   38...
##   39...
##   40...
##   41...
##   42...
##   43...
##   44...
##   45...
##   46...
##   47...
##   48...
##   49...
##   50...
##   51...
##   52...
##   53...
##   54...
##   55...
##   56...
##   57...
##   58...
##   59...
##   60...
##   61...
##   62...
##   63...
##   64...
##   65...
##   66...
##   67...
##   68...
##   69...
##   70...
##   71...
##   72...
##   73...
##   74...
##   75...
##   76...
##   77...
##   78...
##   79...
##   80...
##   81...
##   82...
##   83...
##   84...
##   85...
##   86...
##   87...
##   88...
##   89...
##   90...
##   91...
##   92...
##   93...
##   94...
##   95...
## All dispersal steps completed. Final output in progress...
## Simulation SimA completed successfully. Outputs stored in /home2/Dropbox/Curso/Ejercicios_R/MigClim/SimA

Vamos a generar la figura del raster final


```r
# Descargue un mapa base
colombia <- raster::getData('GADM', country="COL", level=1)


# cargar simulación final
run1 <- raster("./SimA/SimA_raster.asc")

# crear matriz de reclasificación
reclass  <- c(-Inf, 0, 0, 0, 1, 1, 1, Inf, 2)
reclass_m <- matrix(reclass, ncol = 3, byrow = TRUE)

reclass2  <- c(-Inf, 0, 0, 0, 1, 1)
reclass_m2 <- matrix(reclass2, ncol = 2, byrow = TRUE)



# graficar salida cruda
plot(run1)
plot(colombia, add=T, lwd=0.2)

# Definir el esquema de colores
cols <- c("gray89", "blue", "green")

# reclasificar
run1.r <- reclassify(run1,reclass_m)
run1.r2 <- reclassify(run1,reclass_m2)

Primer mapa

# graficar
plot(run1.r, col=cols, legend=TRUE, main="Corrida 1")
plot(colombia, add=T, lwd=0.2)

Segundo mapa

# graficar
plot(run1.r2, legend=TRUE, main="Corrida 1")
plot(colombia, add=T, lwd=0.2)

La tarea consiste en probar varias combinaciones de parámetros:

Kernels de dispersión: 1) dispKernel.flat 2) dispKernel.expdecay

Probabilidad de producción de propágulos/crías 1) pp1: uniforme 2) pp2: exponencial

Frecuencia de eventos de dispersión de larga distancia 1) 0.01 2) 0.1 3) 0.5

Tipos de barreras de dispersión 1) fuerte (strong) 2) débil (weak)

A jugar!