Visualizar series temporales de satélite en R para cambios forestales

La ventana está completamente empañada por la lluvia y la barra de progreso de un raster de Landsat lleva más de un minuto pegada en el mismo punto, sin moverse ni un pixel.

Llevo un buen tiempo armando series temporales de imágenes satelitales para ver cómo cambia el bosque nativo que se alcanza a ver desde el camino a Corral, frente a la bahía de Valdivia, y cada vez que alguien me escribe con una duda parecida noto que son casi siempre las mismas preguntas. Así que esta vez, en lugar de contar la historia completa otra vez, voy directo a lo que la gente realmente pregunta cuando empieza con teledetección en R.

¿Qué necesito tener listo antes de armar una serie temporal?

Lo primero es entender que una imagen satelital no es una foto: es una matriz de números que indica cuánta luz rebota en la vegetación o en la tierra, banda por banda. Si nunca has abierto un archivo de este tipo en R, ese paso básico, leer el raster, ver qué trae adentro, ya es tema para otro texto completo, así que no me voy a detener aquí. Lo que sí importa para una serie temporal es que todas las imágenes que vas a comparar tengan la misma proyección, más o menos la misma resolución y, ojalá, capturas de una época parecida del año. Si mezclas una imagen de Landsat 8 de pleno verano con una de invierno, vas a ver un cambio en el verdor que no tiene nada que ver con deforestación ni con nada raro: es solo la estación.

Primer plano de pantalla con código R y una imagen satelital pixelada de bosque nativo, ejemplo de teledetección en R.

El problema de comparar imágenes que no calzan entre sí

Acá es donde más gente se atasca, y a mí también me pasó. Tienes dos imágenes del mismo cerro, en teoría del mismo lugar exacto, pero para R los píxeles no calzan: uno queda corrido respecto al otro y la resta simplemente no funciona o, peor, funciona pero entrega basura. La causa casi siempre es el sistema de coordenadas: si no le dices a R en qué proyección están tus datos, dos imágenes que a simple vista muestran el mismo bosque pueden terminar completamente desalineadas al momento de compararlas. Ya escribí en detalle sobre cómo corregir proyecciones cartográficas en R de forma sencilla porque es un tema que merece su propio espacio, pero la regla corta es: fija la proyección antes de restar nada, no después.

Otra cosa que confunde al principio son los nombres: NDVI, NDWI, EVI, bandas espectrales, todo suena a otro idioma. Cuando a mí se me mezclaban los términos armé un glosario de índices espectrales que sigo usando cada vez que se me olvida cuál banda va con cuál índice, y la verdad es que no hace falta memorizar nada: basta con tener la referencia a mano cuando la necesitas.

¿Cómo le saco las nubes a mis datos?

Bastante, al principio. Un gráfico de serie temporal con nubes de por medio parece el pulso de alguien nervioso: sube y baja de forma violenta de una captura a otra, y no es que el bosque esté muriendo y reviviendo cada semana, es que hay una nube o una sombra tapando el sensor. La solución no es mirar la imagen y decidir a ojo qué parte parece nublada — eso falla más de lo que uno cree. Cada imagen satelital trae una capa de calidad que marca, píxel por píxel, dónde hay nube, sombra o dato poco confiable, y el criterio que uso es simple: si el píxel viene marcado como nube o sombra, ese dato no entra al gráfico, así de estricto. Recién ahí la línea deja de parecer un electrocardiograma y empieza a contar algo parecido a la verdad.

Comparación en pantalla entre una imagen satelital con nubes y un mapa NDVI limpio, parte de una serie temporal en R.

Las herramientas que uso, y las que abandoné en el camino

Antes de quedarme con R probé de todo un poco. Seguí un tutorial de Python que daba por sentados conocimientos de programación que yo no tenía — hablaba de entornos virtuales y librerías como si fuera obvio, y yo todavía no tenía claro qué era una función. Lo abandoné frustrada, convencida de que el problema era mío. Con el tiempo entendí que el problema era el tutorial: estaba pensado para alguien que ya programaba y quería sumar teledetección, no para alguien que partía de cero con las dos cosas al mismo tiempo. Con R encontré materiales pensados de verdad para principiantes, y ahí recién empezó a avanzar algo.

Para el trabajo espacial en sí uso un puñado de paquetes de R pensados para rasters y mapas, pero ese tema por sí solo da para un texto entero, así que lo dejo ahí. Lo mismo con recortar un raster al contorno exacto de un predio o una cuenca usando un shapefile: es un paso que uso seguido y que tiene su propia explicación en otra parte. Ni hablar de modelar dónde podría vivir una especie con algo como MaxEnt — eso es un tema aparte por completo, y no es lo que estoy resolviendo hoy. Lo que sí puedo decir es que aprender esto sin venir de programación se siente distinto, más lento a ratos, pero también más terco, y ese proceso completo de partir de cero lo fui dejando por escrito en otra parte para quien le sirva.

Con las herramientas de escritorio con menús gráficos tampoco conecté del todo — a mí terminó acomodándome más escribir el paso a paso en código que andar buscando el botón correcto en un menú. Por qué terminé quedándome con RStudio en particular para esto del bosque nativo es una historia más larga que ya conté en por qué elegí RStudio para estudiar el bosque nativo chileno, pero resumida: es gratis, tiene comunidad en español y una vez que entiendes la lógica no se siente tan distinto entre un análisis y el siguiente.

Mirar el promedio no alcanza para el bosque nativo: hay que perseguir la anomalía

La mayoría de los tutoriales básicos enseñan a graficar la serie completa y ahí quedan. A mí ese enfoque me dejó de convencer apenas llevaba un tiempo mirando mis propios datos: el bosque nativo es resiliente y casi siempre se ve verde en el índice de vegetación, incluso cuando algo no anda bien por debajo. El valor crudo de un solo punto no dice mucho por sí solo.

Lo que cambia todo es dejar de mirar el número del día y compararlo contra el promedio histórico de ese mismo mes: si el valor de hoy se aleja de forma notoria de lo que ese mismo punto marcaba en años anteriores para la misma época, ahí hay algo que vale la pena revisar, así el mapa siga viéndose verde a simple vista. Ese cálculo de anomalía es un paso extra sobre el índice base, y si todavía no tienes armado el cálculo de NDVI usando imágenes Sentinel, ese es el punto de partida antes de meterte en anomalías.

Gráfico de serie temporal en R mostrando una caída brusca en el verdor de un sector de bosque nativo.

¿Cuántas imágenes hacen falta para confiar en un cambio?

Con una sola captura no confío en nada, ni con dos. Una caída puntual puede ser una nube que se escapó de la máscara de calidad, una sombra rara o simplemente ruido del sensor. El criterio que uso es simple: si la anomalía se repite en las capturas siguientes, no en una sola, y si además coincide con algo que tiene sentido — una época de sequía, un incendio del que hay registro, una corta — recién ahí lo trato como un cambio real y no como un capricho de los datos. Un punto suelto que se dispara puede ser justamente eso, un dato raro; una racha de varias capturas seguidas mostrando lo mismo ya es otra cosa.

Aprender esto sola, acompañada a ratos

No hago esto completamente sola, aunque la mayor parte del trabajo pasa frente a la pantalla. Hay un contacto de un foro de R en español, Denise, que aprendió R viniendo del diseño gráfico porque quería hacer mapas visualmente limpios, y que manda memes de R a las dos de la mañana cuando por fin le funciona algo que llevaba días trabado. Preguntarle a alguien que entiende el mismo lenguaje de errores ayuda más de lo que uno espera, aunque sea solo para confirmar que el mensaje de error tampoco le hace sentido a ella.

También está el vecino del edificio, Boris, que trabaja en infraestructura de servidores y no entiende nada de mapas pero sí de software libre, y que me presta su monitor externo cuando necesito ver dos capas al mismo tiempo y la pantalla de la laptop se me queda chica. Lo noto en cosas chicas cuánto ha cambiado esto para mí: hoy dejo las bandas de Sentinel-2 abiertas en RStudio de una sesión a otra, sin cerrar el programa ni reiniciar nada, algo que antes me daba miedo hacer por si se me caía todo el trabajo.

Mano sosteniendo una taza frente a un mapa satelital de bosques del sur de Chile en RStudio.

Si estás por empezar con esto, el consejo corto es: no le creas al primer gráfico bonito que te salga. Revisa la calidad de tus píxeles, fija la proyección antes que cualquier otra cosa, compara contra el promedio de la misma época del año y espera a que un cambio se repita antes de darlo por real. El bosque desde la ventana — o desde el camino a Corral, frente a la bahía — se ve distinto una vez que empiezas a mirarlo así.

Artículos relacionados