Al finalizar esta clase, los estudiantes serán capaces de:
El ANOVA responde a la pregunta:
¿Existen diferencias significativas entre las medias de los tratamientos?
Si el p-valor del ANOVA es menor que 0.05, rechazamos la hipótesis nula:
\[ H_0: \mu_1 = \mu_2 = \mu_3 = \mu_4 = \mu_5 \]
Pero el ANOVA no nos dice:
Las pruebas de comparación múltiple permiten responder:
¿Qué pares de tratamientos son significativamente diferentes entre sí?
Si tenemos 5 tratamientos, el número de comparaciones por pares es:
\[ \binom{5}{2} = \frac{5 \times 4}{2} = 10 \]
Es decir, debemos comparar:
Si usáramos pruebas t de Student independientes para cada par con \(\alpha = 0.05\), la probabilidad de cometer al menos un error Tipo I (falso positivo) aumentaría considerablemente.
Las pruebas post-hoc ajustan los valores críticos o los p-valores para controlar este error.12
Características:
Cuándo usarla:
Características:
Cuándo usarla:
Características:
Ejemplo:
Si T1 (25 °C) es el control, Dunnett compara:
Pero no compara T2 vs T3, T4 vs T5, etc.5
Cuándo usarla:
| Característica | Tukey HSD | Duncan | Dunnett |
|---|---|---|---|
| Tipo de comparaciones | Todos los pares | Todos los pares | Tratamientos vs. control |
| Control del error | Estricto | Menos estricto | Estricto para vs. control |
| Poder estadístico | Moderado | Alto | Alto para vs. control |
| Uso típico | General | Agrupamiento | Comparación con control |
| Número de comparaciones (5 tratamientos) | 10 | 10 | 4 (si 1 control) |
Retomamos el diseño de cuadrado latino de orden 5 con los siguientes tratamientos:
| Código | Método | Descripción |
|---|---|---|
| T1 | Ambiente | 25 °C (control) |
| T2 | Refrigeración | 4 °C |
| T3 | Congelación | −18 °C |
| T4 | Opaco | 4 °C, protegido de luz |
| T5 | Atmósfera reducida | 4 °C, mínimo oxígeno |
Hipótesis:
# ============================================================
# PRUEBAS DE COMPARACIÓN MÚLTIPLE DE MEDIAS
# Ejemplo: vitamina C en jugo de naranja
# Diseño: Cuadrado Latino de Orden 5
# ============================================================
# Instalar paquetes (solo la primera vez)
# install.packages(c(
# "readxl", "tidyverse", "janitor", "agricolae",
# "emmeans", "multcomp", "multcompView", "DescTools"
# ))
# Cargar librerías
library(readxl)
library(openxlsx)
library(tidyverse)
library(janitor)
library(agricolae)
library(emmeans)
library(multcomp)
library(multcompView)
library(DescTools)
# ============================================================
# 1. IMPORTAR DATOS
# ============================================================
datos <- read_excel(
"datos_vitamina_c_DCL.xlsx",
sheet = "Datos_Raw"
) %>%
clean_names()
# ============================================================
# 2. PREPARAR VARIABLES
# ============================================================
datos <- datos %>%
mutate(
ue = factor(ue),
fila = factor(fila),
columna = factor(columna),
tratamiento = factor(
tratamiento,
levels = c(
"T1_25C",
"T2_4C",
"T3_menos18C",
"T4_opaco",
"T5_atmosfera_reducida"
)
),
vitamina_c = as.numeric(vitamina_c_mg100m_l)
)
# Verificar estructura
str(datos)
# ============================================================
# 3. ESTADÍSTICA DESCRIPTIVA
# ============================================================
descriptivos <- datos %>%
group_by(tratamiento) %>%
summarise(
n = n(),
media = mean(vitamina_c, na.rm = TRUE),
mediana = median(vitamina_c, na.rm = TRUE),
sd = sd(vitamina_c, na.rm = TRUE),
se = sd / sqrt(n),
cv = (sd / media) * 100,
min = min(vitamina_c, na.rm = TRUE),
max = max(vitamina_c, na.rm = TRUE)
) %>%
mutate(
media = round(media, 2),
sd = round(sd, 2),
se = round(se, 2),
cv = round(cv, 2),
min = round(min, 2),
max = round(max, 2)
)
print("=== ESTADÍSTICOS DESCRIPTIVOS POR TRATAMIENTO ===")
print(descriptivos)
# Gráfico de medias
ggplot(
descriptivos,
aes(x = tratamiento, y = media, fill = tratamiento)
) +
geom_col(alpha = 0.7) +
geom_errorbar(
aes(ymin = media - se, ymax = media + se),
width = 0.2
) +
labs(
title = "Medias de vitamina C por tratamiento",
subtitle = "Barras de error: ± 1 SE",
x = "Tratamiento",
y = "Vitamina C (mg/100 mL)"
) +
theme_minimal() +
theme(
legend.position = "none",
axis.text.x = element_text(angle = 25, hjust = 1)
)
# ============================================================
# 4. MODELO ANOVA (Cuadrado Latino)
# ============================================================
modelo <- aov(
vitamina_c ~ fila + columna + tratamiento,
data = datos
)
print("=== TABLA ANOVA ===")
summary(modelo)
anova(modelo)
# ============================================================
# 5. PRUEBA DE TUKEY HSD
# Compara TODOS los pares de tratamientos
# ============================================================
# Método base de R
tukey_base <- TukeyHSD(modelo, which = "tratamiento", conf.level = 0.95)
print("=== RESULTADOS DE TUKEY (función TukeyHSD) ===")
print(tukey_base)
# Visualizar
plot(
tukey_base,
las = 1,
col = "steelblue"
)
# Método con emmeans (recomendado)
medias_emm <- emmeans(modelo, ~ tratamiento)
tukey_emm <- pairs(medias_emm, adjust = "tukey")
print("=== RESULTADOS DE TUKEY (emmeans) ===")
print(tukey_emm)
confint(tukey_emm)
# Agrupamiento con letras
grupos_tukey <- cld(
medias_emm,
adjust = "tukey",
Letters = letters,
reverse = TRUE
)
print("=== AGRUPAMIENTO DE TUKEY CON LETRAS ===")
print(grupos_tukey)
# ============================================================
# 6. PRUEBA DE DUNCAN
# Más liberal que Tukey, agrupa medias con letras
# ============================================================
duncan_result <- duncan.test(
modelo,
trt = "tratamiento",
alpha = 0.05
)
print("=== RESULTADOS DE DUNCAN ===")
print(duncan_result)
# ============================================================
# 7. PRUEBA DE DUNNETT
# Compara cada tratamiento VS. el control (T1_25C)
# ============================================================
# Método con emmeans
dunnett_emm <- contrast(
medias_emm,
method = "dunnett",
ref = "T1_25C"
)
print("=== RESULTADOS DE DUNNETT (emmeans) ===")
print(dunnett_emm)
confint(dunnett_emm)
# Método con DescTools
dunnett_desc <- DunnettTest(
x = datos$vitamina_c,
g = datos$tratamiento,
control = "T1_25C"
)
print("=== RESULTADOS DE DUNNETT (DescTools) ===")
print(dunnett_desc)
Ejemplo de interpretación:
Según la prueba de Tukey, los tratamientos T3 (congelación), T4 (opaco) y T5 (atmósfera reducida) no difieren significativamente entre sí (comparten la letra “a”), pero todos presentan contenidos de vitamina C significativamente mayores que T1 (ambiente, letra “c”). El tratamiento T2 (refrigeración) es intermedio (letra “b”).
Ejemplo de interpretación:
La prueba de Duncan agrupa los tratamientos en tres categorías: T3, T4 y T5 forman el grupo “a” (mejor preservación), T2 forma el grupo “b” (preservación moderada), y T1 forma el grupo “c” (menor preservación). Duncan es más liberal que Tukey y puede detectar diferencias adicionales.
Ejemplo de interpretación:
La prueba de Dunnett indica que T2, T3, T4 y T5 difieren significativamente del control T1 (p < 0.05). Esto confirma que los métodos de conservación en frío preservan mejor la vitamina C que el almacenamiento a temperatura ambiente.
| Situación | Prueba recomendada |
|---|---|
| No hay control definido | Tukey HSD |
| Interesan todas las comparaciones | Tukey HSD |
| Se quiere mayor poder (más diferencias) | Duncan |
| Hay un control claro (placebo, estándar) | Dunnett |
| Solo importan las diferencias vs. control | Dunnett |
| Presentación con letras agrupadas | Duncan o Tukey con cld() |
# ============================================================
# 10. EXPORTAR RESULTADOS A EXCEL
# ============================================================
# Descriptivos
write.xlsx(
descriptivos,
file = "descriptivos_vitamina_c.xlsx",
sheetName = "Descriptivos",
rowNames = FALSE
)
# Tukey
write.xlsx(
as.data.frame(tukey_emm),
file = "tukey_resultados.xlsx",
sheetName = "Tukey",
rowNames = FALSE
)
# Duncan
write.xlsx(
medias_duncan,
file = "duncan_resultados.xlsx",
sheetName = "Duncan",
rowNames = FALSE
)
# Dunnett
write.xlsx(
as.data.frame(dunnett_emm),
file = "dunnett_resultados.xlsx",
sheetName = "Dunnett",
rowNames = FALSE
)
Las pruebas de comparación múltiple son herramientas que deben usarse con criterio:
La pregunta clave no es:
¿Qué prueba da más diferencias significativas?
Sino:
¿Qué prueba responde mejor a la pregunta de investigación?
https://casrai.org/guides/dunnetts-test-comparisons-against-a-control↩︎
https://www.scribd.com/document/1026583622/Duncans-Multiple-Range-Test-Assignment↩︎
https://casrai.org/guides/dunnetts-test-comparisons-against-a-control↩︎
https://www.scribd.com/document/922355704/MULTIPLE-COMPARISON-TESTS↩︎
https://ami.info.umfcluj.ro/index.php/AMI/article/download/1218/1087↩︎
https://help.displayr.com/hc/en-us/articles/360004117016-How-to-Apply-Significance-Testing-in-Displayr↩︎
https://www.scielo.org.mx/scielo.php?script=sci_arttext\&pid=S0187-893X2021000200074↩︎
https://www.ncss.com/wp-content/themes/ncss/pdf/Procedures/PASS/Dunnetts_Multiple_Comparison_Tests_of_Treatments_vs_a_Control-Proportions.pdf↩︎