Análisis y Homogeneización de Series Climáticas: Guía Práctica - Parte 1

Author
Affiliation
Victor Diaz

Barlovento Clima y Geoografía

Published

June 4, 2024

1 ANÁLISIS EXPLORATORIO PRELIMINAR

El análisis exploratorio preliminar permite identificar el periodo de estudio más completo, periodos faltantes a completar e identificar valores que podrían implicar errores o datos faltantes en la toma de mediciones. Ej. -99.9 ,-999, -888 ,"NA" ,"S/D" (como carácter).

Es un paso muy importante previo al análisis exploratorio.

1.1 Formato Inicial de Archivos

Normalmente los archivos de series climáticas se encuentran en formato en .csv o .txt (más usado), los cuales cuentan con 6 columnas sin nombre:

Donde cada columna representa:

Año Mes Dia Pp Tmax Tmin

Para realizar este análisis es necesario contar con una carpeta donde se encuentren todas las series de alguna región en estudio ya sea en formato .csv o .txt. Es necesario que cada archivo tenga el nombre de la estación en mayusculas y sin espacios de esta forma:

Además también es necesario para los pasos siguientes contar con archivo .xlsx que cuente con los metadatos de las estaciones, NOTA: De no contar con estos metadatos se pueden extraer del paquete senamhiR.

El archivo contará con la siguiente forma:

Cabe recalcar que los nombres de la columna Estacion y de los archivos .csv deben ser los mismos

1.2 Procesamiento inicial en R

Una vez se cumplan con todos estos requisitos, pasaremos a usar R. Primeramente se establecerá el directorio de trabajo donde se encuentran todos los archivos a utilizar.

En el objeto path se gaurdará la ruta y se usará la función setwd() para guardar nuestro directorio.

path = "C:/Users/ASUS/Desktop/Muestra/MAÑAZO"
setwd(path)

Podemos comprobar la ruta guardada con getwd() .

getwd()
[1] "C:/Users/ASUS/Desktop/Muestra/MAÑAZO"

Ahora podemos listar todos los archivos .csv o .txt de cada estación de nuestro directorio usando la función list.files(). Podemos establecer el tipo de archivo con pattern, en este caso pattern = "\\.csv$" para listar archivos .csv. Para archivos .txt usar pattern = "\\.txt$"

files <-list.files(pattern = "\\.csv$")
files  ###Veremos los 15 csv 
 [1] "CABANILLAS.csv" "CAPACHICA.csv"  "CHILLIGUA.csv"  "ELFRAYLE.csv"  
 [5] "ICHUÑA.csv"     "ILAVE.csv"      "IMATA.csv"      "JULI.csv"      
 [9] "JULIACA.csv"    "LAMPA.csv"      "LOSUROS.csv"    "MAÑAZO.csv"    
[13] "PAMPAHUTA.csv"  "PUNOSEI.csv"    "UBINAS.csv"    

1.3 Procesamiento final en R

Con todos los archivo listados procederemos a leer cada uno y agruparlo en un solo dataframe uno debajo de otro usando un bucle, aplicaremos el siguiente código:

datos_f <- NULL
for (i in 1:length(files)){
  # Lee el archivo 
  datos <- read.table(files[i], header = F,sep=";", colClasses = "numeric")  
  
  if(ncol(datos) == 4){
    datos$V5 <- NA
    datos$V6 <- NA
  }
  
  if(ncol(datos) == 5){
    datos$V6 <- NA
  }
  # Modificando nombres de columnas
  names(datos) <-  c("Año","Mes","Dia","Pp","Tmax","Tmin")
  
  # Generando nueva columna de fechas
  datos$Fecha <- as.Date(paste0(datos$Año,"-",datos$Mes,"-",datos$Dia))
  
  #Añadiendo columna de estacion
  datos_f <- rbind(datos_f,data.frame(datos,ESTACION =sub("\\.csv$", "", files[i])))
  
}
  • Establecermos datos_f <- NULL, para definirlo como nuestro inicializador

  • Para leer uno de los archivos listados podemos usar, la función read.csv(“Aqui el archivo.csv”), en el caso de ser archivos en formato .txt se puede usar read.table(“Aqui el archivo.txt”). Como en este caso los csv no tienen nombre de columna, podemos establecer el parámetro header=F, para indicar que no contamos con nombre de columna. NOTA: Normalmente los archivos csv son archivos separados por coma (“,”) , pero a veces están separados por punto y coma, si ocurre ese caso puedes especificar como esta separado usando el parámetro sep = “;” dentro de la función read.csv().

  • Algunas veces los archivos no cuentan con las 6 columnas de año, mes, dia, Pp, Tmax y Tmin por lo que se establecerá un condicional para aumentar columnas en caso no esten completas.

  • Posteriormente se modificarán los nombre de columnas, se creará una columna de fechas y con la función rbind() se procederé a grupar todos los dataframe suno debajo de otro y agregando una columna adicional para determinar que estación es.

En datos_f quedará guardadas todas las estaciones una debajo de otra.

head(datos_f,20)
    Año Mes Dia   Pp Tmax Tmin      Fecha   ESTACION
1  1990   1   1  8.9 14.5  1.4 1990-01-01 CABANILLAS
2  1990   1   2  3.6 15.0  1.0 1990-01-02 CABANILLAS
3  1990   1   3  1.4 16.0  3.2 1990-01-03 CABANILLAS
4  1990   1   4 19.8 14.5  4.0 1990-01-04 CABANILLAS
5  1990   1   5  7.6 15.0  4.4 1990-01-05 CABANILLAS
6  1990   1   6  7.8 13.5  4.4 1990-01-06 CABANILLAS
7  1990   1   7 10.8 12.0  3.6 1990-01-07 CABANILLAS
8  1990   1   8  2.8 14.0  4.2 1990-01-08 CABANILLAS
9  1990   1   9  4.2 17.5  4.0 1990-01-09 CABANILLAS
10 1990   1  10  6.2 14.5  4.0 1990-01-10 CABANILLAS
11 1990   1  11  5.8 14.0  4.8 1990-01-11 CABANILLAS
12 1990   1  12  1.6 14.5  4.2 1990-01-12 CABANILLAS
13 1990   1  13  7.0 14.5  4.6 1990-01-13 CABANILLAS
14 1990   1  14 12.0 12.0  4.4 1990-01-14 CABANILLAS
15 1990   1  15  2.8 15.5  4.2 1990-01-15 CABANILLAS
16 1990   1  16  5.2 18.0  4.6 1990-01-16 CABANILLAS
17 1990   1  17  2.4 14.0  4.0 1990-01-17 CABANILLAS
18 1990   1  18  6.2 13.5  4.4 1990-01-18 CABANILLAS
19 1990   1  19  0.0 15.0  6.0 1990-01-19 CABANILLAS
20 1990   1  20  1.0 16.0  6.6 1990-01-20 CABANILLAS
tail(datos_f,20)
        Año Mes Dia   Pp Tmax Tmin      Fecha ESTACION
176584 2023  12  12  0.2 22.2  7.0 2023-12-12   UBINAS
176585 2023  12  13 12.0 23.0  6.8 2023-12-13   UBINAS
176586 2023  12  14  2.8 18.6  7.0 2023-12-14   UBINAS
176587 2023  12  15  0.0 20.2  7.2 2023-12-15   UBINAS
176588 2023  12  16  0.0 23.8  7.0 2023-12-16   UBINAS
176589 2023  12  17  0.0 21.8  6.8 2023-12-17   UBINAS
176590 2023  12  18  0.0 22.0  7.2 2023-12-18   UBINAS
176591 2023  12  19  0.0 22.4  6.2 2023-12-19   UBINAS
176592 2023  12  20  0.0 22.0  6.2 2023-12-20   UBINAS
176593 2023  12  21  0.0 21.6  6.0 2023-12-21   UBINAS
176594 2023  12  22  0.0 22.0  6.8 2023-12-22   UBINAS
176595 2023  12  23  0.0 23.2  7.0 2023-12-23   UBINAS
176596 2023  12  24  0.0 22.8  6.6 2023-12-24   UBINAS
176597 2023  12  25  0.0 23.6  5.8 2023-12-25   UBINAS
176598 2023  12  26  0.0 19.0  5.4 2023-12-26   UBINAS
176599 2023  12  27  1.2 20.8  7.0 2023-12-27   UBINAS
176600 2023  12  28  1.8 19.2  7.4 2023-12-28   UBINAS
176601 2023  12  29  1.0 18.8  7.0 2023-12-29   UBINAS
176602 2023  12  30  2.0 17.4  7.4 2023-12-30   UBINAS
176603 2023  12  31  0.0 17.8  7.0 2023-12-31   UBINAS
unique(datos_f$ESTACION) 
 [1] "CABANILLAS" "CAPACHICA"  "CHILLIGUA"  "ELFRAYLE"   "ICHUÑA"    
 [6] "ILAVE"      "IMATA"      "JULI"       "JULIACA"    "LAMPA"     
[11] "LOSUROS"    "MAÑAZO"     "PAMPAHUTA"  "PUNOSEI"    "UBINAS"    

1.4 Generación de gráficas para visualización

Ahora podemos graficar una variable de cada una de las estaciones en una sola gráfica, para ello estableceremos nuestro data=datos_f para indicar que queremos graficar de ese dataframe, los ejes x=Fecha y=Pp (variable de precipitación), la variable se puede cambiar a Tmax y Tmin , además se establece un color diferente paa cada estación con col="ESTACION" .

Antes instalaremos los paquetes necesarios ggplot2 para gráficas estáticas y plotly para gráficas interactivas, la instalación se hace con la función install.packages() . NOTA: Solo es necesario instalar una vez, depués de eso se puede comnetar la instalación.

#install.packages("ggplot2")  ####Descomentar para instalar y  comentar después de instalado
#install.packages("plotly")   ####Descomentar para instalar y  comentar después de instalado
#install.packages("htmlwidgets")   ####Descomentar para instalar y  comentar después de instalado
library(ggplot2)
library(plotly)

Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
library(htmlwidgets)
  • Crearemos un bucle para graficar todas las variables y guardarlas en una lista, además de exportarlas a nuestro directorio.

  • En var guardaremos todas las variables que graficaremos en cada iteración, podemos también agregar las unidades (unit) y los títulos (title)

  • Con geom_line() establecemos que genere un gráfico de líneas, esta puede ser cambiado por geom_point() si se quiere un gráfico de puntos.

  • Con facet_wrap() establecemos que sean gráficas de línea por separado, podemos usar el parámetro ncol=2, para establlecer que a lo mucho se generen 2 columnas de gráficos.

  • Creamos 2 listas static_g donde se guardaran las gráficas estáticas e intera_g donde se guardaran las gráficas interactivas.

  • Con la función ggsave() la gráfica se exportará, se puede modificar el height y widht a gusto propio.

  • Además creamos una carpeta donde se guardaran las gráficas llamada aed_preliminar, en esta carpeta estarán los resultados.

var <- c("Pp","Tmax","Tmin")
unit <- c("(mm)","°C","°C")
title <- c("Precipitación Estaciones Mañazo","Temperatura Máxima Estaciones Mañazo","Temperatura Mínima Estaciones Mañazo")
static_g <- list()
interac_g <- list()

carpeta_graficas <- "aed_graph"
  
if (!dir.exists(carpeta_graficas)) {
  dir.create(carpeta_graficas)
}


for (i in 1:length(var)){
  
  g_pp <- ggplot(data=datos_f,aes_string(x="Fecha",y=var[i],col="ESTACION"))+
  geom_line(show.legend = FALSE)+
  facet_wrap(~ ESTACION, scales = "free_y", ncol = 2)+xlab("Fecha")+
  ylab(paste0(var[i]," ",unit[i]))+theme_bw()+
  theme(plot.title = element_text(hjust = 0.5,face = "bold"),  strip.text = element_text(color = "black", face = "bold"),strip.background = element_rect(fill="white",color=NA))+
  theme(axis.title = element_text(face = "bold")) + ggtitle(title[i])
  
  static_g[[i]] <- g_pp   
  interac_g[[i]] <- ggplotly(g_pp) 
  
  
  ggsave(static_g[[i]],filename=paste0("aed_preliminar/",var[i],"_aed.png"),dpi=320,width=11,height=9)
  htmlwidgets::saveWidget(interac_g[[i]],paste0("aed_preliminar/",var[i],"_aed.html"))
  
  
}
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation ideoms with `aes()`
Warning: Removed 21729 rows containing missing values (`geom_line()`).
Warning: Removed 21587 rows containing missing values (`geom_line()`).

Ahora podemos revisar la carpeta creada aed_preliminar donde se guardaron todas las gráficas, esta carpeta la podemos encontrar en nuestro directorio. NOTA: Esta carpeta se crea automáticamente si no existe asi que no es necesario crearla manualmente.

Aqui podemos ver algunas gráficas guardadas en las listas, ya sea de forma estática o interactiva.

static_g[[1]]   ######Precipitación

interac_g[[1]]   ####Precipitación interactiva
static_g[[2]]   ######Temperatura máxima estática
Warning: Removed 21729 rows containing missing values (`geom_line()`).

interac_g[[2]]  ######Temperatura máxima interactiva
static_g[[3]]   ######Temperatura mínima estática
Warning: Removed 21587 rows containing missing values (`geom_line()`).

static_g[[3]]   ######Temperatura mínima interactiva
Warning: Removed 21587 rows containing missing values (`geom_line()`).

1.5 Conclusiones

  • Como se puede apreciar las series principalmente se concentran entre 1990 a 2023 en todas las variables, este deberá ser el periodo de estudio a utilizar.

  • Se observan valores erróneos de -999 y -888, estos deberán ser eliminados en el siguiente proceso de análisis exploratorio.

  • Se observan lineas diagonales entre diversas fechas, esto se puede explicar por la falta de fechas entre los límites de las diagonales, por ello será necesario completarlos con NA para poder proseguir con llos demás procesos.

  • Todo esto será aplicado en el análisis exploratorio.