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.
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.
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.).
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.
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.
La suma total de cuadrados (SCT) se descompone en:
\[ SCT = SCT_{\text{trat}} + SC_{\text{bloq}} + SCE \]
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)}\).
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.
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
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
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.
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).
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.
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.