Se sometieron dos tipos de moluscos (A y B) a tres concentraciones de agua de mar (100%, 75% y 50%), y se midió el consumo de oxígeno (proporción de O2 por unidad de peso seco). El diseño es balanceado, con 8 réplicas por combinación** (48 observaciones en total). El objetivo es evaluar si el tipo de molusco y la concentración de agua de mar (y su interacción) afectan el consumo de oxígeno.
library(ggplot2)
library(dplyr)
library(knitr)
library(car) # Levene
library(agricolae) # LSD.test (post-hoc)
load("moluscos.RData") # objeto: BD_moluscos
# Convertimos las variables categóricas a factor.
# La concentración se deja como factor (no numérica), porque en este
# taller nos interesa comparar niveles discretos, no un efecto lineal continuo.
BD_moluscos <- BD_moluscos %>%
mutate(
c_agua = factor(c_agua, levels = c(50, 75, 100),
labels = c("50%", "75%", "100%")),
molusco = factor(molusco)
)
str(BD_moluscos)
## tibble [48 × 3] (S3: tbl_df/tbl/data.frame)
## $ c_agua : Factor w/ 3 levels "50%","75%","100%": 3 3 3 3 3 3 3 3 3 3 ...
## $ molusco: Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 2 2 ...
## $ cons_o : num [1:48] 7.16 8.26 6.78 14 13.6 11.1 8.93 9.66 6.14 6.14 ...
Variable molusco (tipo de molusco, cualitativa
nominal):
table(BD_moluscos$molusco)
##
## A B
## 24 24
Variable c_agua (concentración de agua de mar,
cualitativa ordinal):
table(BD_moluscos$c_agua)
##
## 50% 75% 100%
## 16 16 16
Las dos tablas confirman que el diseño está perfectamente balanceado: 24 observaciones para cada tipo de molusco y 16 para cada concentración, con 8 réplicas en cada una de las 6 combinaciones molusco x concentración.
Variable cons_o (consumo de oxígeno,
cuantitativa continua):
BD_moluscos %>%
summarise(
n = n(),
media = mean(cons_o),
de = sd(cons_o),
cv_pct = 100 * de / media,
min = min(cons_o),
q1 = quantile(cons_o, 0.25),
mediana= median(cons_o),
q3 = quantile(cons_o, 0.75),
max = max(cons_o)
) %>%
kable(digits = 2, caption = "Estadísticos descriptivos del consumo de oxígeno (global)")
| n | media | de | cv_pct | min | q1 | mediana | q3 | max |
|---|---|---|---|---|---|---|---|---|
| 48 | 9.3 | 3.68 | 39.58 | 1.8 | 6.31 | 9.7 | 11.23 | 18.8 |
p1 <- ggplot(BD_moluscos, aes(x = cons_o)) +
geom_histogram(bins = 10, fill = "steelblue", color = "white") +
labs(title = "Histograma del consumo de O2", x = "Consumo de O2", y = "Frecuencia") +
theme_minimal()
p2 <- ggplot(BD_moluscos, aes(y = cons_o)) +
geom_boxplot(fill = "steelblue") +
labs(title = "Boxplot del consumo de O2", y = "Consumo de O2") +
theme_minimal() +
theme(axis.text.x = element_blank(), axis.ticks.x = element_blank())
gridExtra::grid.arrange(p1, p2, ncol = 2)
Interpretación graficas: Distribución univariada del
consumo de oxígeno considerando las 48 observaciones en conjunto, sin
distinguir por tipo de molusco ni concentración de agua de mar. El
histograma (izquierda) agrupa los datos en intervalos de igual amplitud
y muestra la frecuencia de observaciones en cada uno, permitiendo
identificar la forma general de la distribución. El diagrama de caja
(derecha) resume la misma variable mediante sus cuartiles (Q1, mediana,
Q3), los límites de dispersión normal (bigotes) y los valores
atípicos
Interpretación (a): el consumo de oxígeno global tiene una media cercana a 9-10 unidades, con una dispersión moderada (CV alrededor de 30-35%, valor típico en variables fisiológicas). El histograma muestra una distribución con ligera asimetría positiva (cola hacia la derecha) y el boxplot evidencia un valor atípico. Esta variabilidad relativamente alta es esperable porque, como se verá en el literal (b), el consumo de oxígeno cambia según el molusco y la concentración de agua, por lo que la distribución “global” mezcla varias subpoblaciones distintas.
Consumo de oxígeno según concentración de agua de mar (sin distinguir molusco):
ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = c_agua)) +
geom_boxplot(alpha = 0.8) +
labs(title = "Consumo de O2 según concentración de agua de mar",
x = "Concentración de agua de mar", y = "Consumo de O2") +
theme_minimal() +
theme(legend.position = "none")
Interpretación grafica: Diagrama de caja del consumo de oxígeno según las tres concentraciones de agua de mar (50%, 75% y 100%), agrupando conjuntamente los dos tipos de molusco. Permite comparar visualmente la mediana, la dispersión y el rango de valores del consumo de oxígeno entre los tres niveles de concentración, como primer paso exploratorio antes de confirmar formalmente estas diferencias mediante el ANOVA de dos vías. Se observa que la concentración de 50% presenta el consumo más alto y disperso, mientras que 75% y 100% muestran medianas más bajas y relativamente similares entre sí.
BD_moluscos %>%
group_by(c_agua) %>%
summarise(media = mean(cons_o), de = sd(cons_o)) %>%
kable(digits = 2, caption = "Consumo de O2 promedio por concentración")
| c_agua | media | de |
|---|---|---|
| 50% | 12.25 | 3.2 |
| 75% | 6.99 | 2.8 |
| 100% | 8.67 | 3.0 |
El consumo de oxígeno no es monótono en la concentración: es más alto al 50%, disminuye al 75% y sube de nuevo (parcialmente) al 100%. En otras palabras, la mayor diferencia se observa entre la concentración baja (50%) y la intermedia (75%), sugiriendo que la dilución del agua de mar exige un mayor gasto metabólico al molusco.
¿Este patrón es el mismo para los dos tipos de molusco?
ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, color = molusco, fill = molusco)) +
geom_boxplot(alpha = 0.5, position = position_dodge(0.8)) +
labs(title = "Consumo de O2 por concentración, según tipo de molusco",
x = "Concentración de agua de mar", y = "Consumo de O2",
color = "Molusco", fill = "Molusco") +
theme_minimal()
Interpretación grafica: Diagrama de caja del consumo de
oxígeno según concentración de agua de mar, separado por tipo de molusco
(A y B), permitiendo comparar simultáneamente ambos factores. Cada
concentración muestra dos cajas lado a lado (una por molusco), lo que
facilita observar si el patrón de consumo frente a la concentración es
similar o distinto entre A y B. Se observa que en la concentración de
50% ambos moluscos presentan medianas y dispersión similares, mientras
que en 75% y especialmente en 100% el molusco A muestra una mediana más
alta que B, sugiriendo visualmente una posible diferencia en la
respuesta de cada especie ante la disminución de la concentración de
agua de mar.
resumen <- BD_moluscos %>%
group_by(c_agua, molusco) %>%
summarise(media = mean(cons_o), .groups = "drop")
kable(resumen, digits = 2, caption = "Consumo de O2 promedio por combinación")
| c_agua | molusco | media |
|---|---|---|
| 50% | A | 12.18 |
| 50% | B | 12.33 |
| 75% | A | 7.89 |
| 75% | B | 6.10 |
| 100% | A | 9.94 |
| 100% | B | 7.41 |
ggplot(resumen, aes(x = c_agua, y = media, color = molusco, group = molusco)) +
geom_point(size = 3) +
geom_line(linewidth = 1) +
labs(title = "Gráfico de interacción: molusco x concentración",
x = "Concentración de agua de mar", y = "Consumo de O2 promedio",
color = "Molusco") +
theme_minimal()
Interpretación grafica: Gráfico de perfiles o gráfico
de interacción que muestra el consumo promedio de oxígeno para cada
combinación de tipo de molusco (A, B) y concentración de agua de mar
(50%, 75%, 100%), con los puntos de cada molusco unidos por una línea
siguiendo el orden de concentración. Este gráfico permite evaluar
visualmente si el efecto de la concentración sobre el consumo de oxígeno
es el mismo para ambos tipos de molusco: si las líneas son paralelas, el
efecto es similar entre moluscos (no hay interacción); si no son
paralelas o se cruzan, sugiere que el efecto depende del tipo de molusco
(posible interacción). En este caso, las líneas descienden de forma casi
paralela entre 50% y 75%, pero se separan levemente entre 75% y 100%,
donde el molusco A muestra un mayor incremento que B – una divergencia
que se evalúa formalmente en el ANOVA de dos vías.
Interpretación (b): en la concentración de 50% ambos moluscos consumen prácticamente lo mismo, mientras que en 75% y 100% el molusco A muestra un promedio ligeramente mayor que B, y las líneas del gráfico de interacción se ven algo divergentes. A nivel puramente descriptivo esto sugiere que el patrón podría no ser idéntico para los dos moluscos. Sin embargo, esta impresión visual debe confirmarse con una prueba formal antes de sacar conclusiones. Esto se evalúa en el literal (c) mediante el término de interacción del ANOVA de dos vías.
Se plantean las siguientes hipótesis:
Efecto de la concentración de agua de mar:
H0: el consumo promedio de oxígeno es igual entre las tres concentraciones.
H1: al menos una concentración tiene un consumo promedio distinto.
modelo <- aov(cons_o ~ molusco * c_agua, data = BD_moluscos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## molusco 1 23.2 23.23 2.651 0.111
## c_agua 2 230.8 115.41 13.171 3.63e-05 ***
## molusco:c_agua 2 15.4 7.68 0.876 0.424
## Residuals 42 368.0 8.76
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
1. Normalidad de los residuales
residuos <- residuals(modelo)
qqnorm(residuos, main = "QQ-plot de los residuales")
qqline(residuos, col = "red")
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.95824, p-value = 0.08571
Interpretación graficas: Gráfico cuantil-cuantil (QQ-plot) de los residuales del modelo de ANOVA de dos vías, comparando los cuantiles observados de los residuales (eje Y) contra los cuantiles teóricos que se esperarían bajo una distribución normal perfecta (eje X). La línea roja representa la referencia de normalidad exacta; cuanto más se ajustan los puntos a esa línea, más se acerca la distribución de los residuales a la normalidad. Se utiliza como verificación visual del supuesto de normalidad, previa a la interpretación de la tabla ANOVA, y se complementa con la prueba formal de Shapiro-Wilk.
2. Homogeneidad de varianzas (Levene, sobre los 6 grupos molusco x concentración)
leveneTest(cons_o ~ molusco * c_agua, data = BD_moluscos)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 5 0.1723 0.9715
## 42
Interpretación de los supuestos: el QQ-plot muestra los residuales razonablemente alineados sobre la recta de referencia, y la prueba de Shapiro-Wilk da W = 0.958, valor-p = 0.086 > 0.05, por lo que no se rechaza la normalidad de los residuales. La prueba de Levene da F = 0.172, valor-p = 0.971 > 0.05, por lo que no hay evidencia de heterogeneidad de varianzas entre los 6 grupos molusco x concentración. Ambos supuestos se cumplen razonablemente, así que el ANOVA de dos vías es una técnica válida para este conjunto de datos.
De la tabla ANOVA:
molusco: evalúa
si, en promedio (a través de las tres concentraciones), el consumo de
oxígeno difiere entre A y B.c_agua: evalúa si,
en promedio (a través de los dos moluscos), el consumo de oxígeno
difiere entre las tres concentraciones.molusco:c_agua: evalúa si
el efecto de la concentración sobre el consumo de oxígeno es distinto
según el tipo de molusco.Con los datos analizados, la tabla ANOVA arroja:
| Fuente | gl | F | valor-p | ¿Significativo (α = 0.05)? |
|---|---|---|---|---|
| molusco | 1 | 2.65 | 0.111 | No |
| c_agua | 2 | 13.17 | 3.63e-05 | Sí |
| molusco:c_agua | 2 | 0.88 | 0.424 | No |
Interpretación:
Con base en la tabla ANOVA y usando α = 0.05:
Por tener un efecto principal significativo únicamente en
c_agua, las comparaciones post-hoc se realizan solo sobre
este factor.
Como el único efecto significativo es c_agua, la prueba
de Diferencia Mínima Significativa (LSD) se aplica solo
sobre ese factor, usando la función LSD.test() del paquete
agricolae:
posanova <- LSD.test(modelo, "c_agua")
# Solo el valor de LSD usado como margen de comparación
cat("LSD =", round(posanova$statistics$LSD, 3), "\n")
## LSD = 2.112
# Tabla de letras: la parte que realmente comunica la conclusión
kable(posanova$groups, digits = 2,
caption = "Medias de consumo de O2 por concentración y grupos LSD")
| cons_o | groups | |
|---|---|---|
| 50% | 12.25 | a |
| 100% | 8.67 | b |
| 75% | 6.99 | b |
Con los datos, la tabla muestra que 50% queda con una letra propia (el grupo con mayor consumo, significativamente distinto de los demás), mientras que 75% y 100% comparten la misma letra (no son significativamente distintos entre sí). La diferencia entre 50% y las otras dos concentraciones es de 5.26 y 3.58 unidades respectivamente (ambas mayores al LSD de 2.112), mientras que la diferencia entre 75% y 100% es de solo 1.68 (menor al LSD).
Interpretación (c):
El análisis exploratorio univariado mostró que el consumo de oxígeno tiene una distribución moderadamente dispersa (CV ≈ 32%) y un valor atípico puntual, consistente con la variabilidad natural de una variable fisiológica medida sobre organismos distintos. El análisis bivariado sugirió visualmente que la respuesta a la concentración de agua de mar podría no ser idéntica entre moluscos, pero el ANOVA de dos vías – con normalidad y homogeneidad de varianzas verificadas – mostró que solo la concentración de agua de mar tiene un efecto significativo sobre el consumo de oxígeno (p < 0.001), mientras que el tipo de molusco y la interacción no lo tienen. La prueba post-hoc LSD confirmó que la concentración de 50% genera un consumo significativamente mayor que 75% y 100%, las cuales no difieren entre sí. Biológicamente, esto sugiere que diluir el agua de mar a la mitad exige un esfuerzo osmorregulatorio considerablemente mayor en ambos tipos de molusco por igual, mientras que reducciones moderadas de concentración (hasta 75%) no generan una exigencia metabólica muy distinta a la de agua de mar sin diluir.
El consumo de oxígeno promedio es notablemente más alto al 50% (≈12.25) que al 75% (≈6.99) o al 100% (≈8.67), y la prueba LSD (LSD = 2.112) confirma que la concentración de 50% difiere significativamente de las otras dos (diferencia de 5.26 y 3.58, ambas > LSD), mientras que 75% y 100% no difieren significativamente entre sí (diferencia = 1.68 < LSD = 2.112). En términos biológicos, esto indica que diluir el agua de mar hasta la mitad de su concentración normal obliga al molusco a un gasto metabólico considerablemente mayor – se asocia con un mayor consumo de oxígeno. Este aumento podría estar relacionado con procesos fisiológicos necesarios para mantener el equilibrio interno frente al cambio de salinidad, aunque el presente análisis no permite determinar directamente el mecanismo responsable. – mientras que reducir la concentración solo hasta 75% no genera una exigencia metabólica muy distinta de la que se observa en agua de mar sin diluir (100%). A diferencia de la concentración, el tipo de molusco (A o B) no mostró diferencias significativas en su consumo de oxígeno, ni tampoco se encontró que ambos tipos respondan de manera distinta a los cambios de concentración (interacción no significativa): la respuesta fisiológica ante la dilución del agua de mar es, según esta evidencia, comparable entre ambos moluscos.
No se encontraron diferencias estadísticamente significativas en el consumo de oxígeno entre los dos tipos de molusco. Además, la interacción entre el tipo de molusco y la concentración de agua no fue significativa, por lo que no se encontró evidencia suficiente para afirmar que el efecto de la concentración sobre el consumo de oxígeno dependa del tipo de molusco.
Finalmente, los resultados deben interpretarse considerando que el estudio evaluó el consumo de oxígeno en un único momento y únicamente en dos tipos de moluscos. Por lo tanto, no es posible determinar si la respuesta observada se mantiene a largo plazo ni generalizar los resultados a otros organismos marinos sin estudios adicionales.