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"
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()
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'
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.
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()
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
# 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))
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
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
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
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.
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 ...
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
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()
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.
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
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
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
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"
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.
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] "" "" "" "" ...
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
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()
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()
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()
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
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
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
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
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
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.
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:
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.
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.
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.
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.
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.
En conjunto, los tres análisis muestran que las variables experimentales o ambientales evaluadas pueden presentar efectos diferenciados sobre las respuestas biológicas: