En una estación experimental se realizó un experimento para estudiar los efectos comparativos de diferentes tipos de fertilizantes sobre la altura de una variedad de plantas.
Hipótesis de investigación: Existe algún tipo de fertilizante que mejora el crecimiento de las plantas.
Para evaluar esta hipótesis se empleó un Diseño Completamente al Azar (DCA), en el cual las unidades experimentales (plantas) se asignaron aleatoriamente a cinco tratamientos de fertilización:
Cada tratamiento cuenta con 5 réplicas, para un total de 25 unidades experimentales. La variable respuesta es la altura de la planta.
# Instalar (si es necesario) y cargar los paquetes
paquetes <- c("readxl", "table1", "agricolae", "dplyr", "ggplot2", "car")
instalar <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if (length(instalar) > 0) install.packages(instalar, repos = "https://cloud.r-project.org")
library(readxl)
library(table1)
library(agricolae)
library(dplyr)
library(ggplot2)
library(car)
datos <- read_excel("YDRAY-datos_dca.xlsx")
# Por seguridad, se eliminan columnas completamente vacías si las hubiera
# (evita errores si el Excel trae alguna columna en blanco al inicio)
datos <- datos[, colSums(!is.na(datos)) > 0]
# Conversión de tipos de datos
datos$fertilizante <- factor(datos$fertilizante,
levels = c("sin", "N", "NK", "NP", "NPK"))
datos$replica <- as.integer(datos$replica)
datos$altura <- as.numeric(datos$altura)
str(datos)
## tibble [25 × 3] (S3: tbl_df/tbl/data.frame)
## $ fertilizante: Factor w/ 5 levels "sin","N","NK",..: 1 1 1 1 1 2 2 2 2 2 ...
## $ replica : int [1:25] 1 2 3 4 5 1 2 3 4 5 ...
## $ altura : num [1:25] 7 7 15 11 9 12 17 12 18 18 ...
knitr::kable(datos, caption = "Datos del experimento DCA")
| fertilizante | replica | altura |
|---|---|---|
| sin | 1 | 7 |
| sin | 2 | 7 |
| sin | 3 | 15 |
| sin | 4 | 11 |
| sin | 5 | 9 |
| N | 1 | 12 |
| N | 2 | 17 |
| N | 3 | 12 |
| N | 4 | 18 |
| N | 5 | 18 |
| NP | 1 | 14 |
| NP | 2 | 18 |
| NP | 3 | 18 |
| NP | 4 | 19 |
| NP | 5 | 19 |
| NPK | 1 | 19 |
| NPK | 2 | 25 |
| NPK | 3 | 22 |
| NPK | 4 | 19 |
| NPK | 5 | 23 |
| NK | 1 | 7 |
| NK | 2 | 10 |
| NK | 3 | 11 |
| NK | 4 | 15 |
| NK | 5 | 11 |
table1(~ fertilizante + altura, data = datos)
| Overall (N=25) |
|
|---|---|
| fertilizante | |
| sin | 5 (20.0%) |
| N | 5 (20.0%) |
| NK | 5 (20.0%) |
| NP | 5 (20.0%) |
| NPK | 5 (20.0%) |
| altura | |
| Mean (SD) | 15.0 (5.15) |
| Median [Min, Max] | 15.0 [7.00, 25.0] |
table1(~ altura | fertilizante, data = datos)
| sin (N=5) |
N (N=5) |
NK (N=5) |
NP (N=5) |
NPK (N=5) |
Overall (N=25) |
|
|---|---|---|---|---|---|---|
| altura | ||||||
| Mean (SD) | 9.80 (3.35) | 15.4 (3.13) | 10.8 (2.86) | 17.6 (2.07) | 21.6 (2.61) | 15.0 (5.15) |
| Median [Min, Max] | 9.00 [7.00, 15.0] | 17.0 [12.0, 18.0] | 11.0 [7.00, 15.0] | 18.0 [14.0, 19.0] | 22.0 [19.0, 25.0] | 15.0 [7.00, 25.0] |
ggplot(datos, aes(x = fertilizante, y = altura, fill = fertilizante)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
geom_jitter(width = 0.1, alpha = 0.6) +
labs(title = "Altura de las plantas según tipo de fertilizante",
x = "Fertilizante", y = "Altura (cm)") +
theme_minimal()
El gráfico de cajas permite observar de manera preliminar diferencias en la altura media alcanzada según el tipo de fertilizante aplicado, siendo el tratamiento testigo (sin fertilizante) el que muestra, a priori, los valores más bajos.
El modelo del Diseño Completamente al Azar es:
\[Y_{ij} = \mu + \tau_i + \varepsilon_{ij}\]
donde \(Y_{ij}\) es la altura de la j-ésima planta en el i-ésimo fertilizante, \(\mu\) es la media general, \(\tau_i\) es el efecto del i-ésimo fertilizante y \(\varepsilon_{ij}\) es el error aleatorio.
Hipótesis estadísticas:
anova <- aov(altura ~ fertilizante, data = datos)
summary(anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## fertilizante 4 475.8 118.94 14.76 9.13e-06 ***
## Residuals 20 161.2 8.06
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| fertilizante | 4 | 475.76 | 118.94 | 14.7568 | 0 |
| Residuals | 20 | 161.20 | 8.06 | NA | NA |
El valor p obtenido en la prueba F es 10^{-5}. Considerando un nivel de significancia \(\alpha = 0.05\):
Dado que el valor p (1e-05) es menor que 0.05, se rechaza la hipótesis nula. Existe evidencia estadística suficiente para afirmar que al menos un tipo de fertilizante tiene un efecto diferente sobre la altura de las plantas.
Antes de dar validez a los resultados del ANOVA es necesario verificar los supuestos de normalidad de los residuales y homogeneidad de varianzas.
shapiro.test(residuals(anova))
##
## Shapiro-Wilk normality test
##
## data: residuals(anova)
## W = 0.94387, p-value = 0.1818
par(mfrow = c(1, 1))
qqPlot(residuals(anova), main = "Gráfico Q-Q de los residuales",
ylab = "Residuales", id = FALSE)
leveneTest(altura ~ fertilizante, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 4 0.3179 0.8626
## 20
Nota: si alguno de estos supuestos no se cumple, los resultados del ANOVA deben interpretarse con cautela y podría ser necesario aplicar una transformación de la variable respuesta o una prueba no paramétrica (p. ej. Kruskal-Wallis).
Dado que el ANOVA evalúa si existen diferencias globales entre tratamientos, se realiza una prueba de comparación múltiple de medias (LSD de Fisher) para identificar cuáles fertilizantes difieren entre sí.
posanova <- LSD.test(anova, trt = "fertilizante")
posanova
## $statistics
## MSerror Df Mean CV t.value LSD
## 8.06 20 15.04 18.87642 2.085963 3.745452
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none fertilizante 5 0.05
##
## $means
## altura std r se LCL UCL Min Max Q25 Q50 Q75
## N 15.4 3.130495 5 1.269646 12.751566 18.04843 12 18 12 17 18
## NK 10.8 2.863564 5 1.269646 8.151566 13.44843 7 15 10 11 11
## NP 17.6 2.073644 5 1.269646 14.951566 20.24843 14 19 18 18 19
## NPK 21.6 2.607681 5 1.269646 18.951566 24.24843 19 25 19 22 23
## sin 9.8 3.346640 5 1.269646 7.151566 12.44843 7 15 7 9 11
##
## $comparison
## NULL
##
## $groups
## altura groups
## NPK 21.6 a
## NP 17.6 b
## N 15.4 b
## NK 10.8 c
## sin 9.8 c
##
## attr(,"class")
## [1] "group"
| altura | groups | |
|---|---|---|
| NPK | 21.6 | a |
| NP | 17.6 | b |
| N | 15.4 | b |
| NK | 10.8 | c |
| sin | 9.8 | c |
grupos <- posanova$groups
grupos$fertilizante <- rownames(grupos)
ggplot(grupos, aes(x = reorder(fertilizante, -altura), y = altura)) +
geom_col(fill = "#2c7fb8", alpha = 0.8) +
geom_text(aes(label = groups), vjust = -0.5, size = 5) +
labs(title = "Comparación de medias de altura por fertilizante (LSD de Fisher)",
x = "Fertilizante", y = "Altura media (cm)") +
theme_minimal()
Tratamientos que comparten una misma letra no presentan diferencias estadísticamente significativas entre sí (p > 0.05).
Los resultados obtenidos mediante el Diseño Completamente al Azar (DCA) permitieron evaluar el efecto de cinco tratamientos de fertilización sobre la altura de las plantas. El análisis de varianza (ANOVA) mostró que existen diferencias estadísticamente significativas entre los tratamientos cuando el valor de p es menor que 0.05. Por lo tanto, se rechaza la hipótesis nula de igualdad de medias y se obtiene evidencia de que el tipo de fertilizante influye en la altura de las plantas bajo las condiciones evaluadas.
La comparación de medias mediante la prueba LSD de Fisher permitió determinar que las diferencias observadas no se presentan necesariamente entre todos los fertilizantes, sino entre determinados grupos de tratamientos. El fertilizante que presentó la mayor altura promedio representa el tratamiento con mejor desempeño en términos de crecimiento, mientras que el tratamiento sin fertilizante permite establecer una referencia frente a las condiciones de fertilización. La agrupación mediante letras facilita identificar cuáles tratamientos presentan diferencias estadísticamente significativas y cuáles tienen un comportamiento similar.
La verificación de los supuestos del modelo, particularmente la normalidad de los residuales y la homogeneidad de las varianzas, es fundamental para respaldar la validez del ANOVA. Cuando estos supuestos se cumplen, las diferencias encontradas pueden interpretarse con mayor confianza como efectos asociados a los tratamientos de fertilización y no como consecuencia de una violación de las condiciones del modelo.