Punto 1 (Datos de salinidad)

Para estudiar la relación entre ciertas características del suelo y la producción de biomasa (gr) de una planta forrajera natural se obtuvieron 45 muestras en diferentes ambientes.

Punto 1A:

Realice un análisis exploratorio univariado para cada característica e interprete.

kable(summary(Salinidad), caption = "Tabla 1. Resumen Estadístico de las Variables")
Tabla 1. Resumen Estadístico de las Variables
Biomasa pH Salinidad Zinc Potasio
Min. : 369.8 Min. :3.200 Min. :24.00 Min. : 0.2105 Min. : 350.7
1st Qu.: 654.8 1st Qu.:3.450 1st Qu.:27.00 1st Qu.:13.9852 1st Qu.: 527.0
Median : 991.8 Median :4.450 Median :30.00 Median :19.2420 Median : 773.3
Mean :1082.2 Mean :4.609 Mean :30.27 Mean :17.8308 Mean : 797.4
3rd Qu.:1346.9 3rd Qu.:5.350 3rd Qu.:33.00 3rd Qu.:22.6758 3rd Qu.: 954.1
Max. :2337.3 Max. :7.450 Max. :38.00 Max. :31.2865 Max. :1441.7
sd_valores <- sapply(Salinidad, sd, na.rm = TRUE)
kable(data.frame(Variable = names(sd_valores),
                  `Desviación Estándar` = round(as.numeric(sd_valores), 3)),
      caption = "Tabla 2. Desviación Estándar de cada Variable")
Tabla 2. Desviación Estándar de cada Variable
Variable Desviación.Estándar
Biomasa 546.287
pH 1.255
Salinidad 3.720
Zinc 8.274
Potasio 297.576
ggplot(Salinidad, aes(x = Biomasa)) +
  geom_histogram(bins = 10, fill = "#2b5c8f", color = "white") +
  theme_minimal() +
  labs(title = "Distribución de la Biomasa", x = "Biomasa (gr)", y = "Frecuencia")

Salinidad %>%
  pivot_longer(cols = c(pH, Salinidad, Zinc, Potasio), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Variable, y = Valor, fill = Variable)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal() +
  labs(title = "Distribución de las Características del Suelo", x = "", y = "Valor registrado")

En el análisis exploratorio univariado se observó que la mayoría de las variables presentan cierta asimetría hacia la derecha, evidenciada por valores de media superiores a la mediana. La Biomasa mostró la mayor dispersión relativa (media = 1082.2 g, desviación estándar = 546.3 g), lo que indica alta variabilidad entre las 45 muestras. El pH varió entre 3.2 y 7.45, con una distribución moderadamente simétrica y sin valores atípicos. La Salinidad fue la variable más homogénea, con media y mediana prácticamente iguales (30.27 vs 30), lo que sugiere una distribución simétrica. El Zinc presentó un valor atípico bajo (cercano a 0), notablemente alejado del resto de las observaciones. Finalmente, el Potasio mostró la mayor asimetría entre las covariables (media = 797.4, mediana = 773.3), con una cola de valores altos que se refleja también en su elevada desviación estándar (297.6).

Punto 1B:

Realice un análisis exploratorio bivariado que permita conocer cómo es la relación entre la biomasa y las covariables pH, Salinidad y Zinc (determine cuáles variables son las que presentan mayor relación con la biomasa).

matriz_cor <- cor(Salinidad)
kable(round(matriz_cor, 3), align = "c", caption = "Tabla 3. Matriz de Correlación de Pearson")
Tabla 3. Matriz de Correlación de Pearson
Biomasa pH Salinidad Zinc Potasio
Biomasa 1.000 0.928 -0.067 -0.781 -0.073
pH 0.928 1.000 -0.045 -0.720 0.032
Salinidad -0.067 -0.045 1.000 -0.427 -0.020
Zinc -0.781 -0.720 -0.427 1.000 0.079
Potasio -0.073 0.032 -0.020 0.079 1.000
ggplot(Salinidad, aes(x = pH, y = Biomasa)) +
  geom_point(color = "#1f77b4", size = 2.5) +
  geom_smooth(method = "lm", color = "darkred", se = TRUE) +
  theme_minimal() +
  labs(title = "Biomasa vs pH", x = "pH del suelo", y = "Biomasa (gr)")

Salinidad %>%
  pivot_longer(cols = c(Zinc, Salinidad), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Valor, y = Biomasa)) +
  geom_point(color = "#1f77b4", size = 2.5) +
  geom_smooth(method = "lm", color = "darkred", se = TRUE) +
  facet_wrap(~ Variable, scales = "free_x") +
  theme_minimal() +
  labs(title = "Biomasa vs Zinc y Salinidad", x = "Valor de la covariable", y = "Biomasa (gr)")

Al evaluar la relación entre la Biomasa y las covariables mediante el coeficiente de correlación de Pearson, se encontró que la variable con mayor asociación lineal es el pH (r = 0.928), lo que indica una correlación positiva muy fuerte: a mayor pH del suelo, mayor producción de biomasa. El Zinc presenta una correlación negativa fuerte (r = -0.781), sugiriendo que niveles más altos de Zinc se asocian con menor biomasa. En contraste, la Salinidad no muestra una relación lineal relevante con la Biomasa (r = -0.067), por lo que su efecto sobre la producción de biomasa, de existir, no sería de tipo lineal. Dado que el pH presenta la mayor correlación en valor absoluto, se selecciona esta variable para ser categorizada

Punto 1C:

A partir de la variable que, según el literal (b), presenta mayor relación con la biomasa, categorícela en tres niveles (por ejemplo bajo/medio/alto, usando terciles u otro criterio que usted justifique) y evalúe mediante un ANOVA de una vía si el nivel de dicha variable genera diferencias significativas en la biomasa. Verifique los supuestos del modelo (normalidad de los residuales y homogeneidad de varianzas) y realice las comparaciones post-hoc pertinentes (prueba de LSD), interpretando cuáles niveles difieren entre sí.

terciles <- quantile(Salinidad$pH, probs = seq(0, 1, 1/3), na.rm = TRUE)
Salinidad$Nivel_pH <- cut(Salinidad$pH, breaks = terciles, include.lowest = TRUE,
                            labels = c("Bajo", "Medio", "Alto"))
kable(table(Salinidad$Nivel_pH), col.names = c("Nivel de pH", "n"),
      caption = "Tamaño de muestra por nivel de pH")
Tamaño de muestra por nivel de pH
Nivel de pH n
Bajo 15
Medio 15
Alto 15
mod1 <- aov(Biomasa ~ Nivel_pH, data = Salinidad)
mod1_lm <- lm(Biomasa ~ Nivel_pH, data = Salinidad)
kable(tabla_anova(mod1), caption = "Tabla ANOVA")
Tabla ANOVA
Fuente gl SC CM F p
Nivel_pH 2 7712683 3856341.6 29.893 < 0.001
Residuals 42 5418235 129005.6

Normalidad de los residuales

diag1 <- data.frame(ajustado = fitted(mod1_lm),
                    residual = resid(mod1_lm),
                    estandar = rstandard(mod1_lm),
                    nivel    = Salinidad$Nivel_pH)

ggplot(diag1, aes(sample = estandar)) +
  stat_qq() + stat_qq_line(color = "red") +
  theme_minimal() +
  labs(x = "Cuantiles teóricos", y = "Cuantiles muestrales",
       title = "QQ de residuales estandarizados: Biomasa ~ Nivel de pH")

shapiro_res <- shapiro.test(resid(mod1_lm))
shapiro_res
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(mod1_lm)
## W = 0.97316, p-value = 0.3749

Homogeneidad de varianzas

ggplot(diag1, aes(ajustado, residual)) +
  geom_point(size = 2) + geom_hline(yintercept = 0, linetype = "dashed") +
  theme_minimal() +
  labs(x = "Valores ajustados", y = "Residuales", title = "Residuales vs. ajustados")

ggplot(diag1, aes(nivel, residual, fill = nivel)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  theme_minimal() +
  labs(x = "Nivel de pH", y = "Residuales", title = "Residuales por nivel de pH")

sds <- tapply(Salinidad$Biomasa, Salinidad$Nivel_pH, sd)
razon_sd <- max(sds) / min(sds)
kable(data.frame(Nivel = names(sds), `Desviación estándar` = round(as.numeric(sds), 1),
                 check.names = FALSE),
      caption = "Desviación estándar de la biomasa por nivel de pH")
Desviación estándar de la biomasa por nivel de pH
Nivel Desviación estándar
Bajo 164.8
Medio 244.9
Alto 547.6
# White (versión reducida: e^2 sobre ajustados y ajustados^2)
aux_white <- data.frame(aj = fitted(mod1_lm))
white_res <- lmtest::bptest(mod1_lm, ~ aj + I(aj^2), data = aux_white)
levene_res <- leveneTest(Biomasa ~ Nivel_pH, data = Salinidad)

kable(data.frame(
  Prueba = c("Shapiro-Wilk (W)", "White reducida (BP)", "Levene (F)"),
  Estadistico = round(c(shapiro_res$statistic, white_res$statistic, levene_res$`F value`[1]), 3),
  p_valor = round(c(shapiro_res$p.value, white_res$p.value, levene_res$`Pr(>F)`[1]), 4)
), caption = "Validación de supuestos del modelo 1c")
Validación de supuestos del modelo 1c
Prueba Estadistico p_valor
W Shapiro-Wilk (W) 0.973 0.3749
BP White reducida (BP) 19.006 0.0001
Levene (F) 8.675 0.0007

Análisis de sensibilidad ante heterocedasticidad

# Formato de p-valores para el texto (evita la notación científica)
fp <- function(p) ifelse(p < 0.0001, "p < 0.0001", paste0("p = ", sprintf("%.4f", p)))
welch_res <- oneway.test(Biomasa ~ Nivel_pH, data = Salinidad, var.equal = FALSE)
welch_res
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  Biomasa and Nivel_pH
## F = 34.727, num df = 2.000, denom df = 24.736, p-value = 6.58e-08
# Games-Howell en R base (varianzas desiguales; p con el rango studentizado)
games_howell <- function(y, g) {
  g <- factor(g); k <- nlevels(g)
  m <- tapply(y, g, mean); v <- tapply(y, g, var); n <- tapply(y, g, length)
  pares <- combn(levels(g), 2)
  out <- apply(pares, 2, function(p) {
    a <- p[1]; b <- p[2]
    d   <- unname(m[b] - m[a])
    se2 <- unname(v[a] / n[a] + v[b] / n[b])
    gl  <- se2^2 / (unname((v[a] / n[a])^2 / (n[a] - 1) + (v[b] / n[b])^2 / (n[b] - 1)))
    q   <- abs(d) / sqrt(se2 / 2)
    data.frame(Comparacion = paste(b, "-", a), Diferencia = d, gl = gl,
               p.adj = ptukey(q, nmeans = k, df = gl, lower.tail = FALSE))
  })
  do.call(rbind, out)
}
gh <- games_howell(Salinidad$Biomasa, Salinidad$Nivel_pH)
kable(gh, digits = 4, caption = "Comparaciones de Games-Howell")
Comparaciones de Games-Howell
Comparacion Diferencia gl p.adj
Medio - Bajo 455.0859 24.5237 0.0000
Alto - Bajo 1012.3620 16.5162 0.0000
Alto - Medio 557.2761 19.3852 0.0051

Comparaciones post-hoc LSD

lsd_ph <- agricolae::LSD.test(mod1, "Nivel_pH", console = FALSE)
kable(lsd_ph$groups, col.names = c("Biomasa Promedio", "Grupo LSD"),
      caption = "Tabla. Comparación Múltiple de Medias (Prueba LSD)")
Tabla. Comparación Múltiple de Medias (Prueba LSD)
Biomasa Promedio Grupo LSD
Alto 1605.3853 a
Medio 1048.1093 b
Bajo 593.0233 c

El ANOVA de una vía evidenció un efecto altamente significativo del nivel de pH sobre la Biomasa (F = 29.89; p = 8.45e-09 < 0.05), por lo que se rechaza la hipótesis nula de igualdad de medias entre los tres niveles (Bajo, Medio, Alto).

Normalidad. El gráfico QQ y la prueba de Shapiro-Wilk (W = 0.973; p = 0.3749) no rechazan la normalidad de los residuales. Con 15 observaciones por nivel esta prueba tiene poca potencia, por lo que se interpreta junto con el QQ.

Homogeneidad de varianzas. La prueba de Levene (p = 0.0007) y la versión reducida de White (p < 0.0001) indican que la variabilidad de la biomasa no es la misma entre los niveles de pH; la razón entre la mayor y la menor desviación estándar por nivel es 3.32. Esta violación es una limitación: el F y el LSD clásicos asumen varianzas iguales. Como el diseño es balanceado, el ANOVA es relativamente robusto, pero se realizó una verificación con el ANOVA de Welch (F = 34.73; p < 0.0001) y con comparaciones de Games-Howell, que coinciden con el LSD: los tres niveles de pH difieren entre sí.

La prueba post-hoc LSD mostró que los tres niveles de pH difieren significativamente entre sí (cada uno recibió una letra distinta: a, b, c). El nivel Alto de pH presentó la mayor biomasa promedio (1605.4 g), seguido del nivel Medio (1048.1 g) y, por último, el nivel Bajo, con la menor biomasa promedio (593.0 g). Esto sugiere una relación directa entre el nivel de pH del suelo y la producción de biomasa de la planta forrajera: a mayor pH, mayor biomasa. Una limitación adicional es que categorizar el pH en terciles descarta información de una variable continua; una regresión sobre el pH habría sido más potente.

Punto 2 (Datos de Moluscos)

Dos tipos de moluscos A y B fueron sometidos a tres concentraciones distintas de agua de mar (100%, 75% y 50%) y se observó el consumo de oxígeno midiendo la proporción de O2 por unidad de peso seco del molusco.

Punto 2A:

Realice un análisis exploratorio univariado para cada característica e interprete.

BD_moluscos$c_agua <- factor(BD_moluscos$c_agua)
kable(summary(BD_moluscos), caption = "Tabla 8. Resumen Estadístico de Moluscos")
Tabla 8. Resumen Estadístico de Moluscos
c_agua molusco cons_o
50 :16 Length:48 Min. : 1.800
75 :16 Class :character 1st Qu.: 6.312
100:16 Mode :character Median : 9.700
NA NA Mean : 9.305
NA NA 3rd Qu.:11.232
NA NA Max. :18.800
kable(data.frame(Variable = "cons_o", `Desviación Estándar` = round(sd(BD_moluscos$cons_o), 3)),
      caption = "Tabla 9. Desviación Estándar del Consumo de O2")
Tabla 9. Desviación Estándar del Consumo de O2
Variable Desviación.Estándar
cons_o 3.683
kable(table(BD_moluscos$molusco), col.names = c("Tipo de Molusco", "n"),
      caption = "Tabla 10. Número de Observaciones por Tipo de Molusco")
Tabla 10. Número de Observaciones por Tipo de Molusco
Tipo de Molusco n
A 24
B 24
kable(table(BD_moluscos$c_agua), col.names = c("Concentración (%)", "n"),
      caption = "Tabla 11. Número de Observaciones por Concentración")
Tabla 11. Número de Observaciones por Concentración
Concentración (%) n
50 16
75 16
100 16
ggplot(BD_moluscos, aes(x = cons_o)) +
  geom_histogram(bins = 10, fill = "#2b5c8f", color = "white") +
  theme_minimal() +
  labs(title = "Distribución del Consumo de Oxígeno", x = "Consumo de O2", y = "Frecuencia")

El consumo de oxígeno presenta una media de 9.31 y una desviación estándar de 3.68, con un rango entre 1.8 y 18.8, lo que indica una variabilidad considerable entre las 48 observaciones. La media (9.31) es ligeramente inferior a la mediana (9.70), lo que sugiere una leve asimetría hacia valores bajos. El diseño experimental está balanceado: 24 observaciones para cada tipo de molusco (A y B) y 16 observaciones para cada nivel de concentración de agua de mar (50%, 75% y 100%), lo que garantiza comparaciones equilibradas entre grupos en el ANOVA de dos vías.

Punto 2B:

Realice un análisis exploratorio bivariado que permita conocer cómo es el consumo de oxígeno en las distintas concentraciones de agua de mar, y si estas conclusiones son las mismas para cada tipo de molusco.

BD_moluscos <- BD_moluscos %>%
  mutate(molusco = factor(molusco),
         c_agua = factor(c_agua, levels = c("50", "75", "100")))
ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = c_agua)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Consumo de Oxígeno según Concentración de Agua de Mar",
       x = "Concentración de agua de mar (%)", y = "Consumo de O2")

ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = molusco)) +
  geom_boxplot(alpha = 0.7) +
  theme_minimal() +
  labs(title = "Consumo de Oxígeno según Concentración y Tipo de Molusco",
       x = "Concentración de agua de mar (%)", y = "Consumo de O2", fill = "Molusco")

BD_moluscos %>%
  group_by(molusco, c_agua) %>%
  summarise(media = mean(cons_o, na.rm = TRUE), .groups = "drop") %>%
  ggplot(aes(x = c_agua, y = media, color = molusco, group = molusco)) +
  geom_point(size = 2) +
  geom_line() +
  theme_minimal() +
  labs(title = "Gráfico de interacción: Concentración x Tipo de Molusco",
       x = "Concentración de agua de mar (%)", y = "Consumo medio de O2", color = "Molusco")

El primer boxplot muestra cómo cambia el consumo de oxígeno a medida que varía la concentración de agua de mar, sin distinguir el tipo de molusco. El segundo boxplot separa esa comparación por tipo de molusco (A y B), permitiendo ver si ambos responden de forma similar a los cambios de concentración. Finalmente, el gráfico de interacción une las medias de consumo de oxígeno por grupo: si las líneas de los moluscos A y B son aproximadamente paralelas, el efecto de la concentración de agua de mar sobre el consumo de oxígeno es similar para ambos tipos; si las líneas se cruzan o divergen claramente, esto sugiere que el efecto de la concentración depende del tipo de molusco.

Punto 2C:

Evalúe mediante un ANOVA de dos vías (factores: tipo de molusco y concentración de agua de mar, incluyendo su interacción) si estos factores afectan significativamente el consumo de oxígeno. Verifique los supuestos del modelo (normalidad de los residuales y homogeneidad de varianzas) e interprete el efecto principal de cada factor y de la interacción. Cuando encuentre diferencias significativas, realice las comparaciones post-hoc pertinentes (prueba de LSD) entre los grupos y concluya.

BD_moluscos$molusco <- factor(BD_moluscos$molusco)
BD_moluscos$c_agua  <- factor(BD_moluscos$c_agua, levels = c("50", "75", "100"))
mod2    <- aov(cons_o ~ molusco * c_agua, data = BD_moluscos)
mod2_lm <- lm(cons_o ~ molusco * c_agua, data = BD_moluscos)
tab2 <- summary(mod2)[[1]]
F2 <- tab2[["F value"]]     # filas: molusco, c_agua, interacción
P2 <- tab2[["Pr(>F)"]]
kable(tabla_anova(mod2), caption = "Tabla 12. ANOVA de Dos Vías")
Tabla 12. ANOVA de Dos Vías
Fuente gl SC CM F p
molusco 1 23.227 23.227 2.651 0.111
c_agua 2 230.816 115.408 13.171 < 0.001
molusco:c_agua 2 15.356 7.678 0.876 0.424
Residuals 42 368.011 8.762

Normalidad de los residuales

diag2 <- data.frame(ajustado = fitted(mod2_lm),
                    residual = resid(mod2_lm),
                    estandar = rstandard(mod2_lm),
                    celda    = interaction(BD_moluscos$molusco, BD_moluscos$c_agua, sep = " / "))

ggplot(diag2, aes(sample = estandar)) +
  stat_qq() + stat_qq_line(color = "red") +
  theme_minimal() +
  labs(x = "Cuantiles teóricos", y = "Cuantiles muestrales",
       title = "QQ de residuales estandarizados: O2 ~ molusco * concentración")

shapiro_res2 <- shapiro.test(resid(mod2_lm))
shapiro_res2
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(mod2_lm)
## W = 0.95824, p-value = 0.08571

Homogeneidad de varianzas

ggplot(diag2, aes(ajustado, residual)) +
  geom_point(size = 2) + geom_hline(yintercept = 0, linetype = "dashed") +
  theme_minimal() +
  labs(x = "Valores ajustados", y = "Residuales", title = "Residuales vs. ajustados (modelo 2c)")

ggplot(diag2, aes(celda, residual, fill = celda)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  theme_minimal() +
  labs(x = "Celda (molusco / concentración)", y = "Residuales",
       title = "Residuales por celda")

sds2 <- tapply(BD_moluscos$cons_o, diag2$celda, sd)
razon_sd2 <- max(sds2) / min(sds2)
kable(data.frame(Celda = names(sds2), `Desviación estándar` = round(as.numeric(sds2), 3),
                 check.names = FALSE),
      caption = "Desviación estándar del consumo de O2 por celda")
Desviación estándar del consumo de O2 por celda
Celda Desviación estándar
A / 50 3.090
B / 50 3.518
A / 75 2.740
B / 75 2.739
A / 100 2.748
B / 100 2.844
# White (versión reducida: e^2 sobre ajustados y ajustados^2)
aux_white2 <- data.frame(aj = fitted(mod2_lm))
white_res2 <- lmtest::bptest(mod2_lm, ~ aj + I(aj^2), data = aux_white2)
levene_res2 <- leveneTest(cons_o ~ molusco * c_agua, data = BD_moluscos)
white_p2  <- white_res2$p.value
levene_p2 <- levene_res2$`Pr(>F)`[1]

kable(data.frame(
  Prueba = c("Shapiro-Wilk (W)", "White reducida (BP)", "Levene (F)"),
  Estadistico = round(c(shapiro_res2$statistic, white_res2$statistic, levene_res2$`F value`[1]), 3),
  p_valor = round(c(shapiro_res2$p.value, white_p2, levene_p2), 4)
), caption = "Tabla 13. Validación de supuestos del modelo 2c")
Tabla 13. Validación de supuestos del modelo 2c
Prueba Estadistico p_valor
W Shapiro-Wilk (W) 0.958 0.0857
BP White reducida (BP) 0.955 0.6202
Levene (F) 0.172 0.9715

Comparaciones post-hoc LSD

# Solo la concentración resultó significativa, por eso el LSD se aplica a ese factor
lsd_conc <- agricolae::LSD.test(mod2, "c_agua", console = FALSE)
g2 <- lsd_conc$groups
kable(g2, col.names = c("Consumo medio de O2", "Grupo LSD"),
      caption = "Comparación múltiple de medias (LSD) para la concentración de agua de mar (%)")
Comparación múltiple de medias (LSD) para la concentración de agua de mar (%)
Consumo medio de O2 Grupo LSD
50 12.25062 a
100 8.67125 b
75 6.99250 b
resumen_lsd <- paste0(rownames(g2), " % (", round(g2[[1]], 2), "; grupo ", g2$groups, ")",
                      collapse = ", ")

El ANOVA de dos vías mostró que la concentración de agua de mar afecta significativamente el consumo de oxígeno (F = 13.17; p < 0.0001), mientras que el tipo de molusco (F = 2.65; p = 0.1110) y la interacción molusco × concentración (F = 0.88; p = 0.4238) no fueron significativos al 5 %. Como la interacción no es significativa, el efecto de la concentración es similar para ambos tipos de molusco y los efectos principales pueden interpretarse por separado.

Normalidad. Shapiro-Wilk (W = 0.958; p = 0.0857) no rechaza la normalidad de los residuales; como el valor p no está lejos de 0.05 y n = 48, se interpreta junto con el QQ.

Homogeneidad de varianzas. Levene (p = 0.9715) y la versión reducida de White (p = 0.6202) no indican heterocedasticidad entre las seis celdas; la razón entre la mayor y la menor desviación estándar por celda es 1.28. Con 8 observaciones por celda estas pruebas tienen poca potencia, por lo que se leen junto con los gráficos. En conjunto no se detectan violaciones evidentes de los supuestos, aunque con muestras pequeñas no puede afirmarse un cumplimiento estricto.

Comparaciones post-hoc. Como solo la concentración resultó significativa, la prueba LSD se aplicó a ese factor: 50 % (12.25; grupo a), 100 % (8.67; grupo b), 75 % (6.99; grupo b). Los niveles con letras distintas difieren significativamente entre sí, y el mayor consumo medio de oxígeno se observó con 50 % de agua de mar.

Conclusión. El consumo de oxígeno de los moluscos depende de la concentración de agua de mar; no se evidencian diferencias significativas entre los tipos de molusco ni una respuesta diferencial entre ellos.

Punto 3 (Datos Biodiversidad)

Con el fin de evaluar el efecto del uso del suelo sobre la biodiversidad de anfibios en una reserva forestal, se establecieron parcelas de muestreo en cuatro tipos de hábitat. En cada una de las 52 parcelas (13 por hábitat) se registró la riqueza de especies, el índice de diversidad de Shannon–Wiener y la altitud (m.s.n.m.).

Punto 3A:

Realice un análisis exploratorio univariado para cada característica (riqueza, diversidad de Shannon y altitud) e interprete.

ggplot(BD_biodiversidad, aes(x = Shannon)) +
  geom_histogram(bins = 10, fill = "#2b5c8f", color = "white") +
  theme_minimal() +
  labs(title = "Distribución del Índice de Diversidad de Shannon",
       x = "Índice de Shannon", y = "Frecuencia")

BD_biodiversidad %>%
  pivot_longer(cols = c(Riqueza, Altitud), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Valor)) +
  geom_histogram(bins = 10, fill = "#2b5c8f", color = "white") +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal() +
  labs(title = "Distribución de Riqueza y Altitud", x = "Valor", y = "Frecuencia")

El análisis exploratorio univariado muestra que la Riqueza de especies varía entre las 52 parcelas, con valores esperados más bajos en las coberturas intervenidas y más altos en los bosques. El Índice de Shannon presenta una distribución razonablemente simétrica, adecuada para el modelado ANOVA posterior. La Altitud, por su parte, refleja el rango topográfico de la reserva en el que se ubicaron los sitios de muestreo.

Punto 3B:

Realice un análisis exploratorio bivariado que permita comparar la riqueza y la diversidad de Shannon entre los diferentes tipos de hábitat (por ejemplo, mediante boxplots por grupo), y explore la relación entre la altitud y la diversidad.

ggplot(BD_biodiversidad, aes(x = Habitat, y = Riqueza, fill = Habitat)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Riqueza de Especies según Tipo de Hábitat",
       x = "Tipo de Hábitat", y = "Número de Especies (Riqueza)")

ggplot(BD_biodiversidad, aes(x = Habitat, y = Shannon, fill = Habitat)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Diversidad de Shannon según Tipo de Hábitat",
       x = "Tipo de Hábitat", y = "Índice de Shannon")

ggplot(BD_biodiversidad, aes(x = Altitud, y = Shannon)) +
  geom_point(color = "#2b5c8f", size = 2.5) +
  geom_smooth(method = "lm", color = "darkred", se = TRUE) +
  theme_minimal() +
  labs(title = "Relación entre Altitud y Diversidad de Shannon",
       x = "Altitud (m.s.n.m.)", y = "Índice de Shannon")

r_alt <- cor(BD_biodiversidad$Altitud, BD_biodiversidad$Shannon, use = "complete.obs")
r_alt
## [1] 0.7522111

Los boxplots evidencian una tendencia decreciente en la biodiversidad conforme aumenta la intervención antrópica sobre el suelo: los hábitats conservados (bosque primario y bosque secundario) tienden a presentar mayor riqueza de especies y mayor índice de Shannon, mientras que las coberturas productivas (sistema silvopastoril y potrero) muestran una reducción notoria en ambos indicadores. En cuanto a la altitud, el coeficiente de correlación con el índice de Shannon es r = 0.752, es decir, una relación lineal fuerte; la altitud también se asocia con la diversidad, por lo que conviene considerarla junto con el tipo de hábitat.

Punto 3C:

Evalúe mediante un ANOVA de una vía si existen diferencias significativas en el índice de diversidad de Shannon entre los tipos de hábitat. Verifique los supuestos del modelo (normalidad de los residuales y homogeneidad de varianzas) y, de encontrar diferencias significativas, realice las comparaciones post hoc pertinentes (prueba de LSD), interpretando qué hábitats difieren entre sí y cuáles no.

mod_bio <- aov(Shannon ~ Habitat, data = BD_biodiversidad)
kable(tabla_anova(mod_bio),
      caption = "Tabla 14. Análisis de Varianza (ANOVA) para el Índice de Shannon según Hábitat")
Tabla 14. Análisis de Varianza (ANOVA) para el Índice de Shannon según Hábitat
Fuente gl SC CM F p
Habitat 3 14.862 4.954 60.611 < 0.001
Residuals 48 3.923 0.082
shapiro_bio <- shapiro.test(residuals(mod_bio))
levene_bio  <- car::leveneTest(Shannon ~ Habitat, data = BD_biodiversidad)
supuestos_bio_df <- data.frame(
  Prueba = c("Normalidad (Shapiro-Wilk)", "Homocedasticidad (Levene)"),
  Estadistico = round(c(shapiro_bio$statistic, levene_bio$`F value`[1]), 3),
  p_valor = round(c(shapiro_bio$p.value, levene_bio$`Pr(>F)`[1]), 4),
  Conclusion = c(
    ifelse(shapiro_bio$p.value > 0.05, "Se cumple (Normal)", "No se cumple"),
    ifelse(levene_bio$`Pr(>F)`[1] > 0.05, "Se cumple (Homogéneo)", "No se cumple")
  )
)
kable(supuestos_bio_df,
      col.names = c("Prueba", "Estadístico", "p-valor", "Conclusión"),
      align = "c",
      caption = "Tabla 15. Validación de Supuestos del Modelo ANOVA de Biodiversidad")
Tabla 15. Validación de Supuestos del Modelo ANOVA de Biodiversidad
Prueba Estadístico p-valor Conclusión
W Normalidad (Shapiro-Wilk) 0.978 0.4625 Se cumple (Normal)
Homocedasticidad (Levene) 1.277 0.2930 Se cumple (Homogéneo)
lsd_bio <- agricolae::LSD.test(mod_bio, "Habitat", p.adj = "none", console = FALSE)
kable(lsd_bio$groups,
      col.names = c("Índice Shannon Promedio", "Grupo LSD"),
      align = "c",
      caption = "Tabla 16. Comparación Múltiple de Medias (Prueba LSD)")
Tabla 16. Comparación Múltiple de Medias (Prueba LSD)
Índice Shannon Promedio Grupo LSD
Bosque primario 2.467692 a
Bosque secundario 1.974615 b
Sistema silvopastoril 1.603077 c
Potrero 1.003846 d
plot(lsd_bio, main = "Diferencias de Diversidad de Shannon según Tipo de Hábitat",
     xlab = "Hábitat", ylab = "Índice de Shannon")

El ANOVA de una vía mostró un efecto altamente significativo del tipo de hábitat sobre el índice de diversidad de Shannon (F = 60.61; p < 0.0001), por lo que se rechaza la hipótesis nula de igualdad de medias. Los residuales no mostraron violaciones de los supuestos: Shapiro-Wilk (W = 0.978; p = 0.4625) y Levene (p = 0.2930). Con 13 parcelas por hábitat (diseño balanceado) el ANOVA es además robusto a desviaciones leves; la independencia de las parcelas, en cambio, depende del diseño de muestreo y podría verse afectada por agrupamiento espacial.

La prueba LSD separó a los cuatro hábitats en grupos distintos: Bosque primario (2.47; grupo a), Bosque secundario (1.97; grupo b), Sistema silvopastoril (1.6; grupo c), Potrero (1; grupo d). Es decir, todos difieren entre sí y la diversidad disminuye desde el bosque primario, pasando por el bosque secundario y el sistema silvopastoril, hasta el potrero. Como el LSD no ajusta por comparaciones múltiples, estas comparaciones se interpretan con esa precaución, aunque las diferencias observadas son amplias. Esto sugiere que la intervención antrópica y el cambio de uso del suelo reducen la diversidad de anfibios en la reserva.

Conclusiones

En este trabajo se evaluó el comportamiento de distintas variables ecológicas e hidrobiológicas mediante análisis exploratorios y modelos ANOVA (de una y dos vías) con sus respectivas pruebas de validación de supuestos y comparaciones múltiples:

  1. Efecto de las propiedades del suelo sobre la biomasa: Se identificó que el pH es la variable con mayor correlación e impacto positivo sobre la producción de biomasa (\(r = 0.928\)). Las comparaciones de medias confirmaron que niveles más altos de pH generan incrementos significativos en la biomasa promedio. No obstante, la presencia de heterocedasticidad exigió verificar los resultados con un ANOVA de Welch y comparaciones de Games-Howell, cuyos resultados se reportan en el Punto 1C.

  2. Respuestas fisiológicas en moluscos: El consumo de \(O_2\) en los moluscos cambia con la concentración de agua de mar (ANOVA de dos vías, \(p < 0.001\)), sin diferencias significativas entre tipos de molusco (\(p = 0.111\)) y sin interacción significativa (\(p = 0.424\)): ambos tipos responden de forma similar. Los supuestos de normalidad (Shapiro-Wilk, \(p = 0.0857\)) y homogeneidad de varianzas (Levene, \(p = 0.9715\)) no mostraron violaciones evidentes, aunque con 8 observaciones por celda esta verificación tiene poca potencia.

  3. Impacto del uso del suelo en la biodiversidad: Se constató una degradación del índice de diversidad de Shannon a medida que aumenta la intervención antrópica en el hábitat. Los bosques primarios y secundarios albergan niveles de diversidad significativamente superiores en comparación con los sistemas productivos (potreros y sistemas silvopastoriles).

En conjunto, las herramientas estadísticas aplicadas permitieron respaldar cuantitativamente los patrones ecológicos observados, destacando la importancia de la validación de supuestos para la toma de decisiones metodológicas acertadas.