Este informe recoge el desarrollo del Taller 1 del curso de Diseño de
Experimentos. El taller está compuesto por tres problemas
independientes, cada uno asociado a una base de datos propia
(Salinidad.RData, moluscos.RData y
Biodiversidad.RData), en los que se combina un
análisis exploratorio de datos (AED) con un
Análisis de Varianza (ANOVA) y, cuando la prueba global
resulta significativa, se realizan análisis complementarios usando
pruebas de comparación múltiple post-ANOVA según el
requerimiento.
En términos generales, para cada uno de los tres puntos se sigue la misma ruta de trabajo:
Todos los análisis se realizaron con R (funciones
base aov, lm, shapiro.test,
pairwise.t.test) y los paquetes ggplot2,
car, dplyr, GGally y
multcompView, fijando un nivel de significancia \(\alpha = 0.05\) en todas las pruebas de
hipótesis.
La producción de biomasa de una planta forrajera está relacionada con las condiciones ambientales en las que se desarrolla, entre ellas las características fisicoquímicas del suelo. Factores como el pH, la salinidad y la disponibilidad de nutrientes y micronutrientes pueden afectar procesos fundamentales para el crecimiento vegetal, como la absorción de agua y minerales, la actividad enzimática y el desarrollo de los tejidos (Neina, 2019). Por esta razón, para conocer si la producción de biomasa de la planta forrajera cambia dependiendo de las condiciones del suelo, e identificar cual es el factor que más influye se realizó el siguiente análisis estadístico.
Se dispone de 45 muestras de suelo en las que se midió la producción de biomasa de una planta forrajera (variable respuesta, en gramos) y cuatro covariables del suelo en el que crecía: pH, Salinidad, Zinc y Potasio. El objetivo es (a) describir cada variable, (b) identificar cuál covariable se relaciona más fuertemente con la biomasa y (c) categorizar dicha covariable en tres niveles (bajo/medio/alto, mediante terciles) para evaluarla como factor en un ANOVA de una vía, con LSD de Fisher como prueba post-hoc.
load("Salinidad.RData")
d1 <- Salinidad
kable(head(d1, 6), caption = "Primeras filas de la base Salinidad")| Biomasa | pH | Salinidad | Zinc | Potasio |
|---|---|---|---|---|
| 765.280 | 5.00 | 33 | 16.4524 | 1441.67 |
| 954.017 | 4.70 | 35 | 13.9852 | 1299.19 |
| 827.686 | 4.20 | 32 | 15.3276 | 1154.27 |
| 755.072 | 4.40 | 30 | 17.3128 | 1045.15 |
| 896.176 | 5.55 | 33 | 22.3312 | 521.62 |
| 1422.836 | 5.50 | 33 | 12.2778 | 1273.02 |
tabla_u1 <- rbind(
resumen_num(d1$Biomasa, "Biomasa (g)"),
resumen_num(d1$pH, "pH"),
resumen_num(d1$Salinidad, "Salinidad"),
resumen_num(d1$Zinc, "Zinc"),
resumen_num(d1$Potasio, "Potasio")
)
kable(tabla_u1, caption = "Estadísticos descriptivos de la biomasa y sus covariables (n = 45)")| Variable | n | Media | DE | CV_pct | Mínimo | Q1 | Mediana | Q3 | Máximo | Asimetría | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 25% | Biomasa (g) | 45 | 1082.17 | 546.29 | 50.5 | 369.82 | 654.82 | 991.83 | 1346.88 | 2337.33 | 0.91 |
| 25%1 | pH | 45 | 4.61 | 1.25 | 27.2 | 3.20 | 3.45 | 4.45 | 5.35 | 7.45 | 0.87 |
| 25%2 | Salinidad | 45 | 30.27 | 3.72 | 12.3 | 24.00 | 27.00 | 30.00 | 33.00 | 38.00 | 0.31 |
| 25%3 | Zinc | 45 | 17.83 | 8.27 | 46.4 | 0.21 | 13.99 | 19.24 | 22.68 | 31.29 | -0.66 |
| 25%4 | Potasio | 45 | 797.38 | 297.58 | 37.3 | 350.73 | 526.97 | 773.30 | 954.11 | 1441.67 | 0.48 |
col5 <- rep(paleta, length.out = 5)
wrap_plots(
poligono_box(d1$Biomasa, "Biomasa (g)", col5[1]),
poligono_box(d1$pH, "pH", col5[2]),
poligono_box(d1$Salinidad, "Salinidad", col5[3]),
poligono_box(d1$Zinc, "Zinc", col5[4]),
poligono_box(d1$Potasio, "Potasio", col5[5]),
ncol = 3
) + plot_annotation(title = "Distribución univariada de la biomasa y las covariables del suelo",
theme = theme(plot.title = element_text(face="bold", color="#3B5D42", family="serif")))La biomasa presenta una media de 1082,2g (DE=546,3) y un rango entre 369,8 y 2337,3 g, con un coeficiente de variación del 50,5%, lo que evidencia una dispersión considerable entre sitios y una asimetría positiva moderada (0,91). Si se comparan, se muestra que la mayoría de las parcelas producen valoress intermedios, y solo unas pocas alcanzan producciones altas que jalan la media hacia arriba. El pH del suelo osciló entre valores fuertemente ácidos (3.2) y cercanos a la neutralidad (7.45), con una distribución razonablemente simétrica, por lo que se asume que predominan los suelos ácidos, con algunos sitios con pH cercanos a la neutralidad. La Salinidad en cambio, se concentra en un rango estrecho (24-38) y con baja dispersión relativa, mientras que el Zinc y el Potasio muestran mayor variabilidad entre muestras, reflejo de la heterogeneidad ambiental de los sitios muestreados.
ggpairs(d1[, c("Biomasa","pH","Salinidad","Zinc")],
lower = list(continuous = wrap("smooth", alpha = 0.5, color = paleta[1])),
upper = list(continuous = wrap("cor", size = 4))) +
labs(title = "Matriz de dispersión y correlaciones: Biomasa vs. covariables") +
theme(strip.text = element_text(size = 9))cor_bio <- cor(d1[, c("Biomasa","pH","Salinidad","Zinc")])[1, -1]
kable(data.frame(Covariable = names(cor_bio),
Correlación_con_Biomasa = round(cor_bio, 3)),
caption = "Correlación de Pearson de cada covariable con la Biomasa")| Covariable | Correlación_con_Biomasa | |
|---|---|---|
| pH | pH | 0.928 |
| Salinidad | Salinidad | -0.067 |
| Zinc | Zinc | -0.781 |
La covariable con mayor relación (en valor absoluto) con la biomasa es el pH (\(r =\) 0.928), seguida por el Zinc (\(r =\) -0.781); ambas relaciones son de magnitud considerable, pero de signo opuesto: a mayor pH (suelos menos ácidos) la biomasa tiende a aumentar, mientras que a mayor concentración de Zinc tiende a disminuir (posible efecto de fitotoxicidad). En contraste, resulta llamativo que la variable que da nombre a la base de datos, la Salinidad, es la que presenta menor relación lineal con la biomasa (\(r =\) -0.067), prácticamente nula, lo que también puede relacionarse con la baja dispersión de esta variable. Por lo anterior, la covariable seleccionada para construir el factor del ANOVA es el pH.
terciles <- quantile(d1$pH, probs = c(1/3, 2/3))
d1$pH_cat <- cut(d1$pH,
breaks = c(-Inf, terciles[1], terciles[2], Inf),
labels = c("Bajo","Medio","Alto"))
kable(as.data.frame(table(d1$pH_cat)) %>% setNames(c("Nivel de pH","n")),
caption = paste0("Niveles de pH construidos por terciles (cortes en ",
round(terciles[1],2), " y ", round(terciles[2],2), ")"))| Nivel de pH | n |
|---|---|
| Bajo | 15 |
| Medio | 15 |
| Alto | 15 |
Se categorizó el pH en tres niveles (bajo/medio/alto) usando los terciles muestrales (percentiles 33.3% y 66.7%) como puntos de corte, lo que garantiza grupos similares de 15 observaciones cada uno y evita la arbitrariedad de límites fijos no basados en los datos. En los boxplot de biomasa por nivel de pH se ve una separación clara de las cajas a lo largo de los tres niveles del gradiente de acidez, con la mediana de biomasa creciendo de forma constante de bajo a alto y un solapamiento mínimo entre las cajas.
ggplot(d1, aes(x = pH_cat, y = Biomasa, fill = pH_cat)) +
geom_boxplot(alpha = 0.85, outlier.color = "#B3703A") +
geom_jitter(width = 0.08, alpha = 0.5, size = 1.6, color = "#3A3833") +
scale_fill_manual(values = paleta[c(3,5,1)]) +
labs(title = "Biomasa según nivel categorizado de pH del suelo",
x = "Nivel de pH", y = "Biomasa (g)") +
theme(legend.position = "none")\[Biomasa_{ij} = \mu + \tau_i + \varepsilon_{ij}, \qquad i = \text{Bajo, Medio, Alto}\]
mod1 <- aov(Biomasa ~ pH_cat, data = d1)
tabla_anova1 <- summary(mod1)[[1]]
kable(round(tabla_anova1, 4), caption = "Tabla ANOVA — Biomasa según nivel de pH")| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| pH_cat | 2 | 7712683 | 3856341.6 | 29.8928 | 0 |
| Residuals | 42 | 5418235 | 129005.6 | NA | NA |
Resultado del ANOVA. El estadístico de prueba es \(F\)(2, 42) = 29.89 con un valor \(p\) = <1e-04, muy inferior a \(\alpha = 0.05\). Por lo tanto, se rechaza la hipótesis nula de igualdad de medias: el nivel de pH del suelo sí genera diferencias significativas en la producción de biomasa. El tamaño del efecto (\(\eta^2 =\) 0.587) indica que el nivel de pH explica cerca del 59% de la variabilidad total de la biomasa, un efecto grande.
par_grid <- gridExtra::arrangeGrob(
ggplot(data.frame(res = residuals(mod1)), aes(sample = res)) +
stat_qq(color = paleta[1]) + stat_qq_line(color = "#B3703A") +
labs(title = "Q-Q plot de los residuales", x="Cuantiles teóricos", y="Cuantiles muestrales"),
ggplot(data.frame(res = residuals(mod1), fit = fitted(mod1)), aes(x = fit, y = res)) +
geom_point(color = paleta[1]) + geom_hline(yintercept = 0, linetype = "dashed", color="#B3703A") +
labs(title = "Residuales vs. valores ajustados", x = "Valores ajustados", y = "Residuales"),
ncol = 2
)
grid::grid.draw(par_grid)sh1 <- shapiro.test(residuals(mod1))
lv1 <- leveneTest(Biomasa ~ pH_cat, data = d1)
kable(data.frame(Prueba = c("Shapiro-Wilk (normalidad residuales)", "Levene (homogeneidad de varianzas)"),
Estadístico = c(round(sh1$statistic,3), round(lv1$`F value`[1],3)),
Valor_p = c(format.pval(sh1$p.value, digits=3),
format.pval(lv1$`Pr(>F)`[1], digits=3))),
caption = "Verificación de supuestos del modelo ANOVA — Punto 1")| Prueba | Estadístico | Valor_p | |
|---|---|---|---|
| W | Shapiro-Wilk (normalidad residuales) | 0.973 | 0.375 |
| Levene (homogeneidad de varianzas) | 8.675 | 0.000702 |
Nota metodológica. Al no cumplirse estrictamente la homogeneidad de varianzas, se realizó como verificación de robustez un ANOVA de Welch (que no asume varianzas iguales): \(F\) = 34.73, \(p\) = <1e-04. La conclusión de diferencias altamente significativas se mantiene, por lo que la violación del supuesto de homocedasticidad no compromete la conclusión general del ANOVA clásico, aunque sí sugiere tratar con algo más de cautela los valores p exactos de las comparaciones por pares que siguen a continuación (basadas en varianza combinada).
Dado que el ANOVA resultó significativo, se procede con la prueba de Diferencia Mínima Significativa (LSD) de Fisher, adecuada aquí porque el factor tiene pocos niveles (3) definidos a priori y el interés es comparar todos los pares de medias.
pw1 <- pairwise.t.test(d1$Biomasa, d1$pH_cat, p.adjust.method = "none", pool.sd = TRUE)
medias1 <- tapply(d1$Biomasa, d1$pH_cat, mean)
ee1 <- tapply(d1$Biomasa, d1$pH_cat, function(x) sd(x)/sqrt(length(x)))
tab_lsd1 <- tabla_lsd(pw1, medias1, ee1)
kable(tab_lsd1, row.names = FALSE,
caption = "Comparación de medias de Biomasa por nivel de pH (LSD, α = 0.05). Letras distintas = diferencia significativa")| Grupo | Media | Letra | EE |
|---|---|---|---|
| Alto | 1605.39 | b | 141.39 |
| Medio | 1048.11 | a | 63.24 |
| Bajo | 593.02 | c | 42.56 |
ggplot(d1, aes(x = pH_cat, y = Biomasa, fill = pH_cat)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta[c(3,5,1)]) +
geom_text(data = tab_lsd1, aes(x = Grupo, y = max(d1$Biomasa) * 1.05, label = Letra),
inherit.aes = FALSE, size = 5, fontface = "bold") +
labs(title = "Comparaciones múltiples LSD: Biomasa según nivel de pH",
subtitle = "Letras distintas indican diferencia significativa (α = 0.05)",
x = "Nivel de pH", y = "Biomasa (g)") +
theme(legend.position = "none")Las tres letras obtenidas (a, b, c) son todas distintas, lo que indica que los tres niveles de pH difieren significativamente entre sí: el nivel Alto (media = 1605.4 g) produce significativamente más biomasa que el nivel Medio (1048.1 g), y este a su vez más que el nivel Bajo (593 g). Es decir, la relación entre pH y biomasa no solo es significativa de forma global, sino que se expresa de manera gradual y consistente en los tres tramos de acidez del suelo.
Conclusiones del Punto 1. La biomasa y sus covariables presentan comportamientos univariados coherentes con procesos biológicos/ambientales, sin anomalías destacables. De las covariables consideradas, el pH es la que más se relaciona con la biomasa (\(r \approx 0.93\)), muy por encima de la Salinidad (prácticamente sin relación) y superando también al Zinc. Al categorizar el pH en terciles, el ANOVA muestra diferencias altamente significativas en la biomasa entre niveles (\(p < 0.001\)), con un tamaño de efecto grande (\(\eta^2 \approx\) 0.59). Los residuales son normales, pero no homocedásticos, no poseen el mismo nivel de dispersión; un ANOVA de Welch confirma la misma conclusión, por lo que el hallazgo es robusto. La prueba LSD muestra que los tres niveles de pH difieren entre sí, con una relación positiva monotónica entre pH y producción de biomasa, por lo tanto se puede afirmar que suelos menos ácidos favorecen una mayor producción de esta especie forrajera.
El consumo de oxígeno es una variable ampliamente utilizada para evaluar la actividad metabólica de los organismos, ya que el oxígeno participa en la respiración aeróbica y permite la producción de energía necesaria para procesos como el crecimiento, el movimiento, el mantenimiento celular y otras funciones fisiológicas. Por esta razón, las variaciones en el consumo de O₂ pueden utilizarse como una aproximación a los cambios en las demandas energéticas de un organismo.
En los moluscos, la respiración se encuentra estrechamente relacionada con su fisiología y con las características propias de cada especie. Además, el metabolismo puede variar entre especies debido a diferencias en su tamaño, actividad, fisiología y estrategias de obtención y utilización de energía. Para realizar comparaciones entre individuos de diferente tamaño, el consumo de oxígeno puede expresarse en relación con el peso seco del organismo, obteniendo así una medida estandarizada de consumo de O₂ por unidad de biomasa (Bayne & Newell, 1983).
Se evaluó el consumo de oxígeno (proporción de O₂ por unidad de peso
seco) de dos tipos de molusco (A y B) sometidos a tres concentraciones
de agua de mar (100%, 75% y 50%), en un diseño factorial 2×3 balanceado
(8 réplicas por combinación, 48 observaciones en total). Se plantea un
ANOVA de dos vías con interacción:
cons_o ~ molusco * c_agua, y se aplica la prueba LSD a los
efectos que resulten significativos.
load("moluscos.RData")
d2 <- as.data.frame(BD_moluscos)
d2$c_agua <- factor(d2$c_agua, levels = c(50, 75, 100),
labels = c("50%", "75%", "100%"))
d2$molusco <- factor(d2$molusco)
kable(head(d2, 6), caption = "Primeras filas de la base de moluscos")| c_agua | molusco | cons_o |
|---|---|---|
| 100% | A | 7.16 |
| 100% | A | 8.26 |
| 100% | A | 6.78 |
| 100% | A | 14.00 |
| 100% | A | 13.60 |
| 100% | A | 11.10 |
tab_u2 <- d2 %>%
group_by(molusco, c_agua) %>%
summarise(n = n(), Media = round(mean(cons_o),2), DE = round(sd(cons_o),2), .groups="drop")
kable(tab_u2, caption = "Estadísticos descriptivos del consumo de O2 por combinación molusco × concentración")| molusco | c_agua | n | Media | DE |
|---|---|---|---|---|
| A | 50% | 8 | 12.18 | 3.09 |
| A | 75% | 8 | 7.89 | 2.74 |
| A | 100% | 8 | 9.94 | 2.75 |
| B | 50% | 8 | 12.33 | 3.52 |
| B | 75% | 8 | 6.10 | 2.74 |
| B | 100% | 8 | 7.41 | 2.84 |
p2a <- ggplot(d2, aes(x = cons_o, fill = molusco)) +
geom_density(alpha = 0.55) +
scale_fill_manual(values = paleta[c(1,2)]) +
labs(title = "Distribución del consumo de O2 por tipo de molusco", x = "Consumo de O2", y = "Densidad")
p2b <- ggplot(d2, aes(x = molusco, y = cons_o, fill = molusco)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta[c(1,2)]) +
labs(title = "Consumo de O2 por tipo de molusco", x = NULL, y = "Consumo de O2") +
theme(legend.position = "none")
gridExtra::grid.arrange(p2a, p2b, ncol = 2)La distribución del consumo de oxígeno es razonablemente simétrica y sin valores atípicos marcados, tanto para el molusco A como para el B. Comparando de forma marginal (sin considerar aún la concentración), ambos tipos de molusco presentan niveles de consumo de oxígeno similares, con medias globales de 10 (A) y 8.61 (B) — una diferencia pequeña que habrá que contrastar formalmente con el ANOVA.
ggplot(d2, aes(x = c_agua, y = cons_o, fill = molusco)) +
geom_boxplot(alpha = 0.85, position = position_dodge(0.75)) +
scale_fill_manual(values = paleta[c(1,2)]) +
labs(title = "Consumo de O2 según concentración de agua de mar y tipo de molusco",
x = "Concentración de agua de mar", y = "Consumo de O2", fill = "Molusco")d2_medias <- d2 %>% group_by(molusco, c_agua) %>% summarise(media = mean(cons_o), ee = sd(cons_o)/sqrt(n()), .groups="drop")
ggplot(d2_medias, aes(x = c_agua, y = media, color = molusco, group = molusco)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = media - ee, ymax = media + ee), width = 0.1) +
scale_color_manual(values = paleta[c(1,2)]) +
labs(title = "Gráfico de interacción: molusco × concentración de agua de mar",
x = "Concentración de agua de mar", y = "Consumo medio de O2 (± EE)", color = "Molusco")En ambos tipos de molusco, el patrón general es el mismo: el consumo de oxígeno es máximo al 50% de agua de mar y disminuye al aumentar la concentración (75% y 100%), aunque la caída entre 75% y 100% es más leve e incluso se invierte levemente en el molusco A. Las líneas del gráfico de interacción son casi paralelas, lo que sugiere, de forma exploratoria, que el efecto de la concentración es similar para los dos tipos de molusco, es decir, no hay evidencia visual fuerte de interacción — hipótesis que se confirma a continuación con el ANOVA.
\[cons\_o_{ijk} = \mu + \alpha_i(\text{molusco}) + \beta_j(\text{concentración}) + (\alpha\beta)_{ij} + \varepsilon_{ijk}\]
mod2 <- aov(cons_o ~ molusco * c_agua, data = d2)
tabla_anova2 <- summary(mod2)[[1]]
kable(round(tabla_anova2, 4), caption = "Tabla ANOVA de dos vías — Consumo de O2 ~ Molusco × Concentración")| 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 |
Resultados.
p2q <- ggplot(data.frame(res = residuals(mod2)), aes(sample = res)) +
stat_qq(color = paleta[1]) + stat_qq_line(color = "#B3703A") +
labs(title = "Q-Q plot de los residuales", x="Cuantiles teóricos", y="Cuantiles muestrales")
p2r <- ggplot(data.frame(res = residuals(mod2), fit = fitted(mod2)), aes(x = fit, y = res)) +
geom_point(color = paleta[1]) + geom_hline(yintercept = 0, linetype="dashed", color="#B3703A") +
labs(title = "Residuales vs. valores ajustados", x = "Valores ajustados", y = "Residuales")
gridExtra::grid.arrange(p2q, p2r, ncol = 2)sh2 <- shapiro.test(residuals(mod2))
lv2 <- leveneTest(cons_o ~ molusco * c_agua, data = d2)
kable(data.frame(Prueba = c("Shapiro-Wilk (normalidad residuales)", "Levene (homogeneidad de varianzas)"),
Estadístico = c(round(sh2$statistic,3), round(lv2$`F value`[1],3)),
Valor_p = c(format.pval(sh2$p.value, digits=3),
format.pval(lv2$`Pr(>F)`[1], digits=3))),
caption = "Verificación de supuestos del modelo ANOVA — Punto 2")| Prueba | Estadístico | Valor_p | |
|---|---|---|---|
| W | Shapiro-Wilk (normalidad residuales) | 0.958 | 0.0857 |
| Levene (homogeneidad de varianzas) | 0.172 | 0.971 |
Tanto la prueba de Shapiro-Wilk (\(p\) = 0.0857) como la de Levene (\(p\) = 0.971) arrojan valores \(p\) superiores a 0.05, por lo que no se rechazan los supuestos de normalidad de los residuales ni de homogeneidad de varianzas. El modelo ANOVA de dos vías es, por tanto, válido para este conjunto de datos, y sus conclusiones pueden interpretarse con confianza.
Como el factor molusco y la interacción no fueron significativos, la comparación post-hoc solo tiene sentido para el factor concentración de agua de mar, que sí resultó significativo.
pw2 <- pairwise.t.test(d2$cons_o, d2$c_agua, p.adjust.method = "none", pool.sd = TRUE)
medias2 <- tapply(d2$cons_o, d2$c_agua, mean)
ee2 <- tapply(d2$cons_o, d2$c_agua, function(x) sd(x)/sqrt(length(x)))
tab_lsd2 <- tabla_lsd(pw2, medias2, ee2)
kable(tab_lsd2, row.names = FALSE,
caption = "Comparación de medias de consumo de O2 por concentración de agua de mar (LSD, α = 0.05)")| Grupo | Media | Letra | EE |
|---|---|---|---|
| 50% | 12.25 | b | 0.80 |
| 100% | 8.67 | a | 0.75 |
| 75% | 6.99 | a | 0.70 |
ggplot(d2, aes(x = c_agua, y = cons_o, fill = c_agua)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta[c(3,2,1)]) +
geom_text(data = tab_lsd2, aes(x = Grupo, y = max(d2$cons_o) * 1.05, label = Letra),
inherit.aes = FALSE, size = 5, fontface = "bold") +
labs(title = "Comparaciones múltiples LSD: consumo de O2 por concentración",
subtitle = "Letras distintas indican diferencia significativa (α = 0.05)",
x = "Concentración de agua de mar", y = "Consumo de O2") +
theme(legend.position = "none")La concentración de 50% (media = 12.25) presenta un consumo de oxígeno significativamente mayor que las concentraciones de 75% (6.99, letra distinta) y de 100% (8.67, letra distinta). Sin embargo, 75% y 100% no difieren significativamente entre sí (comparten letra), es decir, una vez que la concentración de agua de mar baja de 100%, el mayor incremento en el consumo de oxígeno ocurre al llegar al 50%, mientras que la diferencia entre concentraciones intermedias y altas no alcanza a ser estadísticamente relevante.
Conclusiones del Punto 2. El consumo de oxígeno no difiere significativamente entre los dos tipos de molusco (A y B) considerados de forma aislada. La concentración de agua de mar sí es un factor determinante del consumo de oxígeno (\(p<0.001\)). No existe interacción significativa entre tipo de molusco y concentración: el patrón de respuesta a la concentración es el mismo para ambas especies (líneas prácticamente paralelas). Los supuestos de normalidad y homocedasticidad se cumplen, por lo que el modelo es confiable. La prueba LSD indica que el consumo de oxígeno se dispara ante condiciones de estrés osmótico (agua de mar diluida al 50%), mientras que concentraciones de 75% y 100% generan un metabolismo respiratorio comparable entre sí.
Los anfibios constituyen un grupo de vertebrados estrechamente relacionado con las condiciones ambientales de los ecosistemas debido a características de su ciclo de vida y de su fisiología. Su dependencia de ambientes húmedos y su sensibilidad a modificaciones en las condiciones del hábitat hacen que sean considerados un grupo de interés para evaluar cambios en los ecosistemas y posibles efectos de la intervención humana sobre la biodiversidad.
La transformación de los bosques naturales para actividades productivas puede modificar la estructura de la vegetación, la disponibilidad de refugios y sitios de reproducción y las condiciones microclimáticas, generando cambios en la composición de las comunidades de anfibios. Por ello, comparar ambientes con diferentes niveles de intervención permite evaluar cómo la modificación del uso del suelo se relaciona con la biodiversidad presente en una reserva forestal.
Adicionalmente, el concepto de riqueza de especies corresponde al número de especies diferentes presentes en una comunidad o área determinada, por lo que constituye una medida básica de la diversidad biológica. Sin embargo, esta medida no considera cuántos individuos pertenecen a cada especie. Para incorporar tanto la riqueza como la distribución de las abundancias entre las especies, se utilizan índices de diversidad, entre ellos el índice de Shannon-Wiener (H’). Este índice permite caracterizar la diversidad de una comunidad teniendo en cuenta simultáneamente el número de especies presentes y qué tan uniformemente se distribuyen sus individuos entre ellas (Magurran,2004). En consecuencia, comunidades con mayor riqueza y una distribución más equitativa de las abundancias tienden a presentar valores más altos de diversidad de Shannon-Wiener.
Se evaluó el efecto del tipo de hábitat (cuatro niveles que representan un gradiente de intervención antrópica: Bosque primario, Bosque secundario, Sistema silvopastoril y Potrero) sobre la riqueza de especies, el índice de diversidad de Shannon-Wiener y se registró además la altitud de cada una de las 52 parcelas (13 por hábitat). El literal (c) pide evaluar mediante un ANOVA de una vía si el hábitat afecta significativamente el índice de Shannon, con LSD como prueba post-hoc.
load("Biodiversidad.RData")
d3 <- BD_biodiversidad
d3$Habitat <- factor(d3$Habitat,
levels = c("Bosque primario","Bosque secundario","Sistema silvopastoril","Potrero"))
kable(head(d3, 6), caption = "Primeras filas de la base de biodiversidad")| Parcela | Habitat | Riqueza | Shannon | Altitud |
|---|---|---|---|---|
| P001 | Bosque primario | 14 | 2.13 | 1478.0 |
| P002 | Bosque primario | 14 | 2.98 | 1476.8 |
| P003 | Bosque primario | 13 | 2.07 | 1505.2 |
| P004 | Bosque primario | 14 | 2.53 | 1395.2 |
| P005 | Bosque primario | 10 | 2.82 | 1493.5 |
| P006 | Bosque primario | 15 | 2.75 | 1337.9 |
tab_u3 <- rbind(
resumen_num(d3$Riqueza, "Riqueza (n° especies)"),
resumen_num(d3$Shannon, "Índice de Shannon"),
resumen_num(d3$Altitud, "Altitud (m.s.n.m.)")
)
kable(tab_u3, caption = "Estadísticos descriptivos generales (n = 52 parcelas)")| Variable | n | Media | DE | CV_pct | Mínimo | Q1 | Mediana | Q3 | Máximo | Asimetría | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 25% | Riqueza (n° especies) | 52 | 9.73 | 4.37 | 44.9 | 2.00 | 6.00 | 9.50 | 13.00 | 21.00 | 0.28 |
| 25%1 | Índice de Shannon | 52 | 1.76 | 0.61 | 34.4 | 0.67 | 1.26 | 1.85 | 2.11 | 2.98 | 0.04 |
| 25%2 | Altitud (m.s.n.m.) | 52 | 1243.89 | 172.71 | 13.9 | 950.90 | 1081.88 | 1254.80 | 1382.88 | 1600.80 | 0.09 |
wrap_plots(
poligono_box(d3$Riqueza, "Riqueza de especies", paleta[1]),
poligono_box(d3$Shannon, "Índice de Shannon", paleta[2]),
poligono_box(d3$Altitud, "Altitud (m.s.n.m.)", paleta[4]),
ncol = 3
) + plot_annotation(title = "Distribución univariada de riqueza, diversidad y altitud",
theme = theme(plot.title = element_text(face="bold", color="#3B5D42", family="serif")))La riqueza de especies varía entre 2 y 21 especies por parcela, con una distribución razonablemente simétrica. El índice de Shannon se mueve entre 0.67 y 2.98, valores consistentes con comunidades de baja a moderada diversidad. La altitud presenta un rango amplio (951–1601 m.s.n.m.), reflejo de que las parcelas de los distintos hábitats fueron establecidas en zonas topográficamente diferentes de la reserva.
p3d <- ggplot(d3, aes(x = Habitat, y = Riqueza, fill = Habitat)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta) +
labs(title = "Riqueza por tipo de hábitat", x = NULL, y = "Riqueza") +
theme(legend.position = "none", axis.text.x = element_text(angle = 25, hjust = 1))
p3e <- ggplot(d3, aes(x = Habitat, y = Shannon, fill = Habitat)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta) +
labs(title = "Shannon por tipo de hábitat", x = NULL, y = "Índice de Shannon") +
theme(legend.position = "none", axis.text.x = element_text(angle = 25, hjust = 1))
gridExtra::grid.arrange(p3d, p3e, ncol = 2)cor_alt <- cor(d3$Altitud, d3$Shannon)
ggplot(d3, aes(x = Altitud, y = Shannon, color = Habitat)) +
geom_point(size = 2.4, alpha = 0.85) +
geom_smooth(aes(group = 1), method = "lm", se = TRUE, color = "#3B5D42", linetype = "dashed") +
scale_color_manual(values = paleta) +
labs(title = "Relación entre altitud y diversidad de Shannon",
subtitle = paste0("Correlación de Pearson global: r = ", round(cor_alt, 2)),
x = "Altitud (m.s.n.m.)", y = "Índice de Shannon")Tanto la riqueza como el índice de Shannon muestran un patrón decreciente y muy marcado a lo largo del gradiente de intervención: Bosque primario > Bosque secundario > Sistema silvopastoril > Potrero, con muy poco solapamiento entre las cajas de los hábitats extremos. En cuanto a la relación con la altitud, se observa una correlación positiva fuerte (\(r =\) 0.75) entre altitud y diversidad de Shannon; sin embargo, esto se explica en buena parte porque los hábitats menos intervenidos (bosques) de esta reserva se ubican también en las zonas más altas, por lo que la altitud actúa aquí como una variable asociada al hábitat más que como una causa independiente de la diversidad (Busch & Ferretti-Gallon, 2023).
\[Shannon_{ij} = \mu + \tau_i(\text{Hábitat}) + \varepsilon_{ij}, \qquad i = 1,\dots,4\]
mod3 <- aov(Shannon ~ Habitat, data = d3)
tabla_anova3 <- summary(mod3)[[1]]
kable(round(tabla_anova3, 4), caption = "Tabla ANOVA — Índice de Shannon según tipo de hábitat")| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Habitat | 3 | 14.8624 | 4.9541 | 60.6112 | 0 |
| Residuals | 48 | 3.9233 | 0.0817 | NA | NA |
Resultado del ANOVA. \(F\)(3,48) = 60.61, \(p\) = <1e-04. Se rechaza contundentemente la hipótesis nula: el tipo de hábitat sí genera diferencias muy significativas en el índice de diversidad de Shannon. El tamaño del efecto es muy grande (\(\eta^2 =\) 0.79): el hábitat explica cerca del 79% de la variación total observada en la diversidad.
p3q <- ggplot(data.frame(res = residuals(mod3)), aes(sample = res)) +
stat_qq(color = paleta[1]) + stat_qq_line(color = "#B3703A") +
labs(title = "Q-Q plot de los residuales", x="Cuantiles teóricos", y="Cuantiles muestrales")
p3r <- ggplot(data.frame(res = residuals(mod3), fit = fitted(mod3)), aes(x = fit, y = res)) +
geom_point(color = paleta[1]) + geom_hline(yintercept = 0, linetype="dashed", color="#B3703A") +
labs(title = "Residuales vs. valores ajustados", x = "Valores ajustados", y = "Residuales")
gridExtra::grid.arrange(p3q, p3r, ncol = 2)sh3 <- shapiro.test(residuals(mod3))
lv3 <- leveneTest(Shannon ~ Habitat, data = d3)
kable(data.frame(Prueba = c("Shapiro-Wilk (normalidad residuales)", "Levene (homogeneidad de varianzas)"),
Estadístico = c(round(sh3$statistic,3), round(lv3$`F value`[1],3)),
Valor_p = c(format.pval(sh3$p.value, digits=3),
format.pval(lv3$`Pr(>F)`[1], digits=3))),
caption = "Verificación de supuestos del modelo ANOVA — Punto 3")| Prueba | Estadístico | Valor_p | |
|---|---|---|---|
| W | Shapiro-Wilk (normalidad residuales) | 0.978 | 0.463 |
| Levene (homogeneidad de varianzas) | 1.277 | 0.293 |
Los valores \(p\) de Shapiro-Wilk (\(p\) = 0.463) y de Levene (\(p\) = 0.293) son ambos superiores a 0.05: no hay evidencia para rechazar ni la normalidad de los residuales ni la homogeneidad de varianzas entre hábitats. El modelo ANOVA de una vía es, por tanto, plenamente válido para estos datos.
pw3 <- pairwise.t.test(d3$Shannon, d3$Habitat, p.adjust.method = "none", pool.sd = TRUE)
medias3 <- tapply(d3$Shannon, d3$Habitat, mean)
ee3 <- tapply(d3$Shannon, d3$Habitat, function(x) sd(x)/sqrt(length(x)))
tab_lsd3 <- tabla_lsd(pw3, medias3, ee3)
kable(tab_lsd3, row.names = FALSE,
caption = "Comparación de medias del índice de Shannon por hábitat (LSD, α = 0.05)")| Grupo | Media | Letra | EE |
|---|---|---|---|
| Bosque primario | 2.47 | d | 0.10 |
| Bosque secundario | 1.97 | a | 0.06 |
| Sistema silvopastoril | 1.60 | b | 0.08 |
| Potrero | 1.00 | c | 0.07 |
ggplot(d3, aes(x = Habitat, y = Shannon, fill = Habitat)) +
geom_boxplot(alpha = 0.85) +
scale_fill_manual(values = paleta) +
geom_text(data = tab_lsd3, aes(x = Grupo, y = max(d3$Shannon) * 1.08, label = Letra),
inherit.aes = FALSE, size = 5, fontface = "bold") +
labs(title = "Comparaciones múltiples LSD: índice de Shannon por hábitat",
subtitle = "Letras distintas indican diferencia significativa (α = 0.05)",
x = NULL, y = "Índice de Shannon") +
theme(legend.position = "none", axis.text.x = element_text(angle = 20, hjust = 1))Las cuatro letras obtenidas son todas diferentes entre sí (a, b, c, d), es decir, cada tipo de hábitat difiere significativamente de todos los demás en su índice de diversidad de Shannon. El orden de las medias reproduce exactamente el gradiente de intervención antrópica: Bosque primario (2.47) > Bosque secundario (1.97) > Sistema silvopastoril (1.6) > Potrero (1). No existen, por tanto, hábitats “empatados” en diversidad: cada nivel de intervención adicional sobre el bosque original conlleva una pérdida estadísticamente detectable de diversidad de anfibios.
Conclusiones del Punto 3. La riqueza y la diversidad de anfibios disminuyen de forma marcada y consistente a lo largo del gradiente de intervención antrópica del suelo. El ANOVA de una vía confirma diferencias muy significativas en el índice de Shannon entre hábitats (\(p<0.001\)), con un tamaño de efecto muy grande (\(\eta^2 \approx\) 0.79). Los supuestos de normalidad y homocedasticidad se cumplen sin reservas, lo que da robustez estadística a la conclusión. La prueba LSD muestra que los cuatro hábitats son distinguibles entre sí: el paso de bosque primario a potrero implica una pérdida progresiva y significativa de diversidad en cada etapa del gradiente. La fuerte asociación entre altitud y diversidad observada en el análisis bivariado debe interpretarse con cautela, pues está confundida con el tipo de hábitat (los bosques mejor conservados de esta reserva se ubican en las zonas más altas).
A través de los tres estudios de caso se evidencia el valor del ANOVA como herramienta para formalizar diferencias que, en la exploración descriptiva, ya se insinuaban gráficamente: