Damos el paso lógico natural: combinar el control local del error (bloques) con el ajuste matemático de una variable continua (covariable).

Este diseño es increíblemente útil en la investigación agrícola. Imagina que tienes un cultivo distribuido en bloques por el gradiente de humedad del terreno (DBCA), pero además, al momento de medir el rendimiento, te das cuenta de que el número inicial de plantas por parcela (covariable) fue distinto debido a fallas de germinación. Este modelo te permite corregir ambas fuentes de variación simultáneamente.

Aquí tienes el desarrollo para tu sexto cuaderno en Google Colab.


📘 Cuaderno 6: Análisis de Covarianza (ANCOVA) en DBCA

a) Introducción Teórica al ANCOVA en DBCA

El Análisis de Covarianza en un Diseño en Bloques Completamente al Azar (DBCA) es una técnica que busca reducir el error experimental por dos vías: mediante la agrupación física de las unidades experimentales (bloques) y mediante el ajuste estadístico por regresión lineal usando una variable cuantitativa auxiliar (covariable).

Para que este análisis sea válido, la covariable (\(X\)) no debe estar afectada por los tratamientos, y la relación entre la covariable y la variable de respuesta (\(Y\)) debe ser lineal y tener la misma pendiente para todos los tratamientos (supuesto de homogeneidad de pendientes).

El Modelo Estadístico Lineal: \[y_{ij} = \mu + \tau_i + \rho_j + \beta(x_{ij} - \bar{x}_{..}) + \epsilon_{ij}\]

Donde: * \(y_{ij}\): Es la respuesta observada bajo el \(i\)-ésimo tratamiento en el \(j\)-ésimo bloque. * \(\mu\): Es la media general del experimento. * \(\tau_i\): Es el efecto del \(i\)-ésimo tratamiento. * \(\rho_j\): Es el efecto del \(j\)-ésimo bloque. * \(\beta\): Es el coeficiente de regresión lineal combinada entre \(X\) e \(Y\). * \(x_{ij}\): Es el valor de la covariable para esa unidad experimental. * \(\bar{x}_{..}\): Es la media general de la covariable. * \(\epsilon_{ij}\): Es el error experimental aleatorio.

Tabla ANOVA Ajustada (ANCOVA en DBCA): Al igual que en el DCA, calculamos las Sumas de Cuadrados (SC) y de Productos (SP), pero ahora incluimos la fuente de variación para los Bloques.

Fuente GL SC (\(Y\)) SP (\(XY\)) SC (\(X\)) GL Ajustados SC Ajustada (\(Y_{adj}\)) CM Ajustado F calc
Tratamientos \(t - 1\) \(SCTr_y\) \(SPTr_{xy}\) \(SCTr_x\) \(t - 1\) \(SCTr_{adj}\) \(\frac{SCTr_{adj}}{t-1}\) \(\frac{CMTr_{adj}}{CME_{adj}}\)
Bloques \(b - 1\) \(SCB_y\) \(SPB_{xy}\) \(SCB_x\)
Error \((t-1)(b-1)\) \(SCE_y\) \(SPE_{xy}\) \(SCE_x\) \((t-1)(b-1)-1\) \(SCE_{adj}\) \(\frac{SCE_{adj}}{GL_{E(adj)}}\)
Total \(N - 1\) \(SCT_y\) \(SPT_{xy}\) \(SCT_x\) \(N - 2\) \(SCT_{adj}\)

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

El cálculo es idéntico al ANCOVA en DCA, pero debes extraer la variación de los bloques antes de calcular el error:

  1. Cálculos base para X e Y: Realiza un ANOVA tradicional de DBCA tanto para la variable \(Y\) como para la variable \(X\). Obtén las sumas de cuadrados de Tratamientos, Bloques, Error y Total para ambas variables.
  2. Suma de Productos Cruzados (SP): Calcula la covariación (\(XY\)):
    • \(SP(Total) = \sum x_{ij}y_{ij} - \frac{(\sum x_{ij})(\sum y_{ij})}{N}\)
    • \(SP(Tratamientos) = \sum \frac{X_{i.}Y_{i.}}{b} - \frac{(\sum x_{ij})(\sum y_{ij})}{N}\)
    • \(SP(Bloques) = \sum \frac{X_{.j}Y_{.j}}{t} - \frac{(\sum x_{ij})(\sum y_{ij})}{N}\)
    • \(SP(Error) = SP(Total) - SP(Tratamientos) - SP(Bloques)\)
  3. Coeficiente de Regresión del Error (\(\beta\)): \[\beta = \frac{SP(Error)}{SC(X\_Error)}\]
  4. Ajuste del Error (SCE Ajustada): \[SCE_{adj} = SCE_y - \frac{(SP(Error))^2}{SC(X\_Error)}\]
  5. Ajuste de Tratamientos (\(SCTr_{adj}\)): Primero calcula la SC ajustada para Tratamientos + Error, y luego réstale la \(SCE_{adj}\).
  6. Cálculo de CM y F: El Cuadrado Medio del Error Ajustado pierde un grado de libertad adicional por el cálculo de \(\beta\).
  7. Medias Ajustadas: \[\bar{y}_{i(adj)} = \bar{y}_{i.} - \beta(\bar{x}_{i.} - \bar{x}_{..})\]

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

Para easyanova, usaremos el conjunto de datos correspondiente al diseño 6 (data6). El orden de las columnas suele ser Tratamiento, Bloque, Covariable (\(X\)) y Respuesta (\(Y\)).

library(easyanova)

# Cargar el dataset de ejemplo para ANCOVA en DBCA
data(data6)

# Inspeccionar los datos: Col1=Tratamiento, Col2=Bloque, Col3=Covariable, Col4=Respuesta
head(data6)
summary(data6)

# EDA: Visualización de la relación entre Covariable y Respuesta, separando por Tratamiento
library(ggplot2)

ggplot(data6, aes(x = data6[,3], y = data6[,4], color = factor(data6[,1]), shape = factor(data6[,2]))) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, aes(group = factor(data6[,1]))) +
  labs(title = "ANCOVA en DBCA: Respuesta vs Covariable",
       subtitle = "Formas representan bloques, colores representan tratamientos",
       x = "Covariable (X)",
       y = "Respuesta Observada (Y)",
       color = "Tratamiento",
       shape = "Bloque") +
  theme_minimal()

Propósito pedagógico: Pide a tus estudiantes que identifiquen si las líneas de tendencia (colores) se mantienen relativamente paralelas. También, hazles notar cómo los puntos de un mismo bloque (misma forma geométrica) podrían estar sistemáticamente más arriba o más abajo, justificando el uso de ambos controles estadísticos.


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

La ejecución requiere especificar design = 6. easyanova procesará la matriz completa y arrojará el ANOVA ajustado junto con las pruebas de medias ya corregidas.

# Ejecutar ANCOVA en DBCA (design = 6)
# Orden requerido: Col 1 = Tratamiento, Col 2 = Bloque, Col 3 = Covariable (X), Col 4 = Respuesta (Y)
resultado_ancova_dbca <- ea1(data6, design = 6)

# Imprimir los resultados completos
print(resultado_ancova_dbca)

e) Prompts Sugeridos para tus Estudiantes

Motiva a los estudiantes a debatir el resultado conmigo usando estas preguntas:

  1. “Hola. Analizando la tabla ANOVA generada para este modelo, veo valores p tanto para ‘Bloques’ como para la ‘Covariable’. ¿Qué sucedería con el Error Experimental si hubiéramos ignorado alguna de estas dos fuentes de variación en nuestro experimento agrícola?”
  2. “En el output, observo las ‘Medias Ajustadas’. Si comparo estas medias ajustadas con los promedios brutos de los datos originales, ¿por qué algunos tratamientos que parecían peores en los datos brutos ahora resultan ser mejores después del ajuste?”
  3. “¿Cuántos grados de libertad nos quedan en el Error Ajustado según la tabla? ¿Consideras que este número es suficiente para que la prueba de comparación de medias (Scott-Knott / Tukey) sea confiable?”

f) Plantillas Alternativas: Python y Julia

En Python (Usando statsmodels):

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Dataset simulado (Ej: Fertilizante, Lote (Bloque), Plantas Iniciales (X), Rendimiento (Y))
data = {
    'Tratamiento': ['T1','T2','T3']*4,
    'Bloque': ['B1']*3 + ['B2']*3 + ['B3']*3 + ['B4']*3,
    'Covariable': [20, 18, 22, 19, 17, 21, 23, 20, 24, 18, 16, 19],
    'Respuesta': [50, 45, 55, 48, 42, 53, 56, 49, 60, 47, 40, 50]
}
df = pd.DataFrame(data)

# Ajuste del modelo lineal sumando la covariable como variable continua
# Se asume que no hay interacción Tratamiento*Covariable (líneas paralelas)
modelo_ancova_dbca = ols('Respuesta ~ Covariable + C(Tratamiento) + C(Bloque)', data=df).fit()
tabla_anova = sm.stats.anova_lm(modelo_ancova_dbca, typ=2)

print("\n--- Tabla ANCOVA (DBCA) ---")
print(tabla_anova)

En Julia (Usando DataFrames y GLM):

using DataFrames, GLM

# DataFrame simulado
df = DataFrame(
    Tratamiento = repeat(["T1", "T2", "T3"], 4),
    Bloque = repeat(["B1", "B2", "B3", "B4"], inner=3),
    Covariable = [20, 18, 22, 19, 17, 21, 23, 20, 24, 18, 16, 19],
    Respuesta = [50, 45, 55, 48, 42, 53, 56, 49, 60, 47, 40, 50]
)

df.Tratamiento = categorical(df.Tratamiento)
df.Bloque = categorical(df.Bloque)

# Ajuste del modelo: Covariable (continua) + Tratamiento (categórica) + Bloque (categórica)
modelo = lm(@formula(Respuesta ~ Covariable + Tratamiento + Bloque), df)

println("--- Resumen del Modelo ANCOVA en DBCA ---")
println(modelo)