Aprender modelado de distribución de especies con Maxent en R desde cero

Ochocientos megabytes: eso pesaba, más o menos, el archivo climático que tenía al ventilador del notebook girando como si fuera a despegar, mientras Maxent, otra vez, se tomaba su tiempo para terminar de correr sin tirarme un error de Java. Llevaba un buen rato metida en esto del modelado de distribución de especies con Maxent en R, tratando de entender dónde podrían esconderse mis plantas favoritas si el clima sigue cambiando como dicen, y todavía no tenía claro si el camino correcto era bajar un programa de escritorio, como recomienda casi todo el mundo, o quedarme peleando con R hasta que algo funcionara.

El vidrio de la ventana que da al patio ya se empañaba con el frío de julio, y yo seguía sentada en el mismo escritorio de siempre, con el café frío junto al trackpad y la carpeta de anotaciones a mano abierta al lado del teclado, por si el error de turno ya lo había resuelto antes sin acordarme. Esa duda entre programa de escritorio o R no era nueva: meses atrás había hecho la prueba con uno de esos programas GIS que todos recomiendan para partir, y la respuesta que me dio fue bastante clara, aunque no de la forma que esperaba.

El ArcGIS que expiró antes de mi primer mapa

Instalé la versión de prueba de ArcGIS con la mejor intención: quería un programa con botones, capas visibles y un manual claro, algo que se sintiera menos como escribir código a ciegas. Los primeros días fueron bien —cargué las capas, miré el mapa base, me sentí casi profesional— pero entre el trabajo de oficina y las semanas que se me fueron en entender la interfaz, la licencia temporal se acabó antes de que lograra armar mi primer mapa de distribución completo. Ahí quedó, cerrada, pidiéndome una licencia que no tenía y que tampoco iba a comprar solo para terminar un ejercicio de fin de semana.

Por eso terminé en R, que no es que sea más simple —de hecho al principio te hace sentir bastante torpe— pero al menos no tiene fecha de vencimiento. Nadie me apura desde una ventana emergente para comprar nada, y el script que dejé a medias un sábado sigue exactamente donde lo dejé el sábado siguiente. Esa diferencia, más que cualquier tutorial, fue lo que me hizo quedarme: prefiero pelear con algo gratis a mi propio ritmo que depender de un cronómetro que no controlo, y en la poca gente que conozco que usa R para estas cosas acá en Chile nadie te cobra por seguir aprendiendo.

¿Por qué Maxent no arranca sin Java?

Lo segundo que aprendí, ya instalada en R, es que Maxent no es un paquete cualquiera: corre sobre Java, y si el Java Runtime Environment no está bien puesto en el sistema, R simplemente no lo encuentra y tira error tras error. Pasé casi todo un fin de semana entendiendo por qué el paquete 'dismo' no encontraba el archivo maxent.jar, hasta que le mandé una captura a Marcia, mi compañera de la oficina, que sin pensarlo mucho me dijo que probara reinstalando Java desde cero. Funcionó. Todavía no tengo del todo claro por qué, pero ella tampoco se detuvo a preguntárselo: resolvió el problema y siguió con lo suyo.

Pantalla de RStudio con el error de Java al instalar Maxent para modelado de especies en R

Superado eso, vino el lío de las proyecciones. Los puntos de mis helechos aparecían en medio del Pacífico en vez del bosque valdiviano, y tardé bastante en entender que las coordenadas necesitaban hablar el mismo idioma que mis mapas de clima: el famoso WGS 84, que ahora sé que tiene el código EPSG 4326. No voy a meterme aquí en el detalle de cómo se corrige una proyección torcida en R —ya escribí sobre las herramientas que uso desde el principio en por qué elegí RStudio para estudiar el bosque nativo chileno—, pero sí quiero dejar claro que este error, sumado al de los archivos raster que pesan tanto que el computador se cuelga, es la razón principal por la que la gente vuelve corriendo a un programa de escritorio.

Meter las diecinueve variables no mejoró el modelo

Después de que R y Java por fin se llevaran bien, tocaba bajar los datos de clima: las diecinueve variables bioclimáticas estándar de WorldClim, BIO1 la temperatura media anual, BIO12 la precipitación anual (que aquí en Valdivia es mucha, créanme), y así hasta BIO19. Casi todos los tutoriales que encontré decían lo mismo: mete las diecinueve a la vez y deja que Maxent elija solo cuáles importan. Seguí ese consejo al pie de la letra la primera vez, aunque algo adentro me decía que no tenía mucho sentido preguntarle al modelo por la temperatura del trimestre más seco en un lugar donde prácticamente siempre llueve.

El resultado fue un modelo que se ajustaba casi perfecto a mis puntos de presencia, pero que dejaba de tener sentido apenas lo proyectaba a un escenario climático distinto: estaba memorizando en vez de aprendiendo. Tuve que probarlo varias tardes seguidas hasta darme cuenta de que menos variables, elegidas con criterio y no por correlación estadística, daban un modelo más honesto. Me quedé con cinco o seis que de verdad tenían sentido ecológico para mi zona, y desde ahí dejé de confiar tanto en la selección automática.

Notas a mano comparando las variables bioclimáticas de WorldClim para el modelo de Maxent en R

Antes de llegar a Maxent ya había peleado bastante con otras cosas de teledetección con R —el índice NDVI, las bandas de Sentinel-2, recortar un raster al tamaño exacto de mi zona de estudio con un shapefile— y cada una de esas peleas terminó siendo, en el fondo, la misma pelea: entender qué archivo pesado necesitaba y por qué. Si a ti también se te cuelga RStudio con archivos raster grandes, dejé apuntada una solución a errores comunes al cargar rasters pesados en R que me salvó más de una tarde de sábado.

Entender qué hace Maxent con los puntos que no tienes

Maxent significa 'máxima entropía', que suena más complicado de lo que es en la práctica. Solo tenía puntos de donde mis plantas sí estaban —presencias que bajé de GBIF e iNaturalist—, y el modelo necesitaba compararlos con algo, así que genera puntos de fondo o background repartidos por toda la zona de estudio. La idea es encontrar la distribución más pareja posible que aún respete los límites de donde sabemos que la especie vive: ni tan concentrada que solo marque los puntos exactos que le di, ni tan repartida que diga que la planta puede estar en cualquier lado, que es, en el fondo, la pregunta que más me importa cuando pienso en conservación y en cómo va a cambiar el bosque que tengo al lado de la casa.

Lo que más me costó entender fue la diferencia con un modelo de presencia-ausencia normal. En mi cuadra yo sé que no hay helechos en la vereda de cemento, pero para Maxent, si no hay un punto marcado ahí, eso no significa que la planta no pueda vivir en ese lugar: solo significa que no tengo el dato. Es una distinción rara al principio, pero explica por qué el mapa final no es un simple sí o no, sino una escala de probabilidad, coloreada de verde a rojo, que hay que leer con cuidado y no como una sentencia.

El mapa de distribución que por fin coincidió con Faro de Niebla

Mapa final del modelo Maxent en R con la probabilidad de presencia de la especie cerca de Valdivia

El sábado que por fin corrió el script completo, sin errores rojos ni mensajes de Java, salí a caminar por Faro de Niebla, donde suelo ir cuando necesito despejarme del computador. El mapa que había dejado cargando en la pantalla marcaba una probabilidad alta justo en la franja de vegetación cercana al acantilado, la misma zona donde había visto la especie el verano pasado sin saber todavía que algún día iba a intentar predecirla con un modelo.

Le mandé una captura de pantalla a mi hermana esa misma tarde, y me di cuenta, tratando de explicarle por qué el rojo significaba más probabilidad y el verde menos, de que no tuve que revisar ni un solo apunte de la carpeta para responder sus preguntas: por primera vez el mapa se explicaba solo, con mis propias palabras.

No soy la única a la que se le tuercen las proyecciones o se le cae la licencia de un programa a mitad de camino: Aldo, un lector de Temuco que según me contó lee estas entradas en el celular durante sus turnos de noche, me escribió hace poco con casi el mismo problema de coordenadas que yo tuve. Si te interesa seguir el hilo completo de estas peleas de fin de semana, dejé más detalles en lo que aprendí usando Maxent en R para modelar especies, otro de los diarios donde anoto las trampas para no repetirlas.

¿Instalar un programa o quedarse peleando con R?

Si tuviera que resumir la comparación para alguien que recién empieza, diría esto: instala un programa de escritorio si necesitas un resultado rápido, visual, y no te importa que la licencia de prueba tenga fecha de caducidad —funciona bien para un ejercicio puntual o una tarea con plazo fijo. Quédate con R si lo que quieres es algo que seguirá ahí sin vencerse, que puedes volver a correr exactamente igual más adelante, y que te obliga a entender cada paso porque no hay botones que lo hagan por ti. Elegí la segunda opción, no porque sea mejor en abstracto, sino porque se ajusta mejor a cómo aprendo: de a poco, los fines de semana, guardando cada error en la carpeta para no repetirlo.

Artículos relacionados