Universidad Nacional de Jujuy

Facultad de Ciencias Agrarias

Cátedra de Bioestadística y Diseño Experimental

Profesora: Ing. Agr. Ivone Carolina Humacata

Clase práctica: Experimentos factoriales en DCA y DBCA


Objetivos de la clase

Al finalizar la clase, los estudiantes serán capaces de:

  1. Comprender qué es un experimento factorial y diferenciarlo de un experimento con un solo factor.
  2. Identificar factores, niveles, tratamientos combinados y variables respuesta.
  3. Interpretar los efectos principales y la interacción entre factores.
  4. Reconocer cuándo corresponde aplicar un factorial en un diseño completamente aleatorizado (DCA) o en un diseño en bloques completos al azar (DBCA).
  5. Ajustar y analizar modelos factoriales en RStudio .
  6. Realizar ANOVA, verificar supuestos y comparar medias mediante emmeans y Tukey.

1. ¿Qué es un experimento factorial?

Un experimento factorial estudia simultáneamente dos o más factores y todas sus combinaciones posibles.

En el ejemplo de vitamina C se estudiarán dos factores:

Factor A: método de conservación

Nivel Descripción
A1 Temperatura ambiente, 25 °C
A2 Refrigeración, 4 °C
A3 Congelación, −18 °C

Factor B: tiempo de almacenamiento

Nivel Tiempo
B1 0 días
B2 7 días

El arreglo factorial será:

\[ 3 \times 2 \]

Esto genera:

\[ 3 \times 2 = 6 \]

combinaciones de tratamientos.


2. Tratamientos factoriales

Código Conservación Tiempo Combinación
A1B1 Ambiente 0 días Ambiente × 0
A1B2 Ambiente 7 días Ambiente × 7
A2B1 Refrigeración 0 días Refrigeración × 0
A2B2 Refrigeración 7 días Refrigeración × 7
A3B1 Congelación 0 días Congelación × 0
A3B2 Congelación 7 días Congelación × 7

La variable respuesta será:

\[ Y=\text{contenido de vitamina C en mg/100 mL} \]

El diseño factorial permite responder tres preguntas:

  1. ¿El método de conservación afecta la vitamina C?
  2. ¿El tiempo de almacenamiento afecta la vitamina C?
  3. ¿El efecto del método de conservación depende del tiempo?

La tercera pregunta corresponde a la interacción.


3. Efectos principales e interacción

3.1. Efecto principal del método

Compara las medias de vitamina C de los tres métodos de conservación, promediando los tiempos.

\[ H_0: \mu_{A1}=\mu_{A2}=\mu_{A3} \]

3.2. Efecto principal del tiempo

Compara la media de vitamina C a los 0 y 7 días, promediando los métodos.

\[ H_0: \mu_{B1}=\mu_{B2} \]

3.3. Interacción conservación × tiempo

La interacción indica si el método de conservación depende del efecto del tiempo.

\[ H_0: \mu_{A1B1}=\mu_{A1B2}=\mu_{A2B1} ... \]

Por ejemplo:

  • si todos los métodos pierden la misma cantidad de vitamina C, no habría interacción;
  • si el jugo almacenado a temperatura ambiente pierde mucho más vitamina C que el congelado, existiría interacción.

La interacción debe analizarse antes de interpretar los efectos principales. Si es significativa, las medias de las combinaciones deben interpretarse con especial atención.


4. Modelo factorial para un DCA

En un diseño completamente aleatorizado, se supone que las unidades experimentales son homogéneas y todos los tratamientos combinados se asignan aleatoriamente a todas las unidades.

Modelo matemático

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

donde:

  • \(Y_{ijk}\): contenido de vitamina C en mg/100 mL
  • \(\mu\): media general;
  • \(\alpha_i\): efecto del método de conservación;
  • \(\beta_j\): efecto del tiempo;
  • \((\alpha\beta)_{ij}\): interacción conservación × tiempo;
  • \(\varepsilon_{ijk}\): error experimental.

En RStudio:

vitamina_c ~ conservacion * tiempo

El símbolo * incluye:

conservacion + tiempo + conservacion:tiempo

5. Modelo factorial para un DBCA

En el DBCA se agrega un factor de bloqueo para controlar una fuente conocida de variación, por ejemplo:

Cada bloque debe contener todas las combinaciones factoriales. Esta es la misma lógica del DBCA: los bloques se forman por una fuente de variabilidad conocida y la aleatorización se realiza dentro de cada bloque.

Modelo matemático

\[ Y_{ijkl}= \mu+\alpha_i+\beta_j+(\alpha\beta)_{ij} +\rho_l+\varepsilon_{ijkl} \]

donde:

  • \(\rho_l\): efecto del bloque \(l\);
  • los demás términos tienen el mismo significado que en el DCA.

En R:

vitamina_c ~ bloque + conservacion * tiempo

6. Tamaño del experimento

DCA

Si se utilizan:

  • 6 combinaciones factoriales;
  • 5 repeticiones por combinación;

entonces:

\[ N=6 \times 5=30 \]

unidades experimentales.

DBCA

Si se utilizan:

  • 6 combinaciones factoriales;
  • 5 bloques;
  • una unidad por combinación dentro de cada bloque;

entonces:

\[ N=6 \times 5=30 \]

unidades experimentales.

La diferencia no está en el número total, sino en la estructura:

  • en el DCA, las 30 unidades son aleatorizadas globalmente;
  • en el DBCA, cada bloque contiene las seis combinaciones y los tratamientos se aleatorizan dentro de cada bloque.

7. Parte I: análisis factorial en DCA

7.1. Crear y aleatorizar el diseño

# ============================================================
# DISEÑO FACTORIAL 3 x 2 EN DCA
# Vitamina C en jugo de naranja
# ============================================================

library(dplyr)
library(tidyr)
library(writexl)

set.seed(20260921)

# Niveles de los factores
conservacion <- c(
  "Ambiente",
  "Refrigeracion",
  "Congelacion"
)

tiempo <- c(
  "Dia_0",
  "Dia_7"
)

repeticiones <- 5

# Crear todas las combinaciones factoriales
tratamientos_dca <- expand.grid(
  Conservacion = conservacion,
  Tiempo = tiempo,
  Repeticion = 1:repeticiones
)

# Identificador de unidad experimental
tratamientos_dca <- tratamientos_dca %>%
  mutate(
    UE = paste0("UE", sprintf("%02d", 1:n())
    )
  )

# Aleatorizar todas las unidades del DCA
tratamientos_dca <- tratamientos_dca %>%
  slice_sample(prop = 1) %>%
  mutate(
    Orden_Ejecucion = row_number()
  )

# Revisar el diseño
print(tratamientos_dca)

# Comprobar cantidad por combinación
with(
  tratamientos_dca,
  table(Conservacion, Tiempo)
)

En el DCA, las 30 unidades se consideran homogéneas y la asignación se realiza sobre el conjunto completo.


7.2. Importar datos desde Excel

Importar el archivo Excel “datos_factorial_DCA_vitamina_c.xlsx”

library(readxl)
library(janitor)

datos_dca <- read_excel(
  "datos_factorial_DCA_vitamina_c.xlsx",
  sheet = "Datos_Raw"
) %>%
  clean_names()

Luego:

datos_dca <- datos_dca %>%
  mutate(
    ue = factor(ue),
    conservacion = factor(conservacion),
    tiempo = factor(tiempo),
    vitamina_c = as.numeric(vitamina_c_mg100m_l)
  )

8. Estadística descriptiva para el DCA

# ============================================================
# ESTADÍSTICA DESCRIPTIVA
# ============================================================

desc_dca <- datos_dca %>%
  group_by(conservacion, tiempo) %>%
  summarise(
    n = n(),
    media = mean(vitamina_c),
    mediana = median(vitamina_c),
    sd = sd(vitamina_c),
    se = sd / sqrt(n),
    minimo = min(vitamina_c),
    maximo = max(vitamina_c),
    .groups = "drop"
  )

print(desc_dca)

Gráfico de interacción

library(ggplot2)

ggplot(
  desc_dca,
  aes(
    x = tiempo,
    y = media,
    group = conservacion,
    color = conservacion
  )
) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  geom_errorbar(
    aes(
      ymin = media - se,
      ymax = media + se
    ),
    width = 0.1
  ) +
  labs(
    title = "Interacción entre conservación y tiempo",
    x = "Tiempo de almacenamiento",
    y = "Vitamina C media (mg/100 mL)",
    color = "Conservación"
  ) +
  theme_minimal()

Interpretación visual

  • líneas aproximadamente paralelas: poca evidencia de interacción;
  • líneas no paralelas: posible interacción (efectos aditivos);
  • líneas que se cruzan: interacción especialmente importante (efectos multiplicativos).

El gráfico es exploratorio: la decisión formal se toma con el ANOVA.


9. ANOVA factorial en DCA

# ============================================================
# MODELO FACTORIAL EN DCA
# ============================================================

modelo_dca <- aov(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dca
)

summary(modelo_dca)
anova(modelo_dca)

La tabla ANOVA contiene:

Interpretación de la interacción

Si la interacción es significativa, no conviene interpretar solamente las medias generales de conservación o tiempo. Se deben comparar las seis combinaciones.


10. Comparaciones múltiples en el DCA

10.1. Medias de las combinaciones

library(emmeans)

medias_dca <- emmeans(
  modelo_dca,
  ~ conservacion * tiempo
)

print(medias_dca)

10.2. Tukey para las seis combinaciones

comparaciones_dca <- pairs(
  medias_dca,
  adjust = "tukey"
)

print(comparaciones_dca)
confint(comparaciones_dca)

10.3. Letras de agrupamiento

library(multcomp)
library(multcompView)

grupos_dca <- cld(
  medias_dca,
  adjust = "tukey",
  Letters = letters
)

print(grupos_dca)

Las combinaciones que comparten una letra no presentan diferencias significativas.

10.4. Efectos simples

Si la interacción es significativa, puede preguntarse:

Comparar métodos dentro de cada tiempo

metodos_por_tiempo <- emmeans(
  modelo_dca,
  ~ conservacion | tiempo
)

pairs(
  metodos_por_tiempo,
  adjust = "tukey"
)

Comparar tiempos dentro de cada método

tiempos_por_metodo <- emmeans(
  modelo_dca,
  ~ tiempo | conservacion
)

pairs(
  tiempos_por_metodo,
  adjust = "tukey"
)

Estas comparaciones son más informativas que comparar solamente los efectos principales.


11. Verificación de supuestos en el DCA

# ============================================================
# SUPUESTOS DEL MODELO DCA
# ============================================================

residuos_dca <- residuals(modelo_dca)

# Normalidad
shapiro.test(residuos_dca)

qqnorm(residuos_dca)
qqline(residuos_dca, col = "red", lwd = 2)

# Homogeneidad de varianzas
library(car)

leveneTest(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dca
)

# Diagnósticos generales
par(mfrow = c(2, 2))
plot(modelo_dca)
par(mfrow = c(1, 1))

12. Parte II: análisis factorial en DBCA

12.1. Estructura del DBCA factorial

Para el DBCA se utilizarán:

  • 6 combinaciones factoriales;
  • 5 bloques;
  • 1 unidad por combinación dentro de cada bloque;
  • 30 unidades experimentales en total.

Cada bloque debe contener:

Ambiente × Día 0
Ambiente × Día 7
Refrigeración × Día 0
Refrigeración × Día 7
Congelación × Día 0
Congelación × Día 7

Por ejemplo, el bloque puede representar una corrida analítica o un lote de jugo. Los tratamientos factoriales se aleatorizan dentro de cada bloque. Este procedimiento mantiene la comparación de todas las combinaciones bajo una condición de bloque.


12.2. Crear y aleatorizar el DBCA factorial

# ============================================================
# DISEÑO FACTORIAL 3 x 2 EN DBCA
# ============================================================

set.seed(20260921)

numero_bloques <- 5

# Crear las seis combinaciones factoriales
combinaciones <- expand.grid(
  Conservacion = conservacion,
  Tiempo = tiempo
)

# Repetir todas las combinaciones en cada bloque
datos_dbca <- expand.grid(
  Bloque = paste0("B", 1:numero_bloques),
  Conservacion = conservacion,
  Tiempo = tiempo
) %>%
  group_by(Bloque) %>%
  mutate(
    Orden_Bloque = sample(row_number())
  ) %>%
  arrange(Bloque, Orden_Bloque) %>%
  ungroup() %>%
  mutate(
    UE = paste0("UE", sprintf("%02d", 1:n())),
    Bloque = factor(Bloque),
    Conservacion = factor(Conservacion),
    Tiempo = factor(Tiempo)
  )

print(datos_dbca)

# Comprobar que cada bloque contiene las 6 combinaciones
with(
  datos_dbca,
  table(Bloque, Conservacion, Tiempo)
)

La tabla debe mostrar una observación por combinación dentro de cada bloque.


12.3. Importar datos desde Excel

datos_dbca <- read_excel(
  "datos_factorial_DBCA_vitamina_c.xlsx",
  sheet = "Datos_Raw"
) %>%
  clean_names()

str(datos_dbca)

Luego

datos_dbca <- datos_dbca %>%
  mutate(
    ue = factor(ue),
    bloque = factor(bloque),
    conservacion = factor(conservacion),
    tiempo = factor(tiempo),
    vitamina_c = as.numeric(vitamina_c_mg100m_l)
  )
  
str(datos_dbca)

13. Modelo factorial en DBCA

# ============================================================
# MODELO FACTORIAL EN DBCA
# ============================================================

modelo_dbca <- aov(
  vitamina_c ~ bloque + conservacion * tiempo,
  data = datos_dbca
)

summary(modelo_dbca)
anova(modelo_dbca)

El modelo incluye:

vitamina_c ~ bloque +
  conservacion +
  tiempo +
  conservacion:tiempo

El bloque se incorpora para reducir el error experimental.


14. Estadística descriptiva del DBCA

# ============================================================
# DESCRIPTIVOS DEL DBCA
# ============================================================

desc_dbca <- datos_dbca %>%
  group_by(conservacion, tiempo) %>%
  summarise(
    n = n(),
    media = mean(vitamina_c),
    mediana = median(vitamina_c),
    sd = sd(vitamina_c),
    se = sd / sqrt(n()),
    minimo = min(vitamina_c),
    maximo = max(vitamina_c),
    .groups = "drop"
  )

print(desc_dbca)

Resumen por bloque:

datos_dbca %>%
  group_by(bloque) %>%
  summarise(
    n = n(),
    media = mean(vitamina_c),
    sd = sd(vitamina_c)
  )

Gráfico de interacción del DBCA

ggplot(
  desc_dbca,
  aes(
    x = tiempo,
    y = media,
    group = conservacion,
    color = conservacion
  )
) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  geom_errorbar(
    aes(
      ymin = media - se,
      ymax = media + se
    ),
    width = 0.1
  ) +
  labs(
    title = "Interaccion en el DBCA factorial",
    x = "Tiempo",
    y = "Vitamina C media (mg/100 mL)",
    color = "Conservación"
  ) +
  theme_minimal()

15. ANOVA factorial en DBCA

# ============================================================
# ANOVA DEL DBCA FACTORIAL
# ============================================================

anova_dbca <- anova(modelo_dbca)

print(anova_dbca)

La tabla separará:

Interpretar la interacción.


16. Comparaciones múltiples del DBCA

16.1. Medias ajustadas

medias_dbca <- emmeans(
  modelo_dbca,
  ~ conservacion * tiempo
)

print(medias_dbca)

16.2. Tukey para combinaciones

tukey_dbca <- pairs(
  medias_dbca,
  adjust = "tukey"
)

print(tukey_dbca)
confint(tukey_dbca)

16.3. Letras de agrupamiento

grupos_dbca <- cld(
  medias_dbca,
  adjust = "tukey",
  Letters = letters
)

print(grupos_dbca)

16.4. Efectos simples

Comparar conservación dentro de cada tiempo

conservacion_por_tiempo <- emmeans(
  modelo_dbca,
  ~ conservacion | tiempo
)

pairs(
  conservacion_por_tiempo,
  adjust = "tukey"
)

Comparar tiempo dentro de cada conservación

tiempo_por_conservacion <- emmeans(
  modelo_dbca,
  ~ tiempo | conservacion
)

pairs(
  tiempo_por_conservacion,
  adjust = "tukey"
)

17. Prueba de Dunnett en el factorial

Si se considera Ambiente × Día 7 como control o referencia, se pueden comparar las demás combinaciones contra esa condición.

Primero se crea un factor combinado:

# ============================================================
# DUNNETT CON UNA COMBINACIÓN CONTROL
# ============================================================

datos_dbca <- datos_dbca %>%
  mutate(
    combinacion = interaction(
      conservacion,
      tiempo,
      sep = "_"
    )
  )

modelo_combinacion <- aov(
  vitamina_c ~ bloque + combinacion,
  data = datos_dbca
)

medias_combinacion <- emmeans(
  modelo_combinacion,
  ~ combinacion
)

print(medias_combinacion)

Para utilizar Dunnett, se puede definir como referencia:

# Ver niveles disponibles
levels(datos_dbca$combinacion)

Después:

comparaciones_dunnett <- contrast(
  medias_combinacion,
  method = "trt.vs.ctrl",
  ref = "Ambiente_Dia_7",
  adjust = "dunnett"
)

print(comparaciones_dunnett)
confint(comparaciones_dunnett)

La etiqueta exacta del control dependerá de cómo RStudio construya los niveles. Por eso siempre conviene consultar:

levels(datos_dbca$combinacion)

Dunnett compara cada condición contra un único control. No responde si, por ejemplo, Refrigeracion_Dia_0 difiere de Congelacion_Dia_0; para eso se utiliza Tukey.12


18. Verificación de supuestos del DBCA factorial

# ============================================================
# SUPUESTOS DEL DBCA FACTORIAL
# ============================================================

residuos_dbca <- residuals(modelo_dbca)

# Normalidad
shapiro.test(residuos_dbca)

qqnorm(
  residuos_dbca,
  main = "Q-Q plot de residuos del DBCA"
)

qqline(
  residuos_dbca,
  col = "red",
  lwd = 2
)

# Homogeneidad de varianzas
leveneTest(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dbca
)

# Diagnósticos
par(mfrow = c(2, 2))
plot(modelo_dbca)
par(mfrow = c(1, 1))

La independencia se fundamenta en:


19. Comparación entre DCA y DBCA

Se puede comparar el cuadrado medio del error de ambos modelos:

# ============================================================
# COMPARAR PRECISIÓN DCA VS. DBCA
# ============================================================

mse_dca <- deviance(modelo_dca) /
  df.residual(modelo_dca)

mse_dbca <- deviance(modelo_dbca) /
  df.residual(modelo_dbca)

cat("MSE del DCA:", mse_dca, "\n")
cat("MSE del DBCA:", mse_dbca, "\n")

reduccion_error <- (
  (mse_dca - mse_dbca) / mse_dca
) * 100

cat(
  "Reducción porcentual del error:",
  round(reduccion_error, 2),
  "%\n"
)

Si el MSE del DBCA es menor, el bloqueo permitió explicar parte de la variabilidad no atribuida a los tratamientos.

No obstante, el DBCA no siempre será mejor. Es adecuado solamente si el bloque representa una fuente real de variación y las unidades dentro de cada bloque son relativamente homogéneas.


20. Script completo simplificado

DCA factorial

# ============================================================
# SCRIPT SIMPLE: FACTORIAL EN DCA
# ============================================================

library(tidyverse)
library(emmeans)
library(multcomp)
library(multcompView)
library(car)

# Importar datos
datos_dca <- read_excel(
  "datos_factorial_DCA_vitamina_c.xlsx",
  sheet = "Datos_Raw"
) %>%
  clean_names()

# Factores
datos_dca$conservacion <- factor(datos_dca$conservacion)
datos_dca$tiempo <- factor(datos_dca$tiempo)

# Descriptivos
datos_dca %>%
  group_by(conservacion, tiempo) %>%
  summarise(
    n = n(),
    media = mean(vitamina_c),
    sd = sd(vitamina_c),
    .groups = "drop"
  )

# Gráfico de interacción
with(
  datos_dca,
  interaction.plot(
    tiempo,
    conservacion,
    vitamina_c,
    xlab = "Tiempo",
    ylab = "Vitamina C",
    trace.label = "Conservación"
  )
)

# Modelo
modelo_dca <- aov(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dca
)

# ANOVA
summary(modelo_dca)

# Supuestos
shapiro.test(residuals(modelo_dca))

leveneTest(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dca
)

# Medias ajustadas
medias_dca <- emmeans(
  modelo_dca,
  ~ conservacion * tiempo
)

# Tukey
pairs(
  medias_dca,
  adjust = "tukey"
)

# Letras
cld(
  medias_dca,
  adjust = "tukey",
  Letters = letters
)

DBCA factorial

# ============================================================
# SCRIPT SIMPLE: FACTORIAL EN DBCA
# ============================================================

library(tidyverse)
library(emmeans)
library(multcomp)
library(multcompView)
library(car)

# Importar datos
datos_dbca <- read_excel(
  "datos_factorial_DBCA_vitamina_c.xlsx",
  sheet = "Datos_Raw"
) %>%
  clean_names()

# Convertir factores
datos_dbca$bloque <- factor(datos_dbca$bloque)
datos_dbca$conservacion <- factor(datos_dbca$conservacion)
datos_dbca$tiempo <- factor(datos_dbca$tiempo)

# Descriptivos
datos_dbca %>%
  group_by(conservacion, tiempo) %>%
  summarise(
    n = n(),
    media = mean(vitamina_c),
    sd = sd(vitamina_c),
    .groups = "drop"
  )

# Modelo
modelo_dbca <- aov(
  vitamina_c ~ bloque + conservacion * tiempo,
  data = datos_dbca
)

# ANOVA
summary(modelo_dbca)

# Supuestos
shapiro.test(residuals(modelo_dbca))

leveneTest(
  vitamina_c ~ conservacion * tiempo,
  data = datos_dbca
)

# Medias ajustadas
medias_dbca <- emmeans(
  modelo_dbca,
  ~ conservacion * tiempo
)

# Tukey
pairs(
  medias_dbca,
  adjust = "tukey"
)

# Letras
cld(
  medias_dbca,
  adjust = "tukey",
  Letters = letters
)

# Efectos simples
pairs(
  emmeans(modelo_dbca, ~ conservacion | tiempo),
  adjust = "tukey"
)

pairs(
  emmeans(modelo_dbca, ~ tiempo | conservacion),
  adjust = "tukey"
)

La pregunta central será:

¿El efecto del método de conservación utilizado sobre la vitamina C depende del tiempo de almacenamiento?

Esta pregunta representa la principal ventaja de un experimento factorial: estudiar simultáneamente varios factores y determinar si actúan de manera independiente o conjunta.

Nota de uso: Este material ha sido elaborado por Ivone Carolina Humacata para fines académicos en la Facultad de Ciencias Agrarias – UNJu, con apoyo de herramientas de inteligencia artificial (Perplexity, Microsoft Copilot). En caso de utilizarlo, por favor cite de la siguiente manera: Humacata, I. C. (2026). Clase práctica: Experimentos factoriales. Universidad Nacional de Jujuy. Material docente elaborado con apoyo de inteligencia artificial.

[^15_10]3456[^15_15]7891011


  1. https://metricgate.com/blogs/dunnetts-test-vs-tukey/↩︎

  2. https://casrai.org/guides/dunnetts-test-comparisons-against-a-control↩︎

  3. https://www.scribd.com/document/956629735/ABE-443-Vol-5↩︎

  4. https://id.scribd.com/document/438817046/Arreglos-Factoriales-en-DBCA↩︎

  5. https://metricgate.com/blogs/statistics-for-agriculture/↩︎

  6. https://cran.r-project.org/web/packages/PGaovR/refman/PGaovR.html↩︎

  7. https://cran.r-project.org/web/packages/TukeyC/TukeyC.pdf↩︎

  8. https://r-statistics.co/Experimental-Design-Exercises-in-R.html↩︎

  9. https://cran.r-project.org/web/packages/PGaovR/index.html↩︎

  10. https://cran.r-project.org/web/packages/aridagri/index.html↩︎

  11. https://cran.r-project.org/web/packages/TukeyC/vignettes/TukeyC_intro.html↩︎