Informe ejecutivo salida de campo mediciones de nivel del mar, corrientes y oleaje

Introducción

Debe incluir, lugar de la salida de campo, fechas de la salida, las variables de medición, equipos utilizados, personal participante.

Localización

Crear un mapa con la localización de cada uno de los equipos

Los equipos de medición junto a una breve descripción de las capacidades de estos.

Objetivos

Efectuar mediciones experimentales a lo largo de la ensenada de Trebal con el fin de identificar y obtener una primera aproximación sobre algunas variables físicas que controlan su dinámica.

Se busca recolectar información sobre variables hidrodinámicas tales como nivel del mar, magnitud y dirección de corrientes, magnitud y dirección del oleaje.

Hacer un levantamiento topográfico

Metodología

Se realizará una campaña de medición durante 4h continúas, donde se dispondrá un arreglo de equipos (correntómetros) perpendiculares a la línea de costa con el fin de obtener información sobre variables hidrodinámicas tales como nivel del mar, magnitud y dirección de oleaje y corriente.

La información de corrientes y oleaje se obtendrá con un correntómetro Aquadop profiler de frecuencia 2MHz, localizado en fondo y con los conos acústicos dirigidos hacia la superficie. Se utilizarán celdas de medición de 0.2 m, con una tasa de medición de alta frecuencia para obtener datos de magnitud y dirección de corrientes en cada celda, las corrientes se medirán cada 10 min, con promedios de 2 min.

Para el oleaje se tomarán 2048 muestras a una tasa de 2Hz, cada 30 min. Para el caso del equipo vector, este se configurará para que tome 19200 datos a una tasa de 64Hz, cada 10 min.

Resultados

Para cada una de las siguientes gráficas debe hacer una descripción de lo observado.

En primera instancia, se cargan los datos.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(TSstudio)
library(skimr)
library(oce)
## Cargando paquete requerido: gsw

Cargar datos

Se crearon dos funciones para facilitar la lectura y unión de las matrices de datos generados por el equipo.

## Conversión de datos .dat a txt

convert_dat_to_txt <- function(directory) {
  # Obtener una lista de archivos .dat en el directorio
  dat_files <- list.files(directory, pattern = "\\.dat$", full.names = TRUE)
  
  # Iterar sobre cada archivo y guardarlo como .txt
  for (dat_file in dat_files) {
    # Leer el archivo .dat
    data <- read.table(dat_file, header = FALSE, stringsAsFactors = FALSE)
    
    # Crear el nombre del archivo de salida .txt
    txt_file <- sub("\\.dat$", ".txt", dat_file)
    
    # Guardar los datos en formato .txt
    write.table(data, file = txt_file, sep = "\t", row.names = FALSE, col.names = FALSE, quote = FALSE)
  }
}

## Conversión de datos .wad a txt

convert_wad_to_txt <- function(directory) {
  # Obtener una lista de archivos .wad en el directorio
  wad_files <- list.files(directory, pattern = "\\.wad$", full.names = TRUE)
  
  # Iterar sobre cada archivo y guardarlo como .txt
  for (wad_file in wad_files) {
    # Leer el archivo .wad
    data <- read.table(wad_file, header = FALSE, stringsAsFactors = FALSE)
    
    # Crear el nombre del archivo de salida .txt
    txt_file <- sub("\\.wad$", ".txt", wad_file)
    
    # Guardar los datos en formato .tx
    write.table(data, file = txt_file, sep = "\t", row.names = FALSE, col.names = FALSE, quote = FALSE)
  }
}

## Creación del data.frame

read_txt_files <- function(directory) {
  # Obtener una lista de archivos .txt en el directorio
  files <- list.files(directory, pattern = "\\.txt$", full.names = TRUE)
  
  # Leer y combinar los archivos en un solo data.frame
  combined_data <- do.call(rbind, lapply(files, function(file) {
    read.table(file, header = FALSE, sep = "", stringsAsFactors = FALSE)
  }))
  
  return(combined_data)
}

G1 - Nombre del instrumento (coordenadas de posición)

A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:

Metric Value
Number of measurements 22,373
Time of first measurement 31/10/2024 10:00:00 a.m.
Time of last measurement 31/10/2024 03:15:48 p.m.

Las variables registradas por el equipo fueron las siguientes:

# Variable Unidad
1 Burst counter
2 Ensemble counter (1-65536)
3 Velocity (Beam1 X
4 Velocity (Beam2 Y
5 Velocity (Beam3 Z
6 Amplitude (Beam1) counts
7 Amplitude (Beam2) counts
8 Amplitude (Beam3) counts
9 SNR (Beam1) dB
10 SNR (Beam2) dB
11 SNR (Beam3) dB
12 Correlation (Beam1) %
13 Correlation (Beam2) %
14 Correlation (Beam3) %
15 Pressure dbar
16 Analog input 1
17 Analog input 2
18 Checksum (1 = failed)

En primera instancia, se leen los datos y se asignan los nombres correspondientes

convert_dat_to_txt("D:/Usuario/Documents/Instrumentación/g1")

G1 = read_txt_files("D:/Usuario/Documents/Instrumentación/g1") %>% 
  rename(
      burst       = V1, 
      ensemble  = V2, 
      v_x       = V3, 
      v_y       = V4,
      v_z       = V5,
      amplitud_1    = V6,
      amplitud_2    = V7,
      amplitud_3    = V8,
      snr_1     = V9,
      snr_2     = V10,  
      snr_3     = V11, 
      cor_1     = V12,
      cor_2     = V13,
      cor_3     = V14,
      presion       = V15,
      analog_1  = V16,
      analog_2  = V17,
      checksum  = V18
  )

G2 - Nombre del instrumento (coordenadas de posición)

A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:

Metric Value
Number of measurements 687,565
Time of first measurement 31/10/2024 09:40:00 a.m.
Time of last measurement 31/10/2024 03:34:05 p.m.

Las variables registradas por el equipo fueron las siguientes:

# Variable Unidad
1 Burst counter
2 Ensemble counter (1-65536)
3 Velocity (Beam1 X
4 Velocity (Beam2 Y
5 Velocity (Beam3 Z
6 Amplitude (Beam1) counts
7 Amplitude (Beam2) counts
8 Amplitude (Beam3) counts
9 SNR (Beam1) dB
10 SNR (Beam2) dB
11 SNR (Beam3) dB
12 Correlation (Beam1) %
13 Correlation (Beam2) %
14 Correlation (Beam3) %
15 Pressure dbar
16 Analog input 1
17 Analog input 2
18 Checksum (1 = failed)

A continuación, se leen los datos y se asignan los nombres correspondientes

G2 = suppressMessages(read_table("G224302.txt", col_names = FALSE, col_types = NULL) %>% 
  rename(
      burst       = X1, 
      ensemble  = X2, 
      v_x       = X3, 
      v_y       = X4,
      v_z       = X5,
      amplitud_1    = X6,
      amplitud_2    = X7,
      amplitud_3    = X8,
      snr_1     = X9,
      snr_2     = X10,  
      snr_3     = X11, 
      cor_1     = X12,
      cor_2     = X13,
      cor_3     = X14,
      presion       = X15,
      analog_1  = X16,
      analog_2  = X17,
      checksum  = X18
  ))


head(G2)
## # A tibble: 6 × 18
##   burst ensemble   v_x     v_y     v_z amplitud_1 amplitud_2 amplitud_3 snr_1
##   <dbl>    <dbl> <dbl>   <dbl>   <dbl>      <dbl>      <dbl>      <dbl> <dbl>
## 1     1        1 0.247 -0.19    0.073          43         44         41   0.9
## 2     1        2 0.257  0.565  -0.411          43         43         43   0.9
## 3     1        3 0.278  0.0863 -0.0681         42         44         44   0.4
## 4     1        4 0.319  0.113  -0.0138         43         42         41   0.9
## 5     1        5 0.215  0.317  -0.158          43         42         41   0.9
## 6     1        6 0.210 -0.306   0.305          40         41         43  -0.4
## # ℹ 9 more variables: snr_2 <dbl>, snr_3 <dbl>, cor_1 <dbl>, cor_2 <dbl>,
## #   cor_3 <dbl>, presion <dbl>, analog_1 <dbl>, analog_2 <dbl>, checksum <dbl>

G4 - Nombre del instrumento (coordenadas de posición)

A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:

Metric Value
Number of measurements 31
Time of first measurement 31/10/2024 09:30:00 a.m.
Time of last measurement 31/10/2024 02:32:01 p.m.

Las variables registradas por el equipo fueron las siguientes:

# Variable Unidad
1 Burst counter
2 Ensemble counter
3 Pressure dbar
4 Spare
5 Analog input
6 Velocity (Beam1 X
7 Velocity (Beam2 Y
8 Velocity (Beam3 Z
9 Velocity (N/A) m/s
10 Amplitude (Beam1) counts
11 Amplitude (Beam2) counts
12 Amplitude (Beam3) counts

En primera instancia, se leen los datos y se asignan los nombres correspondientes

convert_wad_to_txt("D:/Usuario/Documents/Instrumentación/g4")

G4 = read_txt_files("D:/Usuario/Documents/Instrumentación/g4") %>% 
  rename(
      burst       = V1, 
      ensemble  = V2, 
      presion       = V3, 
      spare     = V4,
      analog        = V5,
      v_x     = V6,
      v_y     = V7, 
      v_z     = V8,
      v_na    = V9,
      amplitud_1    = V10,
      amplitud_2    = V11,
      amplitud_3    = V12,
      amplitud_na   = V13
  )

G3 - Nombre del instrumento (coordenadas de posición)

Para leer los datos del tercer grupo se genera un ciclo for que itere entre los diferentes archivos .csv. Pero primero se lee el archivo principal que contiene los nombres de las variables, apartir en cada iteración se irán anexando los diferentes archivos.

G3 = read.csv2("D:/Usuario/Documents/Instrumentación/g3/g4243001001.csv")

files = list.files("D:/Usuario/Documents/Instrumentación/g3/", pattern = "\\.csv$", full.names = TRUE)

for (file in files) {
  # Leer el archivo sin encabezado
  new_data = read_csv2(file, 
                        col_names = colnames(G3), 
                        show_col_types = FALSE, 
                        locale = locale(decimal_mark = ",", grouping_mark = "."))
  
  # Combinar
  G3 = rbind(G3, new_data)
}

Debido a que los datos han sido asignados como variables de tipo carácter por error en la lectura, se realizó un tratamiendo a los datos para adaptar la variable del tiempo al formato POSIXct y se defineron las demás variables como númericas.

G3 = G3 %>%
  mutate(
    DateTime = as.POSIXct(DateTime, format="%d/%m/%Y %H:%M:%S"),
    across(Battery:AnalogIn1, as.numeric))
## Warning: There were 7 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(Battery:AnalogIn1, as.numeric)`.
## Caused by warning:
## ! NAs introducidos por coerción
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 6 remaining warnings.

Calidad de los datos

Gráficas de inclinación de los ejes axiales (pitch, roll y heading). El objetivo de gráficar los datos de inclinación de los ejes axiales es observar la constancia de estas variables a lo largo del tiempo. Siendo esta el objetivo se consideró pertinente hacer un resumen estadístico básico de las variables en cuestión y así corruborar la calidad de los datos.

G3 %>% 
  select(Pitch, Heading, Roll) %>% 
  skim() %>% 
  select(-n_missing, -complete_rate)
Data summary
Name Piped data
Number of rows 28673
Number of columns 3
_______________________
Column type frequency:
numeric 3
________________________
Group variables None

Variable type: numeric

skim_variable mean sd p0 p25 p50 p75 p100 hist
Pitch -1.72 1.64 -14.0 -2.0 -2.0 -2 32.9 ▁▇▁▁▁
Heading 1602.47 539.08 228.2 1830.0 1831.0 1832 1876.0 ▂▁▁▁▇
Roll 0.69 1.60 -17.9 0.9 0.9 1 34.0 ▁▇▁▁▁

Como se puede observar para tres variables, existen datos anomalos, pero son poco representativos dado que la desviación estándar y el histograma indican que los datos tienen una distribución leptocurtica.

Estos datos anómalos representan aquellos tomandos por el equipo durante el tiempo en que se estaba instalando en su posición. Esto ocurrió entre las 9:00:00 y las 9:30:00, debidoa un error en la instalación el equipo tomó datos incorrectos y, por lo tanto, estos no son representativos.

Teniendo en cuenta el intervalo en el cuál los datos estaban más uniformemente distribuidos se realizó una gráfica de la serie de tiempo.

G3 %>% 
  select(Heading, DateTime) %>% 
  filter(Heading > 1825 & Heading < 1835) %>% 
  ggplot(aes(x= DateTime, y= Heading))+
  geom_line()+
  theme_bw()

Como se puede observar los valores de Headign son relativamente constantes entre las 9:30:00 y las 15:12:00, aproximadamete. No obstante, si se gráfica la serie de tiempo completa se podrá observar más claramente el error presente en el primer burst y el último, es decir, los comprendidos entre las 9:00:00 a 9:30:00, al instalar el equipo; y 15:15:00 a 15:17:00, al sacarlo. Para comprobar esto se hará la serie de tiempo con la variable Pitch.

G3 %>% 
  ggplot(aes(x= DateTime, y=Pitch))+
  geom_line()+
  theme_bw()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).

Este mismo comportamiento está presente para el Roll. Por tal motivo, se estableció una ventana de tiempo comprendida entre las 9:30:00 hasta las 15:12:15, ya que se conoce que los demás datos están erróneos.

G3 %>% 
  select(DateTime, Roll) %>% 
  filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>% 
  ggplot(aes(x=DateTime, y=Roll))+
  geom_line()+
  theme_bw()

También se procede a graficar el Pitch adecuadamente. Sin embargo, es curioso notar la presencia de una variación del Pitch entre -0.5 y 0 después de las 15:00:00.

G3 %>% 
  select(DateTime, Pitch) %>% 
  filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>% 
  ggplot(aes(x=DateTime, y=Pitch))+
  geom_line()+
  theme_bw()

Resultados de las mediciones

Serie de tiempo de presión y nivel del mar para cada uno de los equipos asignados durante todo el intervalo de monitoreo.

G3 - Sere tiempo de presión

Gráfica de la serie de tiempo en bruto.

G3  %>% 
  filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>% 
  ggplot(aes(x=DateTime, y=Pressure))+
  geom_line()+
  theme_bw()

A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.

G3 %>% 
  filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_presion = mean(Pressure, na.rm = TRUE), # Calculamos el promedio de presión
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup() %>% 
  ggplot(aes(x=DateTime, y=promedio_presion))+
  geom_line()+
  geom_smooth(method = "lm", se = FALSE) +
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'

G2 - Serie de tiempo de presión y nivel del mar

Metric Value
Number of measurements 22,373
Time of first measurement 31/10/2024 10:00:00 a.m.
Time of last measurement 31/10/2024 03:15:48 p.m.
Sampling rate 2 Hz
Burst interval 1800 sec
Samples per burst 2048
# Parámetros

sampling_rate <- 64
burst_interval <- 300  # 600 segundos
samples_per_burst <- 19200
start_time <- ymd_hms("2024-10-31 09:40:00")
delta_time <- 1 / sampling_rate

G2 <- G2 %>%
  group_by(burst) %>%
  mutate(
    time_offset = (ensemble - 1) * delta_time,
    DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
  ) %>%
  ungroup()


# Crear secuencia completa de tiempo

max_time = max(G2$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)

# Fusionar con la serie completa

G2 = data.frame(DateTime = full_time_sequence) %>%
                left_join(G2, by = "DateTime")

G2 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>%
  ggplot(aes(x=DateTime, y=presion))+
  geom_line()+
  theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).

A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.

G2 %>% 
   filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup() %>% 
  ggplot(aes(x=DateTime, y=promedio_presion))+
  geom_line()+
  geom_smooth(method = "lm", se = FALSE) +
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 160 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 10 rows containing missing values or values outside the scale range
## (`geom_line()`).

G1 - Serie de tiempo de presión y nivel del mar

Metric Value
Number of measurements 22,373
Time of first measurement 31/10/2024 10:00:00 a.m.
Time of last measurement 31/10/2024 03:15:48 p.m.
Sampling rate 2 Hz
Burst interval 1800 sec
Samples per burst 2048
# Parámetros

sampling_rate <- 2
burst_interval <- (1800/2) # 1800 segundos
samples_per_burst <- 2048
start_time <- ymd_hms("2024-10-31 10:10:00")
delta_time <- 1 / sampling_rate

G1 <- G1 %>%
  group_by(burst) %>%
  mutate(
    time_offset = (ensemble - 1) * delta_time,
    DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
  ) %>%
  ungroup()


# Crear secuencia completa de tiempo

max_time = max(G1$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)

# Fusionar con la serie completa

G1 = data.frame(DateTime = full_time_sequence) %>%
                left_join(G1, by = "DateTime")

G1 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=presion))+
  geom_line()+
  theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).

A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.

G1 %>% 
   filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup() %>% 
  ggplot(aes(x=DateTime, y=promedio_presion))+
  geom_line()+
  geom_smooth(method = "lm", se = FALSE) + 
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 124 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).

G4 - Serie de tiempo de presión y nivel del mar

Metric Value
Number of measurements 21,647
Time of first measurement 31/10/2024 09:30:00 a.m.
Time of last measurement 31/10/2024 02:32:01 p.m.
Sampling rate 2 Hz
Burst interval 1800 sec
Samples per burst 2048
# Parámetros

sampling_rate <- 2
burst_interval <- (1800/2) # 1800 segundos
samples_per_burst <- 2048
start_time <- ymd_hms("2024-10-31 09:30:00")
delta_time <- 1 / sampling_rate

G4 <- G4 %>%
  group_by(burst) %>%
  mutate(
    time_offset = (ensemble - 1) * delta_time,
    DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
  ) %>%
  ungroup()


# Crear secuencia completa de tiempo

max_time = max(G4$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)

# Fusionar con la serie completa

G4 = data.frame(DateTime = full_time_sequence) %>%
                left_join(G4, by = "DateTime")

G4 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=presion))+
  geom_line()+
  theme_bw()

A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.

G4 %>% 
   filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup() %>% 
  ggplot(aes(x=DateTime, y=promedio_presion))+
  geom_line()+
  geom_smooth(method = "lm", se = FALSE) + 
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 126 rows containing non-finite outside the scale range
## (`stat_smooth()`).

Resultados de mediciones

Magnitudes de las corrientes para el equipo asignados a su grupo, ralizar una gráficas de las componentes perpendiculares (x) y tranversales (y) de las corrientes, así como una gráfica de la magnitud total de la corriente.

G1 - magnitud de la corriente

# Componente perpendicular (x)

G1 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_x))+
  geom_line()+
  theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).

# Componente tranversal (y)

G1 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_y))+
  geom_line()+
  theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).

## magnitud total de la corriente
G1 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=magnitud))+
  geom_line()+
  theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).

G1 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2)),
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_magnitud = mean(magnitud, na.rm = TRUE), 
    DateTime = first(floor_date(DateTime, "minute")) 
  ) %>%
  ungroup() %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=promedio_magnitud))+
  geom_line()+
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_line()`).

G2 - magnitud de la corriente

# Componente perpendicular (x)

G2 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_x))+
  geom_line()+
  theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).

# Componente tranversal (y)

G2 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_y))+
  geom_line()+
  theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).

## magnitud total de la corriente
G2 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>% 
 filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=magnitud))+
  geom_line()+
  theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).

G2 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2)),
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_magnitud = mean(magnitud, na.rm = TRUE), 
    DateTime = first(floor_date(DateTime, "minute")) 
  ) %>%
  ungroup() %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=promedio_magnitud))+
  geom_line()+
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## Warning: Removed 9 rows containing missing values or values outside the scale range
## (`geom_line()`).

G4 - magnitud de la corriente

# Componente perpendicular (x)

G4 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_x))+
  geom_line()+
  theme_bw()

# Componente tranversal (y)

G4 %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  ggplot(aes(x=DateTime, y= v_y))+
  geom_line()+
  theme_bw()

## magnitud total de la corriente
G4 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>% 
   filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=magnitud))+
  geom_line()+
  theme_bw()

G4 %>% 
  mutate(
    magnitud = sqrt((v_x^2)+(v_y^2)),
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    promedio_magnitud = mean(magnitud, na.rm = TRUE), 
    DateTime = first(floor_date(DateTime, "minute")) 
  ) %>%
  ungroup() %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  ggplot(aes(x=DateTime, y=promedio_magnitud))+
  geom_line()+
  theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.

Sticks plot

Para el desarrollo de los sticks Plot se realizó una adaptación del código de Matlab generado por Indika Weligamage. La publicación del mismo se encuentra en el siguiente enlace: https://www.mathworks.com/matlabcentral/answers/682938-how-to-create-a-stickplot.

(Tristemnete, no fui capaz de crear una función que me permitisee hacer el proceso de forma automática. Así que vamos repetir el proceso manualmente usando como variable auxiliar df)

Para cualquiera a quién interese, aquí está una guía para comprender como se lee una gráfica de sticks: https://tabs.gerg.tamu.edu/Tglo/stick.html

En primera instancia se define una función para generar lags de la serie de tiempo.

myslidingavg <- function(x, n = 3) {
  stats::filter(x, rep(1 / n, n), sides = 2)
}

Para desarrollar el stick plot se debe conocer el angulo formado por las componentes, los cuales se suavizan por medio de la función myslidingavg

\[ \theta = \text{atan}(dv_y, v_x) \]

G2 - Sitck plot

df = G2
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)

Posteriormente se debe obtener el módulo del vector resultante entre las compontentes.

\[ \text{mod} = \sqrt{v_x^2 + v_y^2} \] \[ v_{x,\text{smoothed}} = \text{mod} \cdot \cos(\theta_{\text{smoothed}}) \] \[ v_{y,\text{smoothed}} = \text{mod} \cdot \sin(\theta_{\text{smoothed}}) \]

df <- df %>%
  mutate(
    mod  = sqrt(df$v_x^2 + df$v_y^2),
    v_x_smoothed = mod * cos(theta_smoothed),
    v_y_smoothed = mod * sin(theta_smoothed)
  )

También, se aplican los cambios calculando los promedios en cada minuto de las componontes. Después de este tratamiento, finalmente, se gráfica el stickplot por medio de la libería oce.

Prueba = df %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
    v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.06, ylab='', yaxt='n', length=0)

G1 - Sitck plot

df = G1
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)

df <- df %>%
  mutate(
    mod  = sqrt(df$v_x^2 + df$v_y^2),
    v_x_smoothed = mod * cos(theta_smoothed),
    v_y_smoothed = mod * sin(theta_smoothed)
  )


Prueba = df %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
    v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.025, ylab='', yaxt='n', length=0)

G4 - Sitck plot

df = G4
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)

df <- df %>%
  mutate(
    mod  = sqrt(df$v_x^2 + df$v_y^2),
    v_x_smoothed = mod * cos(theta_smoothed),
    v_y_smoothed = mod * sin(theta_smoothed)
  )


Prueba = df %>% 
  filter(
    DateTime > ymd_hms("2024-10-31 10:30:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime)
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
    v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
    DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
  ) %>%
  ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.2, ylab='', yaxt='n', length=0)

Gráfica presión y magnitud de las corrientes con pcolor

G1 - pcolor

G1 %>% 
filter(
    DateTime > ymd_hms("2024-10-31 10:42:00") & 
    DateTime < ymd_hms("2024-10-31 15:00:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime), 
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>%
  pivot_longer(cols = c(magnitud, presion), 
               names_to = "Variable", 
               values_to = "Value") %>% 
  ggplot( aes(x = minutos, y = horas, fill = Value)) +
    geom_tile() +
    facet_wrap(~Variable, scales = "free") +
    scale_fill_viridis_c() +
    theme_minimal()

G2 - pcolor

G2 %>% 
filter(
    DateTime > ymd_hms("2024-10-31 09:55:00") & 
    DateTime < ymd_hms("2024-10-31 15:10:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime), 
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>% 
  group_by(horas, minutos) %>% 
  summarise(
    mean_magnitud = mean(magnitud, na.rm = TRUE),
    mean_presion = mean(presion, na.rm = TRUE),
    DateTime = first(floor_date(DateTime, "minute")) 
  ) %>%
  ungroup()%>%
  pivot_longer(cols = c(mean_magnitud, mean_presion), 
               names_to = "Variable", 
               values_to = "Value") %>% 
ggplot( aes(x = minutos, y = horas, fill = Value)) +
  geom_tile() +
  facet_wrap(~Variable, scales = "free") +
  scale_fill_viridis_c() +
  theme_minimal()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.

G4 - pcolor

G4 %>% 
filter(
    DateTime > ymd_hms("2024-10-31 09:30:00") & 
    DateTime < ymd_hms("2024-10-31 14:35:00")
  ) %>% 
  mutate(
    horas = hour(DateTime),
    minutos = minute(DateTime),
    segundos = second(DateTime), 
    magnitud = sqrt((v_x^2)+(v_y^2))
  ) %>%
  pivot_longer(cols = c(magnitud, presion), 
               names_to = "Variable", 
               values_to = "Value") %>% 
  ggplot( aes(x = minutos, y = horas, fill = Value)) +
    geom_tile() +
    facet_wrap(~Variable, scales = "free") +
    scale_fill_viridis_c() +
    theme_minimal()

Gráfica conjunta de nivel y magnitud de las corrientes en pcolor.

Análisis de las mediciones - periodograma de Welch

Gráfica de periodograma de Welch para los datos de nivel del mar de los Aquadopp más lejanos y cercanos a la costa (revisar el informe de pre-salida para utilizar los equipos correspondientes)

Cálculo de \(H_s\) y \(T_p\)

No sé cómo se calcula la altura significativa y no tengo idea de que significa \(T_p\).

Otros resultados

También, se realizó una serie de tiempo de la temperatura, más que todo porque me pareció “cool”.

G3 %>% 
  filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>% 
  ggplot(aes(x=DateTime, y=Temperature))+
  geom_line()+
  theme_bw()