Este ensayo evalúa el efecto de un bioestimulante foliar aplicado en tres dosis (baja, media, alta) frente a un testigo sin aplicación, sobre el rendimiento de maíz (ton/ha).
Se utilizó un Diseño Completamente al Azar (DCA), apropiado porque las condiciones del terreno/invernadero son homogéneas (sin gradientes de luz, humedad o pendiente relevantes entre parcelas). Bajo este diseño, cada tratamiento se asigna a las parcelas de forma totalmente aleatoria, sin bloques.
set.seed(123)
datos <- data.frame(
Parcela = 1:32,
Tratamiento = rep(c("T0_Testigo", "T1_Baja", "T2_Media", "T3_Alta"), each = 8),
Rendimiento = c(
rnorm(8, mean = 4.80, sd = 0.35),
rnorm(8, mean = 5.40, sd = 0.35),
rnorm(8, mean = 6.10, sd = 0.35),
rnorm(8, mean = 5.95, sd = 0.35)
)
)
datos$Tratamiento <- factor(datos$Tratamiento,
levels = c("T0_Testigo", "T1_Baja", "T2_Media", "T3_Alta"))
kable(head(datos, 8), caption = "Tabla 1. Primeros 8 registros de las parcelas experimentales")| Parcela | Tratamiento | Rendimiento |
|---|---|---|
| 1 | T0_Testigo | 4.603834 |
| 2 | T0_Testigo | 4.719438 |
| 3 | T0_Testigo | 5.345548 |
| 4 | T0_Testigo | 4.824678 |
| 5 | T0_Testigo | 4.845251 |
| 6 | T0_Testigo | 5.400273 |
| 7 | T0_Testigo | 4.961321 |
| 8 | T0_Testigo | 4.357229 |
Antes de cualquier prueba estadística formal, se resume el comportamiento general de los datos: cuántas parcelas tiene cada tratamiento, cuál fue el rendimiento promedio y qué tan dispersos (variables) fueron los datos dentro de cada grupo. Esto permite tener una primera impresión visual de si el bioestimulante tuvo efecto, antes de confirmarlo estadísticamente.
resumen <- datos %>%
group_by(Tratamiento) %>%
summarise(
`N° Parcelas` = n(),
`Media (ton/ha)` = round(mean(Rendimiento), 2),
`Desv. Est.` = round(sd(Rendimiento), 2),
.groups = 'drop'
)
kable(resumen, caption = "Tabla 2. Resumen estadístico descriptivo por tratamiento")| Tratamiento | N° Parcelas | Media (ton/ha) | Desv. Est. |
|---|---|---|---|
| T0_Testigo | 8 | 4.88 | 0.35 |
| T1_Baja | 8 | 5.50 | 0.31 |
| T2_Media | 8 | 5.91 | 0.30 |
| T3_Alta | 8 | 5.90 | 0.35 |
El ANOVA (Análisis de Varianza) permite responder la pregunta central del experimento: ¿existe al menos un tratamiento que produjo un rendimiento significativamente diferente a los demás? Se comparan las medias de los 4 grupos a la vez, evitando el error de hacer múltiples comparaciones de a pares sin control estadístico.
Pr(>F)) es menor a 0.05, se rechaza H0 y se concluye
que el bioestimulante sí tuvo efecto sobre el rendimiento.modelo <- lm(Rendimiento ~ Tratamiento, data = datos)
anova_result <- anova(modelo)
kable(anova_result, caption = "Tabla 3. Cuadro de Análisis de Varianza (ANOVA)")| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Tratamiento | 3 | 5.640502 | 1.8801673 | 17.3511 | 1.5e-06 |
| Residuals | 28 | 3.034084 | 0.1083601 | NA | NA |
Para que las conclusiones del ANOVA sean válidas, los residuos del modelo deben cumplir dos supuestos:
shapiro_test <- shapiro.test(residuals(modelo))
levene_test <- leveneTest(Rendimiento ~ Tratamiento, data = datos)
tabla_supuestos <- data.frame(
Supuesto = c("Normalidad (Shapiro-Wilk)", "Homocedasticidad (Levene)"),
`P-Valor` = c(round(shapiro_test$p.value, 4), round(levene_test$`Pr(>F)`[1], 4)),
Estado = c(
ifelse(shapiro_test$p.value > 0.05, "CUMPLIDO", "NO CUMPLIDO"),
ifelse(levene_test$`Pr(>F)`[1] > 0.05, "CUMPLIDO", "NO CUMPLIDO")
)
)
kable(tabla_supuestos, caption = "Tabla 4. Evaluación de supuestos estadísticos")| Supuesto | P.Valor | Estado |
|---|---|---|
| Normalidad (Shapiro-Wilk) | 0.2377 | CUMPLIDO |
| Homocedasticidad (Levene) | 0.9522 | CUMPLIDO |
El ANOVA solo indica que hay una diferencia, pero no dice entre cuáles tratamientos. Para eso se usa la prueba de Tukey (HSD), que compara todos los tratamientos de dos en dos y los agrupa con letras: tratamientos que comparten la misma letra no son estadísticamente diferentes entre sí; tratamientos con letras distintas sí lo son.
tukey_test <- HSD.test(modelo, "Tratamiento", group = TRUE)
tukey_tabla <- tukey_test$groups %>%
rownames_to_column(var = "Tratamiento") %>%
arrange(desc(Rendimiento))
kable(tukey_tabla, col.names = c("Tratamiento", "Rendimiento Medio", "Grupo Tukey"),
caption = "Tabla 5. Agrupación según prueba de Tukey")| Tratamiento | Rendimiento Medio | Grupo Tukey |
|---|---|---|
| T2_Media | 5.912711 | a |
| T3_Alta | 5.903034 | a |
| T1_Baja | 5.495983 | a |
| T0_Testigo | 4.882196 | b |
Los gráficos permiten visualizar de forma intuitiva lo que las tablas ya demostraron numéricamente: la dispersión de los datos dentro de cada tratamiento y la magnitud de la diferencia entre las medias.
Gráfico 1: Boxplot de distribución por tratamiento. Cada caja muestra la mediana, el rango intercuartílico y los valores atípicos (en rojo) de cada tratamiento; los puntos individuales son las 8 parcelas de cada grupo.
ggplot(datos, aes(x = Tratamiento, y = Rendimiento, fill = Tratamiento)) +
geom_boxplot(alpha = 0.7, outlier.colour = "red") +
geom_jitter(width = 0.15, size = 2) +
scale_fill_brewer(palette = "Set2") +
labs(title = "Distribución del Rendimiento por Tratamiento", y = "Rendimiento (ton/ha)") +
theme_minimal() +
theme(legend.position = "none")Gráfico 2: Barras de rendimiento promedio ± desviación estándar. Resume visualmente la Tabla 2, facilitando comparar de un vistazo cuál tratamiento tuvo el mayor rendimiento promedio y qué tan consistentes fueron sus repeticiones (barras de error más cortas = menos variabilidad).
ggplot(resumen, aes(x = Tratamiento, y = `Media (ton/ha)`, fill = Tratamiento)) +
geom_bar(stat = "identity", alpha = 0.85, width = 0.6) +
geom_errorbar(aes(ymin = `Media (ton/ha)` - `Desv. Est.`, ymax = `Media (ton/ha)` + `Desv. Est.`), width = 0.2) +
scale_fill_brewer(palette = "Greens") +
ylim(0, 8) +
labs(title = "Rendimiento Promedio ± Desviación Estándar", y = "Rendimiento (ton/ha)") +
theme_minimal() +
theme(legend.position = "none")Gráfico 3: Curva de dosis-respuesta del bioestimulante. Muestra la tendencia del rendimiento promedio en función del incremento de la dosis aplicada. Permite identificar de forma gráfica el comportamiento de la respuesta agronómica y el punto donde el rendimiento alcanza una meseta o saturación (dosis óptima).
# Gráfica 3: Curva de dosis-respuesta
datos_media <- datos %>%
group_by(Tratamiento) %>%
summarise(Media = mean(Rendimiento), .groups = 'drop') %>%
mutate(Dosis = c(0, 1, 2, 3))
g3 <- ggplot(datos_media, aes(x = Dosis, y = Media)) +
geom_point(size = 4, color = "darkgreen") +
geom_line(linewidth = 1, color = "darkgreen", linetype = "dashed") +
geom_smooth(method = "loess", se = TRUE, alpha = 0.2, color = "green") +
labs(title = "Curva de Dosis-Respuesta",
x = "Nivel de Dosis",
y = "Rendimiento Promedio (ton/ha)") +
theme_minimal() +
theme(text = element_text(size = 11)) +
scale_x_continuous(breaks = c(0, 1, 2, 3),
labels = c("T0\n(Testigo)", "T1\n(Baja)", "T2\n(Media)", "T3\n(Alta)"))
print(g3)A partir del ANOVA (Tabla 3) y la prueba de Tukey (Tabla 5), se determina si existen diferencias estadísticamente significativas entre los tratamientos y cuál(es) dosis de bioestimulante produjeron el mayor rendimiento respecto al testigo sin aplicación.
El coeficiente de variación (CV) del ensayo, derivado del cuadrado medio del error del ANOVA, permite evaluar la precisión experimental del DCA; un CV bajo (generalmente menor al 15-20% en ensayos agronómicos de campo) respalda la confiabilidad de las diferencias detectadas entre tratamientos y descarta que la variabilidad observada se deba principalmente a errores de manejo experimental.
Desde el punto de vista agronómico, aunque estadísticamente las dosis media y alta puedan no diferir entre sí (según el agrupamiento de Tukey), la decisión de recomendar una u otra en campo también debe considerar el costo del producto por dosis aplicada: si el incremento de rendimiento entre la dosis media y la alta no es significativo, la dosis media podría ser la opción más eficiente económicamente para el productor