toc: true toc_float: true number_sections: true theme: readable —
El presente estudio tiene como objetivo evaluar el efecto de cuatro bioinsumos sobre el rendimiento del cultivo de fríjol (Phaseolus vulgaris), expresado en kg/parcela. Se empleó un diseño de bloques completos al azar (DBCA), con cuatro tratamientos y cuatro bloques, para un total de 16 parcelas experimentales.
El bloqueo se utilizó para controlar la posible variabilidad del lote asociada con un gradiente de humedad. Se realizarán análisis descriptivos, análisis de varianza (ANOVA), verificación de supuestos y comparación de medias mediante la prueba de Tukey.
Los datos se transcribieron de la tabla suministrada en Excel.
# Instalar estos paquetes una sola vez si es necesario:
# install.packages(c("ggplot2", "dplyr", "knitr", "agricolae"))
library(ggplot2)
library(dplyr)
library(knitr)
library(agricolae)
# Datos observados en la hoja de Excel
datos <- data.frame(
Tratamiento = c(
rep("T1", 4),
rep("T2", 4),
rep("T3", 4),
rep("T4", 4)
),
Bioinsumo = c(
rep("B1", 4),
rep("B2", 4),
rep("B3", 4),
rep("B4", 4)
),
Bloque = rep(1:4, times = 4),
Rendimiento = c(
2.2, 1.7, 2.5, 1.9,
2.4, 2.6, 3.0, 2.3,
3.1, 2.5, 3.0, 2.9,
3.0, 3.1, 3.6, 3.0
)
)
# Convertir las variables categóricas a factores
datos$Tratamiento <- factor(datos$Tratamiento)
datos$Bioinsumo <- factor(
datos$Bioinsumo,
levels = c("B1", "B2", "B3", "B4")
)
datos$Bloque <- factor(datos$Bloque)
# Verificar la estructura de los datos
str(datos)
## 'data.frame': 16 obs. of 4 variables:
## $ Tratamiento: Factor w/ 4 levels "T1","T2","T3",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ Bioinsumo : Factor w/ 4 levels "B1","B2","B3",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ Bloque : Factor w/ 4 levels "1","2","3","4": 1 2 3 4 1 2 3 4 1 2 ...
## $ Rendimiento: num 2.2 1.7 2.5 1.9 2.4 2.6 3 2.3 3.1 2.5 ...
kable(datos, caption = "Datos experimentales del cultivo de fríjol")
| Tratamiento | Bioinsumo | Bloque | Rendimiento |
|---|---|---|---|
| T1 | B1 | 1 | 2.2 |
| T1 | B1 | 2 | 1.7 |
| T1 | B1 | 3 | 2.5 |
| T1 | B1 | 4 | 1.9 |
| T2 | B2 | 1 | 2.4 |
| T2 | B2 | 2 | 2.6 |
| T2 | B2 | 3 | 3.0 |
| T2 | B2 | 4 | 2.3 |
| T3 | B3 | 1 | 3.1 |
| T3 | B3 | 2 | 2.5 |
| T3 | B3 | 3 | 3.0 |
| T3 | B3 | 4 | 2.9 |
| T4 | B4 | 1 | 3.0 |
| T4 | B4 | 2 | 3.1 |
| T4 | B4 | 3 | 3.6 |
| T4 | B4 | 4 | 3.0 |
# Verificar el número de observaciones por combinación
tabla_diseno <- with(datos, table(Bloque, Bioinsumo))
kable(tabla_diseno, caption = "Distribución de los bioinsumos por bloque")
| B1 | B2 | B3 | B4 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 |
Se calcularán el número de observaciones, la media, la desviación estándar, el mínimo y el máximo del rendimiento de cada bioinsumo.
resumen <- datos %>%
group_by(Bioinsumo) %>%
summarise(
Numero = n(),
Media = mean(Rendimiento),
Desviacion_estandar = sd(Rendimiento),
Minimo = min(Rendimiento),
Maximo = max(Rendimiento),
.groups = "drop"
)
kable(
resumen,
digits = 3,
caption = "Estadísticos descriptivos del rendimiento por bioinsumo"
)
| Bioinsumo | Numero | Media | Desviacion_estandar | Minimo | Maximo |
|---|---|---|---|---|---|
| B1 | 4 | 2.075 | 0.350 | 1.7 | 2.5 |
| B2 | 4 | 2.575 | 0.310 | 2.3 | 3.0 |
| B3 | 4 | 2.875 | 0.263 | 2.5 | 3.1 |
| B4 | 4 | 3.175 | 0.287 | 3.0 | 3.6 |
ggplot(datos, aes(x = Bioinsumo, y = Rendimiento, fill = Bioinsumo)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.08, size = 2) +
labs(
title = "Distribución del rendimiento por bioinsumo",
x = "Bioinsumo",
y = "Rendimiento (kg/parcela)"
) +
theme_minimal() +
theme(legend.position = "none")
El diagrama de cajas permite comparar la distribución, la dispersión y los posibles valores atípicos de los rendimientos observados.
Se empleará el modelo del diseño de bloques completos al azar:
\[ Y_{ij} = \mu + \tau_i + \beta_j + \varepsilon_{ij} \]
Donde:
Las hipótesis para los bioinsumos son:
# Modelo DBCA solicitado en el ejercicio
modelo <- aov(Rendimiento ~ Bloque + Bioinsumo, data = datos)
# Tabla ANOVA
tabla_anova <- anova(modelo)
kable(
as.data.frame(tabla_anova),
digits = 4,
caption = "Análisis de varianza del diseño de bloques completos al azar"
)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Bloque | 3 | 0.74 | 0.2467 | 6.0000 | 0.0157 |
| Bioinsumo | 3 | 2.64 | 0.8800 | 21.4054 | 0.0002 |
| Residuals | 9 | 0.37 | 0.0411 | NA | NA |
# Mostrar resumen del modelo
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## Bloque 3 0.74 0.2467 6.00 0.015716 *
## Bioinsumo 3 2.64 0.8800 21.41 0.000196 ***
## Residuals 9 0.37 0.0411
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se utilizará un nivel de significancia de 0,05. Cuando el valor p de Bioinsumo sea inferior a 0,05, se concluirá que existen diferencias estadísticamente significativas entre los tratamientos.
p_bloques <- tabla_anova["Bloque", "Pr(>F)"]
cat("Valor p del efecto de los bloques:", p_bloques, "\n")
## Valor p del efecto de los bloques: 0.01571557
if (p_bloques < 0.05) {
cat("El efecto de los bloques fue estadísticamente significativo.")
} else {
cat("El efecto de los bloques no fue estadísticamente significativo al 5%.")
}
## El efecto de los bloques fue estadísticamente significativo.
Un efecto significativo de los bloques indica que se detectaron diferencias entre bloques después de considerar el modelo. Si no es significativo, no se puede afirmar que el bloqueo haya sido inútil, ya que pudo ayudar a controlar la variabilidad experimental.
La prueba de Shapiro-Wilk se aplicará a los residuos del modelo.
residuos <- residuals(modelo)
prueba_shapiro <- shapiro.test(residuos)
print(prueba_shapiro)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.89968, p-value = 0.07942
if (prueba_shapiro$p.value > 0.05) {
cat("No se rechaza la hipótesis de normalidad de los residuos al 5%.")
} else {
cat("Se rechaza la hipótesis de normalidad de los residuos al 5%.")
}
## No se rechaza la hipótesis de normalidad de los residuos al 5%.
qqnorm(
residuos,
main = "Gráfico Q-Q de los residuos del modelo"
)
qqline(residuos, col = "red", lwd = 2)
Los puntos próximos a la línea de referencia indican una aproximación a la normalidad. La gráfica debe interpretarse junto con la prueba estadística.
Se empleará la prueba de Bartlett para evaluar la igualdad de varianzas entre los cuatro bioinsumos.
prueba_bartlett <- bartlett.test(
Rendimiento ~ Bioinsumo,
data = datos
)
print(prueba_bartlett)
##
## Bartlett test of homogeneity of variances
##
## data: Rendimiento by Bioinsumo
## Bartlett's K-squared = 0.2339, df = 3, p-value = 0.9719
if (prueba_bartlett$p.value > 0.05) {
cat("No se rechaza la hipótesis de igualdad de varianzas al 5%.")
} else {
cat("Se rechaza la hipótesis de igualdad de varianzas al 5%.")
}
## No se rechaza la hipótesis de igualdad de varianzas al 5%.
La prueba de Bartlett es sensible a las desviaciones de normalidad, por lo que su resultado debe interpretarse conjuntamente con Shapiro-Wilk y los gráficos de residuos.
La prueba de Tukey permite identificar qué pares de bioinsumos presentan diferencias estadísticamente significativas.
resultado_tukey <- TukeyHSD(
modelo,
which = "Bioinsumo",
conf.level = 0.95
)
print(resultado_tukey)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rendimiento ~ Bloque + Bioinsumo, data = datos)
##
## $Bioinsumo
## diff lwr upr p adj
## B2-B1 0.5 0.0524212 0.9475788 0.0288857
## B3-B1 0.8 0.3524212 1.2475788 0.0015869
## B4-B1 1.1 0.6524212 1.5475788 0.0001473
## B3-B2 0.3 -0.1475788 0.7475788 0.2263204
## B4-B2 0.6 0.1524212 1.0475788 0.0103951
## B4-B3 0.3 -0.1475788 0.7475788 0.2263204
plot(
resultado_tukey,
las = 1,
col = "blue"
)
Se utilizará la función HSD.test del paquete agricolae para obtener grupos de comparación.
Los tratamientos que comparten una letra no presentan diferencias significativas según el procedimiento de Tukey al 5%.
resultado_letras <- agricolae::HSD.test(
modelo,
trt = "Bioinsumo",
alpha = 0.05,
group = TRUE,
console = FALSE
)
grupos <- resultado_letras$groups
# Incorporar el nombre del tratamiento
grupos$Bioinsumo <- rownames(grupos)
rownames(grupos) <- NULL
# Renombrar las columnas de forma segura
col_media <- setdiff(names(grupos), "groups")[1]
names(grupos)[names(grupos) == col_media] <- "Media"
names(grupos)[names(grupos) == "groups"] <- "Grupo"
grupos <- grupos %>%
arrange(desc(Media))
kable(
grupos,
digits = 3,
caption = "Medias y grupos estadísticos de Tukey"
)
| Media | Grupo | Bioinsumo |
|---|---|---|
| 3.175 | a | B4 |
| 2.875 | ab | B3 |
| 2.575 | b | B2 |
| 2.075 | c | B1 |
ggplot(
grupos,
aes(x = reorder(Bioinsumo, Media), y = Media)
) +
geom_col(
fill = "darkseagreen3",
color = "black",
width = 0.7
) +
geom_text(
aes(label = Grupo),
vjust = -0.5,
size = 5
) +
labs(
title = "Rendimiento medio por bioinsumo",
subtitle = "Grupos de comparación de Tukey al 5%",
x = "Bioinsumo",
y = "Rendimiento medio (kg/parcela)"
) +
expand_limits(y = max(grupos$Media) * 1.15) +
theme_minimal()
La interpretación debe considerar tanto la magnitud de las medias como las letras de agrupación. El mayor promedio observado no implica necesariamente una superioridad estadística frente a todos los demás tratamientos.
p_bioinsumo <- tabla_anova["Bioinsumo", "Pr(>F)"]
mejor <- grupos[which.max(grupos$Media), , drop = FALSE]
cat(
"**Bioinsumo con mayor rendimiento promedio observado:** ",
as.character(mejor$Bioinsumo),
", con ",
round(mejor$Media, 3),
" kg/parcela.\n\n",
sep = ""
)
Bioinsumo con mayor rendimiento promedio observado: B4, con 3.175 kg/parcela.
if (p_bioinsumo < 0.05) {
cat(
"El ANOVA detectó diferencias estadísticamente significativas entre los bioinsumos (p = ",
signif(p_bioinsumo, 4),
"). La comparación de Tukey permite identificar los tratamientos que difieren. Se recomienda priorizar los tratamientos con mayor rendimiento y considerar sus grupos estadísticos antes de seleccionar una alternativa.\n\n",
sep = ""
)
} else {
cat(
"El ANOVA no detectó diferencias estadísticamente significativas entre los bioinsumos al 5% (p = ",
signif(p_bioinsumo, 4),
"). Por tanto, no se puede afirmar que el tratamiento con mayor promedio sea estadísticamente superior. La decisión debe considerar también costos y viabilidad agronómica.\n\n",
sep = ""
)
}
El ANOVA detectó diferencias estadísticamente significativas entre los bioinsumos (p = 0.0001964). La comparación de Tukey permite identificar los tratamientos que difieren. Se recomienda priorizar los tratamientos con mayor rendimiento y considerar sus grupos estadísticos antes de seleccionar una alternativa.
if (p_bloques < 0.05) {
cat(
"El efecto de los bloques fue significativo (p = ",
signif(p_bloques, 4),
"), lo que indica diferencias detectables entre bloques después de considerar el modelo.\n\n",
sep = ""
)
} else {
cat(
"El efecto de los bloques no fue significativo al 5% (p = ",
signif(p_bloques, 4),
"). No se detectaron diferencias entre bloques, aunque el bloqueo pudo contribuir al control de la variabilidad del lote.\n\n",
sep = ""
)
}
El efecto de los bloques fue significativo (p = 0.01572), lo que indica diferencias detectables entre bloques después de considerar el modelo.
cat(
"La recomendación agronómica definitiva debe integrar el rendimiento, la comparación de medias, los supuestos estadísticos, los costos y la viabilidad del tratamiento en campo."
)
La recomendación agronómica definitiva debe integrar el rendimiento, la comparación de medias, los supuestos estadísticos, los costos y la viabilidad del tratamiento en campo.
El diseño de bloques completos al azar permitió evaluar cuatro bioinsumos considerando la variabilidad asociada a los bloques del lote experimental. El ANOVA permitió evaluar el efecto de los tratamientos y de los bloques, mientras que las pruebas de Shapiro-Wilk y Bartlett se utilizaron para revisar los supuestos de normalidad y homogeneidad de varianzas.
La prueba de Tukey permitió comparar las medias de rendimiento e identificar los grupos estadísticos. La selección del bioinsumo más conveniente debe basarse en los resultados obtenidos, sin confundir un promedio numéricamente alto con una diferencia estadísticamente significativa.
aov(),
anova(), shapiro.test(),
bartlett.test() y TukeyHSD().