¡Excelente avance! Al incorporar el control de bloques a un arreglo factorial, estamos dotando a los estudiantes de una de las herramientas más robustas y utilizadas en la investigación agrícola y agroindustrial real.

En el campo, casi siempre hay un gradiente de humedad o fertilidad en el suelo; y en la planta de procesamiento, los lotes de materia prima que llegan cada día introducen variabilidad. El Factorial Doble en DBCA permite aislar esa variabilidad “ruidosa” mientras analizamos la compleja interacción de nuestros dos factores de interés.

Aquí tienes la estructura pedagógica para tu cuaderno número 12.


📘 Cuaderno 12: Factorial Doble en Diseño de Bloques Completamente al Azar (DBCA)

a) Introducción Teórica al Factorial Doble en DBCA

Este diseño combina la evaluación simultánea de dos factores (Arreglo Factorial \(A \times B\)) con la técnica de control local de errores (Bloques). Se utiliza cuando las unidades experimentales no son homogéneas y pueden agruparse en bloques uniformes.

En cada bloque deben estar presentes, de forma aleatoria, todas las combinaciones posibles de los niveles del Factor A y el Factor B. El objetivo es aislar la variación causada por el bloque para poder medir con precisión tanto los efectos principales (A y B por separado) como su interacción (\(A \times B\)).

El Modelo Estadístico Lineal: \[y_{ijk} = \mu + \rho_k + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \epsilon_{ijk}\]

Donde: * \(y_{ijk}\): Respuesta observada en el \(k\)-ésimo bloque bajo la combinación del nivel \(i\) (Factor A) y el nivel \(j\) (Factor B). * \(\mu\): Media general. * \(\rho_k\): Efecto del \(k\)-ésimo bloque. * \(\alpha_i\): Efecto principal del Factor A. * \(\beta_j\): Efecto principal del Factor B. * \((\alpha\beta)_{ij}\): Efecto de la interacción entre A y B. * \(\epsilon_{ijk}\): Error experimental aleatorio.

Tabla ANOVA:

Fuente de Variación Grados de Libertad (GL) Suma de Cuadrados (SC) Cuadrado Medio (CM) F calculado
Bloques \(r - 1\) \(SCB\) \(CMB = \frac{SCB}{r-1}\) \(\frac{CMB}{CME}\)
Factor A \(a - 1\) \(SCA\) \(CMA = \frac{SCA}{a-1}\) \(\frac{CMA}{CME}\)
Factor B \(b - 1\) \(SCB\) \(CMB = \frac{SCB}{b-1}\) \(\frac{CMB}{CME}\)
Interacción (AxB) \((a - 1)(b - 1)\) \(SCAB\) \(CMAB = \frac{SCAB}{(a-1)(b-1)}\) \(\frac{CMAB}{CME}\)
Error \((ab - 1)(r - 1)\) \(SCE\) \(CME = \frac{SCE}{GL_E}\)
Total \(abr - 1\) \(SCT\)

(Nota: \(a\) = niveles de A, \(b\) = niveles de B, \(r\) = número de bloques/repeticiones).


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

Para comprender cómo el bloque modifica el cálculo del error, los estudiantes deben seguir esta secuencia de sumas de cuadrados:

  1. Factor de Corrección (FC): \(FC = \frac{Y_{...}^2}{abr}\)
  2. Suma de Cuadrados Total (SCT): Suma de todos los datos al cuadrado menos el FC.
  3. Suma de Cuadrados de Bloques (SCBloq): Eleva al cuadrado el total de cada bloque (\(Y_{..k}\)), divide por el número de tratamientos (\(a \times b\)) y resta el FC. \[SCBloq = \sum \frac{Y_{..k}^2}{ab} - FC\]
  4. Suma de Cuadrados de Tratamientos o Subtotal (SCTrat): Usa los totales de cada combinación \(A_iB_j\) sumados a través de todos los bloques. \[SCTrat = \sum \sum \frac{Y_{ij.}^2}{r} - FC\]
  5. Efectos Principales (SCA y SCB):
    • \(SCA = \sum \frac{Y_{i..}^2}{br} - FC\)
    • \(SCB = \sum \frac{Y_{.j.}^2}{ar} - FC\)
  6. Interacción (SCAB): \[SCAB = SCTrat - SCA - SCB\]
  7. Suma de Cuadrados del Error (SCE): Aquí radica la diferencia fundamental con el DCA; extraemos la variabilidad del bloque para “limpiar” el error. \[SCE = SCT - SCBloq - SCTrat\]

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

Para easyanova, el dataset de un Factorial Doble en DBCA (típicamente data10 en el paquete) suele requerir un orden estricto de columnas: Factor 1, Factor 2, Bloque y Respuesta. Es crucial visualizar tanto la necesidad de bloquear como la interacción.

library(easyanova)

# Cargar el dataset de ejemplo para Factorial Doble en DBCA
data(data10)

# Inspeccionar los datos: Col1=Factor1, Col2=Factor2, Col3=Bloque, Col4=Respuesta
head(data10)
summary(data10)

# EDA 1: Justificación del Bloqueo
# Visualizamos si las respuestas generales varían sustancialmente entre bloques
boxplot(data10[,4] ~ data10[,3], 
        col = "lightblue",
        main = "Variabilidad por Bloque (Control Local)",
        xlab = "Bloque", ylab = "Respuesta Observada")

# EDA 2: Gráfico de Interacción (Ignorando temporalmente los bloques)
library(ggplot2)

medias_int <- aggregate(data10[,4], by = list(F1 = data10[,1], F2 = data10[,2]), FUN = mean)

ggplot(medias_int, aes(x = F1, y = x, group = F2, color = F2)) +
  geom_line(size = 1.2) +
  geom_point(size = 4) +
  labs(title = "Interacción de Factores (Promediando a través de los Bloques)",
       subtitle = "¿El comportamiento del Factor 1 depende del nivel del Factor 2?",
       x = "Factor 1",
       y = "Respuesta Media",
       color = "Factor 2") +
  theme_minimal()

Propósito pedagógico: Pide a los alumnos que observen el boxplot de bloques. Si los bloques tienen medianas muy distintas, bloquear fue un acierto. Luego, que analicen el gráfico de líneas; si no son paralelas, el efecto conjunto de los factores es más importante que sus efectos individuales aislados.


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

La ejecución requiere la función ea2 con el parámetro design = 2. El paquete gestionará el análisis del bloque, la interacción, y realizará el desdoblamiento (análisis de efectos simples) si la interacción resulta significativa.

# Ejecutar Factorial Doble en DBCA (ea2, design = 2)
# Orden requerido: Col 1 = Factor 1, Col 2 = Factor 2, Col 3 = Bloque, Col 4 = Respuesta
resultado_fac_dbca <- ea2(data10, design = 2)

# Imprimir los resultados completos
print(resultado_fac_dbca)

e) Prompts Sugeridos para tus Estudiantes

Invita a los estudiantes a debatir el resultado conmigo usando estas preguntas estructuradas:

  1. “Hola. Viendo la tabla ANOVA de este Factorial Doble en Bloques, el factor ‘Bloques’ tiene un valor p de 0.012. ¿Qué habría pasado con el ‘Cuadrado Medio del Error’ y con la sensibilidad de nuestra prueba si hubiéramos ignorado esta variable y procesado todo como un DCA?”
  2. “En el output, la interacción entre la Variedad de Semilla y la Dosis de Riego resultó significativa (p < 0.05). ¿Por qué sería un error técnico de mi parte recomendarle al agricultor ‘la variedad con el promedio general más alto’ basándome en los efectos principales?”
  3. “Analizando la prueba de comparaciones múltiples de los ‘efectos simples’ (las minitablas que genera easyanova tras desdoblar la interacción), ¿cuál combinación exacta de Variedad y Riego me sugieres implementar para maximizar el rendimiento?”

f) Plantillas Alternativas: Python y Julia

En Python (Usando statsmodels): Para modelar esto correctamente en Python, simplemente sumamos el efecto del bloque sin interactuarlo, mientras que cruzamos (multiplicamos) los factores principales de interés.

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: Variedad, Riego, Bloque (Lote), Rendimiento)
data = {
    'Variedad': ['V1','V1','V1','V1', 'V2','V2','V2','V2', 'V1','V1','V1','V1', 'V2','V2','V2','V2'],
    'Riego':    ['R1','R1','R2','R2', 'R1','R1','R2','R2', 'R1','R1','R2','R2', 'R1','R1','R2','R2'],
    'Bloque':   ['B1','B2','B1','B2', 'B1','B2','B1','B2', 'B3','B4','B3','B4', 'B3','B4','B3','B4'],
    'Rend':     [10,  12,  15,  14,   8,   9,   20,  22,   11,  13,  16,  15,   7,   10,  19,  23]
}
df = pd.DataFrame(data)

# Ajuste del modelo: Bloque (Efecto aditivo) + Interacción Variedad*Riego
modelo_fac_dbca = ols('Rend ~ C(Bloque) + C(Variedad) * C(Riego)', data=df).fit()
tabla_anova = sm.stats.anova_lm(modelo_fac_dbca, typ=2)

print("\n--- Tabla ANOVA (Factorial Doble en DBCA) ---")
print(tabla_anova)

En Julia (Usando DataFrames y GLM):

using DataFrames, GLM

# DataFrame simulado (asumiendo 2 niveles de Variedad, 2 de Riego, 4 Bloques)
df = DataFrame(
    Variedad = repeat(["V1", "V2"], inner=2, outer=4),
    Riego = repeat(["R1", "R2"], inner=1, outer=8),
    Bloque = repeat(["B1", "B2", "B3", "B4"], inner=4),
    Rend = [10.0, 15.0, 8.0, 20.0, 12.0, 14.0, 9.0, 22.0, 11.0, 16.0, 7.0, 19.0, 13.0, 15.0, 10.0, 23.0]
)

df.Variedad = categorical(df.Variedad)
df.Riego = categorical(df.Riego)
df.Bloque = categorical(df.Bloque)

# Ajuste del modelo: Bloque + (Variedad cruzada con Riego)
modelo = lm(@formula(Rend ~ Bloque + Variedad * Riego), df)

println("--- Resumen del Modelo Factorial Doble en DBCA ---")
println(modelo)

Ya tenemos cubiertos los dos enfoques más universales para arreglos factoriales.