¿Cómo crear un modelo de distribución consensuado?
Para crear un modelo de distribución consensuado, puedes combinar múltiples modelos de distribución de especies individuales (SDMs) en un solo modelo. Aquí hay los pasos generales para hacerlo:
Antes de empezar, es necesario instalar los paquetes de R requeridos. Por favor, realiza una sola ejecución de instalación por computadora. Recuerda que la instalación se realiza con la función install.packages() y el nombre del paquete entre comillas. Por ejemplo, install.packages(“maptools”). Luego, puedes cargar los paquetes en tu sesión de R utilizando la función library(), como se muestra en el siguiente ejemplo: library(maptools). A continuación los paquetes:
library(dismo)
library(maptools)
library(sp)
library(tidyverse)
library(raster)
library(rgdal)
library(sf)
library(randomForest)
library(kernlab)
library(bioclim)
nota: Quiza, deberas actualizar Java para el paquete “randomForest”.
Para trabajar en R, es importante elegir un espacio de trabajo o una carpeta. Se recomienda usar la función setwd para establecer el directorio de trabajo, pero hay otras formas de hacerlo. El siguiente es un ejemplo de cómo utilizar setwd:
setwd("D:/biato/wikiaves/clase_conservacion")
###### Este ultimo vamos a usarlo para otra cosa pero... debe ser el mismo de arriba
first_folder<-"D:/biato/wikiaves/clase_conservacion"
nota: Aquí hay un ejemplo. Es recomendable que utilices el mismo nombre final de carpeta, “clase_conservacion”, para almacenar toda tu información.
Debe guardar su data frame como archivo “.csv” y con el tipo CSV UTF (separado por comas). A continuación, encontrará un ejemplo con una planta de la familia Lauraceae, pero se recomienda que le de un nombre diferente a su archivo de data frame; por favor, asegúrese de utilizar nombres simples y sin espacios o caracteres especiales.
#nota que no use espacios ni asentos en el nombre de mi .csv
obs.data <- read.csv(file = "D:/biato/wikiaves/clase_conservacion/Comino_Crespo.csv", header = T, sep = ",", dec = ".")
Luego usa la funcion “head(obs.data, 4)” para ver si estan de forma correcta. Debes ver algo como lo siguiente,
| gbifID | datasetKey | occurrenceID | kingdom | phylum | class | order | family | genus | species | infraspecificEpithet | taxonRank | scientificName | verbatimScientificName | verbatimScientificNameAuthorship | countryCode | locality | stateProvince | occurrenceStatus | individualCount | publishingOrgKey | decimalLatitude | decimalLongitude | coordinateUncertaintyInMeters | coordinatePrecision | elevation | elevationAccuracy | depth | depthAccuracy | eventDate | day | month | year | taxonKey | speciesKey | basisOfRecord | institutionCode | collectionCode | catalogNumber | recordNumber | identifiedBy | dateIdentified | license | rightsHolder | recordedBy | typeStatus | establishmentMeans | lastInterpreted | mediaType | issue |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 931017814 | 23243164-c132-444d-a3a4-34662abb8305 | UdeA:HUA:97603 | Plantae | Tracheophyta | Magnoliopsida | Laurales | Lauraceae | Aniba | Aniba perutilis | NA | SPECIES | Aniba perutilis Hemsl. | Aniba perutilis | Hemsl. | CO | Hacienda Peñaflor. cerro Caliza. quebrada Caño Seco | Antioquia | PRESENT | 1 | cccff716-2694-4209-9f9e-2f7a484465a0 | 6.272225 | -74.68528 | 1295 | NA | 300 | 0 | NA | NA | 1995-12-13T00:00:00 | 13 | 12 | 1995 | 4180651 | 4180651 | PRESERVED_SPECIMEN | Universidad de Antioquia (UdeA) | HUA | 97603 | 52 | Sánchez C. | 2011-01-01T00:00:00 | CC0_1_0 | Gíl N. | NA | NA | 2023-01-24T15:50:55.178Z | COORDINATE_ROUNDED;INSTITUTION_MATCH_FUZZY;COLLECTION_MATCH_FUZZY | ||
| 931009904 | 23243164-c132-444d-a3a4-34662abb8305 | UdeA:HUA:6270 | Plantae | Tracheophyta | Magnoliopsida | Laurales | Lauraceae | Aniba | Aniba perutilis | NA | SPECIES | Aniba perutilis Hemsl. | Aniba perutilis | Hemsl. | CO | Corregimiento Providencia. valle del río Anorí. entre Dos Bocas y Anorí. cerca a Planta Providencia. 26 km S and 23 km W air of Zaragoza | Antioquia | PRESENT | 1 | cccff716-2694-4209-9f9e-2f7a484465a0 | 7.216667 | -75.05056 | 30214 | NA | 550 | 150 | NA | NA | 1977-08-01T00:00:00 | 1 | 8 | 1977 | 4180651 | 4180651 | PRESERVED_SPECIMEN | Universidad de Antioquia (UdeA) | HUA | 6270 | 828 | Callejas R. | 1992-01-01T00:00:00 | CC0_1_0 | Shepherd J. | NA | NA | 2023-01-24T15:51:09.700Z | COORDINATE_ROUNDED;INSTITUTION_MATCH_FUZZY;COLLECTION_MATCH_FUZZY | ||
| 931009853 | 23243164-c132-444d-a3a4-34662abb8305 | UdeA:HUA:6249 | Plantae | Tracheophyta | Magnoliopsida | Laurales | Lauraceae | Aniba | Aniba perutilis | NA | SPECIES | Aniba perutilis Hemsl. | Aniba perutilis | Hemsl. | CO | Corregimiento Providencia. valle del río Anorí. entre Dos Bocas y Anorí. cerca a Planta Providencia. 26 km S and 23 km W air of Zaragoza | Antioquia | PRESENT | 1 | cccff716-2694-4209-9f9e-2f7a484465a0 | 7.216667 | -75.05056 | 30214 | NA | 550 | 150 | NA | NA | 1977-08-01T00:00:00 | 1 | 8 | 1977 | 4180651 | 4180651 | PRESERVED_SPECIMEN | Universidad de Antioquia (UdeA) | HUA | 6249 | 821 | Sánchez C. | 2010-08-01T00:00:00 | CC0_1_0 | Shepherd J. | NA | NA | 2023-01-24T15:51:09.648Z | COORDINATE_ROUNDED;INSTITUTION_MATCH_FUZZY;COLLECTION_MATCH_FUZZY | ||
| 931003789 | 23243164-c132-444d-a3a4-34662abb8305 | UdeA:HUA:32317 | Plantae | Tracheophyta | Magnoliopsida | Laurales | Lauraceae | Aniba | Aniba perutilis | NA | SPECIES | Aniba perutilis Hemsl. | Aniba perutilis | Hemsl. | CO | Vereda Berlín | Antioquia | PRESENT | 1 | cccff716-2694-4209-9f9e-2f7a484465a0 | 5.966667 | -74.83333 | 1486 | NA | 275 | 25 | NA | NA | 1986-11-23T00:00:00 | 23 | 11 | 1986 | 4180651 | 4180651 | PRESERVED_SPECIMEN | Universidad de Antioquia (UdeA) | HUA | 32317 | 1183 | Hoyos S. | CC0_1_0 | Hoyos S.;Alzate N. | NA | NA | 2023-01-24T15:51:05.795Z | COORDINATE_ROUNDED;INSTITUTION_MATCH_FUZZY;COLLECTION_MATCH_FUZZY |
nota: Como puedes ver, el data-frame de “GBif” contiene mucha información que, aunque es significativa, no es relevante para nuestro análisis. Por lo tanto, debemos limpiar los datos y utilizar solo las columnas necesarias.
Mejor debemos limpiar y eliminar alguna información de nuestro data frame para evitar errores y problemas en el código. Solo vamos a tomar las columnas con información geográfica; debido a un análisis de una sola especie en nuestro ejemplo. Se supone que todas las coordenadas son de una especie. Para esto, seleccionaremos las columnas “decimalLongitude” a “decimalLatitude”, que son las que tienen la longitud y latitud, respectivamente. Tambien, limpiaremos los NA y cambiaremos el nombre de las columnas por unas mas faciles (Long y Lat, respectivamente).
acgeo2 <- obs.data %>% subset( !is.na(decimalLongitude ) & !is.na(decimalLatitude)) %>%
transform(as.numeric(decimalLongitude)) %>% transform(as.numeric(decimalLatitude)) %>%
select(decimalLongitude, decimalLatitude) %>%
rename(Long=decimalLongitude) %>%
rename(Lat=decimalLatitude)
######### tu solo corre esto, el se encargara de limpiar los datos y colocar nombres mas simples
tus datos se veran de la siguiente manera…
| Long | Lat |
|---|---|
| -74.68528 | 6.272225 |
| -75.05056 | 7.216667 |
| -75.05056 | 7.216667 |
| -74.83333 | 5.966667 |
nota: Asegúrate de revisar tus datos utilizando la función “head(acgeo2, 4)”.
Descargaremos algunos raster Biogeográficos de internet para nuestro ejercicio. Hay muchas formas de utilizar más raster en nuestro análisis y proceso, pero debido a ser un ejemplo simple, solo usaremos esos.
files <- list.files(path=paste(system.file(package="dismo"),
'/ex', sep=''), pattern='grd', full.names=T)
Bioma <- stack(files)
nota: Nuestro objeto “Bioma” tiene todos los raster importados que vamos a utilizar.
El paquete ‘raster’ incluye la división política de algunos países. En el caso colombiano, tiene el país (capa 0), departamentos (capa 1) y regiones (capa 2).
Colombia0 <- getData('GADM' , country="COL", level=0)
Colombia1 <- getData('GADM' , country="COL", level=1)
plot(Colombia0, main="Administrativas Colombia nivel 0")
plot(Colombia1, main="Adm. Colombia nivel 1")
plot(Colombia0, xlim=c(-90,-60), ylim=c(-5,10), axes=TRUE, col="light yellow")
points(acgeo2$Lon, acgeo2$Lat, col='orange', pch=20, cex=0.75)
points(acgeo2$Lon, acgeo2$Lat, col='red', cex=0.75)
**nota*: Preguntate, ¿estan todos los puntos dentro de Colombia? En caso
que no, los descargaste mal.
Necesitamos ajustar el raster bio climático a una extensión geográfica específica, en este caso Colombia. Para ello, crearemos una zona de trabajo geográfica.
e <- extent(-81.841530, -66.87033, -4.228429 , 15.91247) #Colombia extencion
Y ahora lo “cortamos”…
Bioma <- crop(x = Bioma, y = e) ##this funtion cuts "Bioma" rasters by "e" extent
predictors2 <- stack(Bioma)
plot(predictors2)
Quieres ver los datos por cada punto, bien has lo siguiente…
presvals <- raster::extract(predictors2, acgeo2)
head(presvals, 3)
## bio1 bio12 bio16 bio17 bio5 bio6 bio7 bio8 biome
## [1,] 252 2664 919 334 308 198 110 249 1
## [2,] 232 3921 1364 365 290 171 119 229 1
## [3,] 232 3921 1364 365 290 171 119 229 1
Problema frecuente
En algunos casos dependiendo la version del computador o el R, etc… Se pueden presentar problemas en el acceso de las coordenas antes suministradas como coordenadas y no numeros. Por tanto realizamos lo siguiente, aclarando a R que son coordenadas.
Long<-as.numeric(as.matrix(acgeo2[1]))
Lat<-as.numeric(as.matrix(acgeo2[2]))
coord2 <- cbind(Long, Lat)
coord2<-as.data.frame(coord2)
acgeo3<-raster::coordinates(coord2)
presvals <- raster::extract(predictors2, acgeo3)
Existen muchas maneras de modelar la distribución de una especie, y la mayoría de ellas pueden ser creadas por una mezcla de información de presencia / ausencia. Para lograr nuestro objetivo, debemos crear algunos puntos de ausencia pseudo-aleatorios.
set.seed(0)
backgr <- randomPoints(predictors2, 500)
absvals <- raster::extract(predictors2, backgr)
pb <- c(rep(1, nrow(presvals)), rep(0, nrow(absvals)))
sdmdata <- data.frame(cbind(pb, rbind(presvals, absvals)))
sdmdata[,'biome'] <- as.factor(sdmdata[,'biome'])
pred_nf <- dropLayer(predictors2, 'biome')
set.seed(0)
group <- kfold(acgeo2, 5)
pres_train <- acgeo3[group != 1, ]
pres_test <- acgeo3[group == 1, ]
####
set.seed(100)
backg <- randomPoints(pred_nf, n=10000, ext=e, extf = 1.25)
Estos pueden apreciarse de la siguiente manera:
colnames(backg) = c('Lon', 'Lat')
group <- kfold(backg, 5)
backg_train <- backg[group != 1, ]
backg_test <- backg[group == 1, ]
r <- raster(pred_nf, 1)
plot(!is.na(r), col=c('white', 'light grey'), legend=FALSE)
plot(e, add=TRUE, col='red', lwd=2)
points(backg_train, pch='-', cex=0.5, col='yellow')
points(backg_test, pch='-', cex=0.5, col='black')
points(pres_train, pch= '+', col='green')
points(pres_test, pch='+', col='blue')
La distribución de especies es fundamental en la conservación biológica, ya que nos permite entender cómo las especies interactúan con su entorno y cómo pueden verse afectadas por cambios ambientales. Conocer la distribución de una especie también nos ayuda a identificar áreas clave para su conservación y tomar medidas para protegerlas. Además, modelar la distribución de especies nos permite predecir cómo una especie puede reaccionar a futuros cambios climáticos y en su hábitat, lo cual es esencial para planificar la conservación a largo plazo.
A continuación, mostraremos cómo realizar algunos modelos de distribución. Al finalizar el proceso, crearemos un consenso de los modelos y exportaremos el resultado.
El modelo de sobre-clima es un tipo de modelo de distribución de especies que predice la distribución de una especie basado en sus requisitos climáticos. El modelo funciona creando una “envoltura climática” que define el rango de condiciones climáticas adecuadas para la especie, basadas en su distribución observada. La envoltura climática se representa típicamente por una combinación de variables bioclimáticas, como la temperatura, la precipitación y la altitud, que se utilizan para definir la tolerancia de la especie a diferentes condiciones ambientales.
bc <- bioclim(pred_nf, pres_train)
#### numero de variables climaticas que afectan la distribucion estan en verde
plot(bc, a=1, b=2, p=0.85)
ef <- evaluate(pres_test, backg_test, bc, pred_nf)
ef
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9803255
## cor : 0.8807402
## max TPR+TNR at : 0.04133646
tr <- threshold(ef, 'spec_sens')
tr
## [1] 0.04133646
pb <- predict(pred_nf, bc, ext=e, progress='')
pb
## class : RasterLayer
## dimensions : 40, 30, 1200 (nrow, ncol, ncell)
## resolution : 0.5, 0.5 (x, y)
## extent : -82, -67, -4, 16 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer
## values : 0, 0.8425414 (min, max)
Grafica:
par(mfrow=c(1,2))
plot(pb, main='Bioclim, raw values')
plot(Colombia0, add=TRUE, border='dark grey')
plot(pb > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
En el contexto del modelado de distribución, el método de dominio se refiere a un enfoque específico para definir la extensión geográfica, o dominio, del modelo. El método de dominio se utiliza para limitar el área de estudio a la gama relevante de una especie y para excluir áreas donde la especie es poco probable que ocurra. Esto ayuda a mejorar la precisión y eficiencia del modelo de distribución, evitando la extrapolación más allá del rango de la especie y centrándose en los recursos computacionales en las áreas más importantes.
dm <- domain(pred_nf, pres_train)
ef <- evaluate(pres_test, backg_test, dm, pred_nf)
ef
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9559448
## cor : 0.712134
## max TPR+TNR at : 0.9393305
Grafica:
##Grafica
pd = predict(pred_nf, dm, ext=e, progress='')
par(mfrow=c(1,2))
plot(pd, main='Domain, raw values')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(ef, 'spec_sens')
plot(pd > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='*')
La distancia de Mahalanobis es una medida de la distancia entre un punto y una distribución. Es comúnmente utilizada en análisis estadístico para evaluar la diferencia entre una observación y un grupo de observaciones, teniendo en cuenta la covarianza entre las variables.
Se define como la distancia entre un punto y una distribución medida en desviaciones estándar, utilizando la matriz de covarianza de la distribución para ajustar por la correlación entre variables. A menudo se utiliza en reconocimiento de patrones y aprendizaje automático, especialmente en la clasificación de datos multivariados.
mm <- mahal(pred_nf, pres_train)
ef <- evaluate(pres_test, backg_test, mm, pred_nf)
ef
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9872611
## cor : 0.2968733
## max TPR+TNR at : 0.9999
pm = predict(pred_nf, mm, ext=e, progress='')
par(mfrow=c(1,2))
pm[pm < -10] <- -10
Grafica:
##Graphic
plot(pm, main='Mahalanobis distance')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(ef, 'spec_sens')
plot(pm > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
data3 <- backg_train
colnames(data3) <- colnames(pres_train)
rbind(pres_train, data3)
backg_train<-data3
train <- rbind(pres_train, backg_train)
pb_train <- c(rep(1, nrow(pres_train)), rep(0, nrow(backg_train)))
envtrain <- raster::extract(predictors2, train)
envtrain <- data.frame( cbind(pa=pb_train, envtrain) )
envtrain[,'biome'] = factor(envtrain[,'biome'], levels=1:14)
head(envtrain)
## pa bio1 bio12 bio16 bio17 bio5 bio6 bio7 bio8 biome
## 1 1 252 2664 919 334 308 198 110 249 1
## 2 1 232 3921 1364 365 290 171 119 229 1
## 3 1 252 2664 919 334 308 198 110 249 1
## 4 1 264 2498 922 372 324 211 113 260 1
## 5 1 252 2664 919 334 308 198 110 249 1
## 6 1 262 3743 1323 345 321 206 115 258 1
testpres <- data.frame( raster::extract(predictors2, pres_test) )
testbackg <- data.frame( raster::extract(predictors2, backg_test) )
testpres[ ,'biome'] = factor(testpres[ ,'biome'], levels=1:14)
testbackg[ ,'biome'] = factor(testbackg[ ,'biome'], levels=1:14)
##Generalized Linear Models
gm1 <- glm(pa ~ bio1 + bio5 + bio6 + bio7 + bio8 + bio12 + bio16 + bio17,
family = binomial(link = "logit"), data=envtrain)
coef(gm1)
## (Intercept) bio1 bio5 bio6 bio7 bio8
## 9.025910183 -0.024883294 2.067536524 -1.974100826 -2.062222389 -0.087604751
## bio12 bio16 bio17
## 0.007446127 -0.019399999 -0.011623238
gm2 <- glm(pa ~ bio1+bio5 + bio6 + bio7 + bio8 + bio12 + bio16 + bio17,
family = gaussian(link = "identity"), data=envtrain)
evaluate(testpres, testbackg, gm1)
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9504246
## cor : 0.760687
## max TPR+TNR at : 1.274852
ge2 <- evaluate(testpres, testbackg, gm2)
ge2
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9526893
## cor : 0.7768101
## max TPR+TNR at : 0.7905402
pg <- predict(predictors2, gm2, ext=e)
par(mfrow=c(1,2))
Grafica:
##Graphic
plot(pg, main='GLM/gaussian, raw values')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(ge2, 'spec_sens')
plot(pg > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
points(backg_train, pch='-', cex=0.25)
Los métodos de aprendizaje automático son un tipo de inteligencia artificial que implican entrenar algoritmos para hacer predicciones basadas en datos de entrada. Las técnicas de aprendizaje automático, como árboles de decisión, bosques aleatorios y máquinas de vectores de soporte, pueden utilizarse para modelar las distribuciones de especies relacionando la presencia o ausencia de una especie con variables ambientales.
Por otro lado, Maxent es un tipo de algoritmo de aprendizaje automático diseñado específicamente para modelar la distribución de especies. Maxent utiliza un enfoque de entropía máxima para modelar la relación entre la presencia de una especie y las variables ambientales, teniendo en cuenta la incertidumbre en las predicciones del modelo.
Importante Deberas intalas un paquete extra con la actualizacion de Java.
#install.packages("rJava") #Corre la instalacion solo una vez OJOOOOOO
library(rJava)
Ahora si continuemos!!
xm <- maxent(predictors2, pres_train, factors='biome')
plot(xm)
ef <- evaluate(pres_test, backg_test, xm, predictors2)
ef
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9398797
## cor : 0.7830463
## max TPR+TNR at : 0.8959265
px <- predict(predictors2, xm, ext=e, progress='')
par(mfrow=c(1,2))
Grafica:
## Grafica
plot(px, main='Maxent, raw values')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(ef, 'spec_sens')
plot(px > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
Random Forest es una técnica de aprendizaje automático utilizada para el modelado predictivo. Construye un conjunto de árboles de decisión y combina sus resultados para hacer una predicción final para nuevas entradas. Además, ofrece una evaluación de la importancia de las características y está equipado para procesar datos faltantes y desequilibrados.
model <- pa ~ bio1 + bio5 + bio6 + bio7 + bio8 + bio12 + bio16 + bio17
rf1 <- randomForest(model, data=envtrain)
model <- factor(pa) ~ bio1 + bio5 + bio6 + bio7 + bio8 + bio12 + bio16 + bio17
rf2 <- randomForest(model, data=envtrain)
rf3 <- randomForest(envtrain[,1:8], factor(pb_train))
erf <- evaluate(testpres, testbackg, rf1)
erf
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9950814
## cor : 0.9613489
## max TPR+TNR at : 0.5890039
pr <- predict(predictors2, rf1, ext=e)
Grafica:
par(mfrow=c(1,2))
plot(pr, main='Random Forest, regression')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(erf, 'spec_sens')
plot(pr > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
points(backg_train, pch='-', cex=0.25)
El método de Máquinas de Vectores de Soporte (SVM) también puede ser utilizado en modelado de distribución de especies. ksvm en R permite la aplicación de SVM en problemas de modelado de distribución de especies, utilizando técnicas de kernel para resolver problemas no lineales y obtener una mejor precisión en la predicción de la distribución de especies en un área dada.
svm <- ksvm(pa ~ bio1+bio5+bio6+bio7+bio8+bio12+bio16+bio17, data=envtrain)
esv <- evaluate(testpres, testbackg, svm)
esv
## class : ModelEvaluation
## n presences : 90
## n absences : 157
## AUC : 0.9881458
## cor : 0.8938387
## max TPR+TNR at : 0.1064286
ps <- predict(predictors2, svm, ext=e)
Grafica:
### Graphic
par(mfrow=c(1,2))
plot(ps, main='Support Vector Machine')
plot(Colombia0, add=TRUE, border='dark grey')
tr <- threshold(esv, 'spec_sens')
plot(ps > tr, main='presence/absence')
plot(Colombia0, add=TRUE, border='dark grey')
points(pres_train, pch='+')
points(backg_train, pch='-', cex=0.25)
El método de consenso consiste en combinar los resultados de varios modelos diferentes para obtener una predicción más precisa y robusta. Se puede crear un método de consenso mediante la combinación de las predicciones de varios modelos individuales utilizando técnicas como la media, la votación o la combinación ponderada. Es importante seleccionar cuidadosamente los modelos individuales que se van a combinar y evaluar su rendimiento antes de crear el método de consenso.
models <- stack(pb, pd, pm, pg, pr, ps )
names(models) <- c("bioclim", "domain", "mahal", "glm", "Random Forest", "SVM")
Grafica de comparacion:
### Graphic
plot(models)
Tarea: Que diferencias puedes encontrar? Meditalo y analiza criticamente cual es la diferencia entre lo que modelamos, la realida y cuales son las mayores interrogantes?
Ahora si podemos crear el consenso final
m <- mean(models)
m<- mask(m,Colombia0 )
Grafica final:
plot(m, main='average score')
points(pres_train, pch='.')
points(backg_train, pch='-', cex=0.25)
plot(Colombia0, add=TRUE, border='dark grey')
Ahora podemos exportar los resultados para un análisis más exhaustivo de la distribución. Analicemos si los puntos de presencia coinciden con la distribución prevista.
auc <- sapply(list(ge2, erf, esv), function(x) x@auc)
w <- (auc-0.5)^2
plot(m, main='weighted mean of three models')
points(pres_train, pch='+')
points(backg_train, pch='-', cex=0.25)
Vamos a crear una carperta llamada distribucion…
file <- "distribucion"
dir.create(file.path(first_folder, file ))
## Warning in dir.create(file.path(first_folder, file)):
## 'D:\biato\wikiaves\clase_conservacion\distribucion' already exists
Ve a tu carpeta “clase_conservacion”, en ella ya podras apreciar una carpeta llamada “distribucion”. en ella vamos a guardar nuestro raster con la informacion de distribucion.
setwd("D:/biato/wikiaves/clase_conservacion/distribucion")
#### por favor ten cuidado con los nombres de las carpetasssssssssss, en tu pc deben ser distintas
pol <- rasterToPolygons(m>0.4,function(x) x == 1,dissolve=T) ##depends on your specie you would ##increase or decrease the porcentage
raster::shapefile(pol,
"Specie_fin.shp",
overwrite=TRUE ) ### Ojo con los nombres de las carpetas, en
Como paso extra vamos a visualizar la distribucion en R y jugar un poco con esta. Para el siguiente paso debemos intalar y ejecutar mas paquetes. Recuerda que la instalación se realiza con la función install.packages() y el nombre del paquete entre comillas. Por ejemplo, install.packages(“maptools”). Luego, puedes cargar los paquetes en tu sesión de R utilizando la función library(), como se muestra en el siguiente ejemplo: library(maptools). A continuación los paquetes:
library(htmlwidgets)
library(webshot)
library(leaflet)
library(mapview)
##########Lo siguiente es para fijar nuestra carpeta como de grabado de outputs
setwd("D:/biato/wikiaves/clase_conservacion/distribucion")
getwd()
## [1] "D:/biato/wikiaves/clase_conservacion/distribucion"
A continuacion crearemos una serie de condiciones con el fin de crear un mapa interactivo en R, desde el cual podremos interactuar de forma mas natural con nuestra distribucion.
##### Recuerda lo de las carpetas, aqui debes colocar el orden correcto y nombres
wqp_sites <- st_read("D:/biato/wikiaves/clase_conservacion/distribucion")
## Reading layer `Specie_fin' from data source
## `D:\biato\wikiaves\clase_conservacion\distribucion' using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -76.5 ymin: 1.5 xmax: -73 ymax: 7.5
## Geodetic CRS: GCS_unknown
nhd_wms_url <- "https://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}"
#######
##### Aca creamos una funcion para algunas especificaciones en nuestro mapa interactivo
extractCoords <- function(sp.df)
{
results <- list()
for(i in 1:length(sp.df@polygons[[1]]@Polygons))
{
results[[i]] <- sp.df@polygons[[1]]@Polygons[[i]]@coords
}
results <- Reduce(rbind, results)
results
}
Ahora usaremos un paquete llamado “leaflet” el cual usa una interfase html para disponer mapas de forma didactica.
## OGR data source with driver: ESRI Shapefile
## Source: "D:\biato\wikiaves\clase_conservacion\distribucion\Specie_fin.shp", layer: "Specie_fin"
## with 1 features
## It has 1 fields