Preparar variables bioclimáticas para Maxent en R sin fallos de proyección

Afuera llueve, pero llueve de esa forma que solo pasa en Valdivia, donde el cielo se cae a pedazos y el verde del bosque parece que va a entrar por la ventana de puro brillante que está. Yo estaba ahí, con el mate ya lavado y el reflejo de la luz azul del monitor sobre los vidrios empañados por el frío mientras las letras rojas de error inundan la consola de R, sintiendo que por más que leía tutoriales, mi modelo de nicho simplemente no quería arrancar. Y es que, si estás intentando usar Maxent, seguro ya sabes que es como un invitado muy exigente: si las capas no son exactamente iguales, ni siquiera te abre la puerta.

El rompecabezas de las 19 variables de WorldClim

Todo empezó a fines de agosto, cuando se me ocurrió que quería modelar dónde podría crecer mejor el arrayán cerca de mi casa. Me bajé las famosas WorldClim, que son estas 19 variables bioclimáticas que resumen todo lo que le importa a una planta: que si la temperatura media, que si la lluvia del trimestre más seco... ya sabes. En teoría, vienen listas para usar, pero cuando las cargué en RStudio, me sentí como tratando de encajar piezas de legos de distintas cajas.

Lo primero que me confundió fue el tema de la resolución. Yo leía que estaban a 30 segundos de arco, lo que en mi cabeza de no-geógrafa no significaba nada hasta que busqué que eso equivale más o menos a 1 km por píxel en el ecuador. El problema es que mis propios datos, los que yo había procesado de mis salidas a terreno, estaban en otra escala. Y entonces, cuando intentas juntar todo, R te lanza ese mensaje de 'rasters have different extents' que te dan ganas de cerrar la tapa del computador y dedicarte a otra cosa.

Primer plano de pantalla de laptop mostrando un error de alineación de rasters en R

El domingo que perdí por 0.00001 de diferencia

No te imaginas la frustración de pasar todo un domingo procesando archivos solo para descubrir que un desfase de 0.00001 en la extensión invalidaba todo el set de datos. Yo juraba que con la función crop() estaba lista (porque claro, uno corta el cuadradito de su zona de estudio y piensa que ya está), pero resulta que Maxent no solo mira el área, sino que las celdas calcen perfecto, como si fueran una grilla de cuaderno cuadriculado donde cada línea tiene que estar sobre la otra. Si una capa está movida un pelito hacia el lado, el modelo se rompe.

Ahí fue cuando entendí que el Código EPSG para WGS84, que es el 4326, es nuestro mejor amigo pero también nuestro juez más estricto. Todas mis capas tenían que estar en ese sistema de coordenadas geográficas. Me pasaba que algunas variables que descargué de otras fuentes venían en proyecciones raras y, aunque en el mapa se veían 'encima', para R eran mundos distintos. Si te ha pasado, quizás te sirva revisar lo que escribí sobre lo que aprendí usando Maxent en R para modelar especies, porque ahí cuento cómo me di cabezazos con los formatos iniciales.

El error de reescalar al final (y por qué el remuestreo es la clave)

Aquí es donde viene lo que nadie te dice en los cursos rápidos, o al menos lo que yo no pesqué a la primera. Muchas veces uno tiende a reescalar las variables a la resolución del raster más grueso justo antes de cortar, pero eso es un error común que introduce sesgos de interpolación evitables mediante remuestreo previo. O sea, si tienes una capa de elevación súper detallada y las bioclimáticas de 1 km, no las fuerces al final.

Lo que yo aprendí a hacer (después de una tarde de lluvia intensa en octubre donde casi tiro la toalla) es crear una 'capa maestra' o máscara. Es como tener un molde de galletas: usas una capa que te guste cómo está, con la resolución y extensión perfecta, y obligas a todas las demás a adaptarse a ese molde usando la función resample() del paquete terra. El paquete terra es mucho más rápido que el viejo raster, y cuando trabajas con las 19 capas a la vez, se nota la diferencia en el ventilador del computador (que a veces suena como si fuera a despegar).

Mano señalando un mapa de idoneidad de hábitat exitoso en la pantalla de RStudio

El momento Eureka de un sábado por la mañana

Fue un sábado por la mañana, con el sol apenas asomando entre las nubes valdivianas, cuando por fin el código corrió sin una sola línea roja. La clave fue ser metódica: primero cargar todo, luego asegurar que el CRS fuera 4326 para todas, y finalmente usar una sola máscara para el recorte y el remuestreo. Al usar resample(capa_problematica, capa_maestra, method='bilinear'), R se encarga de que los píxeles calcen exactamente, moviendo esos decimales molestos que me hacían fallar.

Ver el primer mapa de idoneidad de hábitat del bosque nativo local apareciendo en el visor de R, sin errores de proyección y con las dimensiones perfectas, fue casi místico. De repente, esos datos abstractos se convirtieron en un mapa que tenía sentido, donde las zonas húmedas que yo conozco de caminar los cerros aparecían como los lugares más aptos. Si estás en este camino, de verdad te recomiendo que entiendas bien por qué usar modelado de nicho ecológico con Maxent en R para conservación, porque te abre los ojos a cómo el clima realmente dicta dónde puede vivir cada ser vivo.

Ya para cerrar (que se me enfrió el mate y el bosque afuera se puso más oscuro), no te castigues si no te sale a la primera. A mí me tomó tres semanas de errores constantes entender que el orden de los factores sí altera el producto en la teledetección. Asegúrate de que tu extensión sea idéntica hasta el quinto decimal y usa siempre una capa de referencia. Es mejor perder una tarde configurando bien la grilla que perder un mes entero analizando resultados que están desplazados por un error de proyección silencioso.

Artículos relacionados