library(tidyverse)
library(car)
library(agricolae)

options(stringsAsFactors = FALSE)


load("Salinidad.RData")
load("moluscos.RData")
load("Biodiversidad.RData")

ls()
## [1] "BD_biodiversidad" "BD_moluscos"      "Salinidad"

Punto 1 - Datos Salinidad

1a. Análisis exploratorio univariado

names(Salinidad)
## [1] "Biomasa"   "pH"        "Salinidad" "Zinc"      "Potasio"
str(Salinidad)
## 'data.frame':    45 obs. of  5 variables:
##  $ Biomasa  : num  765 954 828 755 896 ...
##  $ pH       : num  5 4.7 4.2 4.4 5.55 5.5 4.25 4.45 4.75 4.6 ...
##  $ Salinidad: int  33 35 32 30 33 33 36 30 38 30 ...
##  $ Zinc     : num  16.5 14 15.3 17.3 22.3 ...
##  $ Potasio  : num  1442 1299 1154 1045 522 ...
Salinidad <- Salinidad %>%
  mutate(
    Biomasa = as.numeric(Biomasa),
    pH = as.numeric(pH),
    Salinidad = as.numeric(Salinidad),
    Zinc = as.numeric(Zinc),
    Potasio = as.numeric(Potasio)
  )

summary(Salinidad)
##     Biomasa             pH          Salinidad          Zinc        
##  Min.   : 369.8   Min.   :3.200   Min.   :24.00   Min.   : 0.2105  
##  1st Qu.: 654.8   1st Qu.:3.450   1st Qu.:27.00   1st Qu.:13.9852  
##  Median : 991.8   Median :4.450   Median :30.00   Median :19.2420  
##  Mean   :1082.2   Mean   :4.609   Mean   :30.27   Mean   :17.8308  
##  3rd Qu.:1346.9   3rd Qu.:5.350   3rd Qu.:33.00   3rd Qu.:22.6758  
##  Max.   :2337.3   Max.   :7.450   Max.   :38.00   Max.   :31.2865  
##     Potasio      
##  Min.   : 350.7  
##  1st Qu.: 527.0  
##  Median : 773.3  
##  Mean   : 797.4  
##  3rd Qu.: 954.1  
##  Max.   :1441.7
Salinidad %>%
  summarise(
    across(
      c(Biomasa, pH, Salinidad, Zinc, Potasio),
      list(
        media = ~mean(.x, na.rm = TRUE),
        mediana = ~median(.x, na.rm = TRUE),
        DE = ~sd(.x, na.rm = TRUE),
        minimo = ~min(.x, na.rm = TRUE),
        Q1 = ~quantile(.x, 0.25, na.rm = TRUE),
        Q3 = ~quantile(.x, 0.75, na.rm = TRUE),
        maximo = ~max(.x, na.rm = TRUE)
      )
    )
  )
##   Biomasa_media Biomasa_mediana Biomasa_DE Biomasa_minimo Biomasa_Q1 Biomasa_Q3
## 1      1082.173         991.829   546.2874        369.823    654.825    1346.88
##   Biomasa_maximo pH_media pH_mediana    pH_DE pH_minimo pH_Q1 pH_Q3 pH_maximo
## 1       2337.326 4.608889       4.45 1.254731       3.2  3.45  5.35      7.45
##   Salinidad_media Salinidad_mediana Salinidad_DE Salinidad_minimo Salinidad_Q1
## 1        30.26667                30     3.719726               24           27
##   Salinidad_Q3 Salinidad_maximo Zinc_media Zinc_mediana  Zinc_DE Zinc_minimo
## 1           33               38    17.8308       19.242 8.274169      0.2105
##   Zinc_Q1 Zinc_Q3 Zinc_maximo Potasio_media Potasio_mediana Potasio_DE
## 1 13.9852 22.6758     31.2865      797.3778           773.3    297.576
##   Potasio_minimo Potasio_Q1 Potasio_Q3 Potasio_maximo
## 1         350.73     526.97     954.11        1441.67
Salinidad %>%
  pivot_longer(
    cols = c(Biomasa, pH, Salinidad, Zinc, Potasio),
    names_to = "Variable",
    values_to = "Valor"
  ) %>%
  ggplot(aes(x = Valor)) +
  geom_histogram(bins = 10, fill = "steelblue", color = "white") +
  facet_wrap(~Variable, scales = "free", ncol = 2) +
  labs(
    title = "Distribución de las variables",
    x = NULL,
    y = "Frecuencia"
  ) +
  theme_minimal()

Salinidad %>%
  pivot_longer(
    cols = c(Biomasa, pH, Salinidad, Zinc, Potasio),
    names_to = "Variable",
    values_to = "Valor"
  ) %>%
  ggplot(aes(x = Variable, y = Valor)) +
  geom_boxplot(fill = "steelblue", alpha = 0.75) +
  facet_wrap(~Variable, scales = "free", ncol = 2) +
  labs(
    title = "Boxplots de las variables",
    x = NULL,
    y = "Valor"
  ) +
  theme_minimal()

1b. Análisis exploratorio bivariado

cor_p1 <- tibble(
  Variable = c("pH", "Salinidad", "Zinc"),
  r_Pearson = c(
    cor(Salinidad$Biomasa, Salinidad$pH, use = "complete.obs"),
    cor(Salinidad$Biomasa, Salinidad$Salinidad, use = "complete.obs"),
    cor(Salinidad$Biomasa, Salinidad$Zinc, use = "complete.obs")
  ),
  p_valor = c(
    cor.test(Salinidad$Biomasa, Salinidad$pH)$p.value,
    cor.test(Salinidad$Biomasa, Salinidad$Salinidad)$p.value,
    cor.test(Salinidad$Biomasa, Salinidad$Zinc)$p.value
  )
)

cor_p1
## # A tibble: 3 × 3
##   Variable  r_Pearson  p_valor
##   <chr>         <dbl>    <dbl>
## 1 pH           0.928  4.60e-20
## 2 Salinidad   -0.0666 6.64e- 1
## 3 Zinc        -0.781  2.37e-10
Salinidad %>%
  select(Biomasa, pH, Salinidad, Zinc) %>%
  pivot_longer(
    cols = -Biomasa,
    names_to = "Variable",
    values_to = "Valor"
  ) %>%
  ggplot(aes(x = Valor, y = Biomasa)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", se = TRUE) +
  facet_wrap(~Variable, scales = "free_x") +
  labs(
    title = "Relación entre biomasa y las covariables",
    x = "Covariable",
    y = "Biomasa (g)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

1c. Categorización del pH y ANOVA

Crear tres niveles de pH

Aquí usamos ntile() en lugar de cut() con puntos de corte manuales. Esto evita errores cuando hay valores repetidos exactamente en los terciles y garantiza tres grupos ordenados.

Salinidad <- Salinidad %>%
  mutate(
    pH_nivel = factor(
      ntile(pH, 3),
      levels = c(1, 2, 3),
      labels = c("Bajo", "Medio", "Alto")
    )
  )

table(Salinidad$pH_nivel, useNA = "ifany")
## 
##  Bajo Medio  Alto 
##    15    15    15
Salinidad %>%
  group_by(pH_nivel) %>%
  summarise(
    n = n(),
    media_Biomasa = mean(Biomasa, na.rm = TRUE),
    DE = sd(Biomasa, na.rm = TRUE),
    mediana = median(Biomasa, na.rm = TRUE),
    .groups = "drop"
  )
## # A tibble: 3 × 5
##   pH_nivel     n media_Biomasa    DE mediana
##   <fct>    <int>         <dbl> <dbl>   <dbl>
## 1 Bajo        15          593.  165.    546.
## 2 Medio       15         1048.  245.   1040.
## 3 Alto        15         1605.  548.   1423.

Gráfico

ggplot(Salinidad, aes(x = pH_nivel, y = Biomasa)) +
  geom_boxplot(fill = "steelblue", alpha = 0.75) +
  geom_jitter(width = 0.08, alpha = 0.6) +
  labs(
    title = "Biomasa según nivel de pH",
    x = "Nivel de pH",
    y = "Biomasa (g)"
  ) +
  theme_minimal()

ANOVA inicial

datos_p1 <- Salinidad %>%
  select(Biomasa, pH_nivel) %>%
  drop_na()

anova_p1_inicial <- aov(
  Biomasa ~ pH_nivel,
  data = datos_p1
)

summary(anova_p1_inicial)
##             Df  Sum Sq Mean Sq F value   Pr(>F)    
## pH_nivel     2 7712683 3856342   29.89 8.45e-09 ***
## Residuals   42 5418235  129006                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Supuestos del ANOVA

# Normalidad de los residuales
shapiro.test(residuals(anova_p1_inicial))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_p1_inicial)
## W = 0.97316, p-value = 0.3749
# Homogeneidad de varianzas
leveneTest(Biomasa ~ pH_nivel, data = datos_p1)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value   Pr(>F)    
## group  2  8.6753 0.000702 ***
##       42                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Diagnóstico visual
par(mfrow = c(1, 2))
plot(anova_p1_inicial, which = 1)
plot(anova_p1_inicial, which = 2)

par(mfrow = c(1, 1))

ANOVA final

Si el supuesto de homogeneidad no se cumple en la escala original, se transforma la variable respuesta. Esta decisión se basa en el resultado de Levene y no se hace automáticamente sin revisar el diagnóstico.

p_levene_p1 <- car::leveneTest(
  Biomasa ~ pH_nivel,
  data = datos_p1
)$`Pr(>F)`[1]

if (p_levene_p1 < 0.05) {

  if (any(datos_p1$Biomasa <= 0, na.rm = TRUE)) {
    stop("Hay valores de Biomasa <= 0; no es posible usar log(Biomasa).")
  }

  datos_p1 <- datos_p1 %>%
    mutate(log_Biomasa = log(Biomasa))

  anova_p1 <- aov(
    log_Biomasa ~ pH_nivel,
    data = datos_p1
  )

  cat("Se utilizó log(Biomasa) porque Levene fue significativa.\n")
  summary(anova_p1)

} else {

  anova_p1 <- anova_p1_inicial

  cat("Los supuestos de la escala original son compatibles con el ANOVA.\n")
  summary(anova_p1)
}
## Se utilizó log(Biomasa) porque Levene fue significativa.
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## pH_nivel     2  7.154   3.577   40.81 1.42e-10 ***
## Residuals   42  3.681   0.088                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Verificación de los supuestos del modelo final

shapiro_p1 <- shapiro.test(residuals(anova_p1))
shapiro_p1
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_p1)
## W = 0.97896, p-value = 0.578
if (exists("log_Biomasa", where = datos_p1)) {
  levene_p1_final <- leveneTest(
    log_Biomasa ~ pH_nivel,
    data = datos_p1
  )
} else {
  levene_p1_final <- leveneTest(
    Biomasa ~ pH_nivel,
    data = datos_p1
  )
}

levene_p1_final
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  1.4135 0.2546
##       42

Prueba post-ANOVA: LSD

LSD.test(
  anova_p1,
  "pH_nivel",
  p.adj = "none",
  console = TRUE
)
## 
## Study: anova_p1 ~ "pH_nivel"
## 
## LSD t Test for log_Biomasa 
## 
## Mean Square Error:  0.08763569 
## 
## pH_nivel,  means and individual ( 95 %) CI
## 
##       log_Biomasa       std  r         se      LCL      UCL      Min      Max
## Alto     7.322857 0.3608580 15 0.07643546 7.168604 7.477110 6.640242 7.756763
## Bajo     6.351728 0.2641536 15 0.07643546 6.197475 6.505981 5.913025 6.885014
## Medio    6.926945 0.2508216 15 0.07643546 6.772692 7.081198 6.342922 7.307387
##            Q25      Q50      Q75
## Alto  7.089255 7.260407 7.692731
## Bajo  6.176084 6.301772 6.491777
## Medio 6.789658 6.946627 7.088730
## 
## Alpha: 0.05 ; DF Error: 42
## Critical Value of t: 2.018082 
## 
## least Significant Difference: 0.2181467 
## 
## Treatments with the same letter are not significantly different.
## 
##       log_Biomasa groups
## Alto     7.322857      a
## Medio    6.926945      b
## Bajo     6.351728      c

Interpretación

La variable del suelo con mayor relación lineal con la biomasa se selecciona para la comparación por niveles.

Antes de interpretar el ANOVA se revisan explícitamente normalidad y homogeneidad de varianzas. Cuando la homogeneidad se viola, la biomasa se transforma mediante logaritmo y se vuelve a verificar el modelo.

La prueba LSD se utiliza posteriormente para identificar qué niveles de pH presentan diferencias significativas.


Punto 2 - Datos Moluscos

2a. Análisis exploratorio univariado

names(BD_moluscos)
## [1] "c_agua"  "molusco" "cons_o"
str(BD_moluscos)
## tibble [48 × 3] (S3: tbl_df/tbl/data.frame)
##  $ c_agua : num [1:48] 100 100 100 100 100 100 100 100 100 100 ...
##  $ molusco: chr [1:48] "A" "A" "A" "A" ...
##  $ cons_o : num [1:48] 7.16 8.26 6.78 14 13.6 11.1 8.93 9.66 6.14 6.14 ...

Preparación de variables

BD_moluscos <- BD_moluscos %>%
  mutate(
    molusco = factor(trimws(as.character(molusco))),
    c_agua = trimws(as.character(c_agua)),
    c_agua = gsub("%", "", c_agua),
    c_agua = factor(c_agua),
    cons_o = as.numeric(cons_o)
  )

table(BD_moluscos$molusco, useNA = "ifany")
## 
##  A  B 
## 24 24
table(BD_moluscos$c_agua, useNA = "ifany")
## 
## 100  50  75 
##  16  16  16

Tabla descriptiva

BD_moluscos %>%
  summarise(
    n = n(),
    media = mean(cons_o, na.rm = TRUE),
    mediana = median(cons_o, na.rm = TRUE),
    DE = sd(cons_o, na.rm = TRUE),
    minimo = min(cons_o, na.rm = TRUE),
    Q1 = quantile(cons_o, 0.25, na.rm = TRUE),
    Q3 = quantile(cons_o, 0.75, na.rm = TRUE),
    maximo = max(cons_o, na.rm = TRUE)
  )
## # A tibble: 1 × 8
##       n media mediana    DE minimo    Q1    Q3 maximo
##   <int> <dbl>   <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
## 1    48  9.30     9.7  3.68    1.8  6.31  11.2   18.8
ggplot(BD_moluscos, aes(x = cons_o)) +
  geom_histogram(bins = 10, fill = "steelblue", color = "white") +
  labs(
    title = "Distribución del consumo de oxígeno",
    x = "Consumo de O2",
    y = "Frecuencia"
  ) +
  theme_minimal()

2b. Análisis exploratorio bivariado

BD_moluscos %>%
  group_by(molusco, c_agua) %>%
  summarise(
    n = n(),
    media = mean(cons_o, na.rm = TRUE),
    DE = sd(cons_o, na.rm = TRUE),
    mediana = median(cons_o, na.rm = TRUE),
    .groups = "drop"
  )
## # A tibble: 6 × 6
##   molusco c_agua     n media    DE mediana
##   <fct>   <fct>  <int> <dbl> <dbl>   <dbl>
## 1 A       100        8  9.94  2.75    9.30
## 2 A       50         8 12.2   3.09   11.1 
## 3 A       75         8  7.89  2.74    7.18
## 4 B       100        8  7.41  2.84    6.14
## 5 B       50         8 12.3   3.52   12.8 
## 6 B       75         8  6.10  2.74    5.60
ggplot(BD_moluscos, aes(x = c_agua, y = cons_o, fill = molusco)) +
  geom_boxplot(alpha = 0.75) +
  geom_jitter(
    aes(color = molusco),
    width = 0.08,
    alpha = 0.6,
    show.legend = FALSE
  ) +
  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"
  ) +
  theme_minimal()

ggplot(
  BD_moluscos,
  aes(x = c_agua, y = cons_o, color = molusco, group = molusco)
) +
  stat_summary(fun = mean, geom = "point", size = 3) +
  stat_summary(fun = mean, geom = "line") +
  stat_summary(
    fun.data = mean_cl_normal,
    geom = "errorbar",
    width = 0.15
  ) +
  labs(
    title = "Consumo medio de oxígeno por tratamiento",
    x = "Concentración de agua de mar",
    y = "Consumo medio de O2",
    color = "Molusco"
  ) +
  theme_minimal()
## Warning: Computation failed in `stat_summary()`.
## Caused by error in `fun.data()`:
## ! The package "Hmisc" is required.

2c. ANOVA de dos vías

Comprobar que no quedaron valores faltantes

table(BD_moluscos$molusco, BD_moluscos$c_agua, useNA = "ifany")
##    
##     100 50 75
##   A   8  8  8
##   B   8  8  8
datos_p2 <- BD_moluscos %>%
  select(cons_o, molusco, c_agua) %>%
  drop_na()

nrow(datos_p2)
## [1] 48

Modelo

anova_p2 <- aov(
  cons_o ~ molusco * c_agua,
  data = datos_p2
)

summary(anova_p2)
##                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

Supuestos

shapiro.test(residuals(anova_p2))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_p2)
## W = 0.95824, p-value = 0.08571
leveneTest(
  cons_o ~ interaction(molusco, c_agua),
  data = datos_p2
)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  5  0.1723 0.9715
##       42

LSD según el resultado de la interacción

tabla_anova_p2 <- summary(anova_p2)[[1]]

p_molusco <- tabla_anova_p2["molusco", "Pr(>F)"]
p_agua <- tabla_anova_p2["c_agua", "Pr(>F)"]
p_interaccion <- tabla_anova_p2["molusco:c_agua", "Pr(>F)"]

cat("p molusco =", p_molusco, "\n")
## p molusco = NA
cat("p agua =", p_agua, "\n")
## p agua = 3.628683e-05
cat("p interacción =", p_interaccion, "\n\n")
## p interacción = 0.4237999
if (!is.na(p_interaccion) && p_interaccion < 0.05) {

  datos_p2 <- datos_p2 %>%
    mutate(grupo = interaction(molusco, c_agua))

  anova_interaccion <- aov(cons_o ~ grupo, data = datos_p2)

  cat("La interacción es significativa: se comparan las combinaciones de factores.\n")
  print(LSD.test(
    anova_interaccion,
    "grupo",
    p.adj = "none",
    console = TRUE
  ))

} else {

  if (!is.na(p_agua) && p_agua < 0.05) {
    cat("La interacción no es significativa y el factor concentración sí.\n")
    cat("Se realiza LSD para concentración de agua.\n\n")

    print(LSD.test(
      anova_p2,
      "c_agua",
      p.adj = "none",
      console = TRUE
    ))
  }

  if (!is.na(p_molusco) && p_molusco < 0.05) {
    cat("El factor tipo de molusco es significativo.\n")
    cat("Se realiza LSD para tipo de molusco.\n\n")

    print(LSD.test(
      anova_p2,
      "molusco",
      p.adj = "none",
      console = TRUE
    ))
  }
}
## La interacción no es significativa y el factor concentración sí.
## Se realiza LSD para concentración de agua.
## 
## 
## Study: anova_p2 ~ "c_agua"
## 
## LSD t Test for cons_o 
## 
## Mean Square Error:  8.762171 
## 
## c_agua,  means and individual ( 95 %) CI
## 
##       cons_o      std  r        se       LCL       UCL  Min  Max    Q25    Q50
## 100  8.67125 3.000940 16 0.7400241  7.177821 10.164679 3.68 14.0  6.140  8.595
## 50  12.25062 3.199643 16 0.7400241 10.757196 13.744054 6.38 18.8 10.085 11.455
## 75   6.99250 2.804093 16 0.7400241  5.499071  8.485929 1.80 13.2  5.200  6.430
##         Q75
## 100 10.5750
## 50  14.5000
## 75   8.7675
## 
## Alpha: 0.05 ; DF Error: 42
## Critical Value of t: 2.018082 
## 
## least Significant Difference: 2.112028 
## 
## Treatments with the same letter are not significantly different.
## 
##       cons_o groups
## 50  12.25062      a
## 100  8.67125      b
## 75   6.99250      b
## $statistics
##    MSerror Df     Mean      CV  t.value      LSD
##   8.762171 42 9.304792 31.8126 2.018082 2.112028
## 
## $parameters
##         test p.ajusted name.t ntr alpha
##   Fisher-LSD      none c_agua   3  0.05
## 
## $means
##       cons_o      std  r        se       LCL       UCL  Min  Max    Q25    Q50
## 100  8.67125 3.000940 16 0.7400241  7.177821 10.164679 3.68 14.0  6.140  8.595
## 50  12.25062 3.199643 16 0.7400241 10.757196 13.744054 6.38 18.8 10.085 11.455
## 75   6.99250 2.804093 16 0.7400241  5.499071  8.485929 1.80 13.2  5.200  6.430
##         Q75
## 100 10.5750
## 50  14.5000
## 75   8.7675
## 
## $comparison
## NULL
## 
## $groups
##       cons_o groups
## 50  12.25062      a
## 100  8.67125      b
## 75   6.99250      b
## 
## attr(,"class")
## [1] "group"

Interpretación

El ANOVA de dos vías permite evaluar simultáneamente el efecto del tipo de molusco, la concentración de agua de mar y la interacción entre ambos factores.

Primero se verifica la interacción. Si es significativa, las comparaciones se realizan sobre las combinaciones de los dos factores. Si no es significativa, se interpretan los efectos principales y se realizan las comparaciones LSD únicamente para los factores significativos.


Punto 3 - Datos Biodiversidad

3a. Análisis exploratorio univariado

names(BD_biodiversidad)
## [1] "Parcela" "Habitat" "Riqueza" "Shannon" "Altitud"
str(BD_biodiversidad)
## 'data.frame':    52 obs. of  5 variables:
##  $ Parcela: chr  "P001" "P002" "P003" "P004" ...
##  $ Habitat: chr  "Bosque primario" "Bosque primario" "Bosque primario" "Bosque primario" ...
##  $ Riqueza: num  14 14 13 14 10 15 19 16 15 21 ...
##  $ Shannon: num  2.13 2.98 2.07 2.53 2.82 2.75 2.45 1.73 2.04 2.48 ...
##  $ Altitud: num  1478 1477 1505 1395 1494 ...
##  - attr(*, "datalabel")= chr "BD_biodiversidad"
##  - attr(*, "var.labels")= chr [1:5] "" "" "" "" ...

Preparación

BD_biodiversidad <- BD_biodiversidad %>%
  mutate(
    Habitat = factor(trimws(as.character(Habitat))),
    Riqueza = as.numeric(Riqueza),
    Shannon = as.numeric(Shannon),
    Altitud = as.numeric(Altitud)
  )

table(BD_biodiversidad$Habitat, useNA = "ifany")
## 
##       Bosque primario     Bosque secundario               Potrero 
##                    13                    13                    13 
## Sistema silvopastoril 
##                    13
summary(BD_biodiversidad)
##    Parcela                           Habitat      Riqueza          Shannon     
##  Length:52          Bosque primario      :13   Min.   : 2.000   Min.   :0.670  
##  Class :character   Bosque secundario    :13   1st Qu.: 6.000   1st Qu.:1.262  
##  Mode  :character   Potrero              :13   Median : 9.500   Median :1.850  
##                     Sistema silvopastoril:13   Mean   : 9.731   Mean   :1.762  
##                                                3rd Qu.:13.000   3rd Qu.:2.105  
##                                                Max.   :21.000   Max.   :2.980  
##     Altitud      
##  Min.   : 950.9  
##  1st Qu.:1081.9  
##  Median :1254.8  
##  Mean   :1243.9  
##  3rd Qu.:1382.9  
##  Max.   :1600.8

Resumen

BD_biodiversidad %>%
  summarise(
    riqueza_media = mean(Riqueza, na.rm = TRUE),
    riqueza_DE = sd(Riqueza, na.rm = TRUE),
    riqueza_mediana = median(Riqueza, na.rm = TRUE),
    riqueza_min = min(Riqueza, na.rm = TRUE),
    riqueza_max = max(Riqueza, na.rm = TRUE),

    shannon_media = mean(Shannon, na.rm = TRUE),
    shannon_DE = sd(Shannon, na.rm = TRUE),
    shannon_mediana = median(Shannon, na.rm = TRUE),
    shannon_min = min(Shannon, na.rm = TRUE),
    shannon_max = max(Shannon, na.rm = TRUE),

    altitud_media = mean(Altitud, na.rm = TRUE),
    altitud_DE = sd(Altitud, na.rm = TRUE),
    altitud_mediana = median(Altitud, na.rm = TRUE),
    altitud_min = min(Altitud, na.rm = TRUE),
    altitud_max = max(Altitud, na.rm = TRUE)
  )
##   riqueza_media riqueza_DE riqueza_mediana riqueza_min riqueza_max
## 1      9.730769   4.370648             9.5           2          21
##   shannon_media shannon_DE shannon_mediana shannon_min shannon_max
## 1      1.762308  0.6069164            1.85        0.67        2.98
##   altitud_media altitud_DE altitud_mediana altitud_min altitud_max
## 1      1243.892   172.7084          1254.8       950.9      1600.8
BD_biodiversidad %>%
  pivot_longer(
    cols = c(Riqueza, Shannon, Altitud),
    names_to = "Variable",
    values_to = "Valor"
  ) %>%
  ggplot(aes(x = Valor)) +
  geom_histogram(bins = 10, fill = "steelblue", color = "white") +
  facet_wrap(~Variable, scales = "free", ncol = 1) +
  labs(
    title = "Distribución de las variables",
    x = NULL,
    y = "Frecuencia"
  ) +
  theme_minimal()

3b. Análisis exploratorio bivariado

Riqueza por hábitat

ggplot(BD_biodiversidad, aes(x = Habitat, y = Riqueza)) +
  geom_boxplot(fill = "steelblue", alpha = 0.75) +
  geom_jitter(width = 0.08, alpha = 0.6) +
  labs(
    title = "Riqueza de anfibios según hábitat",
    x = "Hábitat",
    y = "Riqueza de especies"
  ) +
  theme_minimal()

Shannon por hábitat

ggplot(BD_biodiversidad, aes(x = Habitat, y = Shannon)) +
  geom_boxplot(fill = "steelblue", alpha = 0.75) +
  geom_jitter(width = 0.08, alpha = 0.6) +
  labs(
    title = "Diversidad de Shannon según hábitat",
    x = "Hábitat",
    y = "Índice de Shannon-Wiener"
  ) +
  theme_minimal()

Altitud y Shannon

ggplot(BD_biodiversidad, aes(x = Altitud, y = Shannon)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(
    title = "Relación entre altitud y diversidad",
    x = "Altitud (m s. n. m.)",
    y = "Índice de Shannon-Wiener"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

cor.test(
  BD_biodiversidad$Altitud,
  BD_biodiversidad$Shannon,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  BD_biodiversidad$Altitud and BD_biodiversidad$Shannon
## t = 8.0722, df = 50, p-value = 1.287e-10
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6031181 0.8505182
## sample estimates:
##       cor 
## 0.7522111

3c. ANOVA de una vía para Shannon

Control previo

table(BD_biodiversidad$Habitat, useNA = "ifany")
## 
##       Bosque primario     Bosque secundario               Potrero 
##                    13                    13                    13 
## Sistema silvopastoril 
##                    13
datos_p3 <- BD_biodiversidad %>%
  select(Shannon, Habitat) %>%
  drop_na()

nrow(datos_p3)
## [1] 52

Modelo

anova_p3 <- aov(
  Shannon ~ Habitat,
  data = datos_p3
)

summary(anova_p3)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Habitat      3 14.862   4.954   60.61 2.38e-16 ***
## Residuals   48  3.923   0.082                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Supuestos

shapiro.test(residuals(anova_p3))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_p3)
## W = 0.97846, p-value = 0.4625
leveneTest(
  Shannon ~ Habitat,
  data = datos_p3
)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  3  1.2768  0.293
##       48

LSD

p_habitat <- summary(anova_p3)[[1]]["Habitat", "Pr(>F)"]

if (!is.na(p_habitat) && p_habitat < 0.05) {

  LSD.test(
    anova_p3,
    "Habitat",
    p.adj = "none",
    console = TRUE
  )

} else {

  cat("El ANOVA no fue significativo; no se realiza LSD.\n")
}
## 
## Study: anova_p3 ~ "Habitat"
## 
## LSD t Test for Shannon 
## 
## Mean Square Error:  0.08173622 
## 
## Habitat,  means and individual ( 95 %) CI
## 
##                        Shannon       std  r         se       LCL      UCL  Min
## Bosque primario       2.467692 0.3765668 13 0.07929314 2.3082628 2.627122 1.73
## Bosque secundario     1.974615 0.2204395 13 0.07929314 1.8151858 2.134045 1.44
## Potrero               1.003846 0.2396712 13 0.07929314 0.8444166 1.163276 0.67
## Sistema silvopastoril 1.603077 0.2812586 13 0.07929314 1.4436474 1.762506 1.14
##                        Max  Q25  Q50  Q75
## Bosque primario       2.98 2.13 2.53 2.75
## Bosque secundario     2.27 1.86 2.03 2.10
## Potrero               1.34 0.80 0.98 1.20
## Sistema silvopastoril 2.06 1.41 1.62 1.86
## 
## Alpha: 0.05 ; DF Error: 48
## Critical Value of t: 2.010635 
## 
## least Significant Difference: 0.2254674 
## 
## Treatments with the same letter are not significantly different.
## 
##                        Shannon groups
## Bosque primario       2.467692      a
## Bosque secundario     1.974615      b
## Sistema silvopastoril 1.603077      c
## Potrero               1.003846      d

Interpretación

El ANOVA de una vía permite evaluar si el índice de diversidad de Shannon cambia entre los cuatro tipos de hábitat estudiados.

En los datos analizados, el modelo mostró un efecto significativo del hábitat sobre el índice de Shannon (F(3,48) = 60.61, p < 0.001). Por tanto, se rechaza la hipótesis nula de igualdad de medias y existe evidencia de que la diversidad de anfibios no es igual entre los cuatro tipos de hábitat.

Antes de interpretar el resultado se verificaron los supuestos. La prueba de Shapiro-Wilk aplicada a los residuales no fue significativa (p = 0.4625), por lo que no se detectó una desviación importante de la normalidad. La prueba de Levene tampoco fue significativa (p = 0.2930), por lo que no se detectó heterogeneidad significativa de las varianzas. En consecuencia, los supuestos del ANOVA fueron razonablemente satisfechos.

Comparaciones post-hoc LSD

La prueba LSD permite identificar entre qué hábitats se encuentran las diferencias detectadas por el ANOVA. Los resultados mostraron diferencias significativas entre todas las parejas de hábitats (p < 0.01 en todas las comparaciones).

En términos descriptivos, el índice medio de Shannon siguió este orden:

  • Bosque primario: 2.47
  • Bosque secundario: 1.97
  • Sistema silvopastoril: 1.60
  • Potrero: 1.00

Esto indica que las parcelas de bosque primario presentaron el mayor valor medio de diversidad, mientras que las parcelas de potrero presentaron el menor. Como todas las comparaciones fueron significativas, cada uno de los cuatro hábitats se diferenció estadísticamente de los demás en el índice de Shannon.

Desde el punto de vista ecológico, los resultados son compatibles con un patrón de mayor diversidad de anfibios en los hábitats con menor transformación hacia usos agropecuarios y menor diversidad en los sitios más intervenidos. Esta interpretación se refiere específicamente a las parcelas incluidas en este estudio y no debe extrapolarse automáticamente a otras reservas o regiones.

Relación entre altitud y diversidad

La correlación de Pearson entre altitud y Shannon fue positiva y significativa (r = 0.7522, p < 0.001). En las parcelas estudiadas, los sitios ubicados a mayor altitud tendieron a presentar valores mayores de diversidad de Shannon.

Esta relación es una asociación exploratoria y no demuestra por sí sola que la altitud sea la causa directa del cambio en diversidad, ya que otras características ambientales pueden estar asociadas con la altitud.

Conclusiones

Punto 1 - Salinidad

El análisis exploratorio mostró que el pH fue la covariable con mayor relación lineal con la biomasa. La correlación fue positiva y muy fuerte (r = 0.9281, p < 0.001), mientras que el zinc presentó una relación negativa fuerte (r = -0.7815, p < 0.001) y la salinidad prácticamente no mostró relación lineal con la biomasa (r = -0.0666, p = 0.6639).

Al categorizar el pH en tres niveles mediante terciles, las medias de biomasa aumentaron desde el nivel bajo hasta el nivel alto. El ANOVA mostró diferencias significativas entre los niveles de pH (p < 0.001).

La revisión de supuestos indicó que, en la escala original, la normalidad de los residuales fue compatible con el modelo (Shapiro-Wilk, p = 0.3749), pero la homogeneidad de varianzas no se cumplió (Levene, p = 0.0007). Por esta razón se utilizó log(Biomasa) para el análisis final. En el modelo transformado, los supuestos fueron razonablemente cumplidos (Shapiro-Wilk, p = 0.5780; Levene, p = 0.2546) y el efecto del nivel de pH continuó siendo significativo (F(2,42) = 40.81, p < 0.001).

La prueba LSD mostró diferencias significativas entre Bajo vs. Medio, Bajo vs. Alto y Medio vs. Alto. Por tanto, en estas muestras, los tres niveles de pH estuvieron asociados con valores de biomasa estadísticamente diferentes, con un incremento de biomasa a medida que aumentó el nivel de pH.

Punto 2 - Moluscos

El análisis exploratorio mostró que el consumo de oxígeno varió según la concentración de agua de mar y que el patrón general fue similar para los dos tipos de molusco.

El ANOVA de dos vías no mostró un efecto significativo del tipo de molusco (F = 2.65, p = 0.111) ni una interacción significativa entre tipo de molusco y concentración de agua de mar (F = 0.88, p = 0.424). En cambio, la concentración de agua de mar sí tuvo un efecto significativo sobre el consumo de oxígeno (F = 13.17, p < 0.001).

Los supuestos del modelo fueron razonablemente cumplidos (Shapiro-Wilk, p = 0.0857; Levene, p = 0.9715). La prueba LSD indicó que la concentración del 50% difirió significativamente de 75% y 100%, mientras que 75% y 100% no presentaron una diferencia significativa.

En términos biológicos, dentro de las condiciones de este experimento, el consumo de oxígeno estuvo relacionado con la concentración de agua de mar, pero no se detectó evidencia estadística de diferencias entre los dos tipos de molusco ni de que ambos respondieran de manera diferente a las concentraciones evaluadas.

Punto 3 - Biodiversidad

El análisis exploratorio mostró diferencias descriptivas importantes entre hábitats. El índice medio de Shannon fue mayor en bosque primario (2.47), seguido por bosque secundario (1.97), sistema silvopastoril (1.60) y potrero (1.00).

El ANOVA de una vía mostró un efecto significativo del tipo de hábitat sobre la diversidad de Shannon (F(3,48) = 60.61, p < 0.001). Los supuestos fueron razonablemente cumplidos, ya que la prueba de Shapiro-Wilk no fue significativa (p = 0.4625) y la prueba de Levene tampoco fue significativa (p = 0.2930).

La prueba LSD mostró diferencias significativas entre todas las parejas de hábitats (p < 0.01). Por tanto, en las parcelas estudiadas, los cuatro tipos de hábitat presentaron valores estadísticamente diferentes de diversidad de Shannon.

Además, la altitud presentó una relación positiva fuerte con Shannon (r = 0.7522, p < 0.001). Esto indica que las parcelas ubicadas a mayor altitud tendieron a presentar mayor diversidad, aunque esta asociación no permite establecer por sí sola una relación causal.

Conclusión general

En conjunto, los tres análisis muestran que las variables experimentales o ambientales evaluadas pueden presentar efectos diferenciados sobre las respuestas biológicas:

  • En Salinidad, el pH fue la variable más fuertemente relacionada con la biomasa y los niveles de pH presentaron diferencias significativas en biomasa.
  • En Moluscos, la concentración de agua de mar modificó significativamente el consumo de oxígeno, mientras que el tipo de molusco y su interacción con la concentración no fueron significativos.
  • En Biodiversidad, el tipo de hábitat produjo diferencias significativas en el índice de Shannon y se observó además una asociación positiva entre altitud y diversidad.