🦪 Contexto del estudio Dos tipos de moluscos (A y B) fueron sometidos a tres concentraciones distintas de agua de mar (100%, 75% y 50%), con el fin de evaluar su consumo de oxígeno, medido como la proporción de O2 por unidad de peso seco del molusco. El diseño corresponde a un experimento factorial 2×3 (tipo de molusco × concentración de agua de mar), con 8 réplicas por combinación, para un total de 48 observaciones.
48Observaciones
2Tipos de molusco (A, B)
3Concentraciones de agua de mar
1Variable respuesta (Consumo O2)
library(tidyverse)
library(agricolae)
library(car)
library(knitr)
library(kableExtra)
load("moluscos.RData")
BD_moluscos <- BD_moluscos %>%
mutate(
c_agua = factor(c_agua, levels = c(100, 75, 50)),
molusco = factor(molusco)
)
Se realiza un análisis exploratorio univariado para cada variable del estudio (tipo de molusco, concentración de agua de mar y consumo de oxígeno), con el fin de describir su comportamiento individual antes de evaluar relaciones entre variables.
Al ser variables cualitativas (factores), se describen mediante tablas de frecuencia y no mediante estadísticos de tendencia central.
tabla_molusco <- as.data.frame(table(BD_moluscos$molusco))
kable(tabla_molusco,
caption = "Frecuencia por tipo de molusco",
col.names = c("Molusco", "N"),
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Molusco | N |
|---|---|
| A | 24 |
| B | 24 |
tabla_agua <- as.data.frame(table(BD_moluscos$c_agua))
kable(tabla_agua,
caption = "Frecuencia por concentración de agua de mar",
col.names = c("Concentración (%)", "N"),
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Concentración (%) | N |
|---|---|
| 100 | 16 |
| 75 | 16 |
| 50 | 16 |
resumen_o2 <- data.frame(
Estadistico = c("Mínimo", "1er Cuartil", "Mediana", "Media", "3er Cuartil",
"Máximo", "Desviación estándar"),
Valor = round(c(min(BD_moluscos$cons_o), quantile(BD_moluscos$cons_o, 0.25),
median(BD_moluscos$cons_o), mean(BD_moluscos$cons_o),
quantile(BD_moluscos$cons_o, 0.75), max(BD_moluscos$cons_o),
sd(BD_moluscos$cons_o)), 2)
)
kable(resumen_o2,
caption = "Estadísticos descriptivos del consumo de O2",
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Estadistico | Valor |
|---|---|
| Mínimo | 1.80 |
| 1er Cuartil | 6.31 |
| Mediana | 9.70 |
| Media | 9.30 |
| 3er Cuartil | 11.23 |
| Máximo | 18.80 |
| Desviación estándar | 3.68 |
ggplot(BD_moluscos, aes(x = cons_o)) +
geom_histogram(bins = 10, fill = "steelblue", color = "white") +
labs(title = "Distribución del consumo de O2", x = "Consumo de O2", y = "Frecuencia") +
theme_minimal()
ggplot(BD_moluscos, aes(y = cons_o)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "Boxplot del consumo de O2", y = "Consumo de O2") +
theme_minimal()
🔍 Interpretación El diseño es completamente balanceado: 24 observaciones para cada tipo de molusco (A y B) y 16 observaciones para cada concentración de agua de mar (100%, 75% y 50%). Respecto al consumo de oxígeno, la media (9.30) y la mediana (9.70) son cercanas entre sí, lo que sugiere una asimetría moderada. La desviación estándar (3.68) frente a una media de 9.30 indica una dispersión relativa considerable (CV ≈ 40%). El histograma muestra una distribución con una ligera cola hacia valores altos, y el boxplot evidencia un valor atípico (18.8), correspondiente al máximo registrado. Es importante notar que este análisis mezcla las seis combinaciones posibles de molusco y concentración; el comportamiento diferenciado entre grupos se explora en el análisis bivariado.
Se evalúa cómo se comporta el consumo de oxígeno según la concentración de agua de mar, y si este comportamiento es consistente entre los dos tipos de molusco.
ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = molusco)) +
geom_boxplot() +
labs(title = "Consumo de O2 según concentración de agua y tipo de molusco",
x = "Concentración de agua de mar (%)",
y = "Consumo de O2",
fill = "Molusco") +
theme_minimal()
medias <- BD_moluscos %>%
group_by(c_agua, molusco) %>%
summarise(media_cons_o = round(mean(cons_o), 2), .groups = "drop")
kable(medias,
caption = "Media de consumo de O2 por combinación molusco x concentración",
col.names = c("Concentración (%)", "Molusco", "Media Consumo O2"),
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Concentración (%) | Molusco | Media Consumo O2 |
|---|---|---|
| 100 | A | 9.94 |
| 100 | B | 7.41 |
| 75 | A | 7.89 |
| 75 | B | 6.10 |
| 50 | A | 12.18 |
| 50 | B | 12.33 |
ggplot(medias, aes(x = c_agua, y = media_cons_o, color = molusco, group = molusco)) +
geom_point(size = 3) +
geom_line(linewidth = 1) +
labs(title = "Gráfico de interacción: concentración x tipo de molusco",
x = "Concentración de agua de mar (%)",
y = "Media de consumo de O2",
color = "Molusco") +
theme_minimal()
🔍 Interpretación En las concentraciones de 100% y 75%, el molusco A presenta un consumo de oxígeno promedio superior al molusco B (9.94 vs 7.41, y 7.89 vs 6.10, respectivamente). Sin embargo, en la concentración de 50%, ambos tipos de molusco presentan un consumo prácticamente idéntico (12.2 vs 12.3). En ambos moluscos, el patrón general frente a la concentración es el mismo: el consumo disminuye de 100% a 75%, y luego aumenta marcadamente al llegar a 50%. Esta forma de “V” sugiere que una menor concentración de agua de mar (mayor dilución, y por tanto mayor estrés osmótico) incrementa la demanda de oxígeno. El hecho de que la brecha entre A y B se reduzca en la concentración más baja podría sugerir una interacción leve entre los factores, lo cual se evalúa formalmente en el ANOVA.
📐 Enfoque estadístico Se ajusta un ANOVA de dos vías con los factores tipo de molusco, concentración de agua de mar y su interacción, sobre la variable respuesta consumo de oxígeno. Se verifican los supuestos de normalidad de los residuales (Shapiro-Wilk) y homogeneidad de varianzas (Levene), y en caso de encontrar efectos significativos se realizan comparaciones post-hoc mediante la prueba de LSD.
modelo <- aov(cons_o ~ molusco * c_agua, data = BD_moluscos)
anova_tabla <- as.data.frame(summary(modelo)[[1]])
anova_tabla <- round(anova_tabla, 4)
kable(anova_tabla,
caption = "Tabla ANOVA: Consumo de O2 ~ Molusco * Concentración de agua",
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| molusco | 1 | 23.2269 | 23.2269 | 2.6508 | 0.1110 |
| c_agua | 2 | 230.8160 | 115.4080 | 13.1712 | 0.0000 |
| molusco:c_agua | 2 | 15.3563 | 7.6781 | 0.8763 | 0.4238 |
| Residuals | 42 | 368.0112 | 8.7622 | NA | NA |
shapiro_res <- shapiro.test(residuals(modelo))
levene_res <- leveneTest(cons_o ~ molusco * c_agua, data = BD_moluscos)
supuestos_tabla <- data.frame(
Prueba = c("Shapiro-Wilk (normalidad)", "Levene (homogeneidad de varianzas)"),
Estadistico = c(round(shapiro_res$statistic, 4), round(levene_res$`F value`[1], 4)),
p_valor = c(round(shapiro_res$p.value, 4), round(levene_res$`Pr(>F)`[1], 4))
)
kable(supuestos_tabla,
caption = "Verificación de supuestos del ANOVA",
col.names = c("Prueba", "Estadístico", "p-valor"),
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Prueba | Estadístico | p-valor |
|---|---|---|
| Shapiro-Wilk (normalidad) | 0.9582 | 0.0857 |
| Levene (homogeneidad de varianzas) | 0.1723 | 0.9715 |
par(mfrow = c(1, 2))
plot(modelo, which = 1)
plot(modelo, which = 2)
par(mfrow = c(1, 1))
✅ Interpretación de supuestos La prueba de Shapiro-Wilk sobre los residuales arroja un valor-p = 0.086, por lo que el supuesto de normalidad no se rechaza (los residuales son compatibles con una distribución normal). La prueba de Levene arroja un valor-p = 0.972, por lo que el supuesto de homogeneidad de varianzas tampoco se rechaza. Ambos supuestos se cumplen satisfactoriamente, lo que respalda la validez del ANOVA de dos vías.
🔍 Interpretación El ANOVA de dos vías evidenció que el tipo de molusco no tuvo un efecto significativo sobre el consumo de O2 (F(1,42) = 2.65, p = 0.111), y que la interacción entre molusco y concentración de agua tampoco fue significativa (F(2,42) = 0.876, p = 0.424). Esto indica que el efecto de la concentración de agua es consistente entre ambos tipos de molusco. En cambio, la concentración de agua de mar mostró un efecto altamente significativo sobre el consumo de oxígeno (F(2,42) = 13.17, p < 0.001). Dado que el único efecto significativo corresponde al factor concentración, las comparaciones post-hoc se centran en dicho factor.
posanova_c <- LSD.test(modelo, "c_agua", console = FALSE)
kable(as.data.frame(posanova_c$statistics),
caption = "Estadísticos generales del modelo",
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| MSerror | Df | Mean | CV | t.value | LSD |
|---|---|---|---|---|---|
| 8.76217 | 42 | 9.304792 | 31.8126 | 2.018082 | 2.112028 |
grupos_tabla <- posanova_c$groups
grupos_tabla$Concentracion <- rownames(grupos_tabla)
grupos_tabla <- grupos_tabla[, c("Concentracion", "cons_o", "groups")]
kable(grupos_tabla,
caption = "Agrupamiento LSD — Concentración de agua de mar",
col.names = c("Concentración (%)", "Consumo O2 promedio", "Grupo"),
row.names = FALSE,
table.attr = "class='tabla-verde'") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Concentración (%) | Consumo O2 promedio | Grupo |
|---|---|---|
| 50 | 12.25062 | a |
| 100 | 8.67125 | b |
| 75 | 6.99250 | b |
🔍 Interpretación La prueba de LSD muestra que la concentración de 50% forma un grupo estadísticamente distinto (grupo “a”), con el mayor consumo promedio de oxígeno (12.25), mientras que las concentraciones de 100% (8.67) y 75% (6.99) comparten el grupo “b”, sin diferencias significativas entre ellas. Esto indica que la caída del consumo de O2 entre 100% y 75% no es estadísticamente significativa, pero el incremento marcado al llegar a 50% sí lo es. Estos resultados sugieren que una dilución fuerte del agua de mar (50%) genera una condición de estrés osmótico que obliga a los moluscos —independientemente del tipo— a incrementar significativamente su consumo de oxígeno.
🦪 Conclusiones
Análisis univariado (a): el diseño es completamente balanceado (24 obs. por tipo de molusco, 16 obs. por concentración). El consumo de O2 presenta una media de 9.30, una dispersión considerable (CV ≈ 40%) y un valor atípico (18.8).
Análisis bivariado (b): el consumo de O2 sigue un patrón en “V” frente a la concentración de agua (baja de 100% a 75%, y sube fuertemente en 50%) en ambos tipos de molusco. La diferencia entre molusco A y B es notoria en 100% y 75%, pero se diluye en 50%, lo que sugirió visualmente una posible interacción.
ANOVA de dos vías (c): se confirmó que la concentración de agua de mar afecta significativamente el consumo de O2 (F(2,42) = 13.17, p < 0.001), mientras que el tipo de molusco (p = 0.111) y la interacción molusco×concentración (p = 0.424) no fueron significativos. Ambos supuestos del modelo (normalidad, Shapiro-Wilk p = 0.086; homogeneidad de varianzas, Levene p = 0.972) se cumplieron. La prueba post-hoc de LSD mostró que la concentración de 50% difiere significativamente de 100% y 75%, mientras que estas dos últimas no difieren entre sí.
Conclusión integradora: la concentración de agua de mar es el factor determinante del consumo de oxígeno en estos moluscos, con un efecto consistente para ambos tipos (A y B). La dilución del agua de mar hasta 50% genera un incremento significativo en el consumo de O2, probablemente asociado a un mayor esfuerzo osmorregulador de los organismos ante el estrés hipoosmótico.