1. Introducción

Este documento describe la metodología empleada para realizar el downscaling espacial de las variables climáticas temperatura (2 m) y precipitación total (mm) a nivel mensual, utilizando como datos base el producto ECMWF/ERA5_LAND/MONTHLY_AGGR y variables topográficas derivadas del DEM SRTM.

El objetivo del procedimiento es obtener productos climáticos a resolución fina (30 m) que permitan analizar la variabilidad espacial local en la zona de Chongón, Guayaquil - Ecuador.

El código ejecutado para el downscaling, se realizó en Google Earth Engine y está disponible en Geoportal. El procesamiento estadístico del producto generado se realizó en RStudio.

2. Datos de entrada y cobertura temporal

Se emplearon datos del producto ECMWF/ERA5_LAND/MONTHLY_AGGR, disponibles en la plataforma Google Earth Engine (GEE). Este conjunto de datos provee variables meteorológicas mensuales desde el año 2000 hasta el año 2024, con una resolución espacial aproximada de 0.1° (~9 km).

2.1. Datos climáticos:

  • Producto: ECMWF/ERA5_LAND/MONTHLY_AGGR (Google Earth Engine).
  • Variables seleccionadas: temperature_2m (convertida a °C) y total_precipitation (convertida a mm).
  • Periodo analizado en este estudio: 1 de enero de 2000 hasta el 31 de diciembre de 2024. Agregados de forma mensual.

2.2. Predictores topográficos:

  • DEM: USGS/SRTMGL1_003 (aprox. 30 m).
  • Derivados: pendiente (slope) y orientación (aspect).
  • Justificación: la topografía y la orientación es un predictor robusto para la variación espacial de temperatura y precipitación a escalas locales.

3 Procesamiento en Google Earth Engine (resumen metodológico)

A continuación se sintetiza el flujo implementado en GEE.

3.1. Definición de periodo y colecciones

  • Se filtró la colección ‘ECMWF/ERA5_LAND/MONTHLY_AGGR’ para el intervalo 2000-01-01 / 2012-12-31 y para el intervalo siguiente 2013-01-01 / 2024-12-31 considerando como área de estudio el polígono de Chongón llamado ROI_chongon.

3.2. Conversión de unidades

  • La variable temperatura 2m: Se convirtió la temperatura de grados Kelvin a grados Celsius mediante la resta de 273.15.
  • La variable precipitación: Se convirtió la precipitación de metros a milímetros multiplicando por 1000.

3.3. Predictores topográficos

  • Se cargó SRTMGL1_003 y se aplicó el algoritmo de terreno (ee.Algorithms.Terrain) para obtener DEM, Slope y Aspect.
  • Los predictores se combinaron en una imagen multibanda predictors = dem + slope + aspect.

3.4. Entrenamiento y predicción mensuales (loop año-mes) con Random Forest

Random Forest es robusto frente a relaciones no lineales y colinealidad moderada entre predictores. Se lo utiliza mucho en eventos de Downscaling climático.

El modelo de Random Forest se entrenó con las mismas variables topográficas para capturar la influencia orográfica en la distribución de la precipitación y la temperatura. El resultado fue una serie mensual con resolución espacial de 30 m.

Los pasos se detallan a continuación:

  • Para cada mes del periodo se extrae la imagen ERA5 correspondiente y se derivan las bandas temperatura_C y precipitación_mm.
  • Se generan muestras aleatorias a 30 m desde la imagen predictors + variable objetivo para entrenamiento (numPixels = 900 en el script).
  • Se entrena un modelo Random Forest (smileRandomForest con 100 árboles) en modo regresión por separado para temperatura y precipitación, usando inputProperties = [‘elevation’, ‘slope’, ‘aspect’].
  • Se aplica el modelo sobre la imagen de predictores para producir una predicción a 30 m para ese mes.
  • Cada predicción mensual se renombra con el patrón temp_YYYY_MM o precip_YYYY_MM y se agrega a una lista.

3.5. Creación de stacks y exportación

  • Al finalizar el bucle se apilan las bandas mensuales en un imageCollection.toBands() para obtener image multibanda (stack).
  • Se renombran las bandas para mantener una convención YYYY_MM.
  • Se exportan los stacks a Google Drive como GeoTIFF en CRS EPSG:32717 y resolución 30 m.

4. Procesamiento posterior en RStudio.

Los resultados del downscaling fueron exportados en formato GeoTIFF y analizados en RStudio usando los paquetes terra, sf, tidyverse y RColorBrewer.

4.1. Estadísticos descriptivos globales

Para cada variable (temperatura y precipitación) se calcularon estadísticos globales:

#libreria ráster
library(terra) #Para manipular información ráster
library(sf) #Para manipular información vectorial
library(tidyverse) #Para maniupular información tabulada
library(RColorBrewer) #Genera rango de colores
library(trend) #Para ejecutar tendencias climáticas

# Cargamos imágenes downscaled de GEE
temp <- list.files("TEMPERATURE/", pattern = "\\.tif$", full.names = TRUE) #imagenes por periodo (2000-2012) y (2013-2024)
precp <- list.files("PRECIPITACON/", pattern = "\\.tif$", full.names = TRUE) #imagenes por periodo (2000-2012) y (2013-2024)

#generamos un stack completo 
tempG <- rast(temp)
PrecpG <- rast(precp)

# Estadísticos globales para temperatura
TmaxG <- app(tempG, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TmeanG <- app(tempG, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TminG <- app(tempG, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
# Asignar nombres a las bandas calculadas temperatura
names(TmaxG) <- "TmaxG_2000_2024" 
names(TmeanG) <- "TmeanG_2000_2024" 
names(TminG) <- "TminG_2000_2024" 
  
# Estadísticos globales para precipitacion
PrecpMaxG <- app(PrecpG, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMeanG <- app(PrecpG, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMinG <- app(PrecpG, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpTotalG <- app(PrecpG, sum, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
# Asignar nombres a las bandas calculadas precipitacion
names(PrecpMaxG) <- "PrecpMaxG_2000_2024" 
names(PrecpMeanG) <- "PrecpMeanG_2000_2024" 
names(PrecpMinG) <- "PrecpMinG_2000_2024" 
names(PrecpTotalG) <- "PrecpTotalG_2000_2024" 

4.2. Estadísticos descriptivos por periodo

Se agruparon las capas en dos periodos:

  • Periodo 1: 2000–2012 (13 años * 12 meses = 156 capas)
  • Periodo 2: 2013–2024 (12 años * 12 meses = 144 capas)
  • En total son 300 meses que corresponden a 300 layers.

Y se calcularon los estadísticos por periodo para TEMPERATURA

#Definición de periodos
TempP1 <- tempG[[1:156]] #periodo 1
TempP2 <- tempG[[157:300]] # periodo 2

# Calcular estadísticos por píxel en cada periodo
TmeanP1 <- app(TempP1, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TmeanP2 <- app(TempP2, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TmaxP1 <- app(TempP1, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TmaxP2 <- app(TempP2, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TminP1 <- app(TempP1, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
TminP2 <- app(TempP2, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
# Asignar nombres a las bandas calculadas
names(TmeanP1) <- "TmeanP1_2000_2012" 
names(TmeanP2) <- "TmeanP1_2013_2024"
names(TmaxP1)  <- "TmaxP1_2000_2012"  
names(TmaxP2)  <- "TmaxP2_2013_2024"
names(TminP1)  <- "TminP1_2000_2012"  
names(TminP2)  <- "TminP2_2013_2024"

Estadísticos por periodo para PRECIPITACIÓN

#Definición de periodos
PrecpP1 <- PrecpG[[1:156]] #periodo 1
PrecpP2 <- PrecpG[[157:300]] # periodo 2

# Calcular estadísticos por píxel en cada periodo
PrecpMeanP1 <- app(PrecpP1, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMeanP2 <- app(PrecpP2, mean, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMaxP1 <- app(PrecpP1, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMaxP2 <- app(PrecpP2, max, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMinP1 <- app(PrecpP1, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpMinP2 <- app(PrecpP2, min, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpTotalP1 <- app(PrecpP1, sum, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
PrecpTotalP2 <- app(PrecpP2, sum, na.rm = TRUE)
## |---------|---------|---------|---------|=========================================                                          
# Asignar nombres a las bandas calculadas
names(PrecpMeanP1) <- "PrecpMeanP1_2000_2012" 
names(PrecpMeanP2) <- "PrecpMeanP2_2013_2024"
names(PrecpMaxP1)  <- "PrecpMaxP1_2000_2012"  
names(PrecpMaxP2)  <- "PrecpMaxP2_2013_2024"
names(PrecpMinP1)  <- "PrecpMinP1_2000_2012"  
names(PrecpMinP2)  <- "PrecpMinP2_2013_2024"
names(PrecpTotalP1)  <- "PrecpTotalP1_2000_2012"
names(PrecpTotalP2)  <- "PrecpTotalP2_2013_2024"

5. Visualización global

Por TEMPERATURA

# rampa de colores para temperatura
col_temp <- colorRampPalette(brewer.pal(11, "RdYlBu"))(100)


#Para temperatura
plot(TmaxG, col = rev(col_temp), main = "Temperatura Máxima (2000–2024)")

plot(TmeanG, col = rev(col_temp), main = "Temperatura Media (2000–2024)")

plot(TminG, col = rev(col_temp), main = "Temperatura Mínima (2000–2024)")

Por PRECIPITACIÓN

# Paleta tipo gradiente azul-rojo
col_precp <- colorRampPalette(c("#e0f3f8", "#74add1", "#4575b4", "#313695"))(100)

#Para precipitación
plot(PrecpMaxG, col = col_precp, main = "Precpitación Máxima (2000–2024)")

plot(PrecpMeanG, col = col_precp, main = "Precipitación Media (2000–2024)")

plot(PrecpMinG, col = col_precp, main = "Precipitación Mínima (2000–2024)")

plot(PrecpTotalG, col = col_precp, main = "Precipitación Total (2000–2024)")

# 5.1 Visualización por periodos

Por TEMPERATURA

#Para temperatura periodo 1
plot(TmaxP1, col = rev(col_temp), main = "Temperatura Máxima (2000–2012)")

plot(TmeanP1, col = rev(col_temp), main = "Temperatura Media (2000–2012)")

plot(TminP1, col = rev(col_temp), main = "Temperatura Mínima (2000–2012)")

#Para temperatura periodo 2
plot(TmaxP2, col = rev(col_temp), main = "Temperatura Máxima (2013–2024)")

plot(TmeanP2, col = rev(col_temp), main = "Temperatura Media (2013–2024)")

plot(TminP2, col = rev(col_temp), main = "Temperatura Mínima (2013–2024)")

Por PRECIPITACIÓN

#Para precipitación periodo 1
plot(PrecpMaxP1, col = col_precp, main = "Precpitación Máxima (2000–2012)")

plot(PrecpMeanP1, col = col_precp, main = "Precipitación Media (2000–2012)")

plot(PrecpMinP1, col = col_precp, main = "Precipitación Mínima (2000–2012)")

plot(PrecpTotalP1, col = col_precp, main = "Precipitación Total (2000–2012)")

#Para precipitación periodo 2
plot(PrecpMaxP2, col = col_precp, main = "Precpitación Máxima (2013–2024)")

plot(PrecpMeanP2, col = col_precp, main = "Precipitación Media (2013–2024)")

plot(PrecpMinP2, col = col_precp, main = "Precipitación Mínima (2013–2024)")

plot(PrecpTotalP2, col = col_precp, main = "Precipitación Total (2013–2024)")

6. Resultados estadísticos por periodos

Por TEMPERATURA

Por PRECIPITACÓN

7. Conclusión

El procedimiento permitió:

8. Recomendación

9. Referencias