---
title: "Factores asociados al peso individual en peces demersales: especie, longitud y edad a partir de datos DATRAS (IEO-CSIC)"
author: "Fernando José Pereira Salvador"
date: "`r Sys.Date()`"
output:
  html_document:
    toc: true
    toc_float: true
    number_sections: true
    theme: flatly
    highlight: tango
---

# Introducción y Contexto

El **Instituto Español de Oceanografía (IEO-CSIC)** realiza anualmente campañas de arrastre de fondo, conocidas como **DEMERSALES** (por ejemplo, `SP-NORTH` en la plataforma del Cantábrico y Galicia), cuyo objetivo principal es la evaluación directa de los recursos pesqueros.

Los microdatos obtenidos en estas campañas se remiten al **Consejo Internacional para la Exploración del Mar (CIEM/ICES)** y se almacenan en la base de datos **DATRAS**. En este proyecto se consume la API del ICES para extraer registros biológicos reales correspondientes a la campaña de 2022, incluyendo variables como edad, longitud y peso individual de los ejemplares capturados.

La unidad de análisis de este estudio es, por tanto, **cada ejemplar individual** registrado biológicamente en la campaña. A partir de estos datos, se pretende aplicar herramientas de la Estadística Matemática para estudiar qué factores parecen explicar mejor el peso individual de los peces analizados.

La pregunta principal de investigación es la siguiente:

**¿Qué factores explican mejor el peso individual de los ejemplares analizados: la especie, la longitud o la edad?**

A partir de esta pregunta, los objetivos concretos del trabajo son:

1. Construir una muestra biométrica válida a partir de datos reales de la campaña DEMERSALES 2022.
2. Describir la distribución del peso, la longitud y la edad de los ejemplares analizados.
3. Evaluar el papel de la especie como factor asociado al peso individual mediante técnicas de inferencia estadística.
4. Estudiar la asociación entre la longitud y el peso, así como entre la edad y el peso.
5. Comparar, de forma preliminar, cuál de estas variables parece aportar mayor capacidad explicativa sobre el peso individual.

# Extracción de Datos

Para garantizar la reproducibilidad y el uso de datos empíricos reales, utilizamos el paquete `icesDatras` para consultar el registro `"CA"` (*Catch at Age/Biology*) de la campaña `SP-NORTH`.

```{r}
# install.packages("icesDatras")
library(icesDatras)
library(dplyr)
library(ggplot2)
library(knitr)
```

```{r}
# Descargamos los datos de cada trimestre de 2022
q1 <- getDATRAS(record = "CA", survey = "SP-NORTH", years = 2022, quarters = 1)
q2 <- suppressMessages(suppressWarnings(getDATRAS(record = "CA", survey = "SP-NORTH", years = 2022, quarters = 2)))
q3 <- suppressMessages(suppressWarnings(getDATRAS(record = "CA", survey = "SP-NORTH", years = 2022, quarters = 3)))
q4 <- suppressMessages(suppressWarnings(getDATRAS(record = "CA", survey = "SP-NORTH", years = 2022, quarters = 4)))

# Unimos todos los trimestres en una sola tabla
datos_raw <- rbind(q1, q2, q3, q4)
```

```{r}
# Imprimir dimensiones
cat("TOTAL DE DATOS DESCARGADOS:\n")
cat("Filas:", nrow(datos_raw), "- Columnas:", ncol(datos_raw), "\n\n")

# Imprimir todos los nombres de las columnas
cat("NOMBRES EXACTOS DE LAS COLUMNAS:\n")
cat(names(datos_raw))
```

A continuación, realizamos una primera exploración del volumen total de datos, del número de especies registradas y de la calidad de las variables biométricas de interés, prestando especial atención al peso individual (`IndWgt`) y a la longitud (`LngtClass`).

```{r}
# Volumen total de la campaña
cat("Total de registros biológicos procesados:", nrow(datos_raw), "\n")

# Biodiversidad
num_especies <- length(unique(datos_raw$Valid_Aphia))
cat("Número de especies distintas (AphiaIDs) capturadas:", num_especies, "\n")

# Calidad del dato: peso individual
pesos_invalidos <- sum(is.na(datos_raw$IndWgt) | datos_raw$IndWgt <= 0)
porcentaje_invalidos <- round((pesos_invalidos / nrow(datos_raw)) * 100, 2)

cat("Registros sin un peso individual válido (NAs o negativos):", pesos_invalidos,
    "(", porcentaje_invalidos, "% del total)\n")
```

```{r}
table(datos_raw$Valid_Aphia)
```

A continuación, detallamos el diccionario taxonómico exacto con todas las especies que han aparecido en nuestra extracción:

- 0: Registros nulos o no identificados (ej. restos, huevos o errores).
- 126285: *Conger conger* (Congrio o Safio)
- 126439: *Micromesistius poutassou* (Bacaladilla o Lirio)
- 126445: *Trisopterus luscus* (Faneca)
- 126484: *Merluccius merluccius* (Merluza europea)
- 126501: *Capros aper* (Ochavo)
- 126554: *Lophius budegassa* (Rape negro)
- 126555: *Lophius piscatorius* (Rape blanco)
- 126822: *Trachurus trachurus* (Jurel o Chicharro)
- 127023: *Scomber scombrus* (Caballa o Xarda)
- 127145: *Lepidorhombus boscii* (Gallo de cuatro manchas)
- 127146: *Lepidorhombus whiffiagonis* (Gallo del norte)
- 127251: *Zeus faber* (Pez de San Pedro)
- 127427: *Helicolenus dactylopterus* (Gallineta)

Dado que el objetivo del trabajo es estudiar factores asociados al peso individual, se seleccionan inicialmente tres especies de interés y se construye una tabla de análisis que conserve el peso, la longitud y la edad de los ejemplares siempre que sea posible. Posteriormente, el propio proceso de depuración determinará qué especies disponen de observaciones suficientes para el análisis final.

```{r}
# Usamos los códigos reales identificados en nuestra exploración
especies_ids <- c(126484, 126439, 126822)

# Aplicamos los filtros mínimos de limpieza
datos_limpios <- subset(
  datos_raw,
  Valid_Aphia %in% especies_ids &
  !is.na(IndWgt) & IndWgt > 0 &
  !is.na(LngtClass)
)

# Mapeamos los códigos numéricos a texto para que los gráficos sean legibles
datos_limpios$Especie <- ifelse(
  datos_limpios$Valid_Aphia == 126484, "Merluccius merluccius (Merluza)",
  ifelse(datos_limpios$Valid_Aphia == 126439, "Micromesistius poutassou (Bacaladilla)",
         "Trachurus trachurus (Jurel)")
)

# Creación de la tabla de análisis final
datos_ieo <- data.frame(
  ID_Pez = seq_len(nrow(datos_limpios)),
  Especie = datos_limpios$Especie,
  Longitud_cm = datos_limpios$LngtClass / 10,
  Peso_g = datos_limpios$IndWgt,
  Edad = suppressWarnings(as.numeric(as.character(datos_limpios$Age)))
)

cat("Muestra final válida para el análisis biométrico:", nrow(datos_ieo), "peces.\n")
cat("Registros con edad válida:", sum(!is.na(datos_ieo$Edad) & datos_ieo$Edad >= 0), "\n")
```

```{r}
# Ordenamos las especies para que salgan siempre igual en tablas y gráficos
datos_ieo$Especie <- factor(
  datos_ieo$Especie,
  levels = c(
    "Merluccius merluccius (Merluza)",
    "Micromesistius poutassou (Bacaladilla)",
    "Trachurus trachurus (Jurel)"
  )
)
```

En el planteamiento inicial se seleccionaron tres especies de interés pesquero. Sin embargo, tras el proceso de depuración y filtrado de registros con biometría válida, la muestra final quedó compuesta por dos especies con observaciones suficientes para el análisis principal: *Merluccius merluccius* (Merluza) y *Trachurus trachurus* (Jurel), mientras que la bacaladilla no aportó observaciones válidas en la muestra final.

```{r}
table(datos_ieo$Especie)
```

# Análisis Exploratorio de Datos

En este apartado se realiza una descripción inicial de la muestra con el fin de estudiar cómo se distribuyen las principales variables implicadas en la pregunta de investigación: especie, longitud, edad y peso individual.

## Composición de la muestra

```{r}
# Frecuencias absolutas y relativas por especie
tabla_especies <- datos_ieo %>%
  count(Especie, name = "Frecuencia") %>%
  mutate(Porcentaje = round(100 * Frecuencia / sum(Frecuencia), 2))

print(tabla_especies)
```

```{r}
ggplot(tabla_especies, aes(x = Especie, y = Frecuencia)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Número de ejemplares por especie",
    x = "Especie",
    y = "Frecuencia"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))
```

Como puede observarse en el gráfico de barras, la muestra final está formada por 477 ejemplares de merluza y 479 de jurel, lo que supone una distribución prácticamente equilibrada entre ambas especies. Esta composición resulta conveniente para la comparación posterior, ya que evita que una de las especies domine claramente en tamaño muestral.

## Resumen descriptivo global

```{r}
resumen_global <- datos_ieo %>%
  summarise(
    n = n(),
    media_peso = mean(Peso_g),
    mediana_peso = median(Peso_g),
    sd_peso = sd(Peso_g),
    media_longitud = mean(Longitud_cm),
    mediana_longitud = median(Longitud_cm),
    sd_longitud = sd(Longitud_cm),
    media_edad = mean(Edad, na.rm = TRUE),
    mediana_edad = median(Edad, na.rm = TRUE),
    sd_edad = sd(Edad, na.rm = TRUE)
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

print(resumen_global)
```

La muestra analítica final está formada por 956 ejemplares. En conjunto, el peso medio es de 310.29 gramos, aunque la mediana se sitúa en 118 gramos, lo que evidencia una fuerte asimetría a la derecha. Además, la desviación típica del peso alcanza 531.94 gramos, muy elevada en relación con la media, lo que confirma una gran dispersión y la presencia de individuos excepcionalmente pesados. En cuanto a la longitud, la media global es de 27.62 cm y la mediana de 25.25 cm, mientras que la edad media de los registros disponibles es de 2.91 años.

## Resumen descriptivo por especie

```{r}
resumen_especies <- datos_ieo %>%
  group_by(Especie) %>%
  summarise(
    n = n(),
    media_peso = mean(Peso_g),
    mediana_peso = median(Peso_g),
    sd_peso = sd(Peso_g),
    cv_peso = 100 * sd(Peso_g) / mean(Peso_g),
    media_longitud = mean(Longitud_cm),
    mediana_longitud = median(Longitud_cm),
    sd_longitud = sd(Longitud_cm),
    media_edad = mean(Edad, na.rm = TRUE),
    mediana_edad = median(Edad, na.rm = TRUE),
    sd_edad = sd(Edad, na.rm = TRUE)
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

print(resumen_especies)
```

El resumen por especie confirma diferencias biométricas muy marcadas. La merluza presenta un peso medio cercano a 525 gramos, frente a los 96.6 gramos del jurel, y también una longitud media claramente superior, en torno a 36.6 cm frente a 18.7 cm. Además, la dispersión del peso es mucho mayor en la merluza, con una desviación típica muy elevada y un coeficiente de variación en torno al 129%, lo que refleja una biometría más heterogénea. En cambio, el jurel presenta pesos y tallas bastante menores.

## Distribución del peso individual

```{r}
ggplot(datos_ieo, aes(x = Peso_g)) +
  geom_histogram(bins = 30, fill = "darkcyan", color = "black") +
  labs(
    title = "Distribución global del peso individual",
    x = "Peso individual (g)",
    y = "Frecuencia"
  ) +
  theme_minimal()
```

El histograma muestra que la distribución global del peso individual no es simétrica, sino claramente asimétrica a la derecha. La mayor parte de los ejemplares se concentra en pesos bajos, mientras que existe un número reducido de individuos con pesos muy elevados, lo que genera una cola larga hacia la derecha.

```{r}
ggplot(datos_ieo, aes(x = Peso_g)) +
  geom_histogram(bins = 25, fill = "darkorange", color = "black") +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Distribución del peso individual por especie",
    x = "Peso individual (g)",
    y = "Frecuencia"
  ) +
  theme_minimal()
```

El histograma por especie muestra que tanto la merluza como el jurel presentan una distribución del peso individual asimétrica a la derecha. No obstante, la merluza presenta una mayor dispersión y una cola derecha mucho más larga, lo que indica la existencia de ejemplares considerablemente más pesados.

## Distribución de la longitud

```{r}
ggplot(datos_ieo, aes(x = Longitud_cm)) +
  geom_histogram(bins = 25, fill = "mediumpurple", color = "black") +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Distribución de la longitud por especie",
    x = "Longitud (cm)",
    y = "Frecuencia"
  ) +
  theme_minimal()
```

La longitud muestra diferencias claras entre especies. En particular, la merluza presenta longitudes mayores y una dispersión más amplia que el jurel, lo que sugiere que la longitud podría desempeñar un papel importante en la explicación del peso individual.

## Distribución de la edad

```{r}
datos_edad <- datos_ieo %>%
  filter(!is.na(Edad), Edad >= 0)

print(datos_edad %>% count(Especie))
```

```{r}
ggplot(datos_edad, aes(x = Edad)) +
  geom_histogram(binwidth = 1, fill = "goldenrod", color = "black") +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Distribución de la edad por especie",
    x = "Edad",
    y = "Frecuencia"
  ) +
  theme_minimal()
```

La variable edad incorpora una dimensión biológica adicional al estudio, pero en este caso debe interpretarse con cautela. Tras el filtrado, solo se dispone de registros de edad válidos para el jurel, con 478 observaciones, por lo que no es posible realizar una comparación directa entre especies en igualdad de condiciones. Aun así, su distribución resulta útil para estudiar hasta qué punto la edad puede asociarse con el peso dentro de la submuestra disponible.

## Comparación visual entre especies

```{r}
ggplot(datos_ieo, aes(x = Especie, y = Peso_g)) +
  geom_boxplot(fill = "tomato", alpha = 0.8, outlier.alpha = 0.6) +
  labs(
    title = "Comparación del peso individual entre especies",
    x = "Especie",
    y = "Peso individual (g)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))
```

```{r}
ggplot(datos_ieo, aes(x = Especie, y = Longitud_cm)) +
  geom_boxplot(fill = "seagreen", alpha = 0.8, outlier.alpha = 0.6) +
  labs(
    title = "Comparación de la longitud entre especies",
    x = "Especie",
    y = "Longitud (cm)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))
```

```{r}
ggplot(datos_edad, aes(x = Especie, y = Edad)) +
  geom_boxplot(fill = "khaki4", alpha = 0.8, outlier.alpha = 0.6) +
  labs(
    title = "Comparación de la edad entre especies",
    x = "Especie",
    y = "Edad"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))
```

Los diagramas de caja refuerzan lo observado en las tablas y en los histogramas. La merluza presenta medianas de peso y longitud claramente superiores a las del jurel, además de una mayor dispersión y una presencia más acusada de valores extremos. En cambio, la edad solo puede visualizarse para el jurel, ya que no se dispone de edades válidas para la merluza en la muestra final.

## Relación longitud-peso

```{r}
ggplot(datos_ieo, aes(x = Longitud_cm, y = Peso_g)) +
  geom_point(alpha = 0.6, size = 1.8) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.8) +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Relación entre longitud y peso por especie",
    x = "Longitud (cm)",
    y = "Peso individual (g)"
  ) +
  theme_minimal()
```

El diagrama de dispersión muestra una relación positiva clara entre la longitud y el peso en ambas especies, de modo que, en general, a mayor longitud corresponde un mayor peso individual. Esta asociación visual sugiere que la longitud puede ser uno de los factores más relevantes para explicar el peso.

## Relación edad-peso

```{r}
ggplot(datos_edad, aes(x = Edad, y = Peso_g)) +
  geom_point(alpha = 0.6, size = 1.8) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.8) +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Relación entre edad y peso por especie",
    x = "Edad",
    y = "Peso individual (g)"
  ) +
  theme_minimal()
```

Este gráfico permite estudiar si los individuos de mayor edad tienden también a presentar mayores pesos. Aunque la relación puede ser más dispersa que en el caso de la longitud, sigue siendo una variable de interés para valorar la explicación del peso individual.

## Correlaciones biométricas

```{r}
correlaciones_longitud <- datos_ieo %>%
  group_by(Especie) %>%
  summarise(
    Correlacion_Pearson = cor(Longitud_cm, Peso_g, method = "pearson"),
    Correlacion_Spearman = cor(Longitud_cm, Peso_g, method = "spearman")
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4)))

print(correlaciones_longitud)
```

```{r}
correlaciones_edad <- datos_edad %>%
  group_by(Especie) %>%
  summarise(
    Correlacion_Pearson = cor(Edad, Peso_g, method = "pearson"),
    Correlacion_Spearman = cor(Edad, Peso_g, method = "spearman")
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4)))

print(correlaciones_edad)
```

Los coeficientes de correlación permiten cuantificar con mayor precisión lo sugerido por los gráficos. La longitud muestra una asociación muy fuerte con el peso en ambas especies: la correlación de Pearson es 0.904 en la merluza y 0.951 en el jurel, mientras que la correlación de Spearman alcanza 0.996 y 0.988, respectivamente. Por su parte, en la submuestra con edad válida la relación edad-peso en el jurel también es muy intensa, con una correlación de Pearson de 0.985 y una de Spearman de 0.953. No obstante, este último resultado debe interpretarse con cautela, ya que no puede compararse con la merluza.

## Asimetría visual y transformación logarítmica

```{r}
ggplot(datos_ieo, aes(sample = Peso_g)) +
  stat_qq(size = 1, alpha = 0.6) +
  stat_qq_line(color = "red", linewidth = 0.7) +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Gráficos Q-Q del peso individual por especie",
    x = "Cuantiles teóricos",
    y = "Cuantiles muestrales"
  ) +
  theme_minimal()
```

```{r}
datos_ieo <- datos_ieo %>%
  mutate(log_Peso_g = log(Peso_g))

ggplot(datos_ieo, aes(x = log_Peso_g)) +
  geom_histogram(bins = 25, fill = "royalblue", color = "black") +
  facet_wrap(~ Especie, scales = "free") +
  labs(
    title = "Distribución de log(Peso_g) por especie",
    x = "log(Peso_g)",
    y = "Frecuencia"
  ) +
  theme_minimal()
```

Los gráficos Q-Q y la transformación logarítmica permiten valorar si el peso individual puede analizarse de manera más estable tras reducir su asimetría. Esta transformación será útil en la comparación preliminar de factores explicativos basada en modelos sencillos.

# Inferencia estadística

En esta sección se reinterpreta parte del análisis anterior desde el punto de vista inferencial. El objetivo ya no es solo describir la muestra, sino estudiar formalmente qué variables parecen desempeñar un papel más relevante en la explicación del peso individual.

## Efecto de la especie sobre el peso individual

Aunque la pregunta general del trabajo es más amplia, la especie sigue siendo uno de los factores candidatos a explicar diferencias de peso. Por ello, se comienza estudiando si existen diferencias estadísticamente significativas entre el peso medio de la merluza y el del jurel.

### Estimación puntual por especie

```{r}
estimadores_puntuales <- datos_ieo %>%
  group_by(Especie) %>%
  summarise(
    n = n(),
    media_peso = round(mean(Peso_g), 2),
    varianza_peso = round(var(Peso_g), 2),
    sd_peso = round(sd(Peso_g), 2),
    media_longitud = round(mean(Longitud_cm), 2),
    varianza_longitud = round(var(Longitud_cm), 2),
    sd_longitud = round(sd(Longitud_cm), 2)
  )

print(estimadores_puntuales)
```

La tabla anterior recoge los principales estimadores puntuales obtenidos para cada especie. Estas cantidades permiten una primera aproximación al papel de la especie como factor asociado al peso.

### Intervalos de confianza para la media del peso por especie

```{r}
# Merluza
y <- datos_ieo$Peso_g[datos_ieo$Especie == "Merluccius merluccius (Merluza)"]

m <- length(y)
media_muestral <- mean(y)
desviacion_tipica <- sd(y)

alpha <- 0.05
gl <- m - 1
t_critico <- qt(1 - alpha/2, df = gl)
se_media <- desviacion_tipica / sqrt(m)
margen_error <- t_critico * se_media

ic_inferior <- media_muestral - margen_error
ic_superior <- media_muestral + margen_error

cat("Media muestral =", round(media_muestral, 4), "\n")
cat("Desviación típica =", round(desviacion_tipica, 4), "\n")
cat("Error estándar =", round(se_media, 4), "\n")
cat("Grados de libertad =", gl, "\n")
cat("Cuantil crítico =", round(t_critico, 4), "\n")
cat("Margen de error =", round(margen_error, 4), "\n")
cat("IC95% para la media del peso de la merluza = (",
    round(ic_inferior, 4), ",", round(ic_superior, 4), ")\n")
```

```{r}
# Jurel
y <- datos_ieo$Peso_g[datos_ieo$Especie == "Trachurus trachurus (Jurel)"]

m <- length(y)
media_muestral <- mean(y)
desviacion_tipica <- sd(y)

gl <- m - 1
t_critico <- qt(1 - alpha/2, df = gl)
se_media <- desviacion_tipica / sqrt(m)
margen_error <- t_critico * se_media

ic_inferior <- media_muestral - margen_error
ic_superior <- media_muestral + margen_error

cat("Media muestral =", round(media_muestral, 4), "\n")
cat("Desviación típica =", round(desviacion_tipica, 4), "\n")
cat("Error estándar =", round(se_media, 4), "\n")
cat("Grados de libertad =", gl, "\n")
cat("Cuantil crítico =", round(t_critico, 4), "\n")
cat("Margen de error =", round(margen_error, 4), "\n")
cat("IC95% para la media del peso del jurel = (",
    round(ic_inferior, 4), ",", round(ic_superior, 4), ")\n")
```

```{r}
peso_merluza <- datos_ieo$Peso_g[datos_ieo$Especie == "Merluccius merluccius (Merluza)"]
peso_jurel   <- datos_ieo$Peso_g[datos_ieo$Especie == "Trachurus trachurus (Jurel)"]

# Verificación con t.test

t.test(peso_merluza, conf.level = 0.95)$conf.int
t.test(peso_jurel, conf.level = 0.95)$conf.int
```

### Intervalo de confianza para la diferencia de medias entre especies

Además de estimar la media de cada especie por separado, resulta de interés cuantificar directamente la diferencia entre las medias poblacionales del peso individual de la merluza y del jurel. Dado que las dispersiones no parecen iguales, se empleará el procedimiento de Welch.

\[
IC(\mu_M - \mu_J)=
(\bar{x}_M-\bar{x}_J)\pm t_{\alpha/2,\nu}\sqrt{\frac{s_M^2}{n_M}+\frac{s_J^2}{n_J}}
\]

```{r}
# Nivel de significación
alpha <- 0.05

# Tamaños muestrales
n1 <- length(peso_merluza)
n2 <- length(peso_jurel)

# Medias muestrales
xbar1 <- mean(peso_merluza)
xbar2 <- mean(peso_jurel)

# Varianzas muestrales
s1_2 <- var(peso_merluza)
s2_2 <- var(peso_jurel)

# Diferencia de medias
dif_medias <- xbar1 - xbar2

# Error estándar de Welch
se_dif <- sqrt((s1_2 / n1) + (s2_2 / n2))

# Grados de libertad aproximados
gl_welch <- ((s1_2 / n1 + s2_2 / n2)^2) /
  (((s1_2 / n1)^2) / (n1 - 1) + ((s2_2 / n2)^2) / (n2 - 1))

# Cuantil crítico
t_critico <- qt(1 - alpha/2, df = gl_welch)

# Margen de error
margen_error <- t_critico * se_dif

# Intervalo de confianza
ic_inf <- dif_medias - margen_error
ic_sup <- dif_medias + margen_error

cat("Tamaño muestral merluza =", n1, "\n")
cat("Tamaño muestral jurel =", n2, "\n")
cat("Media muestral merluza =", round(xbar1, 4), "\n")
cat("Media muestral jurel =", round(xbar2, 4), "\n")
cat("Diferencia de medias =", round(dif_medias, 4), "\n")
cat("Error estándar =", round(se_dif, 4), "\n")
cat("Grados de libertad (Welch) =", round(gl_welch, 4), "\n")
cat("t crítico =", round(t_critico, 4), "\n")
cat("Margen de error =", round(margen_error, 4), "\n")
cat("IC95% para la diferencia de medias (Merluza - Jurel) = (",
    round(ic_inf, 4), ",", round(ic_sup, 4), ")\n")
```

```{r}
t.test(
  peso_merluza,
  peso_jurel,
  conf.level = 0.95,
  var.equal = FALSE
)$conf.int
```

El intervalo de confianza al 95% para la diferencia de medias del peso individual entre merluza y jurel es (366.15, 490.21) gramos. Como el intervalo no contiene el valor 0 y todos sus valores son positivos, la evidencia apunta de forma clara a que la merluza presenta un peso medio superior al del jurel. En términos prácticos, la diferencia media estimada entre ambas especies se sitúa entre 366 y 490 gramos.

### Contraste de hipótesis para comparar medias entre especies

Aunque el análisis exploratorio ya sugería diferencias claras entre ambas especies, el contraste de hipótesis permite formalizar dicha evidencia desde un punto de vista inferencial y evaluar si la diferencia observada entre medias puede atribuirse al azar muestral o si, por el contrario, refleja una diferencia real entre las poblaciones.

Dado que en el análisis exploratorio también se observaron diferencias claras de dispersión entre ambas especies, se utilizará el test t de Welch, que no requiere asumir igualdad de varianzas.

Se plantea el siguiente contraste bilateral:

\[
H_0:\mu_M=\mu_J
\]

\[
H_1:\mu_M\neq\mu_J
\]

```{r}
resultado_welch <- t.test(
  peso_merluza,
  peso_jurel,
  alternative = "two.sided",
  var.equal = FALSE,
  conf.level = 0.95
)

t_estadistico <- resultado_welch$statistic
gl_welch <- resultado_welch$parameter
p_valor <- resultado_welch$p.value
ic_contraste <- resultado_welch$conf.int
dif_medias <- mean(peso_merluza) - mean(peso_jurel)

cat("Diferencia de medias (Merluza - Jurel) =", round(dif_medias, 4), "\n")
cat("Estadístico t =", round(t_estadistico, 4), "\n")
cat("Grados de libertad (Welch) =", round(gl_welch, 4), "\n")
cat("p-valor =", round(p_valor, 6), "\n")
cat("IC95% para la diferencia de medias = (",
    round(ic_contraste[1], 4), ",", round(ic_contraste[2], 4), ")\n")
```

```{r}
if (p_valor < alpha) {
  cat("DECISIÓN: Rechazamos H0.\n")
  cat("Existe evidencia estadísticamente significativa de que las medias poblacionales son distintas.\n")
} else {
  cat("DECISIÓN: No rechazamos H0.\n")
  cat("No existe evidencia estadística suficiente para afirmar que las medias poblacionales son distintas.\n")
}
```

El contraste t de Welch confirma formalmente lo que ya sugerían los gráficos y los intervalos de confianza. La diferencia de medias estimada es de 428.18 gramos, el estadístico t observado es 13.5613 y el p-valor es prácticamente nulo. Por tanto, se rechaza la hipótesis nula de igualdad de medias y se concluye que existe una diferencia estadísticamente significativa entre el peso medio de la merluza y el del jurel, siendo la merluza claramente más pesada en promedio.

## Asociación entre longitud y peso

La longitud es una variable cuantitativa que, tanto desde el punto de vista biológico como estadístico, parece estrechamente relacionada con el peso individual. Para formalizar esta asociación, se analizarán la correlación y un modelo lineal simple.

### Correlación global entre longitud y peso

```{r}
cor_longitud_global_pearson <- cor(datos_ieo$Longitud_cm, datos_ieo$Peso_g, method = "pearson")
cor_longitud_global_spearman <- cor(datos_ieo$Longitud_cm, datos_ieo$Peso_g, method = "spearman")

cat("Correlación de Pearson (Longitud, Peso) =", round(cor_longitud_global_pearson, 4), "\n")
cat("Correlación de Spearman (Longitud, Peso) =", round(cor_longitud_global_spearman, 4), "\n")
```

### Modelo lineal simple con longitud

```{r}
modelo_longitud <- lm(log_Peso_g ~ Longitud_cm, data = datos_ieo)
summary(modelo_longitud)
```

El modelo lineal simple con longitud confirma que esta variable está fuertemente asociada con el peso individual. El ajuste sobre `log(Peso_g)` alcanza un R² ajustado de 0.9069, lo que implica que más del 90% de la variabilidad del peso transformado queda explicada únicamente por la longitud. Este resultado refuerza la idea de que la talla del ejemplar es el factor individual más informativo de los analizados.

## Asociación entre edad y peso

La edad representa otro posible factor explicativo del peso. Para estudiarla, se restringe el análisis a aquellos ejemplares con edad válida registrada.

### Correlación global entre edad y peso

```{r}
cor_edad_global_pearson <- cor(datos_edad$Edad, datos_edad$Peso_g, method = "pearson")
cor_edad_global_spearman <- cor(datos_edad$Edad, datos_edad$Peso_g, method = "spearman")

cat("Correlación de Pearson (Edad, Peso) =", round(cor_edad_global_pearson, 4), "\n")
cat("Correlación de Spearman (Edad, Peso) =", round(cor_edad_global_spearman, 4), "\n")
```

### Modelo lineal simple con edad

```{r}
datos_modelo_edad <- datos_ieo %>%
  filter(!is.na(Edad), Edad >= 0)

modelo_edad <- lm(log_Peso_g ~ Edad, data = datos_modelo_edad)
summary(modelo_edad)
```

En la submuestra con edad válida, el modelo lineal simple con edad alcanza un R² ajustado de 0.7726, lo que indica una asociación elevada entre edad y peso. Sin embargo, este resultado debe interpretarse con cautela, ya que se obtiene únicamente sobre jureles y, por tanto, no es directamente comparable con la merluza ni con modelos ajustados sobre la muestra completa.

## Comparación preliminar de factores explicativos

Para responder directamente a la pregunta principal del trabajo, se comparan varios modelos sencillos construidos sobre el logaritmo del peso individual. La transformación logarítmica se utiliza para reducir la asimetría observada previamente en la variable original.

Se considerarán los siguientes modelos:

- modelo con **especie** como predictor,
- modelo con **longitud** como predictor,
- modelo con **edad** como predictor,
- y un modelo combinado con las tres variables.

```{r}
# Datos para modelo de especie y longitud: toda la muestra
datos_modelo_base <- datos_ieo %>%
  filter(!is.na(log_Peso_g), !is.na(Longitud_cm)) %>%
  droplevels()

# Datos para modelo de edad: solo observaciones con edad válida
datos_modelo_edad <- datos_ieo %>%
  filter(!is.na(log_Peso_g), !is.na(Longitud_cm), !is.na(Edad), Edad >= 0) %>%
  droplevels()

cat("Niveles de especie en datos_modelo_base:
")
print(table(datos_modelo_base$Especie))

cat("
Niveles de especie en datos_modelo_edad:
")
print(table(datos_modelo_edad$Especie))

# Modelos individuales
modelo_especie <- lm(log_Peso_g ~ Especie, data = datos_modelo_base)
modelo_longitud_comparable <- lm(log_Peso_g ~ Longitud_cm, data = datos_modelo_base)
modelo_edad_comparable <- lm(log_Peso_g ~ Edad, data = datos_modelo_edad)

# Resumen comparativo básico
comparacion_modelos <- data.frame(
  Modelo = c("Especie", "Longitud", "Edad"),
  n = c(nrow(datos_modelo_base), nrow(datos_modelo_base), nrow(datos_modelo_edad)),
  R2 = c(
    summary(modelo_especie)$r.squared,
    summary(modelo_longitud_comparable)$r.squared,
    summary(modelo_edad_comparable)$r.squared
  ),
  R2_ajustado = c(
    summary(modelo_especie)$adj.r.squared,
    summary(modelo_longitud_comparable)$adj.r.squared,
    summary(modelo_edad_comparable)$adj.r.squared
  ),
  AIC = c(
    AIC(modelo_especie),
    AIC(modelo_longitud_comparable),
    AIC(modelo_edad_comparable)
  )
)

comparacion_modelos <- comparacion_modelos %>%
  mutate(
    R2 = round(R2, 4),
    R2_ajustado = round(R2_ajustado, 4),
    AIC = round(AIC, 2)
  )

print(comparacion_modelos)

# Modelo completo solo si hay al menos 2 especies en la submuestra con edad válida
if (nlevels(droplevels(datos_modelo_edad$Especie)) >= 2) {
  modelo_completo <- lm(log_Peso_g ~ Especie + Longitud_cm + Edad, data = datos_modelo_edad)
  
  cat("
Resumen del modelo completo:
")
  print(summary(modelo_completo))
} else {
  cat("
No se puede ajustar el modelo completo con Especie + Longitud_cm + Edad,
")
  cat("porque en la submuestra con edad válida solo hay una especie.
")
}
```

```{r}
mejor_factor <- comparacion_modelos$Modelo[which.max(comparacion_modelos$R2_ajustado[1:3])]
cat("El factor individual con mayor R2 ajustado es:", mejor_factor, "
")
```

La comparación preliminar entre modelos simples sobre `log(Peso_g)` sugiere que la longitud es el factor individual más informativo de los considerados. En concreto, el modelo con longitud alcanza un R² ajustado de 0.9069, muy por encima del modelo con especie, cuyo R² ajustado es 0.3488. El modelo con edad obtiene un R² ajustado de 0.7726, también elevado, pero calculado sobre una submuestra más reducida y formada únicamente por jureles, por lo que su interpretación no es directamente comparable con la de los otros dos modelos. En consecuencia, dentro de las limitaciones de los datos disponibles, la longitud parece ser el factor que mejor explica el peso individual.

# Conclusión general

El estudio realizado a partir de los registros biológicos de la campaña DEMERSALES 2022 muestra que el peso individual de los ejemplares analizados no depende de un único factor, sino que se relaciona con varias características biométricas y biológicas. En la muestra final se dispuso de 956 observaciones válidas, repartidas de manera muy equilibrada entre merluza (477) y jurel (479), lo que permitió comparar ambas especies con una base muestral sólida.

Desde el punto de vista descriptivo e inferencial, la especie sí introduce diferencias claras en el peso. La merluza presenta un peso medio muy superior al del jurel, y esta diferencia queda cuantificada por un intervalo de confianza del 95% para la diferencia de medias de (366.15, 490.21) gramos y confirmada por el contraste t de Welch, con una diferencia media estimada de 428.18 gramos y un p-valor prácticamente nulo. Por tanto, la especie se asocia de forma evidente con el peso individual.

No obstante, el análisis sugiere que la longitud es el factor individual con mayor capacidad explicativa sobre el peso. Las correlaciones entre longitud y peso son muy altas en ambas especies, y el modelo lineal simple sobre `log(Peso_g)` con longitud como predictor alcanza un R² ajustado de 0.9069, claramente superior al del modelo basado únicamente en la especie (0.3488). Esto indica que una parte muy importante de la variabilidad del peso puede entenderse a partir del tamaño del ejemplar.

Por su parte, la edad también muestra una asociación elevada con el peso, pero su análisis queda limitado por la calidad y disponibilidad de los datos. En la muestra final solo se dispone de edades válidas para el jurel, donde la relación edad-peso es muy fuerte. Sin embargo, al no poder compararse ambas especies en igualdad de condiciones, la edad debe considerarse en este trabajo como un factor potencialmente relevante, pero con evidencia menos completa que la disponible para la longitud y la especie.

En conjunto, los resultados permiten responder a la pregunta central del estudio: entre los factores considerados, la longitud parece explicar mejor el peso individual, seguida por la edad en la submuestra donde esta está disponible, mientras que la especie también resulta importante, aunque en menor medida cuando se compara su capacidad explicativa aislada. Así, el trabajo muestra cómo el uso combinado de análisis exploratorio, intervalos de confianza, contrastes de hipótesis y modelos lineales simples permite extraer conclusiones útiles y bien fundamentadas a partir de datos biológicos reales.

# Referencias y Fuentes de Datos

Para garantizar la transparencia, reproducibilidad y el rigor académico de este análisis, los microdatos empleados han sido extraídos de fuentes oficiales, públicas y contrastadas:

- **Instituto Español de Oceanografía (IEO-CSIC)**: organismo público de investigación responsable de la ejecución de las campañas oceanográficas (como *SP-NORTH*) y de la recolección biológica en origen. [Visitar web oficial](https://www.ieo.csic.es/es)
- **ICES / CIEM (Consejo Internacional para la Exploración del Mar)**: organización intergubernamental que centraliza, coordina y publica los datos marinos en el Atlántico Norte. [Portal del ICES](https://www.ices.dk/)
- **Base de datos DATRAS**: *Database of Trawl Surveys*, repositorio específico del ICES del cual se han extraído los registros de captura a nivel biológico (registro `"CA"`). [Explorar DATRAS](https://datras.ices.dk/)
- **Librería `icesDatras`**: paquete oficial del lenguaje R utilizado para consumir y automatizar las consultas a la API web del ICES de forma programática. [Documentación en CRAN](https://cran.r-project.org/web/packages/icesDatras/index.html)
