Datos y limpieza

Author

Luis La Cruz & German Chacón

library(readxl)
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(egg)
Loading required package: gridExtra

Attaching package: 'gridExtra'

The following object is masked from 'package:dplyr':

    combine
library(tidyverse)
library(ggplot2)
library(ggpmisc)
Loading required package: ggpp
Registered S3 methods overwritten by 'ggpp':
  method                  from   
  heightDetails.titleGrob ggplot2
  widthDetails.titleGrob  ggplot2

Attaching package: 'ggpp'

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

    annotate

Registered S3 method overwritten by 'ggpmisc':
  method                  from   
  as.character.polynomial polynom
library(broom)
library(ggplot2)
library(patchwork)
library(egg)
library(ggpubr)

Attaching package: 'ggpubr'

The following objects are masked from 'package:ggpp':

    as_npc, as_npcx, as_npcy

The following object is masked from 'package:egg':

    ggarrange
library(readxl)
library(tidyverse)
library(egg)
library(tidyverse)
datos_sv=read_excel("Datos_FM_Tesis_moda.xlsx", sheet="Total_data")

datos_sv_longer=datos_sv %>%
    pivot_longer(cols = c(14:285),
      names_to = c("Frequency"),
      values_to = "Value")


datos_sv_longer$Range=cut(as.numeric(datos_sv_longer$Depth_school), breaks=c(0,5,10,15,20,25,50,100,150,200,250,500),
  include.lowest=F, right=F,labels=c("0-5","5-10","10-15","15-20","20-25","25-50","50-100","100-150","150-200","200-250","250-500"))


datos_sv_longer$Banda_name=cut(as.numeric(datos_sv_longer$Frequency), breaks=c(0,18.1,45,90,170,270),
  include.lowest=F, right=F,labels=c("b0","b1","b2","b3","b4"))

datos_sv_longer$Banda=cut(as.numeric(datos_sv_longer$Frequency), breaks=c(0,18.1,45,90,170,270),
  include.lowest=F, right=F,labels=c("18","35-45","45-90","90-170","170-260"))


 Data_Sv=datos_sv_longer[datos_sv_longer$Data=="Sv",]

Datos Sv y Std por especies

Data_Sv <- Data_Sv %>%
  filter(Class %in% c("Anchoveta", "Múnida","Vinciguerria","Plancton","Salpas","Otros"))



Data_Std=datos_sv_longer[datos_sv_longer$Data=="Std",]
Data_Std <- Data_Std %>%
filter(Class %in% c("Anchoveta", "Múnida","Vinciguerria","Plancton","Salpas","Otros"))

Datos Sv y Std “Anchoveta x tallas”

dat=Data_Sv[Data_Sv$Class=="Anchoveta",]

dat <-dat %>%
  filter(Subclass_n %in% c("Moda 3.5 cm", "Moda 4 cm", "Moda 5 cm", "Moda 7.5 cm","Moda 10.5 cm", "Moda 11 cm", "Moda 12 cm","Moda 12.5 cm","Moda 13 cm","Moda 13.5 cm"))

dat$group <- factor(dat$Subclass_n,      # Reordering group factor levels
                         levels = c("Moda 3.5 cm", "Moda 4 cm", "Moda 5 cm", "Moda 7.5 cm","Moda 10.5 cm", "Moda 11 cm", "Moda 12 cm","Moda 12.5 cm","Moda 13 cm","Moda 13.5 cm"),labels = c("3.5", "4", "5", "7.5","10.5","11","12","12.5","13","13.5"))

dat$Banda <- factor(dat$Banda,
  levels = c("35-45","45-90","90-170","170-260"),labels = c("35-45","45-90","90-170","170-260"))


################

dat_std=Data_Std[Data_Std$Class=="Anchoveta",]

dat_std <-dat_std %>%
  filter(Subclass_n %in% c("Moda 3.5 cm", "Moda 4 cm", "Moda 5 cm", "Moda 7.5 cm","Moda 10.5 cm", "Moda 11 cm", "Moda 12 cm","Moda 12.5 cm","Moda 13 cm","Moda 13.5 cm"))

dat_std$group <- factor(dat_std$Subclass_n,      # Reordering group factor levels
                         levels = c("Moda 3.5 cm", "Moda 4 cm", "Moda 5 cm", "Moda 7.5 cm","Moda 10.5 cm", "Moda 11 cm", "Moda 12 cm","Moda 12.5 cm","Moda 13 cm","Moda 13.5 cm"))

Plot densidad “sin filtrar”

ggplot(dat)+
  geom_density(alpha=1,size=0.75, aes(fill=group,x = Value))+
  theme_presentation(base_size = 12)+
  facet_wrap(facets = "group",scales = "free")
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
Warning: Removed 19303 rows containing non-finite outside the scale range
(`stat_density()`).

Limpieza de datos Intercuartil

library(rstatix)  

Attaching package: 'rstatix'
The following object is masked from 'package:stats':

    filter
library(ggpubr)  # For easy data-visualization
library(dplyr)

dat=dat %>%
  mutate(Value_linear = 10^(Value/10)) %>%
  mutate(Value_linear_log = log10(10^(Value/10)))%>% 
  filter(!is.na(Value_linear))


# Definir función para filtrar valores atípicos por grupo
filter_outliers <- function(data, group_var, value_var) {
  data %>%
    group_by({{group_var}}) %>%
    mutate(Q1 = quantile({{value_var}}, 0.25, na.rm = TRUE),
           Q3 = quantile({{value_var}}, 0.75, na.rm = TRUE),
           IQR = Q3 - Q1,
           lower_limit = Q1 - 1.5 * IQR,
           upper_limit = Q3 + 1.5 * IQR) %>%
    filter({{value_var}} >= lower_limit & {{value_var}} <= upper_limit) %>%
    select(-Q1, -Q3, -IQR, -lower_limit, -upper_limit)
}

# Aplicar la función para filtrar valores atípicos por grupo
dat_clean_iq <- dat %>%
  filter_outliers(group, Value)

Limpieza de datos sobre Sv

Z-Score

# Definir función para filtrar valores atípicos por grupo usando Z-Score
filter_outliers_zscore <- function(data, group_var, value_var, threshold = 3.5) {
  data %>%
    group_by({{group_var}}) %>%
    mutate(z_score = abs(scale({{value_var}}, center = TRUE, scale = TRUE))) %>%
    filter(z_score <= threshold) %>%
    select(-z_score)
}

# Aplicar la función para filtrar valores atípicos por grupo usando Z-Score
dat_clean_zscore <- dat %>%
  filter_outliers_zscore(group, Value, threshold = 3.5)
Warning: Using one column matrices in `filter()` was deprecated in dplyr 1.1.0.
ℹ Please use one dimensional logical vectors instead.

Limpieza de datos sobre Sv

Z-score Modificado

# Definir función para filtrar valores atípicos por grupo usando Z-Score modificado
filter_outliers_modified_zscore <- function(data, group_var, value_var, threshold = 3.5) {
  data %>%
    group_by({{group_var}}) %>%
    mutate(median_value = median({{value_var}}, na.rm = TRUE),
           mad_value = mad({{value_var}}, constant = 1, na.rm = TRUE),
           modified_z_score = abs({{value_var}} - median_value) / (mad_value * 1.4826)) %>%
    filter(modified_z_score <= threshold) %>%
    select(-median_value, -mad_value, -modified_z_score)
}

# Aplicar la función para filtrar valores atípicos por grupo usando Z-Score modificado
dat_clean_modified_zscore <- dat %>%
  filter_outliers_modified_zscore(group, Value, threshold = 3.5)

Box plot

dat_clean_modified_z-score

library(ggplot2)

ggplot(dat_clean_modified_zscore)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 15) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))

ggplot(dat_clean_modified_zscore)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 12) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))+
  facet_wrap(~Banda)

ggplot(dat_clean_modified_zscore)+
  geom_density(alpha=1,size=0.75, aes(x = Value))+
  theme_presentation(base_size = 12)+
  facet_wrap(facets = "group",ncol=1,strip.position = "right",scales = "free_y")

ggplot(dat_clean_modified_zscore)+
  geom_density(alpha=1,size=0.75, aes(x = Pendiente_b2))+
  theme_presentation(base_size = 12)+
  facet_wrap(facets = "group",ncol=1,strip.position = "right",scales = "free_y")

averages <- aggregate(Value ~ Banda+group, data = dat_clean_modified_zscore , FUN = median)


averages$Banda <- factor(averages$Banda,
  levels = c("35-45","45-90","90-170","170-260"),labels = c("35-45","45-90","90-170","170-260"))



# Gráfico ggplot con promedios como líneas
ggplot(averages , aes(x = factor(group), y = Value, fill = group)) +
  #geom_boxplot(alpha = 1, size = 0.75, show.legend = FALSE) +
  geom_line(data = averages, aes(x = factor(group), y = Value, group = Banda), 
            stat = "summary", fun.y = "mean", size = 1, color = "black") +
  scale_fill_manual(name = "Anchoveta",
                    values = c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c")) +
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5")) +
  ylab("Sv (dB)") +
  theme_presentation(base_size = 12) +
  theme(legend.position = "top",
        panel.grid.major.y = element_line(color = "gray", linetype = "dashed")) +
  facet_wrap(~ Banda)
Warning in geom_line(data = averages, aes(x = factor(group), y = Value, :
Ignoring unknown parameters: `fun.y`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`

averages <- aggregate(Value ~ Banda+group, data = dat_clean_modified_zscore , FUN = median)

averages$Banda <- factor(averages$Banda,
  levels = c("35-45","45-90","90-170","170-260"),labels = c("35-45","45-90","90-170","170-260"))



# Gráfico ggplot con promedios como líneas
ggplot(averages , aes(x = factor(Banda), y = Value, fill = group)) +
  #geom_boxplot(alpha = 1, size = 0.75, show.legend = FALSE) +
  geom_point(data = averages, aes(x = factor(Banda), y = Value, group = Banda), 
            stat = "summary", fun.y = "mean", size = 1, color = "black") +
  scale_fill_manual(name = "Anchoveta",
                    values = c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c")) +
  #scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5")) +
  ylab("Sv (dB)") +
  theme_presentation(base_size = 12) +
  theme(legend.position = "top",
        panel.grid.major.y = element_line(color = "gray", linetype = "dashed")) +
  facet_wrap(~ group)
Warning in geom_point(data = averages, aes(x = factor(Banda), y = Value, :
Ignoring unknown parameters: `fun.y`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`
No summary function supplied, defaulting to `mean_se()`

#write.csv(dat_std_clean,"dat_clean_std_anchoveta.csv")

write.csv(dat_clean_modified_zscore,"dat_clean_modified_zscore_anchoveta.csv")

Z score-modificado sobre Sv lineal

# Definir función para filtrar valores atípicos por grupo usando Z-Score modificado
filter_outliers_modified_zscore <- function(data, group_var, value_var, threshold = 3.5) {
  data %>%
    group_by({{group_var}}) %>%
    mutate(median_value = median({{value_var}}, na.rm = TRUE),
           mad_value = mad({{value_var}}, constant = 1, na.rm = TRUE),
           modified_z_score = abs({{value_var}} - median_value) / (mad_value * 1.4826)) %>%
    filter(modified_z_score <= threshold) %>%
    select(-median_value, -mad_value, -modified_z_score)
}

# Aplicar la función para filtrar valores atípicos por grupo usando Z-Score modificado
dat_clean_modified_zscore_lineal <- dat %>%
  filter_outliers_modified_zscore(group, Value_linear, threshold = 3.5)
library(ggplot2)

ggplot(dat_clean_modified_zscore_lineal)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 15) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))

##
ggplot(dat_clean_modified_zscore_lineal)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 12) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))+
  facet_wrap(~Banda)

Limpieza intercuartil sobre Sv lineal

library(rstatix)  
library(ggpubr)  # For easy data-visualization
library(dplyr)



# Definir función para filtrar valores atípicos por grupo
filter_outliers <- function(data, group_var, value_var) {
  data %>%
    group_by({{group_var}}) %>%
    mutate(Q1 = quantile({{value_var}}, 0.25, na.rm = TRUE),
           Q3 = quantile({{value_var}}, 0.75, na.rm = TRUE),
           IQR = Q3 - Q1,
           lower_limit = Q1 - 1.5 * IQR,
           upper_limit = Q3 + 1.5 * IQR) %>%
    filter({{value_var}} >= lower_limit & {{value_var}} <= upper_limit) %>%
    select(-Q1, -Q3, -IQR, -lower_limit, -upper_limit)
}

# Aplicar la función para filtrar valores atípicos por grupo
dat_clean_iq_Sv_lineal <- dat %>%
  filter_outliers(group, Value_linear)
library(ggplot2)

ggplot(dat_clean_iq_Sv_lineal)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 15) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))

##
ggplot(dat_clean_modified_zscore_lineal)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 12) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))+
  facet_wrap(~Banda)

Datos SIN FILTRAR

library(ggplot2)

ggplot(dat)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 15) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))

##
ggplot(dat)+
  geom_boxplot(alpha=1,size=0.75, aes(fill=group,y = Value, x=group), show.legend = F)+
  theme_presentation(base_size = 12) +
  ylab("Sv (dB)")+ #Average response
  #scale_fill_brewer(palette = "RdYlBu",name="Especie")+
    #scale_fill_viridis_d(option = "C")+
  scale_fill_manual(name="Anchoveta",values =c("#5f5f5f","#0000ff","#000080","#00bf00","#008000","#ffff00","#ff8000","#ff00bf","#ff0000","#a6533c"))+  
  scale_x_discrete(name = "Longitud (cm)", labels = c("3.5","4","5","7.5","10.5","11","11.5","12","12.5","13","13.5"))+
  theme(legend.position = "top")+ #legend.title=element_blank()
  #scale_x_discrete(name = "Bandas (kHz)")+
  theme(panel.grid.major.y = element_line(color = "gray", linetype = "dashed"))+
  facet_wrap(~Banda)