Se compara el puntaje de olor de tres cafés, con seis repeticiones cada uno (18 observaciones en total). Los puntajes van de 1 a 5, siendo 5 el mejor. Se utiliza un diseño completamente al azar y un nivel de significancia de 0,05.
H0: las medias del puntaje de olor son iguales en los tres cafés (μ1 = μ2 = μ3).
H1: al menos un café tiene una media distinta.
|—:|—:|—:|—:|
olor <- c(2, 4, 3, 2, 4, 5, # Café 1
5, 3, 4, 3, 3, 3, # Café 2
1, 3, 3, 3, 3, 3) # Café 3
cafe <- factor(rep(c("Café 1", "Café 2", "Café 3"), each = 6),
levels = c("Café 1", "Café 2", "Café 3"))
datos <- data.frame(cafe, olor)
str(datos)
## 'data.frame': 18 obs. of 2 variables:
## $ cafe: Factor w/ 3 levels "Café 1","Café 2",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ olor: num 2 4 3 2 4 5 5 3 4 3 ...
aggregate(olor ~ cafe, data = datos,
FUN = function(x) c(n = length(x), media = mean(x),
mediana = median(x), de = sd(x)))
boxplot(olor ~ cafe, data = datos, col = c("#F4B183", "#9DC3E6", "#A9D18E"),
ylab = "Puntaje de olor", xlab = "Café")
stripchart(olor ~ cafe, data = datos, vertical = TRUE, method = "jitter",
pch = 16, ylab = "Puntaje de olor", xlab = "Café")
points(1:3, tapply(datos$olor, datos$cafe, mean), pch = 95, cex = 3)
modelo <- aov(olor ~ cafe, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## cafe 2 2.333 1.1667 1.235 0.319
## Residuals 15 14.167 0.9444
TukeyHSD(modelo)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = olor ~ cafe, data = datos)
##
## $cafe
## diff lwr upr p adj
## Café 2-Café 1 0.1666667 -1.290731 1.6240646 0.9526769
## Café 3-Café 1 -0.6666667 -2.124065 0.7907313 0.4778615
## Café 3-Café 2 -0.8333333 -2.290731 0.6240646 0.3254797
library(agricolae)
LSD.test(modelo, "cafe", console = TRUE)
##
## Study: modelo ~ "cafe"
##
## LSD t Test for olor
##
## Mean Square Error: 0.9444444
##
## cafe, means and individual ( 95 %) CI
##
## olor std r se LCL UCL Min Max Q25 Q50 Q75
## Café 1 3.333333 1.2110601 6 0.396746 2.487689 4.178977 2 5 2.25 3.5 4.00
## Café 2 3.500000 0.8366600 6 0.396746 2.654356 4.345644 3 5 3.00 3.0 3.75
## Café 3 2.666667 0.8164966 6 0.396746 1.821023 3.512311 1 3 3.00 3.0 3.00
##
## Alpha: 0.05 ; DF Error: 15
## Critical Value of t: 2.13145
##
## least Significant Difference: 1.195921
##
## Treatments with the same letter are not significantly different.
##
## olor groups
## Café 2 3.500000 a
## Café 1 3.333333 a
## Café 3 2.666667 a
shapiro.test(residuals(modelo)) # normalidad
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.94489, p-value = 0.3505
bartlett.test(olor ~ cafe, data = datos) # homogeneidad de varianzas
##
## Bartlett test of homogeneity of variances
##
## data: olor by cafe
## Bartlett's K-squared = 0.9536, df = 2, p-value = 0.6208
qqnorm(residuals(modelo)); qqline(residuals(modelo))
plot(fitted(modelo), residuals(modelo)); abline(h = 0)
# Prueba sobre los valores absolutos de los residuos
anova(lm(abs(residuals(modelo)) ~ datos$cafe))
datos$rango <- rank(datos$olor) # rank() promedia empates
# automáticamente
tapply(datos$rango, datos$cafe, sum) # R_i
## Café 1 Café 2 Café 3
## 61.0 66.5 43.5
tapply(datos$rango, datos$cafe, mean) # rango medio
## Café 1 Café 2 Café 3
## 10.16667 11.08333 7.25000
kw <- kruskal.test(olor ~ cafe, data = datos)
kw
##
## Kruskal-Wallis rank sum test
##
## data: olor by cafe
## Kruskal-Wallis chi-squared = 2.0487, df = 2, p-value = 0.359
N <- nrow(datos)
epsilon2 <- kw$statistic / (N - 1)
epsilon2
## Kruskal-Wallis chi-squared
## 0.1205096
Ejecute install.packages("FSA") una sola vez en la
consola de R si aún no tiene instalado el paquete.
library(FSA)
dunnTest(olor ~ cafe, data = datos, method = "holm")
## Comparison Z P.unadj P.adj
## 1 Café 1 - Café 2 -0.3277254 0.7431193 0.7431193
## 2 Café 1 - Café 3 1.0427626 0.2970583 0.5941165
## 3 Café 2 - Café 3 1.3704880 0.1705346 0.5116039
dunn <- function(y, g, ajuste = "holm") {
r <- rank(y); N <- length(y)
Ri <- tapply(r, g, mean); ni <- tapply(r, g, length)
t <- table(r); C <- sum(t^3 - t) / (12 * (N - 1)) # corrección por empates
par <- combn(levels(g), 2)
z <- apply(par, 2, function(p) {
(Ri[p[1]] - Ri[p[2]]) /
sqrt((N * (N + 1) / 12 - C) * (1 / ni[p[1]] + 1 / ni[p[2]]))
})
p <- 2 * pnorm(-abs(z))
data.frame(Comparacion = paste(par[1, ], "-", par[2, ]),
Z = round(z, 4), p.sin.ajuste = signif(p, 4),
p.ajustado = signif(p.adjust(p, ajuste), 4))
}
dunn(datos$olor, datos$cafe, "holm")
pairwise.wilcox.test(datos$olor, datos$cafe, p.adjust.method = "bonferroni")
##
## Pairwise comparisons using Wilcoxon rank sum exact test
##
## data: datos$olor and datos$cafe
##
## Café 1 Café 2
## Café 2 1.00 -
## Café 3 1.00 0.82
##
## P value adjustment method: bonferroni
El puntaje de olor se analiza mediante ANOVA de un factor y se contrasta con Kruskal-Wallis. Las comparaciones múltiples permiten revisar qué pares de cafés presentan diferencias. Interprete los valores p usando α = 0,05 y las salidas generadas por R.
Se compara el puntaje de sabor de tres cafés, con seis repeticiones cada uno (18 observaciones en total). Los puntajes van de 1 a 5, siendo 5 el mejor. Se utiliza un diseño completamente al azar y un nivel de significancia de 0,05.
H0: las medias del puntaje de sabor son iguales en los tres cafés (μ1 = μ2 = μ3).
H1: al menos un café tiene una media distinta.
|—:|—:|—:|—:|
sabor <- c(4, 4, 3, 2, 4, 4, # Café 1
5, 2, 4, 4, 2, 2, # Café 2
3, 2, 2, 2, 3, 2) # Café 3
cafe <- factor(rep(c("Café 1", "Café 2", "Café 3"), each = 6),
levels = c("Café 1", "Café 2", "Café 3"))
datos <- data.frame(cafe, sabor)
str(datos)
## 'data.frame': 18 obs. of 2 variables:
## $ cafe : Factor w/ 3 levels "Café 1","Café 2",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ sabor: num 4 4 3 2 4 4 5 2 4 4 ...
aggregate(sabor ~ cafe, data = datos,
FUN = function(x) c(n = length(x), media = mean(x),
mediana = median(x), de = sd(x)))
boxplot(sabor ~ cafe, data = datos, col = c("#F4B183", "#9DC3E6", "#A9D18E"),
ylab = "Puntaje de sabor", xlab = "Café")
stripchart(sabor ~ cafe, data = datos, vertical = TRUE, method = "jitter",
pch = 16, ylab = "Puntaje de sabor", xlab = "Café")
points(1:3, tapply(datos$sabor, datos$cafe, mean), pch = 95, cex = 3)
modelo <- aov(sabor ~ cafe, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## cafe 2 4.333 2.1667 2.378 0.127
## Residuals 15 13.667 0.9111
TukeyHSD(modelo)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = sabor ~ cafe, data = datos)
##
## $cafe
## diff lwr upr p adj
## Café 2-Café 1 -0.3333333 -1.764781 1.0981148 0.8196529
## Café 3-Café 1 -1.1666667 -2.598115 0.2647815 0.1198502
## Café 3-Café 2 -0.8333333 -2.264781 0.5981148 0.3133752
library(agricolae)
LSD.test(modelo, "cafe", console = TRUE)
##
## Study: modelo ~ "cafe"
##
## LSD t Test for sabor
##
## Mean Square Error: 0.9111111
##
## cafe, means and individual ( 95 %) CI
##
## sabor std r se LCL UCL Min Max Q25 Q50 Q75
## Café 1 3.500000 0.8366600 6 0.3896817 2.669413 4.330587 2 4 3.25 4 4.00
## Café 2 3.166667 1.3291601 6 0.3896817 2.336080 3.997254 2 5 2.00 3 4.00
## Café 3 2.333333 0.5163978 6 0.3896817 1.502746 3.163920 2 3 2.00 2 2.75
##
## Alpha: 0.05 ; DF Error: 15
## Critical Value of t: 2.13145
##
## least Significant Difference: 1.174627
##
## Treatments with the same letter are not significantly different.
##
## sabor groups
## Café 1 3.500000 a
## Café 2 3.166667 a
## Café 3 2.333333 a
shapiro.test(residuals(modelo)) # normalidad
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.93289, p-value = 0.2182
bartlett.test(sabor ~ cafe, data = datos) # homogeneidad de varianzas
##
## Bartlett test of homogeneity of variances
##
## data: sabor by cafe
## Bartlett's K-squared = 3.8115, df = 2, p-value = 0.1487
qqnorm(residuals(modelo)); qqline(residuals(modelo))
plot(fitted(modelo), residuals(modelo)); abline(h = 0)
# Prueba sobre los valores absolutos de los residuos
anova(lm(abs(residuals(modelo)) ~ datos$cafe))
datos$rango <- rank(datos$sabor) # rank() promedia empates
# automáticamente
tapply(datos$rango, datos$cafe, sum) # R_i
## Café 1 Café 2 Café 3
## 72.5 60.5 38.0
tapply(datos$rango, datos$cafe, mean) # rango medio
## Café 1 Café 2 Café 3
## 12.083333 10.083333 6.333333
kw <- kruskal.test(sabor ~ cafe, data = datos)
kw
##
## Kruskal-Wallis rank sum test
##
## data: sabor by cafe
## Kruskal-Wallis chi-squared = 4.1093, df = 2, p-value = 0.1281
N <- nrow(datos)
epsilon2 <- kw$statistic / (N - 1)
epsilon2
## Kruskal-Wallis chi-squared
## 0.2417258
library(FSA)
dunnTest(sabor ~ cafe, data = datos, method = "holm")
## Comparison Z P.unadj P.adj
## 1 Café 1 - Café 2 0.6944563 0.48739612 0.4873961
## 2 Café 1 - Café 3 1.9965618 0.04587281 0.1376184
## 3 Café 2 - Café 3 1.3021055 0.19288032 0.3857606
dunn <- function(y, g, ajuste = "holm") {
r <- rank(y); N <- length(y)
Ri <- tapply(r, g, mean); ni <- tapply(r, g, length)
t <- table(r); C <- sum(t^3 - t) / (12 * (N - 1)) # corrección por empates
par <- combn(levels(g), 2)
z <- apply(par, 2, function(p) {
(Ri[p[1]] - Ri[p[2]]) /
sqrt((N * (N + 1) / 12 - C) * (1 / ni[p[1]] + 1 / ni[p[2]]))
})
p <- 2 * pnorm(-abs(z))
data.frame(Comparacion = paste(par[1, ], "-", par[2, ]),
Z = round(z, 4), p.sin.ajuste = signif(p, 4),
p.ajustado = signif(p.adjust(p, ajuste), 4))
}
dunn(datos$sabor, datos$cafe, "holm")
pairwise.wilcox.test(datos$sabor, datos$cafe, p.adjust.method = "bonferroni")
##
## Pairwise comparisons using Wilcoxon rank sum exact test
##
## data: datos$sabor and datos$cafe
##
## Café 1 Café 2
## Café 2 1.00 -
## Café 3 0.14 0.95
##
## P value adjustment method: bonferroni
El puntaje de sabor se analiza mediante ANOVA de un factor y se contrasta con Kruskal-Wallis. Las comparaciones múltiples permiten revisar qué pares de cafés presentan diferencias. Interprete los valores p usando α = 0,05 y las salidas generadas por R.
Compare los resultados obtenidos para olor y sabor. Recuerde que un valor p menor que 0,05 indica evidencia estadística de diferencias entre los cafés; un valor p igual o mayor que 0,05 no permite rechazar la hipótesis nula.