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.


📘 Cuaderno 2: Diseño en Bloques Completamente al Azar (DBCA)

a) Introducción Teórica al DBCA

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


b) Miniguía: Solución Manual (Papel y Lápiz)

Para el cálculo manual, el proceso es una extensión del DCA, añadiendo el cálculo para los bloques:

  1. Calcular Totales: Suma por tratamiento (\(Y_{i.}\)), suma por bloque (\(Y_{.j}\)), y el gran total (\(Y_{..}\)).
  2. Factor de Corrección (FC): \[FC = \frac{Y_{..}^2}{N}\]
  3. Suma de Cuadrados Total (SCT): \[SCT = \sum \sum y_{ij}^2 - FC\]
  4. Suma de Cuadrados de Tratamientos (SCTr): \[SCTr = \sum \frac{Y_{i.}^2}{b} - FC\]
  5. Suma de Cuadrados de Bloques (SCB): Se eleva al cuadrado el total de cada bloque, se divide por el número de tratamientos (\(t\)) y se resta el FC. \[SCB = \sum \frac{Y_{.j}^2}{t} - FC\]
  6. Suma de Cuadrados del Error (SCE): \[SCE = SCT - SCTr - SCB\]
  7. Calcular los Cuadrados Medios (CM) y los F calculados: Aplicar las fórmulas de la tabla ANOVA y comparar con la tabla F de Fisher para tratamientos (y opcionalmente para bloques, para ver si valió la pena bloquear).

c) Exploración de Datos (EDA) en R

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.


d) Plantilla de Código R: Solución con easyanova

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

e) Prompts Sugeridos para tus Estudiantes

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:

  1. “Hola. Analizando la tabla ANOVA generada por 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?”
  2. “Revisando la prueba de comparación de medias que arrojó el paquete, ¿cuál tratamiento recomendarías implementar para maximizar el rendimiento del cultivo, considerando que todos los bloques mostraron variabilidad en el suelo?”
  3. “Si un bloque entero (por ejemplo, el Lote 3) se inunda y pierdo esas observaciones, ¿puedo seguir analizando los datos con esta misma función de easyanova o el diseño se desbalancea? ¿Qué me sugieres hacer?”

f) Plantillas Alternativas: Python y Julia

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)