A continuación, se explica todo lo relacionado con el DBCA (Diseño de Bloques Completos al Azar), también conocido en inglés como RCBD (Randomized Complete Block Design).

Se cubren cuatro puntos solicitados con detalle, incluyendo fundamentos, fórmulas, ejemplos de cálculo manual y su implementación en Python y R, así como la interpretación de los resultados.


1. Definición, importancia y aplicaciones en Ingeniería Agrícola y Agroindustrial

Definición

El Diseño de Bloques Completos al Azar (DBCA) es un diseño experimental en el que las unidades experimentales se agrupan en bloques homogéneos (según alguna fuente de variación conocida, como suelo, tiempo, máquina, etc.). Dentro de cada bloque, todos los tratamientos se asignan de manera completamente aleatoria. Cada tratamiento aparece exactamente una vez por bloque.

Importancia

  • Control de la variabilidad: Al agrupar en bloques, se elimina o reduce la variabilidad debida a diferencias entre bloques, permitiendo estimar con mayor precisión el efecto de los tratamientos.

  • Aumento de la potencia estadística: Al reducir el error experimental, se incrementa la capacidad de detectar diferencias reales entre tratamientos.

  • Flexibilidad: Se adapta bien cuando hay una fuente de heterogeneidad conocida (por ejemplo, gradiente de fertilidad en un campo, turnos de trabajo, etc.).

Aplicaciones en Ingeniería Agrícola y Agroindustrial

  • Evaluación de variedades de cultivos: Se bloquea por lotes de suelo o por repeticiones en el campo.

  • Pruebas de dosis de fertilizantes, riego o plaguicidas: Se bloquea por zonas con características similares.

  • Comparación de maquinaria agrícola: Bloques por tipo de suelo o por operador.

  • Procesos agroindustriales: En pruebas de equipos de secado, extracción, fermentación, etc., se bloquea por lote de materia prima o por tiempo de proceso.


2. Fundamento teórico, fórmulas y cálculo manual

Modelo estadístico

El modelo lineal para el DBCA es:

\[ Y_{ij} = \mu + \tau_i + \beta_j + \varepsilon_{ij} \]

donde:

  • \(Y_{ij}\): observación del tratamiento \(i\) en el bloque \(j\).

  • \(\mu\): media general.

  • \(\tau_i\): efecto del tratamiento \(i\) (con \(\sum \tau_i = 0\)).

  • \(\beta_j\): efecto del bloque \(j\) (con \(\sum \beta_j = 0\)).

  • \(\varepsilon_{ij}\): error experimental ~ N(0, \(\sigma^2\)) e independientes.

Supuestos: normalidad, homocedasticidad e independencia de los residuos.

Partición de la suma de cuadrados

La suma total de cuadrados (SCT) se descompone en:

\[ SCT = SCT_{\text{trat}} + SC_{\text{bloq}} + SCE \]

Fórmulas para el cálculo manual

Supongamos:

  • \(t\) = número de tratamientos.

  • \(b\) = número de bloques.

  • \(Y_{ij}\) = valor observado del tratamiento \(i\) en el bloque \(j\).

  • \(T_{i.}\) = suma de las observaciones del tratamiento \(i\) (sobre todos los bloques).

  • \(T_{.j}\) = suma de las observaciones del bloque \(j\) (sobre todos los tratamientos).

  • \(T_{..}\) = suma total de todas las observaciones.

Factor de corrección (C): \[ C = \frac{T_{..}^2}{t \cdot b} \]

Suma de cuadrados total (SCT): \[ SCT = \sum_{i=1}^{t} \sum_{j=1}^{b} Y_{ij}^2 - C \]

Suma de cuadrados de tratamientos (SCTr): \[ SCTr = \frac{\sum_{i=1}^{t} T_{i.}^2}{b} - C \]

Suma de cuadrados de bloques (SCB): \[ SCB = \frac{\sum_{j=1}^{b} T_{.j}^2}{t} - C \]

Suma de cuadrados del error (SCE): \[ SCE = SCT - SCTr - SCB \]

Grados de libertad:

  • gl total = \(t \cdot b - 1\)

  • gl tratamientos = \(t - 1\)

  • gl bloques = \(b - 1\)

  • gl error = \((t-1)(b-1)\)

Cuadrados medios (CM): \[ CMTr = \frac{SCTr}{t-1}, \quad CMB = \frac{SCB}{b-1}, \quad CME = \frac{SCE}{(t-1)(b-1)} \]

Estadístico F para tratamientos: \[ F = \frac{CMTr}{CME} \] Se compara con \(F_{\alpha, t-1, (t-1)(b-1)}\).

Ejemplo numérico

Supongamos un experimento con 3 tratamientos (A, B, C) y 4 bloques (I, II, III, IV). Los datos son:

Bloque A B C Total bloque
I 12 15 10 37
II 14 16 12 42
III 13 14 11 38
IV 15 18 13 46
Total trat 54 63 46 \(T_{..}=163\)
  • \(t=3\), \(b=4\), \(n = 12\)

  • \(C = \frac{163^2}{12} = \frac{26569}{12} = 2214.0833\)

  • SCT = \((12^2+14^2+...+13^2) - C\). Suma de cuadrados de los 12 datos: 12²=144, 15²=225, 10²=100, 14²=196, 16²=256, 12²=144, 13²=169, 14²=196, 11²=121, 15²=225, 18²=324, 13²=169. Suma = 144+225+100+196+256+144+169+196+121+225+324+169 = 2269. Entonces SCT = 2269 - 2214.0833 = 54.9167.

  • SCTr = \(\frac{54^2+63^2+46^2}{4} - C\). 54²=2916, 63²=3969, 46²=2116. Suma=2916+3969+2116=9001. Dividido entre 4 = 2250.25. SCTr = 2250.25 - 2214.0833 = 36.1667.

  • SCB = \(\frac{37^2+42^2+38^2+46^2}{3} - C\). 37²=1369, 42²=1764, 38²=1444, 46²=2116. Suma=1369+1764+1444+2116=6693. Dividido entre 3 = 2231. SCB = 2231 - 2214.0833 = 16.9167.

  • SCE = 54.9167 - 36.1667 - 16.9167 = 1.8333.

  • glTr = 2, glB = 3, glE = 6.

  • CMTr = 36.1667/2 = 18.08335; CME = 1.8333/6 = 0.30555.

  • F = 18.08335 / 0.30555 ≈ 59.18.

  • Valor crítico F₀.₀₅,₂,₆ = 5.14. Como F > crítico, hay diferencias significativas entre tratamientos.


3. Soluciones en Python y R, y uso del paquete easyanova

a) En Python (usando statsmodels)

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

# Datos del ejemplo
data = {
    'tratamiento': ['A','B','C']*4,
    'bloque': ['I']*3 + ['II']*3 + ['III']*3 + ['IV']*3,
    'y': [12,15,10, 14,16,12, 13,14,11, 15,18,13]
}
df = pd.DataFrame(data)

# Modelo: y ~ tratamiento + bloque
modelo = ols('y ~ C(tratamiento) + C(bloque)', data=df).fit()
anova_table = sm.stats.anova_lm(modelo, typ=2)
print(anova_table)

Salida (aproximada):

                    sum_sq    df         F    PR(>F)
C(tratamiento)  36.166667   2.0  59.181818  0.000116
C(bloque)       16.916667   3.0   9.227273  0.011444
Residual         1.833333   6.0        NaN       NaN

b) En R (usando aov)

# Datos
tratamiento <- rep(c("A","B","C"), 4)
bloque <- rep(c("I","II","III","IV"), each=3)
y <- c(12,15,10,14,16,12,13,14,11,15,18,13)
datos <- data.frame(tratamiento, bloque, y)

# ANOVA con aov
modelo <- aov(y ~ tratamiento + bloque, data=datos)
summary(modelo)

Salida:

            Df Sum Sq Mean Sq F value   Pr(>F)    
tratamiento  2 36.167  18.083  59.182 0.000116 ***
bloque       3 16.917   5.639   9.455 0.011444 *  
Residuals    6  1.833   0.306                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

c) Con el paquete easyanova (R)

easyanova simplifica el análisis de varianza y las comparaciones de medias. Instalarlo con install.packages("easyanova").

library(easyanova)

# Datos en formato adecuado: columnas: Tratamiento, Bloque, Respuesta
datos <- data.frame(tratamiento, bloque, y)

# Análisis de varianza con easyanova
# Se especifica el modelo: respuesta ~ tratamiento | bloque
res <- ea1(y, tratamiento, bloque, data=datos)
print(res)

ea1 realiza el ANOVA y ofrece opciones de comparaciones múltiples (Tukey, Duncan, etc.). La salida incluye la tabla ANOVA y las medias con agrupaciones.


4. Interpretación de las salidas en Python, R y easyanova

Tabla ANOVA común

Las tres herramientas generan una tabla con:

  • Fuentes de variación: Tratamientos, Bloques, Residual (Error).

  • Suma de cuadrados (Sum Sq): Indica la variabilidad explicada por cada fuente.

  • Grados de libertad (Df).

  • Cuadrado medio (Mean Sq) = Sum Sq / Df.

  • Valor F: cociente entre el cuadrado medio del efecto y el cuadrado medio del error.

  • Pr(>F): p-valor asociado.

Interpretación:

  • Si p-valor < α (generalmente 0.05), se rechaza H₀ de que los tratamientos son iguales. Hay diferencias significativas entre al menos dos tratamientos.

  • En el ejemplo, el p-valor de tratamientos es ~0.0001, muy pequeño → evidencia fuerte de diferencias.

  • El bloque también resultó significativo (p=0.0114), lo que justifica su inclusión en el diseño (controló variabilidad).

Comparaciones de medias (post-hoc)

Cuando el ANOVA indica diferencias significativas, se suele realizar una prueba de comparación múltiple (Tukey, LSD, etc.) para identificar qué tratamientos difieren.

  • En Python con statsmodels, se puede usar pairwise_tukeyhsd del módulo statsmodels.stats.multicomp.

  • En R, la función TukeyHSD(modelo) o con easyanova se obtienen directamente.

  • La salida muestra grupos de medias que no difieren significativamente (letras iguales) o intervalos de confianza.

Interpretación práctica: Por ejemplo, si la prueba de Tukey indica que A y B son estadísticamente iguales pero C es diferente, se concluye que el tratamiento C produce un efecto distinto.

Consideraciones adicionales

  • Verificar los supuestos del modelo (normalidad de residuos, homocedasticidad) mediante gráficos (QQ-plot, residuos vs ajustados). Tanto en R como en Python se pueden obtener.

  • En easyanova, además del ANOVA, se pueden evaluar los supuestos con funciones complementarias.