Punto 2: Moluscos

Análisis exploratorio univariado

Se analizaron las tres variables del estudio: el tipo de molusco y la concentración de agua de mar (cualitativas), y el consumo de oxígeno (cuantitativa). Para las variables cualitativas se calcularon tablas de frecuencia absoluta y relativa, y para el consumo de oxígeno se calcularon los indicadores media, mediana, desviación estándar, coeficiente de variación (CV%), mínimo y máximo. Por ultimo, se hallaron los gráficos de distribución para las tres variables.

library(ggplot2)
library(dplyr)
library(knitr)

load("~/Cuarto semestre/Diseño de Experimentos/Taller 1/Recursos/moluscos.RData")   

BD_moluscos <- BD_moluscos %>%
  mutate(
    molusco = factor(molusco),
    c_agua  = factor(c_agua, levels = c(100, 75, 50),
                      labels = c("100%", "75%", "50%"))
  )

tabla_molusco <- BD_moluscos %>%
  count(molusco) %>%
  mutate(`Porcentaje (%)` = round(n / sum(n) * 100, 1))
kable(tabla_molusco, caption = "Tabla 1. Frecuencia por tipo de molusco (N = 48).",
      col.names = c("Tipo de molusco", "n", "Porcentaje (%)"), align = "c")
Tabla 1. Frecuencia por tipo de molusco (N = 48).
Tipo de molusco n Porcentaje (%)
A 24 50
B 24 50
tabla_conc <- BD_moluscos %>%
    count(c_agua) %>%
    mutate(`Porcentaje (%)` = round(n / sum(n) * 100, 1))
kable(tabla_conc, caption = "Tabla 2. Frecuencia por concentración de agua de mar (N = 48).",
      col.names = c("Concentración de agua de mar", "n", "Porcentaje (%)"), align = "c")
Tabla 2. Frecuencia por concentración de agua de mar (N = 48).
Concentración de agua de mar n Porcentaje (%)
100% 16 33.3
75% 16 33.3
50% 16 33.3
tabla_univariado <- BD_moluscos %>%
    summarise(
        Media = mean(cons_o),
        Mediana = median(cons_o),
        `Desv. Est.` = sd(cons_o),
        Mínimo = min(cons_o),
        Máximo = max(cons_o),
        `CV (%)` = (sd(cons_o) / mean(cons_o)) * 100
    ) %>%
    mutate(across(everything(), ~ round(., 2))) %>%
    mutate(Variable = "Consumo de O2", .before = 1)

kable(tabla_univariado, caption = "Tabla 3. Medidas descriptivas del consumo de oxígeno (N = 48).")
Tabla 3. Medidas descriptivas del consumo de oxígeno (N = 48).
Variable Media Mediana Desv. Est. Mínimo Máximo CV (%)
Consumo de O2 9.3 9.7 3.68 1.8 18.8 39.58

Gráficos de Distribución

Los gráficos de distribución para las tres variables:

# Gráfico tipo de molusco
g_molusco <- ggplot(BD_moluscos, aes(x = molusco)) +
  geom_bar(fill = "firebrick", color = "black", width = 0.6) +
  theme_minimal() +
  labs(title = "Distribución por tipo de molusco", x = "Tipo de molusco", y = "Frecuencia")

# Gráfico concentración de agua de mar
g_conc <- ggplot(BD_moluscos, aes(x = c_agua)) +
  geom_bar(fill = "darkseagreen", color = "black", width = 0.6) +
  theme_minimal() +
  labs(title = "Distribución por concentración de agua de mar", x = "Concentración", y = "Frecuencia")

# Gráfico consumo de oxígeno
g_cons <- ggplot(BD_moluscos, aes(x = factor(cut(cons_o, breaks = 6)))) +
  geom_bar(fill = "orange", color = "black", width = 0.6) +
  theme_minimal() +
  labs(title = "Distribución del consumo de O2", x = "Consumo de O2", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

g_molusco

g_conc

g_cons

Interpretación del Análisis Univariado

Tipo de molusco: la base de datos está perfectamente balanceada entre los dos tipos, con 24 observaciones (50%) para el molusco A y 24 observaciones (50%) para el molusco B.

Concentración de agua de mar: las tres concentraciones presentan la misma cantidad de observaciones, 16 cada una (33.3%), lo que confirma un diseño balanceado de 8 réplicas por combinación de molusco y concentración.

Consumo de oxígeno: presenta una media de 9.30, una mediana de 9.70 y una desviación estándar de 3.68, con valores que oscilan entre 1.8 y 18.8. El coeficiente de variación es de 39.58%, lo que indica una variabilidad relativamente alta en el consumo de oxígeno entre los individuos evaluados. En el gráfico de distribución se observa una ligera concentración de datos hacia los valores medios-bajos, sin una asimetría marcada.

Análisis exploratorio bivariado

Para conocer cómo es el consumo de oxígeno en las distintas concentraciones de agua de mar, y si esta relación es la misma para cada tipo de molusco, se realizaron tablas de medias por grupo, diagramas de cajas y un gráfico de interacción entre los dos factores.

library(patchwork)

#Tabla de medias 1
tabla_conc_cons <- BD_moluscos %>%
  group_by(c_agua) %>%
  summarise(n = n(), Media = round(mean(cons_o), 2), `Desv. Est.` = round(sd(cons_o), 2))
kable(tabla_conc_cons, caption = "Tabla 4. Consumo medio de O2 según concentración de agua de mar.")
Tabla 4. Consumo medio de O2 según concentración de agua de mar.
c_agua n Media Desv. Est.
100% 16 8.67 3.0
75% 16 6.99 2.8
50% 16 12.25 3.2
#Tabla de medias 2
tabla_molusco_conc <- BD_moluscos %>%
  group_by(molusco, c_agua) %>%
  summarise(n = n(), Media = round(mean(cons_o), 2), `Desv. Est.` = round(sd(cons_o), 2), .groups = "drop")
kable(tabla_molusco_conc, caption = "Tabla 5. Consumo medio de O2 según concentración y tipo de molusco.")
Tabla 5. Consumo medio de O2 según concentración y tipo de molusco.
molusco c_agua n Media Desv. Est.
A 100% 8 9.94 2.75
A 75% 8 7.89 2.74
A 50% 8 12.18 3.09
B 100% 8 7.41 2.84
B 75% 8 6.10 2.74
B 50% 8 12.33 3.52
# consumo de O2 según concentración de agua
g_box_conc <- ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = c_agua)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Consumo de O2 según concentración de agua", x = "Concentración de agua de mar", y = "Consumo de O2") +
  theme(legend.position = "none")


g_box_molusco <- ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = molusco)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Consumo de O2 por concentración y tipo de molusco", x = "Concentración de agua de mar", y = "Consumo de O2", fill = "Molusco")

g_box_conc | g_box_molusco

#Gráfico de interacción 
ggplot(tabla_molusco_conc, aes(x = c_agua, y = Media, group = molusco, color = molusco)) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  theme_minimal() +
  labs(title = "Gráfico de interacción: Molusco x Concentración de agua",
       x = "Concentración de agua de mar", y = "Consumo medio de O2", color = "Molusco")

Interpretación del Análisis Exploratorio Bivariado

Al observar el consumo de oxígeno según la concentración de agua de mar, se aprecia un comportamiento no lineal: el mayor consumo medio se presenta en la concentración más baja, 50% (media = 12.25), posterios de la concentración de 100% (media = 8.67), y el menor consumo se registra en la concentración de 75% (media = 6.99). Es decir, los moluscos consumen más oxígeno cuando el agua está más diluida (50%) que en las concentraciones de 75% y 100%.

Al separar este comportamiento por tipo de molusco (Tabla 5 y gráfico de interacción), se observa que el patrón es muy similar para A y B: ambos alcanzan su mayor consumo en la concentración de 50% (molusco A = 12.18, molusco B = 12.33) y su menor consumo en la concentración de 75% (molusco A = 7.89, molusco B = 6.10), con las líneas del gráfico de interacción prácticamente paralelas. Esto sugiere que, la concentración de agua de mar afecta de manera similar a los dos tipos de molusco, sin evidencia contundente de una interacción entre los dos factores.

C. ANOVA de dos vías, verificación de supuestos y prueba LSD

Se evaluó mediante un Análisis de Varianza (ANOVA) de dos vías si el tipo de molusco, la concentración de agua de mar y la interacción entre ambos factores afectan de forma significativa el consumo de oxígeno.

library(car)
library(agricolae)

# 1. Modelo ANOVA de dos vías
modelo_anova <- aov(cons_o ~ molusco * c_agua, data = BD_moluscos)
summary_aov <- summary(modelo_anova)[[1]]

# Tabla ANOVA
tabla_anova <- data.frame(
  `Fuente de Variación` = c("Molusco", "Concentración de agua", "Molusco:Concentración", "Residuales"),
  `GL` = summary_aov$Df,
  `Suma Cuadrados` = round(summary_aov$`Sum Sq`, 2),
  `Cuadrado Medio` = round(summary_aov$`Mean Sq`, 2),
  `F Calculado` = c(round(summary_aov$`F value`[1:3], 2), "-"),
  `Valor p` = c(format.pval(summary_aov$`Pr(>F)`[1:3], digits = 3), "-"),
  check.names = FALSE
)

### Supuestos
residuos <- residuals(modelo_anova)
shapiro_test <- shapiro.test(residuos)
levene_test <- leveneTest(cons_o ~ molusco * c_agua, data = BD_moluscos)

tabla_supuestos <- data.frame(
  `Supuesto Evaluado` = c("Normalidad (Shapiro-Wilk)", "Homocedasticidad (Levene)"),
  `Estadístico` = round(c(shapiro_test$statistic, levene_test$`F value`[1]), 3),
  `Valor p` = round(c(shapiro_test$p.value, levene_test$`Pr(>F)`[1]), 4),
  `Conclusión` = c(
    ifelse(shapiro_test$p.value > 0.05, "Cumple supuesto (p > 0.05)", "No cumple"),
    ifelse(levene_test$`Pr(>F)`[1] > 0.05, "Cumple supuesto (p > 0.05)", "No cumple")
  ),
  check.names = FALSE
)

# Prueba LSD de Fisher 
lsd_res <- LSD.test(modelo_anova, "c_agua", p.adj = "none")
tabla_lsd <- data.frame(
  `Concentración` = rownames(lsd_res$groups),
  `Consumo O2 Promedio` = round(lsd_res$groups$cons_o, 2),
  `Grupo Significación` = lsd_res$groups$groups,
  check.names = FALSE
)

1. Tabla del Análisis de Varianza (ANOVA)

kable(tabla_anova, align = "c")
Fuente de Variación GL Suma Cuadrados Cuadrado Medio F Calculado Valor p
Molusco 1 23.23 23.23 2.65 0.111
Concentración de agua 2 230.82 115.41 13.17 3.63e-05
Molusco:Concentración 2 15.36 7.68 0.88 0.424
Residuales 42 368.01 8.76 - -

2. Verificación de Supuestos Estadísticos

kable(tabla_supuestos, align = "c")
Supuesto Evaluado Estadístico Valor p Conclusión
W Normalidad (Shapiro-Wilk) 0.958 0.0857 Cumple supuesto (p > 0.05)
Homocedasticidad (Levene) 0.172 0.9715 Cumple supuesto (p > 0.05)
par(mfrow = c(1, 2))
plot(modelo_anova, which = 1, main = "Homocedasticidad", caption = "")
plot(modelo_anova, which = 2, main = "Normalidad (Q-Q Plot)", caption = "")

par(mfrow = c(1, 1))

3. Prueba de Comparación Múltiple (LSD de Fisher)

kable(tabla_lsd, align = "c")
Concentración Consumo O2 Promedio Grupo Significación
50% 12.25 a
100% 8.67 b
75% 6.99 b

Interpretación de Resultados

ANOVA: Al observar la Tabla del Análisis de Varianza, el factor Molusco presentó una Suma de Cuadrados de 23.23 con 1 grado de libertad, un Cuadrado Medio de 23.23, un estadístico F de 2.65 y un valor p de 0.111. Como el valor p es mayor a 0.05, no se rechaza la hipótesis nula, por lo que el tipo de molusco (A o B) no tiene un efecto significativo sobre el consumo de oxígeno. El factor Concentración de agua registró una Suma de Cuadrados de 230.82 con 2 grados de libertad, un Cuadrado Medio de 115.41, un estadístico F de 13.17 y un valor p < 0.001. Al ser el valor p considerablemente inferior a 0.05, se rechaza la hipótesis nula, concluyendo que la concentración de agua de mar sí ejerce un efecto significativo sobre el consumo de oxígeno. Por ultimo, la interacción Molusco vs Concentración presentó una Suma de Cuadrados de 15.36, un Cuadrado Medio de 7.68, un estadístico F de 0.88 y un valor p de 0.424, por lo que no se rechaza la hipótesis nula de no interacción; eso quiere deci quer, el efecto de la concentración de agua sobre el consumo de oxígeno es estadísticamente el mismo para ambos tipos de molusco, tal como se había planteado en el análisis exploratorio bivariado.

Supuestos Estadísticos del Modelo: Con el fin de garantizar la validez inferencial del ANOVA, se verificaron los supuestos sobre los residuales del modelo.

Normalidad: la prueba de Shapiro-Wilk arrojó un estadístico W = 0.958 con un valor p = 0.0857. Dado que p > 0.05, no existe evidencia suficiente para rechazar la hipótesis de normalidad, concluyendo que los residuales se distribuyen de forma normal. Esto se confirma ven el gráfico Q-Q, donde los cuantiles observados se alinean de forma cercana a la línea teórica, sin desviaciones importantes en los extremos.

Homocedasticidad: la prueba de Levene arrojó un estadístico F = 0.186 con un valor p = 0.9665. Como p > 0.05, no se rechaza la hipótesis nula de igualdad de varianzas, por lo que se cumple el supuesto de homocedasticidad. Esto es consistente con el gráfico de Residuales x Ajustados, en el que la dispersión de los residuales se mantiene algo estable a lo largo de los valores ajustados.

Prueba LSD de Fisher: Dado que el ANOVA solo identificó un efecto significativo para el factor Concentración de agua, la prueba LSD de Fisher (α = 0.05) se aplicó sobre este factor, obteniéndose 2 grupos de significación:

  • Concentración 50%: presentó el consumo de oxígeno promedio más alto, con 12.25, ubicándose de forma exclusiva en el grupo de significación a.

  • Concentración 100%: alcanzó un consumo promedio de 8.67, clasificándose en el grupo b.

  • Concentración 75%: registró el consumo promedio más bajo, con 6.99, compartiendo el grupo b con la concentración de 100%, es decir, no se encontró diferencia estadísticamente significativa entre estas dos concentraciones.

En conclusión, la concentración de agua de mar al 50% genera un consumo de oxígeno mucho mayor que las concentraciones de 75% y 100%, mientras que entre estas dos no se halla una diferencia significativa. Dado que el tipo de molusco no resultó significativo ni tampoco su interacción con la concentración, este efecto de la concentración sobre el consumo de oxígeno aplica de igual manera para los moluscos A y B.