Erre Datos

Selección de variables climáticas para MaxEnt en R según tu área de estudio

Una tarde lluviosa de domingo aquí en San José, me quedé mirando la pantalla de mi laptop con cara de no entender nada. Mi modelo de MaxEnt afirmaba, con total seriedad matemática, que un mirlo de montaña amenazado podía vivir feliz de la vida entre el asfalto de unos parqueos céntricos.

El disparate tenía una explicación bastante vergonzosa: le había metido al algoritmo las 19 variables bioclimáticas estándar de golpe, sin recortar, sin limpiar y convencido de que entre más datos le tirara a R, más inteligente saldría el mapa. En logística aprendí hace años que acumular cajas en la bodega no significa tener inventario útil, pero cuando empecé con el modelado de nicho cometí exactamente esa novatada.

El espejismo de meter todas las capas al asador

Cuando uno descubre portales como WorldClim y ve que puede descargarse gratis todo el set bioclimático a una resolución de 30 segundos de arco (más o menos un kilómetro cuadrado cerca del ecuador), la tentación de novato es absoluta. Uno piensa: si están ahí, será por algo. Así que armas un raster stack gigante y le das correr a MaxEnt esperando magia.

Matriz de correlación de variables climáticas mostrada en la pantalla de RStudio

Esa tarde de domingo, el zumbido del ventilador de mi laptop sonaba como turbina vieja mientras la matriz de correlación dibujaba diecinueve cuadritos rojos diminutos en el panel gráfico de RStudio. La máquina ardía, el ventilador bufaba y el resultado final fue un chiste: mi primer mapa de idoneidad le daba puntaje perfecto a una terminal de carga pavimentada cerca de Alajuela, donde con costos se posa una paloma de castilla.

Lo que estaba pasando se llama multicolinealidad. Si le dices al modelo que evalúe la temperatura media anual (bio1), la temperatura del trimestre más cálido (bio10) y la precipitación del mes más seco (bio14) todas juntas en un país con montañas quebradas como Costa Rica, el algoritmo se marea. Muchas de esas variables dicen casi exactamente lo mismo con diferente ropa.

La famosa regla del 0.7 y sus trampas ocultas

Después de unas tres semanas probando scripts ajenos que encontraba en foros y repositorios desordenados, di con el remedio estándar que repiten todos los tutoriales: calcular una correlación de Spearman o Pearson entre las capas y eliminar cualquier pareja que supere un umbral de 0.7 (o 0.8 en los manuales más permisivos).

El procedimiento habitual en R es sencillo si usas paquetes espaciales modernos como terra:

Suena impecable y matemático, ¿verdad? Pues aquí viene el tropiezo donde casi todos caemos al inicio. Hace un par de meses me di cuenta de que seguir ciegamente el filtro del 0.7 te lleva a cometer errores biológicos garrafales. Si dejas que una función automática elija cuál variable conservar basándose solo en un número o en cuál corrió primero en el bucle, puedes terminar borrando la variable que realmente condiciona la vida de tu especie.

Por qué el filtro puramente estadístico se queda corto

Aquí está mi postura personal contra la corriente habitual: seleccionar variables basándote únicamente en correlación estadística ignora por completo los procesos ecológicos del bicho y suele terminar en modelos sobreajustados que colapsan en cuanto intentas predecir escenarios futuros o extrapolar a otra cordillera.

Revisión manual de mapas de idoneidad climática impresos con notas ecológicas

Si estás modelando una planta epífita o un ave de bosque nuboso, la precipitación del trimestre más seco o la estacionalidad de la humedad relativa son limitantes fisiológicos reales. Si esas variables están correlacionadas a 0.72 con la temperatura máxima del mes más cálido, y tu script automatizado decide botar la lluvia para dejar la temperatura solo porque tenía un pelo menos de correlación con otra capa, acabas de arruinar el sustento biológico de tu mapa.

Para no meter la pata, el filtro debe tener dos etapas y en este orden estricto:

En su momento pagué un curso en línea bastante publicitado sobre modelado de nicho que prometía enseñarte a automatizar todo este flujo con dos clics. Lo dejé de recomendar a los compañeros del grupo de aves porque dedicaba tres módulos enteros a pipelines ciegas que botaban capas por puro p-valor o umbrales rígidos, sin mirar jamás la historia natural de los animales. Si ves un curso que te dice que el software puede decidir qué clima le importa a un colibrí sin que tú leas sobre la especie, ahórrate el dinero.

Recortar el área de estudio antes de medir nada

El otro dolor de cabeza típico es el área de calibración (la famosa extensión M del diagrama de dispersión biológica). Si bajas las capas climáticas de toda América Central pero tu ave solo vive en la Cordillera de Talamanca, cualquier matriz de correlación que calcules va a estar falseada por el clima de las bajuras del Caribe y el Pacífico seco.

Las correlaciones cambian según el territorio que encierres en tu ventana de corte (crop() y mask() en R). Lo que está fuertemente correlacionado a escala de todo un continente puede comportarse de forma independiente en un gradiente altitudinal de montaña de apenas cincuenta kilómetros.

Para armar estos recortes sin desquiciarte, organizar bien tus datos de presencia desde el inicio te ahorra horas de código trabado. Recuerdo que cuando empezaba me enredaba horrores con formatos incompatibles; de hecho, hace un tiempo comenté cómo algunos usan software externo para organizar datos de aves antes de usar MaxEnt para que las coordenadas lleguen limpias y sin duplicados en el mismo píxel.

Una vez que tienes los puntos limpios, genera un polígono razonable de accesibilidad para la especie (un búfer sensato alrededor de tus registros o una ecorregión continua), recorta tus rásteres a esa máscara y únicamente sobre esos píxeles calcula la matriz de correlación. Verás cómo varios valores de 0.7 se reacomodan a números mucho más manejables.

Cuando procesas varias capas pesadas a la vez en resoluciones finas, la máquina sufre de verdad; en su momento revisé varias mejores tarjetas gráficas para acelerar el procesamiento de mapas en R porque ver la barra de carga congelada en el 40% durante una noche entera le quita la paciencia a cualquiera.

Un modelo sobrio vale más que veinte capas ruidosas

El día que logré domar mi selección de variables, reduje las 19 capas originales a solo cuatro: dos relacionadas con temperaturas extremas nocturnas y dos con estacionalidad de precipitación, todas recortadas a la faja montañosa real. Al darle correr al algoritmo, la mancha roja del mapa que antes cubría parqueos urbanos y zonas francas desapareció de golpe. En su lugar quedaron los filos boscosos, las cuencas altas y los parches de bosque nuboso que los guardaparques y voluntarios conocemos a pie de campo.

Hacer buenos modelos en R no exige ser un genio del álgebra lineal ni memorizarse funciones esotéricas de memoria (yo sigo buscando en Google la sintaxis exacta de extract() cada dos semanas). Exige la disciplina humilde de apagar el piloto automático, quitar capas redundantes que solo hacen ruido y recordar que los animales responden al frío y a la sed, no a los índices que inventamos los humanos frente a un monitor.

Artículos relacionados