Taller de especialización
Herramientas SIG:
Google Earth Engine y R.
Clase 4.
Autor: Nelson Mattie
Limpiar la consola de variables
rm(list=ls())cat("\014")Defininr el directorio donde obtendremos y dejaremos los archivos generados
ruta_proyecto <- dirname(getwd())
ruta_clase_01 <- file.path(ruta_proyecto, "Clase_01_GEE")
ruta_clase_02 <- file.path(ruta_proyecto, "Clase_02_R")
ruta_clase_03 <- file.path(ruta_proyecto, "Clase_03_Modelamiento")
ruta_clase_04 <- file.path(ruta_proyecto, "Clase_04_Maxent")
ruta_clase_05 <- file.path(ruta_proyecto, "Clase_05_Metricas")
ruta_clase_06 <- file.path(ruta_proyecto, "Clase_06_amc")
ruta_datos <- file.path(ruta_proyecto, "datos")OBJETIVO: Cargar los paquetes necesarios para desarrollar este práctico Si no tienen los paquetes, deben buscarlos en la consola de abajo a la derecha (opción packages) y bajarlos
if(!require(rgdal)) suppressMessages( suppressWarnings( install.packages("rgdal") ))
if(!require(sp)) suppressMessages( suppressWarnings( install.packages("sp") ))
if(!require(raster)) suppressMessages( suppressWarnings( install.packages("raster") ))
if(!require(rJava)) suppressMessages( suppressWarnings( install.packages("rJava") ))
if(!require(dismo)) suppressMessages( suppressWarnings( install.packages("dismo") ))Encontramos que la versión de la función maxent del paquete dismo tarda demasiado y no reconoce la opción caching, de manera que siempre se vuelve a generar. Probaremos con una nueva versión del autor que hizo para MaxEnt usando la regresión regularizada mixnet del paquete glmnet, lo que se encuentra disponible con un nombre similar, llamado maxnet en CRAN.
if(!require(maxnet)) suppressMessages( suppressWarnings( install.packages("maxnet") ))## Loading required package: maxnet
OJO!!!
Este modelo es para """Abierto""" (reemplazar este campo en Edit -> Find, Replace: "Abierto" por "Cobertura a Modelar")
OBJETIVO:
Cargar los datos desde archivo csv.
Abierto <- read.csv(file.path(ruta_clase_04,"Práctico_Maxent/Puntos/Puntos_Abierto.csv"),
header = TRUE, sep = ',')Revisar la tabla que acabamos de cargar
head(Abierto,10)## Name LON LAT
## 1 Abierto -71.47224 -33.16257
## 2 Abierto -71.48326 -33.16397
## 3 Abierto -71.48728 -33.16842
## 4 Abierto -71.49877 -33.17026
## 5 Abierto -71.50290 -33.16970
## 6 Abierto -71.51561 -33.15453
## 7 Abierto -71.52032 -33.15292
## 8 Abierto -71.51601 -33.13458
## 9 Abierto -71.51755 -33.12604
## 10 Abierto -71.50676 -33.12219
Sin embargo, en R los puntos deben estar sólo como coordenas x,y en dos columnas.
Puntos_Abierto <- Abierto[,-1]
head(Puntos_Abierto,10)## LON LAT
## 1 -71.47224 -33.16257
## 2 -71.48326 -33.16397
## 3 -71.48728 -33.16842
## 4 -71.49877 -33.17026
## 5 -71.50290 -33.16970
## 6 -71.51561 -33.15453
## 7 -71.52032 -33.15292
## 8 -71.51601 -33.13458
## 9 -71.51755 -33.12604
## 10 -71.50676 -33.12219
OBJETIVO:
Mapa_Region_Valparaiso <- readOGR(dsn=file.path(ruta_clase_04,"Práctico_Maxent/Shape_Valparaiso"),
layer= "Región_de_Valparaíso", verbose=FALSE) #cargar el mapa que tenemos en la carpeta
Area_de_Estudio <- readOGR(dsn=file.path(ruta_clase_04,"Práctico_Maxent/Área_de_Estudio"),
layer= "Area_Estudio", verbose=FALSE) #para cargar el área de estudio
plot(Mapa_Region_Valparaiso, axes=TRUE, col="light blue") #para visualizar el mapa
lines(Area_de_Estudio, col="red", lwd=3) #para visualizar el área de estudio
points(Puntos_Abierto, col='red', pch=1, cex=0.8, lwd=1) #pch: forma del símbolo; cex: tamaño símbolo; lwd: ancho de líneaADICIONAL:
plot(Mapa_Region_Valparaiso, xlim=c(-72,-71),ylim=c(-33.4,-33), axes=TRUE, col="yellow")
lines(Area_de_Estudio, col="red", lwd=1) #Esto es para cargar el polígono del área de estudio
points(Puntos_Abierto, col='blue', pch=4, cex=1, lwd=0.5) #pch: forma del símbolo; cex: tamaño símbolo; lwd: ancho de línea
box() #Esto es para ponerle un borde de caja al mapa, es sólo para visualizaciónOBJETIVO:
Buscar_Rasters <- list.files(path=file.path(ruta_clase_04,"Práctico_Maxent/Imágenes"),
pattern='B\\d.tif|ndvi.tif$', all.files = TRUE, full.names = TRUE)
print(Buscar_Rasters) #para ver los rasters que se identificaron en la carpeta## [1] "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/B2.tif" "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/B3.tif"
## [3] "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/B4.tif" "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/B5.tif"
## [5] "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/B6.tif" "/home/matbox/Documents/TrabajosExtra/nelson.mattie/Taller_GEE_R/Clase_04_Maxent/Práctico_Maxent/Imágenes/ndvi.tif"
Capas_Raster <- stack(Buscar_Rasters) #apilar los rasters en un sólo raster multibanda
list(Capas_Raster) #para ver las características de los rasters apilados## [[1]]
## class : RasterStack
## dimensions : 941, 1121, 1054861, 6 (nrow, ncol, ncell, nlayers)
## resolution : 0.0002694946, 0.0002694946 (x, y)
## extent : -71.59339, -71.29129, -33.35022, -33.09663 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
## names : B2, B3, B4, B5, B6, ndvi
## min values : ?, ?, ?, ?, ?, -0.3210981
## max values : ?, ?, ?, ?, ?, 0.8064534
plot(Capas_Raster) #para visualzar las distintas bandas que se encuentran dentro del raster apiladoTambién podemos hacer un mapa específico para cada una de las bandas, por ejemplo
plot(Capas_Raster, 3)
plot(Mapa_Region_Valparaiso, add=TRUE) #Con este comando añadimos el mapa vectorial sobre el raster
points(Puntos_Abierto) #Con este comando añadimos los puntos sobre el mapaOBJETIVO:
#lazyLoad("sesion04_nelson_mattie_cache/latex/bloque_0010_a1e362bc30fab03c52688de7e7f397a9")
Grupo <- kfold(Puntos_Abierto,k=5) #esto separa los puntos en 5 grupos, con números que van de 1 al 5
Datos_Entrenamiento <- Puntos_Abierto[Grupo != 1,] #Selecciona aquellos datos que no pertenecen al grupo 1
Datos_Testeo <- Puntos_Abierto[Grupo == 1,] #Selecciona aquellos datos que sí pertenecen al grupo 1
head(Datos_Entrenamiento,10)
## LON LAT
## 1 -71.47224 -33.16257
## 2 -71.48326 -33.16397
## 3 -71.48728 -33.16842
## 6 -71.51561 -33.15453
## 7 -71.52032 -33.15292
## 8 -71.51601 -33.13458
## 9 -71.51755 -33.12604
## 10 -71.50676 -33.12219
## 11 -71.49881 -33.12106
## 13 -71.53380 -33.13260
head(Datos_Testeo,10)
## LON LAT
## 4 -71.49877 -33.17026
## 5 -71.50290 -33.16970
## 12 -71.49337 -33.13023
## 15 -71.55527 -33.16281
## 19 -71.53661 -33.18299
## 27 -71.43839 -33.26018
## 36 -71.40623 -33.32967
## 40 -71.32681 -33.24259
## 48 -71.34340 -33.14967
## 50 -71.36456 -33.12565
table(Grupo)
## Grupo
## 1 2 3 4 5
## 10 10 10 10 10
str(Grupo)
## int [1:50] 3 4 4 1 1 5 5 3 3 4 ...
str(Puntos_Abierto)
## 'data.frame': 50 obs. of 2 variables:
## $ LON: num -71.5 -71.5 -71.5 -71.5 -71.5 ...
## $ LAT: num -33.2 -33.2 -33.2 -33.2 -33.2 ...OBJETIVO:
Modelo generado en base a 2000 puntos de "background".
Modelo <- dismo::maxent(Capas_Raster, Datos_Entrenamiento, nbg=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Modelo"), silent=FALSE)## This is MaxEnt version 3.4.1
### show(Modelo) #Abre los resultados del modelo en un navegador web, en formato .html
plot(Modelo) #Genera un gráfico con la contribución relativa de cada una de las variables predictorasProducir una clasificación en base al modelo generado.
#lazyLoad("sesion04_nelson_mattie_cache/latex/predict_modelo_e045c9c3f5806a12dbb12de1d7c4757d")
Clasificacion <- dismo::predict(Modelo,Capas_Raster, silent=FALSE)## This is MaxEnt version 3.4.1
Para visualizar el modelo generado. OJO que Maxent genera un modelo probabilístico, no binario.
plot(Clasificacion)Guardar la capa de clasificación en un directorio
if(!file.exists(file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion")))
{ dir.create(file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion")) }
writeRaster(Clasificacion,
file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/Abierto_MaxEnt.tif"),
overwrite=TRUE)OBJETIVO:
Generar 1000 puntos de background para evaluar el modelo.
#lazyLoad("sesion04_nelson_mattie_cache/latex/bloque_0012_20eb3e0b338d203d567c7058d7c5a480")
Pts_Background_Testeo <- randomPoints(Capas_Raster, 1000)Para evaluar el modelo
Evaluacion <- evaluate(Modelo, p=Datos_Testeo, a=Pts_Background_Testeo, x=Capas_Raster)## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
Podemos gráficar el "Receiver Opreation Curve" y visualizar el AUC
plot(Evaluacion, 'ROC')Este comado nos sirve para visualizar la estructura y contenido del resultado
### str(Evaluacion)Algunos ejemplos de información que se puede obtener de la tabla de resultados para generar mapas binarios Evaluación en base al estadísitico kappa
plot(Evaluacion@t,Evaluacion@kappa, type="l") #Esto nos serviría para evaluar el valor del "threshold" para optimizar kappaMaxKappa <- Evaluacion@t[which.max(Evaluacion@kappa)] #Con este comando podemos obtener el valor de threshold que maximiza kappa
plot(Clasificacion > MaxKappa, main = "Binary Kappa") #Generación de un modelo binario en función de Kappa"print(MaxKappa)## [1] 0.7393394
Evaluación en base al estadísitico True Skill Statistics (TSS)
TSS <- Evaluacion@TPR+(Evaluacion@TNR-1) #Con este comando generamos el TSS
plot(Evaluacion@t,TSS, type='l') #Esto nos serviría para evaluar el valor del "threshold" para optimizar el TSSMaxTSS <- Evaluacion@t[which.max(TSS)] #Con este comando podemos obtener el valor de threshold que maximiza el TSS
plot(Clasificacion > MaxTSS, main = "Binary TSS") #Generación de un modelo binario en función de TSS"print(MaxTSS)## [1] 0.2456064
Usaremos cada valor de corte para generar una nueva imagen que contenga valores enteros por cada categoría que puedan ser necesarios más adelante. Primero usamos el valor de corte MaxKappa.
reclassfunMKappa <- function(x) {
ifelse(x <= MaxKappa, 0,
ifelse(x > MaxKappa, 1, NA)) }
Clasificacion_reclass_maxkappa <- calc(Clasificacion, fun=reclassfunMKappa)
plot(Clasificacion_reclass_maxkappa)unique(Clasificacion_reclass_maxkappa)## [1] 0 1
writeRaster(Clasificacion_reclass_maxkappa,
file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/Abierto_reclass_maxkappa.tif"),
overwrite=TRUE)El gráfico anterior es idéntico al mostrado usando el valor de corte inicial con la salvedad de que esta imagen solamente contiene valores enteros 0 y 1. En ese sentido el rango mostrado en la leyenda del gráfico no varía entre esta versión y la anterior, pero esta imagen contiene valores binarios mientras que la otra contiene valores reales. Luego usamos el valor de corte MaxTSS para generar una imagen binaria.
reclassfunMtss <- function(x) {
ifelse(x <= MaxTSS, 0,
ifelse(x > MaxTSS, 1, NA)) }
Clasificacion_reclass_maxtss <- calc(Clasificacion, fun=reclassfunMtss)
plot(Clasificacion_reclass_maxtss)unique(Clasificacion_reclass_maxtss)## [1] 0 1
writeRaster(Clasificacion_reclass_maxtss,
file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/Abierto_reclass_maxtss.tif"),
overwrite=TRUE)Esta imagen muestra el mismo resultado que lo comentado en la imagen justamente anterior respecto de sus valores binarios versus los valores reales iniciales.
IMPORTANTE!
Tenemos las otras coberturas también tienen un total de 50 puntos cada una. Vamos a repetir los paso de clasificación para poder reunir todas las clases finales en una sola imagen clasificada. Vamos a cargar cada archivo y retiraremos la variable name de cada cobertura puesto que solamente nos indica a qué cobertura pertenece y es común a toda coordenada.
Puntos_Abierto <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Abierto.csv" ) , header=T , sep=",")
Puntos_Agricola <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Agrícola.csv" ) , header=T , sep=",")
Puntos_Agua <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Agua.csv" ) , header=T , sep=",")
Puntos_Construido <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Construido.csv") , header=T , sep=",")
Puntos_Nativo <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Nativo.csv" ) , header=T , sep=",")
Puntos_Plantacion <- read.csv(file.path(ruta_clase_04 , "Práctico_Maxent/Puntos/Puntos_Plantación.csv") , header=T , sep=",")Retiramos variable name de cada cobertura.
Puntos_Abierto $Name <- NULL
Puntos_Agricola $Name <- NULL
Puntos_Agua $Name <- NULL
Puntos_Construido$Name <- NULL
Puntos_Nativo $Name <- NULL
Puntos_Plantacion$Name <- NULLVerificamos el número de puntos por cada cobertura.
dim(Puntos_Abierto )
## [1] 50 2
dim(Puntos_Agricola )
## [1] 50 2
dim(Puntos_Agua )
## [1] 50 2
dim(Puntos_Construido)
## [1] 50 2
dim(Puntos_Nativo )
## [1] 50 2
dim(Puntos_Plantacion)
## [1] 50 2Creamos grupos sintéticos usando la función kfold.
Grupos_Abierto <- kfold(Puntos_Abierto , k=5)
Grupos_Agricola <- kfold(Puntos_Agricola , k=5)
Grupos_Agua <- kfold(Puntos_Agua , k=5)
Grupos_Construido <- kfold(Puntos_Construido, k=5)
Grupos_Nativo <- kfold(Puntos_Nativo , k=5)
Grupos_Plantacion <- kfold(Puntos_Plantacion, k=5)Separar cada grupo en muestra de entrenamiento y testeo.
Puntos_entrenamiento_Abierto <- Puntos_Abierto [ Grupos_Abierto !=1,]
Puntos_entrenamiento_Agricola <- Puntos_Agricola [ Grupos_Agricola !=1,]
Puntos_entrenamiento_Agua <- Puntos_Agua [ Grupos_Agua !=1,]
Puntos_entrenamiento_Construido <- Puntos_Construido[ Grupos_Construido!=1,]
Puntos_entrenamiento_Nativo <- Puntos_Nativo [ Grupos_Nativo !=1,]
Puntos_entrenamiento_Plantacion <- Puntos_Plantacion[ Grupos_Plantacion!=1,]
Puntos_Testeo_Abierto <- Puntos_Abierto [ Grupos_Abierto ==1,]
Puntos_Testeo_Agricola <- Puntos_Agricola [ Grupos_Agricola ==1,]
Puntos_Testeo_Agua <- Puntos_Agua [ Grupos_Agua ==1,]
Puntos_Testeo_Construido <- Puntos_Construido[ Grupos_Construido==1,]
Puntos_Testeo_Nativo <- Puntos_Nativo [ Grupos_Nativo ==1,]
Puntos_Testeo_Plantacion <- Puntos_Plantacion[ Grupos_Plantacion==1,]Ejecutamos MaxEnt en cada una de las coberturas en las respectivas muestras de entrenamiento.
maxent_entrenamiento_Abierto <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Abierto , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Abierto" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_entrenamiento_Agricola <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Agricola , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Agricola" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_entrenamiento_Agua <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Agua , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Agua" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_entrenamiento_Construido <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Construido , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Construido"), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_entrenamiento_Nativo <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Nativo , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Nativo" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_entrenamiento_Plantacion <- dismo::maxent(Capas_Raster, Puntos_entrenamiento_Plantacion , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent/train_Plantacion"), silent=FALSE)
## This is MaxEnt version 3.4.1Podemos graficar la contribución de variables por cada cobertura.
par(mfrow=c(2,3))
plot(maxent_entrenamiento_Abierto , main="Variable contribution\nAbierto" )
plot(maxent_entrenamiento_Agricola , main="Variable contribution\nAgricola" )
plot(maxent_entrenamiento_Agua , main="Variable contribution\nAgua" )
plot(maxent_entrenamiento_Construido , main="Variable contribution\nConstruido" )
plot(maxent_entrenamiento_Nativo , main="Variable contribution\nNativo" )
plot(maxent_entrenamiento_Plantacion , main="Variable contribution\nPlantacion" )Obtenemos raster con las predicciones para cada cobertura.
maxent_prediccion_Abierto <- predict(maxent_entrenamiento_Abierto , Capas_Raster)
## This is MaxEnt version 3.4.1
maxent_prediccion_Agricola <- predict(maxent_entrenamiento_Agricola , Capas_Raster)
## This is MaxEnt version 3.4.1
maxent_prediccion_Agua <- predict(maxent_entrenamiento_Agua , Capas_Raster)
## This is MaxEnt version 3.4.1
maxent_prediccion_Construido <- predict(maxent_entrenamiento_Construido , Capas_Raster)
## This is MaxEnt version 3.4.1
maxent_prediccion_Nativo <- predict(maxent_entrenamiento_Nativo , Capas_Raster)
## This is MaxEnt version 3.4.1
maxent_prediccion_Plantacion <- predict(maxent_entrenamiento_Plantacion , Capas_Raster)
## This is MaxEnt version 3.4.1Evaluamos cada modelo usando los mismos puntos de background generados previamente.
maxent_evaluacion_Abierto <- evaluate(maxent_entrenamiento_Abierto , p=Puntos_Testeo_Abierto , a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_evaluacion_Agricola <- evaluate(maxent_entrenamiento_Agricola , p=Puntos_Testeo_Agricola , a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_evaluacion_Agua <- evaluate(maxent_entrenamiento_Agua , p=Puntos_Testeo_Agua , a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_evaluacion_Construido <- evaluate(maxent_entrenamiento_Construido, p=Puntos_Testeo_Construido, a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_evaluacion_Nativo <- evaluate(maxent_entrenamiento_Nativo , p=Puntos_Testeo_Nativo , a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_evaluacion_Plantacion <- evaluate(maxent_entrenamiento_Plantacion, p=Puntos_Testeo_Plantacion, a=Pts_Background_Testeo, x=Capas_Raster)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1Podemos graficar las curvas ROC por cada cobertura.
par(mfrow=c(2,3))
plot(maxent_evaluacion_Abierto , 'ROC')
plot(maxent_evaluacion_Agricola , 'ROC')
plot(maxent_evaluacion_Agua , 'ROC')
plot(maxent_evaluacion_Construido , 'ROC')
plot(maxent_evaluacion_Nativo , 'ROC')
plot(maxent_evaluacion_Plantacion , 'ROC')Almacenamos las clasificaciones en archivo en disco.
library(raster)
#lazyLoad("sesion04_nelson_mattie_cache/latex/predict_maxent_coberturas_31cf829a7e64710964901f587f7cc0d4")
writeRaster(maxent_prediccion_Abierto , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Abierto.tif" ) , overwrite=TRUE)
writeRaster(maxent_prediccion_Agricola , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Agricola.tif" ) , overwrite=TRUE)
writeRaster(maxent_prediccion_Agua , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Agua.tif" ) , overwrite=TRUE)
writeRaster(maxent_prediccion_Construido , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Construido.tif") , overwrite=TRUE)
writeRaster(maxent_prediccion_Nativo , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Nativo.tif" ) , overwrite=TRUE)
writeRaster(maxent_prediccion_Plantacion , file.path(ruta_clase_04,"Práctico_Maxent/Resultados_Clasificacion/maxent_prediccion_Plantacion.tif") , overwrite=TRUE)