Avancemos con el segundo diseño. Este es fundamental para tus estudiantes de Ingeniería Agrícola y Agroindustrial, ya que en campo o en planta rara vez encontramos condiciones perfectamente homogéneas.
Aquí tienes la estructura pedagógica lista para tu Google Colab.
El Diseño en Bloques Completamente al Azar (DBCA) se utiliza cuando las unidades experimentales no son homogéneas, pero es posible agruparlas en conjuntos (bloques) que sí lo son. En agricultura, un bloque puede representar un gradiente de fertilidad en el suelo o diferentes niveles de humedad; en agroindustria, un bloque podría ser el lote de materia prima de un día específico o el turno de producción. El objetivo de bloquear es aislar esta variabilidad conocida para que no infle el error experimental y nos impida detectar diferencias reales entre los tratamientos.
El Modelo Estadístico Lineal: \[y_{ij} = \mu + \tau_i + \beta_j + \epsilon_{ij}\]
Donde: * \(y_{ij}\): Es la respuesta observada en el \(j\)-ésimo bloque bajo el \(i\)-ésimo tratamiento. * \(\mu\): Es la media general verdadera. * \(\tau_i\): Es el efecto del \(i\)-ésimo tratamiento. * \(\beta_j\): Es el efecto del \(j\)-ésimo bloque. * \(\epsilon_{ij}\): Es el error experimental aleatorio (asumido normal, independiente y con varianza constante).
Tabla ANOVA (Análisis de Varianza):
| Fuente de Variación | Grados de Libertad (GL) | Suma de Cuadrados (SC) | Cuadrado Medio (CM) | F calculado |
|---|---|---|---|---|
| Tratamientos | \(t - 1\) | \(SCTr\) | \(CMTr = \frac{SCTr}{t-1}\) | \(\frac{CMTr}{CME}\) |
| Bloques | \(b - 1\) | \(SCB\) | \(CMB = \frac{SCB}{b-1}\) | \(\frac{CMB}{CME}\) |
| Error | \((t - 1)(b - 1)\) | \(SCE\) | \(CME = \frac{SCE}{(t-1)(b-1)}\) | |
| Total | \(N - 1\) | \(SCT\) |
(Nota: \(t\) = número de tratamientos, \(b\) = número de bloques, \(N = t \times b\) = total de observaciones).
Para el cálculo manual, el proceso es una extensión del DCA, añadiendo el cálculo para los bloques:
Para este diseño, usaremos un dataset estructurado en tres columnas: Tratamiento, Bloque y Respuesta. Es crucial visualizar tanto el efecto del tratamiento como el del bloque.
library(easyanova)
# Cargar el dataset de ejemplo para DBCA incluido en el paquete
data(data2)
# Inspeccionar la estructura: Tratamiento, Bloque, Respuesta
head(data2)
summary(data2)
# Configurar el espacio de gráficos para ver dos visualizaciones juntas
par(mfrow=c(1,2))
# Visualización 1: Variabilidad por Tratamiento
boxplot(data2[,3] ~ data2[,1],
col = "lightgreen",
main = "Respuesta vs Tratamiento",
xlab = "Tratamiento", ylab = "Respuesta")
# Visualización 2: Variabilidad por Bloque (Justificación del bloqueo)
boxplot(data2[,3] ~ data2[,2],
col = "lightblue",
main = "Respuesta vs Bloque",
xlab = "Bloque", ylab = "Respuesta")
# Restaurar parámetros gráficos
par(mfrow=c(1,1))
Propósito pedagógico: Invita a tus alumnos a observar el segundo gráfico. Si las cajas de los bloques están a diferentes alturas, significa que el factor de bloqueo (ej. el gradiente de humedad del suelo) realmente estaba afectando los datos y fue una buena decisión usar un DBCA en lugar de un DCA.
easyanovaEn easyanova, el DBCA se ejecuta cambiando simplemente
el argumento design al valor 2.
# Ejecutar el DBCA (design = 2 corresponde a Diseño en Bloques Completamente al Azar)
# La tabla de datos debe tener el orden: Col 1 = Tratamiento, Col 2 = Bloque, Col 3 = Respuesta
resultado_dbca <- ea1(data2, design = 2)
# Ver los resultados, incluyendo la tabla ANOVA y la prueba de medias (ej. Tukey/Scott-Knott)
print(resultado_dbca)
Pide a tus alumnos que usen estos prompts para interactuar conmigo y
profundizar en la interpretación agronómica o industrial de la salida de
easyanova:
easyanova para este DBCA, ¿el valor p del factor ‘Bloques’
indica que fue útil haber bloqueado el experimento? ¿Qué hubiera pasado
con el Error Experimental si no hubiéramos bloqueado?”En Python (Usando statsmodels):
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Dataset simulado (Ej: Tratamientos de fertilizantes, Bloques de humedad del suelo)
data = {
'Tratamiento': ['T1','T2','T3','T1','T2','T3','T1','T2','T3','T1','T2','T3'],
'Bloque': ['B1','B1','B1','B2','B2','B2','B3','B3','B3','B4','B4','B4'],
'Rendimiento': [10, 12, 14, 11, 13, 16, 9, 11, 13, 12, 14, 17]
}
df = pd.DataFrame(data)
# EDA: Gráfico de interacción
sns.pointplot(data=df, x='Tratamiento', y='Rendimiento', hue='Bloque')
plt.title('Interacción Tratamiento vs Bloque')
plt.show()
# Ajuste del modelo DBCA (Nota: Se suman los efectos categóricos)
modelo = ols('Rendimiento ~ C(Tratamiento) + C(Bloque)', data=df).fit()
tabla_anova = sm.stats.anova_lm(modelo, typ=2)
print("\n--- Tabla ANOVA (DBCA) ---")
print(tabla_anova)
En Julia (Usando DataFrames y
GLM):
using DataFrames, GLM
# Creación del DataFrame
df = DataFrame(
Tratamiento = repeat(["T1", "T2", "T3"], inner = 1, outer = 4),
Bloque = repeat(["B1", "B2", "B3", "B4"], inner = 3),
Rendimiento = [10, 12, 14, 11, 13, 16, 9, 11, 13, 12, 14, 17]
)
# Convertir a variables categóricas
df.Tratamiento = categorical(df.Tratamiento)
df.Bloque = categorical(df.Bloque)
# Ajuste del modelo lineal para DBCA
modelo = lm(@formula(Rendimiento ~ Tratamiento + Bloque), df)
# Resumen del modelo ajustado
println("--- Resumen del Modelo DBCA ---")
println(modelo)