Diseños Factoriales \(2^k\)

Javier De La Hoz Maestre, PhD

2025-09-26

Diseños factoriales \(2^k\)

  • La familia de diseños factoriales completos \(2^k\) (k factores con dos niveles) es de las más utilizadas en investigación e industria por su eficacia y versatilidad.

  • Útiles principalmente cuando \(2 \leq k \leq 5\) (de 4 a 32 tratamientos, manejables en la práctica).

  • Cuando \(k > 5\), se recomienda un factorial fraccionado \(2^{k-p}\) para reducir el número de corridas.

  • Tanto completos como fraccionados, los factoriales en dos niveles son el núcleo de las aplicaciones modernas del diseño de experimentos.

Número de réplicas en \(2^k\) — idea clave

  • El número de corridas crece exponencialmente: con \(r\) réplicas → \(r\cdot 2^k\) corridas.
  • En práctica, la mayoría de estudios \(2^k\) (o fracciones) usan \(\leq 32\) corridas; incluso \(\leq 16\) suele bastar en una primera etapa.
  • Para \(k\ge 5\) conviene fraccionar (\(2^{k-p}\)) y, si es necesario, completar después.

Guía rápida (corridas típicas)

Diseño Recomendación inicial Corridas típicas
\(2^2\) \(3\)\(4\) réplicas \(12\), \(16\)
\(2^3\) \(2\) réplicas \(16\)
\(2^4\) \(1\)\(2\) réplicas \(16\), \(32\)
\(2^5\) Fracción \(2^{5-1}\) (media fracción); evaluar y luego completar si hace falta \(16\), \(32\)
\(2^6\) Fracción \(2^{6-2}\) o \(2^{6-1}\) \(16\), \(32\)
\(2^7\) Fracción \(2^{7-3}\) o \(2^{7-2}\) \(16\), \(32\)
  • \(2^4\) es el completo más grande que suele correrse con \(2\) réplicas (32 corridas).
  • Para \(k>8\), fracciones con \(\leq 32\) corridas siguen siendo útiles para “tamizado”.

Si solo hay 1 réplica: cómo obtener el error (ANOVA aproximado)

  • En \(2^k\) no replicado, estima \(SS_E\) aglomerando efectos pequeños (típicamente interacciones de orden \(\ge 3\)) al error.
  • Pasos: (1) Enviar a error interacciones altas si son despreciables (verificación gráfica/tabular); (2) añadir otros efectos claramente pequeños hasta tener un error estable.
  • Fórmulas: \(SS_E=\sum SS_{\text{efectos\ enviados}}\), \(\;\;gl_E=\#\text{efectos\ enviados}\); compara \(CM_E\) con una varianza histórica para validar orden de magnitud.
  • Regla práctica: reunir ≥ 8 efectos pequeños ayuda a estabilizar el \(CM_E\); cuidado con mandar efectos reales al error (inflan \(CM_E\)) o con un error subestimado (falsos positivos).

Diseño \(2^2\)

Introducción al diseño \(2^2\)

El diseño factorial \(2^2\) es el más sencillo de la familia de diseños \(2^k\).

Se caracteriza por trabajar con dos factores, cada uno en dos niveles: bajo (−) y alto (+).

Este diseño constituye la base para comprender los diseños factoriales de mayor dimensión.

Notaciones: signos, letras y Yates

- La notación con letras (A+, A−) se emplea para identificar el punto ganador (mejor tratamiento).

  • La notación de signos (+, −) es muy práctica para escribir las matrices de diseño.

  • la notación de Yates, permite representar y calcular fácilmente los efectos de interés.

Regla:
Si una letra minúscula aparece → el factor correspondiente está en su nivel alto.
Si no aparece → el factor está en su nivel bajo.

Ejemplo:
ab indica que A y B están ambos en alto.

Representación geométrica de un diseño \(2^2\)

Cada vértice corresponde a un punto de diseño o tratamiento dentro del experimento.

El área delimitada por el cuadrado se denomina región experimental y representa el espacio en el que se evalúan los factores y niveles considerados. En consecuencia, las conclusiones derivadas del experimento tienen validez, en principio, únicamente dentro de esta región.

Cálculo de los efectos

En este diseño hay tres efectos de interés: los dos efectos principales (\(A\) y \(B\)) y la interacción (\(AB\)).

Con la notación de Yates, si cada tratamiento se corre \(n\) veces:

\(E_A = \frac{a + ab - (1) - b}{2n}\)

\(E_B = \frac{b + ab - (1) - a}{2n}\)

\(E_{AB} = \frac{ab + (1) - a - b}{2n}\)

  • Efecto \(A\): compara promedios derecha – izquierda.
  • Efecto \(B\): compara promedios arriba – abajo.
  • Interacción \(AB\): compara los promedios de las dos diagonales.

Hipótesis en un diseño \(2^2\)

Sea \(A\) el factor 1 y \(B\) el factor 2.
Se plantean tres conjuntos de hipótesis para los efectos principales y la interacción:

  • Efecto del factor \(A\)
    \(H_0: \alpha_1 = \alpha_2 = 0 \quad\quad\) \(H_A: \exists \, \alpha_i \neq 0\)

  • Efecto del factor \(B\)

\(H_0: \beta_1 = \beta_2 = 0 \quad\quad\) \(H_A: \exists \, \beta_j \neq 0\)

  • Interacción \(AB\)

\(H_0: (\alpha\beta)_{ij} = 0 \; \; \forall \, i,j \quad\quad\) \(H_A: \exists \, (\alpha\beta)_{ij} \neq 0\)

Interpretación

  • \(H_0\): No hay efecto significativo del factor o interacción.
  • \(H_A\): Al menos un nivel del factor o interacción afecta la variable respuesta.

Análisis de varianza

\(Y_{ij\ell}=\mu+\alpha_i+\beta_j+(\alpha\beta)_{ij}+\varepsilon_{ij\ell}\)

  • Los efectos distintos de cero no garantizan significancia estadística.

  • Es necesario aplicar ANOVA para contrastar hipótesis:

  • Las sumas de cuadrados se pueden calcular:

    • Con la notación de Yates (contrastes).
    • O mediante efectos estimados.

Sumas de cuadrados (2² con n réplicas)

Las sumas de cuadrados por efectos vía efectos/contrastes son:

\[ SS_A=\frac{[a+ab-b-(1)]^2}{n\,2^2}, \qquad SS_B=\frac{[b+ab-a-(1)]^2}{n\,2^2}, \qquad SS_{AB}=\frac{[ab+(1)-a-b]^2}{n\,2^2}. \]

La suma de cuadrados total (a partir de observaciones) es: \[ SS_T=\sum_{i=1}^{2}\sum_{j=1}^{2}\sum_{\ell=1}^{n} Y_{ij\ell}^{\,2}\;-\;\frac{Y_{\cdots}^{\,2}}{n\,2^2}, \] donde \(Y_{\cdots}=\sum_{i,j,\ell} Y_{ij\ell}\).

El error: \[ SS_E = SS_T-SS_A-SS_B-SS_{AB}. \]

Equivalentemente, con contrastes \(C_A=(a+ab)-[(1)+b]\), \(C_B=(b+ab)-[(1)+a]\), \(C_{AB}=(ab+(1))-(a+b)\):

\(SS_A=\frac{C_A^2}{4n},\quad SS_B=\frac{C_B^2}{4n},\quad\) \(SS_{AB}=\frac{C_{AB}^2}{4n}\).

Tabla ANOVA (2² con n réplicas)

Fuente de variación SC GL CM \(F_0\) Valor-\(p\)
\(A\) \(SS_A\) \(1\) \(CM_A \,=\, SS_A/1\) \(F_A \,=\, CM_A/CM_E\) \(p_A \,=\, \Pr\!\left(F_{1,\,4(n-1)} \ge F_A\right)\)
\(B\) \(SS_B\) \(1\) \(CM_B \,=\, SS_B/1\) \(F_B \,=\, CM_B/CM_E\) \(p_B \,=\, \Pr\!\left(F_{1,\,4(n-1)} \ge F_B\right)\)
\(AB\) \(SS_{AB}\) \(1\) \(CM_{AB} \,=\, SS_{AB}/1\) \(F_{AB} \,=\, CM_{AB}/CM_E\) \(p_{AB} \,=\, \Pr\!\left(F_{1,\,4(n-1)} \ge F_{AB}\right)\)
Error \(SS_E\) \(4(n-1)\) \(CM_E \,=\, \dfrac{SS_E}{4(n-1)}\)
Total \(SS_T\) \(4n-1\)

Note

  • \(F_0\) se compara con el valor crítico \(F_{(1,\,4(n-1))}\).
  • Si \(F_0 > F_{\alpha}\), se rechaza \(H_0\) para ese efecto.
  • Se rechaza \(H_0\) si el valor-p < \(\alpha\)

Ejemplo

Contexto y objetivo. En una planta de compostaje se evaluará, en biofiltro de laboratorio, el efecto del material de lecho y de la humedad sobre la concentración de H\(_2\)S a la salida (ppmv), y si existe interacción entre factores.

Factores (codificación \(\pm1\)). - A — Material del lecho: Compost (−1) vs Biochar (+1)
- B — Humedad del lecho: 40 % (−1) vs 60 % (+1)

Respuesta. \(Y=\) H\(_2\)S (ppmv) a la salida (menor es mejor).
Diseño. Factorial \(2\times2\) completamente al azar con \(n=4\) réplicas por celda (16 corridas); orden de corridas aleatorizado.

Condiciones controladas

  • Carga de entrada: \(C_{\text{in}}=20\pm2\) ppmv H₂S (mezclador dinámico).
  • Caudal: \(20\ \text{m}^3\ \text{h}^{-1}\) (EBRT ≈ 5 s).
  • Temperatura del gas: \(25\pm2\ ^\circ\text{C}\).
  • pH del lecho: 7.0–7.5 (buffer fosfato).
  • Sensórica: celda electroquímica continua (verificación colorimétrica por azul de metileno 1/4 de réplicas).

Diseño, unidades y réplicas

  • Diseño completamente al azar 2×2 con 4 réplicas por celda (16 corridas).
  • Unidad experimental: 1 h de operación en estado cuasi-estacionario por tratamiento.
  • Reacondicionar humedad y estabilizar 20 min entre corridas.
  • Aleatorizar el orden de corridas para evitar deriva temporal.

Hipótesis a probar

Sea \(\mu_{ij}\) la media en el nivel \(i\) de \(A\) (material; \(i=1\) compost, \(i=2\) biochar) y nivel \(j\) de \(B\) (humedad; \(j=1\) 40%, \(j=2\) 60%). También: \(Y=\beta_0+\beta_A x_A+\beta_B x_B+\beta_{AB}x_Ax_B+\varepsilon\) con \(x_A,x_B\in\{-1,+1\}\).

  • Factor \(A\) (material del lecho)
    • \(H_0:\ \bar\mu_{1\cdot}=\bar\mu_{2\cdot}\ \ \Leftrightarrow\ \ \alpha_1=\alpha_2=0\ \ \Leftrightarrow\ \ \beta_A=0\)
    • \(H_A:\ \bar\mu_{1\cdot}\neq\bar\mu_{2\cdot}\ \ \Leftrightarrow\ \ \exists\,\alpha_i\neq 0\ \ \Leftrightarrow\ \ \beta_A\neq 0\)
  • Factor \(B\) (humedad del lecho)
    • \(H_0:\ \bar\mu_{\cdot1}=\bar\mu_{\cdot2}\ \ \Leftrightarrow\ \ \beta_1=\beta_2=0\ \ \Leftrightarrow\ \ \beta_B=0\)
    • \(H_A:\ \bar\mu_{\cdot1}\neq\bar\mu_{\cdot2}\ \ \Leftrightarrow\ \ \exists\,\beta_j\neq 0\ \ \Leftrightarrow\ \ \beta_B\neq 0\)
  • Interacción \(AB\)
    • \(H_0:\ (\mu_{11}-\mu_{12})-(\mu_{21}-\mu_{22})=0\ \ \Leftrightarrow\ \ (\alpha\beta)_{ij}=0\ \forall i,j\ \ \Leftrightarrow\ \ \beta_{AB}=0\)
    • \(H_A:\ (\mu_{11}-\mu_{12})-(\mu_{21}-\mu_{22})\neq 0\ \ \Leftrightarrow\ \ \exists\,(\alpha\beta)_{ij}\neq 0\ \ \Leftrightarrow\ \ \beta_{AB}\neq 0\)

Contraste y decisión (\(\alpha=0.05\)): usar \(F_A=CM_A/CM_E\), \(F_B=CM_B/CM_E\), \(F_{AB}=CM_{AB}/CM_E\) con \(gl_1=1\) y \(gl_2=12\); rechazar $_

Datos obtenidos

A: Material B: Humedad A B \(x_A\) \(x_B\) Rép 1 Rép 2 Rép 3 Rép 4 Total Media
Compost 40 % −1 −1 7.6 7.1 6.8 7.4 28.9 \(=(1)\) 7.23
Biochar 40 % + +1 −1 3.2 2.9 3.5 3.1 12.7 \(=a\) 3.18
Compost 60 % + −1 +1 4.8 4.2 4.5 4.6 18.1 \(=b\) 4.53
Biochar 60 % + + +1 +1 0.9 0.7 1.0 0.8 3.4 \(=ab\) 0.85

Totales (orden de Yates): \((1)=28.9,\; a=12.7,\; b=18.1,\; ab=3.4.\)

ANOVA paso a paso (manual)

Datos en notación de Yates: \((1)=28.9\), \(a=12.7\), \(b=18.1\), \(ab=3.4\), \(n=4\), \(N=16\).

1) Contrastes (\(2^2\)): \[ \begin{aligned} C_A &= (a+ab)-\big[(1)+b\big] \;=\; 12.7+3.4-28.9-18.1 \;=\; -30.9,\\ C_B &= (b+ab)-\big[(1)+a\big] \;=\; 18.1+3.4-28.9-12.7 \;=\; -20.1,\\ C_{AB} &= (ab+(1))-(a+b) \;=\; 3.4+28.9-12.7-18.1 \;=\; 1.5. \end{aligned} \]

2) Efectos (diferencias de medias, \(2n=8\)): \[ E_A=\frac{C_A}{2n}=\frac{-30.9}{8}=-3.8625,\quad E_B=\frac{-20.1}{8}=-2.5125,\quad E_{AB}=\frac{1.5}{8}=0.1875. \]

3) Sumas de cuadrados por efecto \(\big(SS=\dfrac{C^2}{4n}=\dfrac{C^2}{16}\big)\): \[ SS_A=\frac{(-30.9)^2}{16}=59.676,\quad SS_B=\frac{(-20.1)^2}{16}=25.251,\quad SS_{AB}=\frac{(1.5)^2}{16}=0.141. \]

4) Total y error (con los \(16\) datos: \(\sum Y^2=334.71\), \(Y_{\cdots}=63.1\)): \[ SS_T=\sum Y^2-\frac{Y_{\cdots}^2}{N} =334.71-\frac{63.1^2}{16} =85.859,\qquad SS_E=SS_T-(SS_A+SS_B+SS_{AB})=0.793. \]

5) Grados de libertad y cuadrados medios: \[ gl_A=gl_B=gl_{AB}=1,\quad gl_E=4(n-1)=12,\quad gl_T=N-1=15, \] \[ CM_A=SS_A,\;\; CM_B=SS_B,\;\; CM_{AB}=SS_{AB},\;\; CM_E=\frac{SS_E}{12}=\frac{0.793}{12}=0.066. \]

6) Estadísticos \(F\) y valores-\(p\) (\(gl_1=1\), \(gl_2=12\)): \[ F_A=\frac{CM_A}{CM_E}=\frac{59.676}{0.066}=903.606,\;\; p_A\approx 1.15\times10^{-12}; \] \[ F_B=\frac{25.251}{0.066}=382.344,\;\; p_B\approx 1.82\times10^{-10}; \] \[ F_{AB}=\frac{0.141}{0.066}=2.129,\;\; p_{AB}\approx 0.170. \]

Tabla ANOVA (con \(p\)-valor)

\(\text{FV}\) \(\text{SC}\) \(\text{GL}\) \(\text{CM}\) \(F_0\) \(p\)-valor
\(A\) \(59.676\) \(1\) \(59.676\) \(903.606\) \(1.15\times10^{-12}\)
\(B\) \(25.251\) \(1\) \(25.251\) \(382.344\) \(1.82\times10^{-10}\)
\(AB\) \(0.141\) \(1\) \(0.141\) \(2.129\) \(0.170\)
\(\text{Error}\) \(0.793\) \(12\) \(0.066\)
\(\text{Total}\) \(85.859\) \(15\)

Ejercicio en R

En este primer paso generamos el diseño factorial \(2^2\) con 4 réplicas por celda (16 corridas en total) usando FrF2. Definimos los nombres y niveles de los factores exactamente como en el ejemplo aplicado (Material y Humedad). No aleatorizamos para poder asignar manualmente las réplicas en el mismo orden que aparece en la tabla.

Code
library(FrF2)
library(DoE.base)

## 1) Diseño 2^2 con 4 réplicas (16 corridas), sin aleatorizar
des <- FrF2(
  nruns = 4, nfactors = 2,
  replications = 4, 
  randomize = FALSE,
  factor.names = list(
    Material = c("Compost(-)","Biochar(+)"),
    Humedad  = c("40%(-)","60%(+)")
  )
)
des
   run.no run.no.std.rp   Material Humedad Blocks
1       1           1.1 Compost(-)  40%(-)     .1
2       2           2.1 Biochar(+)  40%(-)     .1
3       3           3.1 Compost(-)  60%(+)     .1
4       4           4.1 Biochar(+)  60%(+)     .1
5       5           1.2 Compost(-)  40%(-)     .2
6       6           2.2 Biochar(+)  40%(-)     .2
7       7           3.2 Compost(-)  60%(+)     .2
8       8           4.2 Biochar(+)  60%(+)     .2
9       9           1.3 Compost(-)  40%(-)     .3
10     10           2.3 Biochar(+)  40%(-)     .3
11     11           3.3 Compost(-)  60%(+)     .3
12     12           4.3 Biochar(+)  60%(+)     .3
13     13           1.4 Compost(-)  40%(-)     .4
14     14           2.4 Biochar(+)  40%(-)     .4
15     15           3.4 Compost(-)  60%(+)     .4
16     16           4.4 Biochar(+)  60%(+)     .4
class=design, type= full factorial 
NOTE: columns run.no and run.no.std.rp  are annotation, 
 not part of the data frame

Etiquetamos cada fila del diseño con la notación de Yates “(1)”, “a”, “b”, “ab” y, aparte, creamos un objeto con los vectores de respuesta (4 réplicas por tratamiento) exactamente como en tu tabla. Esto nos permitirá asignar la respuesta a las filas correctas.

Code
# 2) Etiqueta de tratamiento en notación de Yates para cada fila del diseño
yates_lab <- with(des, ifelse(Material=="Compost(-)" & Humedad=="40%(-)", "(1)",
                       ifelse(Material=="Biochar(+)" & Humedad=="40%(-)",  "a",
                       ifelse(Material=="Compost(-)" & Humedad=="60%(+)",  "b", "ab"))))
des$Yates <- factor(yates_lab, levels = c("(1)","a","b","ab"))


y_list <- list(
  "(1)" = c(7.6, 7.1, 6.8, 7.4),   # A-, B-
  "a"   = c(3.2, 2.9, 3.5, 3.1),   # A+, B-
  "b"   = c(4.8, 4.2, 4.5, 4.6),   # A-, B+
  "ab"  = c(0.9, 0.7, 1.0, 0.8)    # A+, B+
)
y_list
$`(1)`
[1] 7.6 7.1 6.8 7.4

$a
[1] 3.2 2.9 3.5 3.1

$b
[1] 4.8 4.2 4.5 4.6

$ab
[1] 0.9 0.7 1.0 0.8

Aquí asignamos cada réplica de y_list en las 4 filas correspondientes de des (según su etiqueta de Yates). Luego verificamos totales y medias por tratamiento: deben coincidir con \((1)=28.9,\ a=12.7,\ b=18.1,\ ab=3.4\) y con las medias mostradas en la tabla.

Code
## 4) Asignación robusta: coloca cada réplica en las filas correspondientes del diseño
des$y <- NA_real_
for (k in names(y_list)) {
  idx <- which(des$Yates == k)           # deben ser 4 índices por tratamiento
  des$y[idx] <- y_list[[k]]              # asigna sus 4 réplicas (en el orden de las filas)
}

## Verificación de totales y medias en Yates
tapply(des$y, des$Yates, sum)   # (1)=28.9, a=12.7, b=18.1, ab=3.4
 (1)    a    b   ab 
28.9 12.7 18.1  3.4 
Code
tapply(des$y, list(des$Material, des$Humedad), mean)
           40%(-) 60%(+)
Compost(-)  7.225  4.525
Biochar(+)  3.175  0.850
Code
des
   run.no run.no.std.rp   Material Humedad Blocks Yates   y
1       1           1.1 Compost(-)  40%(-)     .1   (1) 7.6
2       2           2.1 Biochar(+)  40%(-)     .1     a 3.2
3       3           3.1 Compost(-)  60%(+)     .1     b 4.8
4       4           4.1 Biochar(+)  60%(+)     .1    ab 0.9
5       5           1.2 Compost(-)  40%(-)     .2   (1) 7.1
6       6           2.2 Biochar(+)  40%(-)     .2     a 2.9
7       7           3.2 Compost(-)  60%(+)     .2     b 4.2
8       8           4.2 Biochar(+)  60%(+)     .2    ab 0.7
9       9           1.3 Compost(-)  40%(-)     .3   (1) 6.8
10     10           2.3 Biochar(+)  40%(-)     .3     a 3.5
11     11           3.3 Compost(-)  60%(+)     .3     b 4.5
12     12           4.3 Biochar(+)  60%(+)     .3    ab 1.0
13     13           1.4 Compost(-)  40%(-)     .4   (1) 7.4
14     14           2.4 Biochar(+)  40%(-)     .4     a 3.1
15     15           3.4 Compost(-)  60%(+)     .4     b 4.6
16     16           4.4 Biochar(+)  60%(+)     .4    ab 0.8
class=design, type= full factorial 
NOTE: columns run.no and run.no.std.rp  are annotation, 
 not part of the data frame

Ajustamos un modelo aov con efectos principales e interacción (Material*Humedad). La salida summary(fit) debe reflejar lo obtenido en el cálculo manual: efectos muy significativos de A y B y no significativo para la interacción AB con estos datos.

Code
fit <- aov(y ~ Material * Humedad, data = des)
summary(fit)
                 Df Sum Sq Mean Sq F value   Pr(>F)    
Material          1  59.68   59.68 903.606 1.15e-12 ***
Humedad           1  25.25   25.25 382.344 1.82e-10 ***
Material:Humedad  1   0.14    0.14   2.129     0.17    
Residuals        12   0.79    0.07                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Diagnóstico visual de efectos.

Para reproducir las gráficas de efectos e interacción del enfoque clásico, usamos IAPlot (interacción) y, si lo deseas, MEPlot (efectos principales).

Note

Nota clave: estas funciones requieren declarar la respuesta con response = “y”; de lo contrario aparece el error “The design obj must have at least one response.”

Efectos principales

Code
EP <- MEPlot(fit, response = "y")  # Efectos principales
Code
head(EP)
  Material Humedad
-   5.8750  5.2000
+   2.0125  2.6875

Interpretación breve de los efectos principales

Material: al pasar de Compost a Biochar la media baja de ~5.88 a ~2.02 ppmv (Δ ≈ −3.86). → Efecto principal muy fuerte; Biochar rinde mejor en promedio.

Humedad: al pasar de 40% a 60% la media baja de ~5.21 a ~2.69 ppmv (Δ ≈ −2.52). → Efecto marcado, aunque menor que el del material.

En este gráfico las pendientes negativas en ambos paneles indican que moverse al nivel “alto” (Biochar; 60%) reduce la respuesta (y = H₂S, menor es mejor).

Conclusión práctica: los mejores niveles, considerados por separado, son Biochar y 60%. En combinación (ver celdas), esto coincide con la menor media observada (Biochar–60%).

Efecto de interacción

Code
EI <- IAPlot(fit, response = "y")  # Efecto de interacción
Code
head(EI)
    Material:Humedad
-:-            7.225
+:-            3.175
-:+            4.525
+:+            0.850

Interpretación breve interación

Las líneas son casi paralelas en ambos contrastes → la interacción AB es débil/no significativa (coincide con ANOVA: p ≈ 0.17).

En los dos factores, la pendiente es descendente al pasar al nivel alto (Biochar; 60%) → cada factor reduce y por sí mismo.

No hay cruce de líneas (no se invierte el orden entre niveles) → el efecto conjunto no cambia la dirección del efecto principal.

Mejor combinación esperada: Biochar–60%, que produce la menor media observada de y (H₂S, menor es mejor).

Verificación de Supuestos

Code
library(performance)
performance::check_model(fit)

Verificación de supuestos — resumen

Normalidad: QQ-plot cercano a la línea de referencia → residuos ~ normales.

Linealidad: residuales sin patrón respecto a ajustados → relación lineal plausible.

Homoscedasticidad: ligera pendiente en escala-ubicación, pero débil → varianza aproximadamente constante.

Influyentes: sin puntos fuera de las bandas de Cook/leverage → no hay observaciones problemáticas.

Colinealidad: VIF bajos (< 2) → sin colinealidad relevante.

Independencia: respaldada por la aleatorización del experimento.

Conclusión: supuestos del ANOVA razonablemente satisfechos; no se requieren transformaciones.

Verificación de Supuestos

Code
check_normality(fit)
OK: residuals appear as normally distributed (p = 0.972).
Code
check_homogeneity(fit, method = "bartlett") # podria cambiar a method = "levene"
OK: There is not clear evidence for different variances across groups (Bartlett Test, p = 0.514).

Modelo de regresión

En un diseño \(2^k\), es útil ajustar un modelo de regresión sobre variables codificadas \(x_1,\dots,x_k \in \{-1,+1\}\) para predecir la respuesta \(Y\) en cualquier punto de la región experimental.

Para \(k=2\) (factores \(A\) y \(B\)), el modelo lineal con interacción es:

\[ \hat Y \;=\; \beta_0 \;+\; \beta_A\,x_A \;+\; \beta_B\,x_B \;+\; \beta_{AB}\,x_A x_B. \]

La codificación unitaria (\(-1,+1\)) hace que los coeficientes sean los efectos estimados divididos entre 2:
\(\beta_A=\tfrac{\text{Efecto}(A)}{2}\), \(\;\beta_B=\tfrac{\text{Efecto}(B)}{2}\), \(\;\beta_{AB}=\tfrac{\text{Efecto}(AB)}{2}\).
El término \(\beta_0\) es la media global (predicción en el centro, \(x_A=x_B=0\)).

Tip

¿Por qué “efecto/2”?
Con \(x\in\{-1,+1\}\) el ancho de la región es 2 unidades; dividir por 2 lleva los efectos a escala unitaria, que es la escala usual de regresión.

Calidad del ajuste: \(R^2\) y \(R^2_{\text{aj}}\)

Evaluamos la capacidad explicativa del modelo con:

\[ R^2 \;=\; 1 - \frac{SS_E}{SS_T}, \qquad R^2_{\text{aj}} \;=\; 1 - \frac{CM_E}{CM_T}, \]

donde \(SS_E\) y \(SS_T\) son la suma de cuadrados del error y total;
\(CM_E = SS_E/\text{gl}_E\) y \(CM_T = SS_T/\text{gl}_T\).
\(R^2_{\text{aj}}\) es preferible cuando hay varios términos, pues penaliza complejidad innecesaria.

Con el modelo ajustado, podemos predecir \(\hat Y\) e informar intervalos de confianza para la media en puntos de interés (p. ej., vértices y centro de la región).

Implementación en R

A continuación, ajustamos el modelo codificado (\(x_A,x_B\in\{-1,+1\}\)), verificamos la relación efectos ↔︎ coeficientes, reportamos \(R^2\) y \(R^2_{\text{aj}}\), generamos predicciones con IC y visualizamos la superficie de respuesta.

Code
# Variables codificadas ±1
des$xA <- ifelse(des$Material == "Biochar(+)",  +1, -1)
des$xB <- ifelse(des$Humedad  == "60%(+)"   ,  +1, -1)

# Modelo de regresión con interacción en codificación unitaria
lm_cod <- lm(y ~ xA * xB, data = des)
summary(lm_cod)

Call:
lm.default(formula = y ~ xA * xB, data = des)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4250 -0.1313  0.0000  0.1562  0.3750 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.94375    0.06425  61.385 2.31e-16 ***
xA          -1.93125    0.06425 -30.060 1.15e-12 ***
xB          -1.25625    0.06425 -19.554 1.82e-10 ***
xA:xB        0.09375    0.06425   1.459     0.17    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.257 on 12 degrees of freedom
Multiple R-squared:  0.9908,    Adjusted R-squared:  0.9885 
F-statistic: 429.4 on 3 and 12 DF,  p-value: 1.806e-12

Efectos ↔︎ Coeficientes

Comprobamos la equivalencia: (efecto estimado) \(\approx 2\times\) (coeficiente de regresión). La tabla debe mostrar coincidencia numérica fila a fila.

Code
E_A  <- with(des, mean(y[xA==+1]) - mean(y[xA==-1]))
E_B  <- with(des, mean(y[xB==+1]) - mean(y[xB==-1]))
E_AB <- with(des, mean(y[xA*xB==+1]) - mean(y[xA*xB==-1]))

efectos <- c(E_A = E_A, E_B = E_B, E_AB = E_AB)
coefs   <- coef(lm_cod)[c("xA","xB","xA:xB")]

round(rbind("Efecto estimado" = efectos,
            "2 * Coef(lm)"    = 2*coefs), 4)
                    E_A     E_B   E_AB
Efecto estimado -3.8625 -2.5125 0.1875
2 * Coef(lm)    -3.8625 -2.5125 0.1875

Calidad del ajuste: \(R^2\) y \(R^2_{\text{aj}}\)

Medimos la proporción de variabilidad explicada por el modelo. Reportamos también el ANOVA para ver \(SC_\text{modelo}\), \(SC_\text{error}\) y \(SC_\text{total}\).

Code
s <- summary(lm_cod)
c(R2 = s$r.squared, R2_aj = s$adj.r.squared)
       R2     R2_aj 
0.9907698 0.9884622 
Code
anova(lm_cod)
Analysis of Variance Table

Response: y
          Df Sum Sq Mean Sq  F value    Pr(>F)    
xA         1 59.676  59.676 903.6057 1.150e-12 ***
xB         1 25.251  25.251 382.3438 1.815e-10 ***
xA:xB      1  0.141   0.141   2.1293    0.1702    
Residuals 12  0.792   0.066                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Predicciones con IC (vértices y centro)

Obtenemos la respuesta promedio predicha \(\hat Y\) y su IC 95% en los cuatro vértices y en el centro de la región experimental (\(x_A,x_B\in{-1,0,+1}\)).

Code
new_pts <- data.frame(
  xA = c(-1,+1,-1,+1, 0),
  xB = c(-1,-1,+1,+1, 0),
  row.names = c("(-1,-1)","(+1,-1)","(-1,+1)","(+1,+1)","Centro (0,0)")
)

pred_ci <- predict(lm_cod, newdata = new_pts,
                   interval = "confidence", level = 0.95)
round(pred_ci, 3)
               fit   lwr   upr
(-1,-1)      7.225 6.945 7.505
(+1,-1)      3.175 2.895 3.455
(-1,+1)      4.525 4.245 4.805
(+1,+1)      0.850 0.570 1.130
Centro (0,0) 3.944 3.804 4.084

Predicción puntual (ejemplo)

Ejemplo de tratamiento específico: Compost–60% (\(x_A=-1,\ x_B=+1\)). Reportamos \(\hat Y\) e intervalo de confianza.

Code
predict(lm_cod, newdata = data.frame(xA = -1, xB = +1),
        interval = "confidence", level = 0.95)
    fit      lwr      upr
1 4.525 4.245038 4.804962

Superficie de respuesta y contornos

Visualizamos la superficie \(\hat Y(x_A,x_B)\) y sus contornos en \([-1,1]\times[-1,1]\). Busca el mínimo (zonas más frías) y verifica que coincida con la mejor combinación observada.

Code
library(ggplot2)

grid <- expand.grid(
  xA = seq(-1, 1, length.out = 101),
  xB = seq(-1, 1, length.out = 101)
)
grid$y_hat <- predict(lm_cod, newdata = grid)

ggplot(grid, aes(xA,xB, z = y_hat)) +
  geom_raster(aes(fill = y_hat), interpolate = TRUE) +
  geom_contour(color = "white", linewidth = 0.4) +
 geom_contour(color = "white", linewidth = 0.4) +
  scale_fill_viridis_c(direction = 1, name = "ŷ")+  # direction=1: tonos + oscuros = valores + bajos
  
  guides(fill = guide_colorbar(title = "ŷ")) +
  labs(x = "Material", y = "Humedad") +
  theme_minimal(base_size = 12)

Superficie de respuesta (ŷ) y contornos en la región experimental codificada.

Superficie de respuesta — interpretación

Al avanzar hacia Biochar (+1) y 60% (+1) el color pasa de amarillo a morado ⇒ la respuesta disminuye (menor H₂S = mejor).

Las isolíneas rectas y paralelas sugieren interacción pequeña (modelo casi aditivo/planar).

La pendiente es mayor en Material (xA) que en Humedad (xB) ⇒ el Material tiene mayor efecto.

Óptimo: Biochar–60% ((+1,+1)), Máximo: Compost–40% ((-1,-1)); en el centro ((0,0)) se predice ŷ ≈ 3.94.

Code
library(plot3D)
library(viridisLite)

# Paleta: usa viridisLite si está disponible; si no, jet.col
if (!requireNamespace("viridisLite", quietly = TRUE)) {
  pal <- plot3D::jet.col(5)          # fallback
} else {
  pal <- viridisLite::viridis(5)      # oscuro (bajo) → claro (alto)
}

# Malla en [-1,1] × [-1,1]
x <- seq(-1, 1, length.out = 80)   # -1 = Compost, +1 = Biochar
y <- seq(-1, 1, length.out = 80)   # -1 = 40%,    +1 = 60%
G <- mesh(x, y)

# Predicciones del modelo codificado
z_hat <- predict(lm_cod, newdata = data.frame(xA = c(G$x), xB = c(G$y)))
Z <- matrix(z_hat, nrow = nrow(G$x), ncol = ncol(G$y))

# Superficie + contornos
surf3D(x = G$x, y = G$y, z = Z,
       colvar = Z, col = pal,
       border = "steelblue4", lwd = 1.1,
       lighting = FALSE, bty = "b2", box = TRUE, ticktype = "detailed",
       xlab = "xA: Material (−1=Compost, +1=Biochar)",
       ylab = "xB: Humedad (−1=40%, +1=60%)",
       zlab = "H₂S (ppmv)",
       theta = 35, phi = 20, expand = 0.8,
       colkey = list(side = 4, length = 0.5, width = 0.45, clab = "ŷ"),
       contour = list(nlevels = 8, col = "grey",
                      side = c("z","bottom","left")))

# Puntos observados
scatter3D(x = des$xA, y = des$xB, z = des$y,
          add = TRUE, pch = 16, cex = 0.5, col = "grey40")

Superficie estimada (ŷ) con contornos proyectados y puntos observados.

Diseño \(2^3\)

Introducción al diseño \(2^3\)

En un \(2^3\) estudiamos tres factores \((A,B,C)\) con dos niveles cada uno \((−1,+1)\)8 tratamientos (vértices de un cubo en la región experimental). Podemos estimar \(2^3-1=7\) efectos: tres principales (\(A,B,C\)), tres interacciones dobles (\(AB,AC,BC\)) y la triple (\(ABC\)). La notación de Yates para los totales de tratamiento sigue el orden estándar: \((1),a,b,ab,c,ac,bc,abc\).

Efectos y contrastes en \(2^3\)

Con \(n\) réplicas por tratamiento, el efecto de cada término es el contraste dividido por \(2^{k-1}n=4n\): \(\;\;\displaystyle \text{Efecto}=\dfrac{C}{4n}\). La suma de cuadrados por término se obtiene como: \(\;\;\displaystyle SS=\dfrac{C^2}{2^k n}=\dfrac{C^2}{8n}\).

\[ C_A = (a+ab+ac+abc) - \big[(1)+b+c+bc\big] \]

\[ C_B = (b+ab+bc+abc) - \big[(1)+a+c+ac\big] \]

\[ C_C = (c+ac+bc+abc) - \big[(1)+a+b+ab\big] \]

\[ C_{ABC} = (abc+(1)) - (a+b+c+ab+ac+bc) \]

Modelo estadístico e hipótesis en \(2^3\)

\[Y_{ijk\ell} \;=\; \mu \;+\; \alpha_i \;+\; \beta_j \;+\; \gamma_k \;+\; (\alpha\beta)_{ij} \;+\; (\alpha\gamma)_{ik} \;+\; (\beta\gamma)_{jk} \;+\; (\alpha\beta\gamma)_{ijk} \;+\; \varepsilon_{ijk\ell}, \]

donde \(\;i,j,k=1,2,\;\; \ell=1,\dots,n\), y
\(\;\varepsilon_{ijk\ell}\sim N(0,\sigma^2)\).

Parametrización alternativa

Codificando \(x_A, x_B, x_C \in \{-1,+1\}\):

\[ Y \;=\; \beta_0 + \beta_A x_A + \beta_B x_B + \beta_C x_C + \beta_{AB} x_A x_B + \beta_{AC} x_A x_C + \beta_{BC} x_B x_C + \beta_{ABC} x_A x_B x_C + \varepsilon \]

Hipótesis de interés

  • Efectos principales
    • \(H_0: \beta_A=0 \quad\) vs \(\quad H_A: \beta_A\neq 0\)
    • \(H_0: \beta_B=0 \quad\) vs \(\quad H_A: \beta_B\neq 0\)
    • \(H_0: \beta_C=0 \quad\) vs \(\quad H_A: \beta_C\neq 0\)
  • Interacciones de segundo orden
    • \(H_0: \beta_{AB}=0 \quad\) vs \(\quad H_A: \beta_{AB}\neq 0\)
    • \(H_0: \beta_{AC}=0 \quad\) vs \(\quad H_A: \beta_{AC}\neq 0\)
    • \(H_0: \beta_{BC}=0 \quad\) vs \(\quad H_A: \beta_{BC}\neq 0\)
  • Interacción triple
    • \(H_0: \beta_{ABC}=0 \quad\) vs \(\quad H_A: \beta_{ABC}\neq 0\)

ANOVA para \(2^3\) con \(n\) réplicas

Fuente de variación Suma de cuadrados (\(SS\)) gl Cuadrado medio (\(MS\)) Estadístico \(F\)
Factor A \(SS_A = \dfrac{C_A^2}{8n}\) 1 \(MS_A = SS_A/1\) \(F_A = MS_A/MS_E\)
Factor B \(SS_B = \dfrac{C_B^2}{8n}\) 1 \(MS_B = SS_B/1\) \(F_B = MS_B/MS_E\)
Factor C \(SS_C = \dfrac{C_C^2}{8n}\) 1 \(MS_C = SS_C/1\) \(F_C = MS_C/MS_E\)
Interacción AB \(SS_{AB} = \dfrac{C_{AB}^2}{8n}\) 1 \(MS_{AB} = SS_{AB}/1\) \(F_{AB} = MS_{AB}/MS_E\)
Interacción AC \(SS_{AC} = \dfrac{C_{AC}^2}{8n}\) 1 \(MS_{AC} = SS_{AC}/1\) \(F_{AC} = MS_{AC}/MS_E\)
Interacción BC \(SS_{BC} = \dfrac{C_{BC}^2}{8n}\) 1 \(MS_{BC} = SS_{BC}/1\) \(F_{BC} = MS_{BC}/MS_E\)
Interacción ABC \(SS_{ABC} = \dfrac{C_{ABC}^2}{8n}\) 1 \(MS_{ABC} = SS_{ABC}/1\) \(F_{ABC} = MS_{ABC}/MS_E\)
Error \(SS_E\) \(8(n-1)\) \(MS_E = SS_E/[8(n-1)]\)
Total \(SS_T\) \(8n-1\)

Recordatorio de contrastes

  • \(C_A = (a+ab+ac+abc) - \big[(1)+b+c+bc\big]\)
  • \(C_B = (b+ab+bc+abc) - \big[(1)+a+c+ac\big]\)
  • \(C_C = (c+ac+bc+abc) - \big[(1)+a+b+ab\big]\)
  • \(C_{ABC} = (abc + (1)) - (a+b+c+ab+ac+bc)\)

Los contrastes de dos factores (\(C_{AB}, C_{AC}, C_{BC}\)) se definen de forma análoga.

Note

Para tener \(gl_E>0\) se requiere \(n\ge 2\). En un \(2^3\) con \(n\) réplicas, el error tiene \(\mathrm{gl}_E=8(n-1)\). - Con una sola réplica (\(n=1\)) ⇒ \(\mathrm{gl}_E=0\)no se puede estimar \(CM_E\) ni hacer pruebas \(F\) del ANOVA clásico. - Para un ANOVA válido en \(2^3\), exige al menos \(n\ge 2\) (entonces \(\mathrm{gl}_E=8(n-1)\ge 8\)).

Ejemplo simulado

Contexto y objetivo

Contexto y objetivo. En una planta de compostaje se evaluará, en biofiltro de laboratorio, el efecto del material de lecho (A), de la humedad (B) y de la temperatura (C) sobre la concentración de H\(_2\)S a la salida (ppmv), y si existe interacción entre factores.

Factores (codificación \(\pm1\)). - A — Material del lecho: Compost (\(-1\)) vs Biochar (\(+1\))
- B — Humedad del lecho: 40 % (\(-1\)) vs 60 % (\(+1\))
- C — Temperatura del lecho/gas: 25 °C (\(-1\)) vs 35 °C (\(+1\))

Respuesta. \(Y=\) H\(_2\)S (ppmv) a la salida (menor es mejor).
Diseño. Factorial \(2^3\) completamente al azar con \(n=3\) réplicas por celda (24 corridas); orden de corridas aleatorizado.

Condiciones controladas (mismas que antes)

  • Carga de entrada: \(C_{\text{in}}=20\pm2\) ppmv H₂S.
  • Caudal: \(20\ \text{m}^3\ \text{h}^{-1}\).
  • Temperatura del gas nominal 25±2 °C (C añade un contraste controlado).
  • pH del lecho: 7.0–7.5.
  • Sensórica: celda electroquímica continua (verificación colorimétrica 1/4 réplicas).

Datos simulados

Material Humedad Temperatura Réplica 1 Réplica 2 Réplica 3 Réplica 4 H2S (ppm)
Biochar 40% 25°C 30 30.1 29.8 30.2 30.025
Biochar 40% 25°C 0.1 0.1 0.2 0.2 0.15
Biochar 40% 35°C 28 28.1 27.9 28.2 28.05
Biochar 40% 35°C 0.1 0.1 0.2 0.3 0.175
Biochar 60% 25°C 8 8.1 8.2 8.3 8.15
Biochar 60% 25°C 20 20.1 20.2 20.3 20.15
Biochar 60% 35°C 9 9.1 9.2 9.3 9.15
Biochar 60% 35°C 21 21.1 21.2 21.3 21.15
Compost 40% 25°C 7.6 7.7 7.5 7.8 7.65
Compost 40% 25°C 3.5 3.6 3.4 3.7 3.55
Compost 40% 35°C 4.8 4.9 5.0 5.1 4.95
Compost 40% 35°C 3.0 2.9 3.1 3.2 3.05
Compost 60% 25°C 9.0 9.2 9.1 9.0 9.05
Compost 60% 25°C 19.1 19.3 19.0 19.2 19.15
Compost 60% 35°C 5.2 5.3 5.0 5.1 5.15
Compost 60% 35°C 20.3 20.4 20.5 20.2 20.35

ANOVA

Code
# Cargar el paquete necesario
library(FrF2)

# Datos ajustados para mejorar significancia de la interacción
datos <- data.frame(
  Material = c(rep("Biochar", 16), rep("Compost", 16)),
  Humedad = rep(c(rep("40%", 8), rep("60%", 8)), 2),
  Temperatura = rep(c(rep("25°C", 4), rep("35°C", 4)), 4),
  Replicas = rep(c("Réplica 1", "Réplica 2", "Réplica 3", "Réplica 4"), 8),
  H2S = c(30, 30.1, 29.8, 30.2, 0.1, 0.1, 0.2, 0.2, 28, 28.1, 27.9, 28.2, 0.1, 0.1, 0.2, 0.3,
          8, 8.1, 8.2, 8.3, 20, 20.1, 20.2, 20.3, 9, 9.1, 9.2, 9.3, 21, 21.1, 21.2, 21.3)
)

# Crear un diseño factorial 2^3 con los factores Material, Humedad y Temperatura
diseño <- FrF2(nruns = 8, nfactors = 3, replications = 4, 
               factor.names = c("Material", "Humedad", "Temperatura"))

# Asignar los datos crudos de H2S a las réplicas del diseño
diseño$H2S <- datos$H2S

# Ajustar el modelo ANOVA para los factores y la interacción
fit <- aov(H2S ~ Material * Humedad * Temperatura, data = diseño)

# Resumen del análisis de varianza
summary(fit)
                             Df Sum Sq Mean Sq F value Pr(>F)
Material                      1     17   17.11   0.120  0.732
Humedad                       1     20   19.53   0.138  0.714
Temperatura                   1     18   17.70   0.125  0.727
Material:Humedad              1    155  154.88   1.090  0.307
Material:Temperatura          1     68   68.45   0.482  0.494
Humedad:Temperatura           1      0    0.00   0.000  1.000
Material:Humedad:Temperatura  1    237  236.53   1.665  0.209
Residuals                    24   3409  142.04               

Conclusiones a partir del ANOVA:

Según la tabla de ANOVA, Material, Humedad y Temperatura no tienen efectos estadísticamente significativos sobre la concentración de H₂S, ya que sus valores p son mayores que 0.05 (Material p = 0.28388, Humedad p = 0.15818, Temperatura p = 0.31360). Sin embargo, la interacción Material:Temperatura es significativa (p = 0.00535), lo que indica que la combinación de estos dos factores influye en la concentración de H₂S.

Efectos

Efectos principales

Code
# Diagnóstico de los efectos principales
library(ggplot2)
EP <- MEPlot(fit, response = "H2S")  # Efectos principales

Code
head(EP)
  Material  Humedad Temperatura
- 13.89375 13.84375    13.88125
+ 15.35625 15.40625    15.36875

Interacciónes

Code
# Cargar la librería DoE.base
library(DoE.base)
# Utilizando IAPlot para interacciones
 IA <- IAPlot(fit, response = "H2S", interaction = c("Material", "Humedad", "Temperatura"))

Code
 IA
    Material:Humedad Material:Temperatura Humedad:Temperatura
-:-          10.9125              11.6875             13.1000
+:-          16.7750              16.0750             14.6625
-:+          16.8750              16.1000             14.5875
+:+          13.9375              14.6375             16.1500

El biochar a 25 °C y 60% humedad es la mejor condición (mínima H₂S: ~9.6 ppmv).

Si la temperatura sube a 35 °C, el biochar pierde eficacia y es incluso peor que el compost.

Mantener la humedad en torno al 60% es crítico para la eficiencia.