Este es, sin duda, el diseño estrella para los ensayos de campo. Al llevar las Parcelas Divididas a un Diseño en Bloques Completamente al Azar (DBCA), dotamos al experimento de un blindaje completo: manejamos la logística de aplicar factores en diferentes tamaños de unidad experimental y, al mismo tiempo, controlamos los gradientes ambientales (como la humedad o la fertilidad del suelo) que inevitablemente cruzan el terreno.
Aquí tienes la estructura completa para este crucial cuaderno de Google Colab.
El diseño de Parcelas Divididas en DBCA combina la técnica de control local (bloques) con la restricción de aleatorización jerárquica (parcela principal y subparcela).
El proceso de campo ocurre en tres pasos: 1. El terreno se divide en Bloques para controlar un gradiente ambiental. 2. Cada bloque se divide en Parcelas Principales, a las cuales se les asignan aleatoriamente los niveles del Factor A (por ejemplo, Sistemas de Riego, que requieren áreas grandes). 3. Cada Parcela Principal se subdivide en Subparcelas, a las cuales se les asignan aleatoriamente los niveles del Factor B (por ejemplo, Variedades de Semilla).
Al igual que en el DCA, mantenemos la estructura de dos errores experimentales, pero ahora el Error A se calcula extrayendo primero la variación del bloque.
El Modelo Estadístico Lineal: \[y_{ijk} = \mu + \rho_i + \alpha_j + \eta_{ij} + \beta_k + (\alpha\beta)_{jk} + \epsilon_{ijk}\]
Donde: * \(\mu\): Media general. * \(\rho_i\): Efecto del \(i\)-ésimo Bloque. * \(\alpha_j\): Efecto del Factor Principal (A). * \(\eta_{ij}\): Error A (Error de la Parcela Principal, que equivale a la interacción Bloque \(\times\) Factor A). * \(\beta_k\): Efecto del Subfactor (B). * \((\alpha\beta)_{jk}\): Interacción entre los factores A y B. * \(\epsilon_{ijk}\): Error B (Error de la Subparcela).
Tabla ANOVA:
| Fuente de Variación | GL | Suma de Cuadrados | Cuadrado Medio (CM) | F calculado |
|---|---|---|---|---|
| Parcela Principal | ||||
| Bloques | \(r - 1\) | \(SCBloq\) | \(CMBloq = \frac{SCBloq}{r-1}\) | \(\frac{CMBloq}{CME_a}\) |
| Factor A | \(a - 1\) | \(SCA\) | \(CMA = \frac{SCA}{a-1}\) | \(\frac{CMA}{CME_a}\) |
| Error A | \((r - 1)(a - 1)\) | \(SCE_a\) | \(CME_a = \frac{SCE_a}{GL_{Ea}}\) | |
| Subparcela | ||||
| Factor B | \(b - 1\) | \(SCB\) | \(CMB = \frac{SCB}{b-1}\) | \(\frac{CMB}{CME_b}\) |
| Interacción (AxB) | \((a - 1)(b - 1)\) | \(SCAB\) | \(CMAB = \frac{SCAB}{GL_{AB}}\) | \(\frac{CMAB}{CME_b}\) |
| Error B | \(a(r - 1)(b - 1)\) | \(SCE_b\) | \(CME_b = \frac{SCE_b}{GL_{Eb}}\) | |
| Total | \(abr - 1\) | \(SCT\) |
Para el cálculo a mano, la lógica sigue siendo resolver la Parcela Principal como un DBCA estándar, y luego desglosar la Subparcela.
Para easyanova, el diseño tipo 5 espera un orden
estricto: Bloque, Parcela (Factor A), Subparcela (Factor B) y Respuesta.
Usaremos un dataset hipotético o el data13 del paquete si
está estructurado así.
library(easyanova)
# Asumimos que data13 tiene la estructura: Bloque, Parcela (A), Subparcela (B), Respuesta
data(data13)
# Inspeccionar la estructura
head(data13)
summary(data13)
# EDA 1: Efecto del Bloqueo sobre la Respuesta General
boxplot(data13[,4] ~ data13[,1],
col = "wheat",
main = "Evaluación del Gradiente de Bloques",
xlab = "Bloques en Campo", ylab = "Respuesta Observada")
# EDA 2: Interacción A x B
library(ggplot2)
medias_split_dbca <- aggregate(data13[,4], by = list(FactorA = data13[,2], FactorB = data13[,3]), FUN = mean)
ggplot(medias_split_dbca, aes(x = FactorB, y = x, group = FactorA, color = FactorA)) +
geom_line(size = 1.2) +
geom_point(size = 4) +
labs(title = "Interacción: Factor Principal x Subfactor (Ajustado por Bloques)",
x = "Niveles del Subfactor (B) [Subparcela]",
y = "Respuesta Media",
color = "Factor Principal (A) [Parcela]") +
theme_minimal()
ea2La función ea2 con design = 5 se encarga de
aislar la variación del bloque y aplicar los dos niveles de error
correspondientes para evaluar la significancia de los factores.
# Ejecutar Parcelas Divididas en DBCA (ea2, design = 5)
# Orden requerido: Col 1 = Bloque, Col 2 = Parcela(A), Col 3 = Subparcela(B), Col 4 = Respuesta
resultado_split_dbca <- ea2(data13, design = 5)
# Imprimir los resultados. La tabla ANOVA mostrará Bloques, Factor A, Error a, Factor B, Interacción y Error b.
print(resultado_split_dbca)
Invita a los estudiantes a reflexionar sobre el rigor del trabajo de campo con estas preguntas dirigidas al modelo de lenguaje:
En Python (Usando statsmodels con Modelos
Mixtos): Para capturar esta estructura correctamente en Python,
debemos definir la Parcela Principal como un efecto aleatorio que está
anidado dentro del Bloque.
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
# Dataset simulado (Bloque, Metodo_Arado (Parcela A), Variedad (Subparcela B))
data = {
'Bloque': ['B1','B1','B1','B1', 'B2','B2','B2','B2', 'B3','B3','B3','B3'],
'Arado_A': ['A1','A1','A2','A2', 'A1','A1','A2','A2', 'A1','A1','A2','A2'],
'Varied_B': ['V1','V2','V1','V2', 'V1','V2','V1','V2', 'V1','V2','V1','V2'],
'Rendimiento':[45, 50, 40, 42, 48, 55, 43, 46, 42, 48, 38, 40]
}
df = pd.DataFrame(data)
# El Error A es la interacción Bloque x Factor Principal
df['Parcela_Principal'] = df['Bloque'] + "_" + df['Arado_A']
# Modelo Mixto: Tratamientos y Bloque como efectos fijos (para obtener sus medias), Parcela_Principal como aleatorio
modelo_split_dbca = smf.mixedlm("Rendimiento ~ C(Bloque) + C(Arado_A) * C(Varied_B)", df, groups=df["Parcela_Principal"]).fit()
print("\n--- Resumen del Modelo Mixto (Parcelas Divididas en DBCA) ---")
print(modelo_split_dbca.summary())
En Julia (Usando MixedModels):
using DataFrames, MixedModels
# DataFrame simulado
df = DataFrame(
Bloque = repeat(["B1", "B2", "B3"], inner=4),
Arado_A = repeat(["A1", "A1", "A2", "A2"], outer=3),
Varied_B = repeat(["V1", "V2"], outer=6),
Rend = [45.0, 50.0, 40.0, 42.0, 48.0, 55.0, 43.0, 46.0, 42.0, 48.0, 38.0, 40.0]
)
# Identificador para el Error de la Parcela Principal
df.Parcela_Principal = df.Bloque .* "_" .* df.Arado_A
df.Bloque = categorical(df.Bloque)
df.Arado_A = categorical(df.Arado_A)
df.Varied_B = categorical(df.Varied_B)
# Ajuste: Bloque aditivo + Interacción Tratamientos + Efecto aleatorio de la Parcela Principal
modelo_mixto_dbca = fit(MixedModel, @formula(Rend ~ Bloque + Arado_A * Varied_B + (1|Parcela_Principal)), df)
println("--- Resumen del Modelo (Parcelas Divididas en DBCA) ---")
println(modelo_mixto_dbca)
Con las parcelas divididas dominadas en sus dos facetas principales,
el siguiente desafío en la lista de easyanova es el
6. Parcelas Divididas en DCL.