toc: true toc_float: true number_sections: true theme: readable —

1. Introducción

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.

2. Carga y preparación de los datos

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")
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")
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

3. Análisis exploratorio

3.1. Estadísticos descriptivos

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"
)
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

3.2. Boxplot del rendimiento

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.

4. Modelo estadístico y análisis de varianza

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"
)
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.

4.1. Evaluación del efecto de los bloques

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.

5. Verificación de los supuestos

5.1. Normalidad de los residuos: Shapiro-Wilk

La prueba de Shapiro-Wilk se aplicará a los residuos del modelo.

  • H0: los residuos son compatibles con una distribución normal.
  • H1: los residuos no son compatibles con una distribución normal.
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%.

Gráfico Q-Q

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.

5.2. Homogeneidad de varianzas: Bartlett

Se empleará la prueba de Bartlett para evaluar la igualdad de varianzas entre los cuatro bioinsumos.

  • H0: las varianzas de los tratamientos son iguales.
  • H1: al menos una varianza es diferente.
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.

6. Comparación de medias mediante Tukey

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"
)

6.1. Agrupación de medias por letras

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"
)
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

6.2. Gráfico de medias con letras

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.

7. Conclusión agronómica

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.

8. Conclusiones generales

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.

9. Referencias