¡Entramos a una nueva etapa fascinante del curso! Al pasar a la
función ea2 de easyanova, dejamos atrás los
diseños de un solo factor y entramos al mundo real de la agroindustria y
la agronomía, donde los fenómenos casi nunca dependen de una sola
variable.
En un Arreglo Factorial, cruzamos dos o más factores simultáneamente (por ejemplo, evaluar 3 variedades de semilla de maíz cruzadas con 4 dosis de nitrógeno). El objetivo principal, más allá de ahorrar material experimental, es descubrir la interacción: saber si el comportamiento de una variedad cambia dependiendo de la dosis de fertilizante que reciba.
Aquí tienes la estructura pedagógica para iniciar esta nueva unidad en tu Google Colab.
Un diseño Factorial Doble (\(A \times B\)) en DCA se utiliza cuando queremos evaluar simultáneamente el efecto de dos factores sobre una variable de respuesta, asumiendo que las unidades experimentales son completamente homogéneas (por ejemplo, macetas idénticas en una cámara de ambiente controlado o lotes de jugo en un laboratorio).
El concepto más importante que el estudiante debe aprender aquí es la Interacción (\(A \times B\)). Si la interacción es significativa, significa que los factores no actúan de forma independiente; el efecto del Factor A sobre el rendimiento dependerá del nivel en el que se encuentre el Factor B. En este caso, los “efectos principales” de A y B pasan a un segundo plano, y las recomendaciones agronómicas deben hacerse para combinaciones específicas.
El Modelo Estadístico Lineal: \[y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \epsilon_{ijk}\]
Donde: * \(y_{ijk}\): Respuesta en la \(k\)-ésima repetición de la combinación del nivel \(i\) del factor A y el nivel \(j\) del factor B. * \(\mu\): Media general del experimento. * \(\alpha_i\): Efecto principal del \(i\)-ésimo nivel del Factor A. * \(\beta_j\): Efecto principal del \(j\)-ésimo nivel del Factor B. * \((\alpha\beta)_{ij}\): Efecto de la interacción entre el nivel \(i\) de A y el nivel \(j\) de B. * \(\epsilon_{ijk}\): Error experimental.
Tabla ANOVA:
| Fuente de Variación | Grados de Libertad (GL) | Suma de Cuadrados (SC) | Cuadrado Medio (CM) | F calculado |
|---|---|---|---|---|
| Factor A | \(a - 1\) | \(SCA\) | \(CMA = \frac{SCA}{a-1}\) | \(\frac{CMA}{CME}\) |
| Factor B | \(b - 1\) | \(SCB\) | \(CMB = \frac{SCB}{b-1}\) | \(\frac{CMB}{CME}\) |
| Interacción (AxB) | \((a - 1)(b - 1)\) | \(SCAB\) | \(CMAB = \frac{SCAB}{(a-1)(b-1)}\) | \(\frac{CMAB}{CME}\) |
| Error | \(ab(r - 1)\) | \(SCE\) | \(CME = \frac{SCE}{ab(r-1)}\) | |
| Total | \(abr - 1\) | \(SCT\) |
(Nota: \(a\) = niveles de A, \(b\) = niveles de B, \(r\) = repeticiones).
Para comprender de dónde salen las sumas de cuadrados, el cálculo manual se divide enfocándose en los totales de cada factor y de las celdas combinadas:
Para la función ea2, usaremos el conjunto de datos
data9 que viene en el paquete easyanova. Las
columnas representan el Factor 1, el Factor 2 y la Respuesta (al ser un
DCA, no hay columna de bloques).
library(easyanova)
# Cargar el dataset de ejemplo para Factorial en DCA
data(data9)
# Inspeccionar los datos: Col 1 = Factor 1, Col 2 = Factor 2, Col 3 = Respuesta
head(data9)
summary(data9)
# EDA: Gráfico de Interacción (La herramienta visual más importante en factoriales)
# Un gráfico de líneas cruzadas nos dará una pista fuerte de si existe interacción
library(ggplot2)
# Calculamos las medias por cada combinación de factores para graficar
medias_interaccion <- aggregate(data9[,3], by = list(Factor1 = data9[,1], Factor2 = data9[,2]), FUN = mean)
colnames(medias_interaccion)[3] <- "Respuesta_Media"
ggplot(medias_interaccion, aes(x = Factor1, y = Respuesta_Media, group = Factor2, color = Factor2)) +
geom_line(size = 1.2) +
geom_point(size = 4) +
labs(title = "Gráfico de Interacción: Factor 1 x Factor 2",
subtitle = "Si las líneas no son paralelas (se cruzan o divergen), sugiere una interacción fuerte",
x = "Niveles del Factor 1",
y = "Respuesta Media",
color = "Factor 2") +
theme_minimal()
Propósito pedagógico: Este gráfico es el corazón de la clase. Pregunta a tus alumnos: “¿Las líneas corren paralelas como rieles de tren? Si es así, los factores actúan independientemente. Si las líneas se cruzan (por ejemplo, la Variedad 1 rinde más con la Dosis A, pero la Variedad 2 rinde más con la Dosis B), entonces hay interacción y no podemos dar una recomendación general.”
ea2La sintaxis cambia ligeramente. Ahora usamos la función
ea2 y establecemos design = 1 para indicar que
el arreglo factorial se montó bajo un DCA. El paquete realiza
automáticamente el desdoblamiento de los grados de libertad si la
interacción es significativa.
# Ejecutar Factorial Doble en DCA (ea2, design = 1)
# Orden requerido: Col 1 = Factor 1, Col 2 = Factor 2, Col 3 = Respuesta
resultado_factorial <- ea2(data9, design = 1)
# Imprimir los resultados
# La salida mostrará la tabla ANOVA y, dependiendo de la interacción, la prueba de medias de efectos principales o efectos simples
print(resultado_factorial)
Motiva a tus alumnos a discutir la interpretación del diseño factorial conmigo:
easyanova, veo que se hizo un
‘desdoblamiento’ (análisis de efectos simples). ¿Podrías explicarme con
palabras sencillas por qué el software decidió hacer esto en lugar de
solo comparar los promedios generales del Factor A?”En Python (Usando statsmodels y
seaborn): En Python, la notación de fórmula
FactorA * FactorB le indica al modelo que incluya tanto los
efectos principales como la interacción.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Dataset simulado (Ej: Temperatura, Enzima, Rendimiento_Jugo)
data = {
'Temperatura': ['T1','T1','T1', 'T2','T2','T2', 'T1','T1','T1', 'T2','T2','T2'],
'Enzima': ['E1','E1','E1', 'E1','E1','E1', 'E2','E2','E2', 'E2','E2','E2'],
'Rendimiento': [45, 47, 44, 60, 62, 59, 50, 52, 51, 40, 42, 38]
}
df = pd.DataFrame(data)
# EDA: Gráfico de Interacción (pointplot es excelente para esto)
sns.pointplot(x='Temperatura', y='Rendimiento', hue='Enzima', data=df, markers=["o", "s"], capsize=.1)
plt.title('Interacción: Temperatura x Enzima')
plt.show()
# Ajuste del modelo Factorial Doble (El operador * incluye principales e interacción)
modelo_factorial = ols('Rendimiento ~ C(Temperatura) * C(Enzima)', data=df).fit()
tabla_anova = sm.stats.anova_lm(modelo_factorial, typ=2)
print("\n--- Tabla ANOVA (Factorial Doble en DCA) ---")
print(tabla_anova)
En Julia (Usando DataFrames y
GLM):
using DataFrames, GLM
# DataFrame simulado
df = DataFrame(
Temperatura = repeat(["T1", "T2"], inner=3, outer=2),
Enzima = repeat(["E1", "E2"], inner=6),
Rendimiento = [45.0, 47.0, 44.0, 60.0, 62.0, 59.0, 50.0, 52.0, 51.0, 40.0, 42.0, 38.0]
)
df.Temperatura = categorical(df.Temperatura)
df.Enzima = categorical(df.Enzima)
# En GLM, el operador * despliega la fórmula a: Temperatura + Enzima + Temperatura&Enzima
modelo_fac = lm(@formula(Rendimiento ~ Temperatura * Enzima), df)
println("--- Resumen del Modelo Factorial Doble ---")
println(modelo_fac)
Con esta base, los estudiantes están listos para entender casi cualquier experimento complejo.