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.


📘 Cuaderno 15: Parcelas Divididas en DBCA (Split-plot en Bloques)

a) Introducción Teórica a las Parcelas Divididas en DBCA

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\)

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

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.

  1. Factor de Corrección (FC) y SCT: \(FC = \frac{Y_{...}^2}{abr}\) y \(SCT = \sum y_{ijk}^2 - FC\)
  2. Cálculos de la Parcela Principal: Trabaja únicamente con los totales de cada parcela grande (\(Y_{ij.}\)).
    • \(SCBloq = \sum \frac{Y_{i..}^2}{ab} - FC\)
    • \(SCA = \sum \frac{Y_{.j.}^2}{rb} - FC\)
    • Error A: Calculado como la interacción Bloque \(\times\) Factor A. \[SCE_a = \sum \frac{Y_{ij.}^2}{b} - FC - SCBloq - SCA\]
  3. Cálculos de la Subparcela: Trabaja con la matriz bidimensional de los factores A y B sumados a través de los bloques (\(Y_{.jk}\)).
    • \(SCB = \sum \frac{Y_{..k}^2}{ra} - FC\)
    • \(SCTrat = \sum \frac{Y_{.jk}^2}{r} - FC\)
    • \(SCAB = SCTrat - SCA - SCB\)
    • Error B: Por diferencia del total. \[SCE_b = SCT - SCBloq - SCA - SCE_a - SCB - SCAB\]

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

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()

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

La 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)

e) Prompts Sugeridos para tus Estudiantes

Invita a los estudiantes a reflexionar sobre el rigor del trabajo de campo con estas preguntas dirigidas al modelo de lenguaje:

  1. “Hola. Revisando la tabla ANOVA para este diseño de Parcelas Divididas en DBCA, ¿por qué el ‘Error a’ (que evalúa el factor de la parcela principal) se calcula utilizando la interacción matemática entre los Bloques y el Factor A?”
  2. “Si el valor p de los ‘Bloques’ es muy bajo (significativo), y sabiendo que implementé esto en un terreno agrícola con un desnivel marcado, ¿qué conclusión logística debo sacar para mis futuros ensayos en esa misma finca?”
  3. “En el desdoblamiento de la interacción (cuando el Factor A y B interactúan), easyanova usa diferentes fórmulas para comparar ‘dos medias de B dentro de un mismo nivel de A’ versus ‘dos medias de A dentro de un mismo nivel de B’. ¿Por qué matemáticamente una comparación es más ‘estricta’ o tiene un error distinto que la otra?”

f) Plantillas Alternativas: Python y Julia

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.