Este informe compara el rendimiento (tn/ha) de cuatro variedades de aceituna —Sevillana, Ascolana, Empeltre e Ilo— bajo un Diseño Completamente al Azar (DCA) con tamaños de muestra desiguales. Se examinan los supuestos del ANOVA mediante las pruebas de Shapiro–Wilk y Levene, y se presentan el ANOVA de un factor y la prueba no paramétrica de Kruskal–Wallis.
Hallazgos principales con los datos analizados:
Las pruebas globales indican que al menos una variedad difiere, pero no identifican por sí solas qué pares de variedades son diferentes. Para ello se recomienda un análisis post hoc.
Se consideran 24 observaciones distribuidas de forma desigual entre cuatro variedades. El factor explicativo es la variedad y la variable respuesta es el rendimiento en toneladas por hectárea.
datos_dca <- data.frame(
Variedad = factor(c(
rep("Sevillana", 6),
rep("Ascolana", 7),
rep("Empeltre", 5),
rep("Ilo", 6)
), levels = c("Sevillana", "Ascolana", "Empeltre", "Ilo")),
Rendimiento = c(
4.9, 8.5, 9.4, 9.8, 7.4, 10.5,
8.2, 4.7, 5.6, 6.3, 6.4, 5.2, 4.8,
5.6, 4.9, 5.0, 4.7, 4.3,
10.6, 9.6, 8.7, 10.3, 9.9, 8.7
)
)
kable(head(datos_dca), caption = "Primeras seis observaciones")
| Variedad | Rendimiento |
|---|---|
| Sevillana | 4.9 |
| Sevillana | 8.5 |
| Sevillana | 9.4 |
| Sevillana | 9.8 |
| Sevillana | 7.4 |
| Sevillana | 10.5 |
tabla_desc <- datos_dca |>
group_by(Variedad) |>
summarise(
n = n(),
Media = mean(Rendimiento),
Desviacion_estandar = sd(Rendimiento),
Mediana = median(Rendimiento),
Minimo = min(Rendimiento),
Maximo = max(Rendimiento),
.groups = "drop"
) |>
mutate(across(where(is.numeric), ~ round(.x, 3)))
kable(tabla_desc, caption = "Estadísticos descriptivos del rendimiento por variedad")
| Variedad | n | Media | Desviacion_estandar | Mediana | Minimo | Maximo |
|---|---|---|---|---|---|---|
| Sevillana | 6 | 8.417 | 2.031 | 8.95 | 4.9 | 10.5 |
| Ascolana | 7 | 5.886 | 1.220 | 5.60 | 4.7 | 8.2 |
| Empeltre | 5 | 4.900 | 0.474 | 4.90 | 4.3 | 5.6 |
| Ilo | 6 | 9.633 | 0.799 | 9.75 | 8.7 | 10.6 |
Las barras muestran la media de cada variedad y los intervalos representan media ± error estándar. Estos intervalos son descriptivos y no sustituyen las comparaciones post hoc.
medias <- datos_dca |>
group_by(Variedad) |>
summarise(
n = n(),
media = mean(Rendimiento),
ee = sd(Rendimiento) / sqrt(n),
.groups = "drop"
)
ggplot(medias, aes(x = Variedad, y = media)) +
geom_col(fill = "steelblue", alpha = 0.8, width = 0.65) +
geom_errorbar(aes(ymin = media - ee, ymax = media + ee), width = 0.15) +
geom_text(aes(label = sprintf("%.2f", media)), vjust = -0.7, size = 4) +
labs(
title = "Rendimiento medio por variedad",
subtitle = "Barras de error: ± 1 error estándar",
x = "Variedad de aceituna",
y = "Rendimiento medio (tn/ha)"
) +
theme_minimal(base_size = 13) +
expand_limits(y = max(medias$media + medias$ee) + 0.8)
El diagrama de cajas permite comparar medianas, dispersión y posibles valores atípicos. Los puntos representan observaciones individuales.
ggplot(datos_dca, aes(x = Variedad, y = Rendimiento, fill = Variedad)) +
geom_boxplot(alpha = 0.65, outlier.shape = 16, outlier.size = 2) +
geom_jitter(width = 0.12, size = 2.2, color = "black", alpha = 0.65) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Distribución del rendimiento por variedad",
subtitle = "Diseño Completamente al Azar (DCA)",
x = "Variedad de aceituna",
y = "Rendimiento (tn/ha)"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
panel.grid.minor = element_blank())
Se ajusta un modelo lineal de un factor. La normalidad se evalúa sobre los residuos del modelo, mientras que la homogeneidad de varianzas se examina con la prueba de Levene centrada en la mediana.
modelo_lineal <- lm(Rendimiento ~ Variedad, data = datos_dca)
residuos <- residuals(modelo_lineal)
Hipótesis:
prueba_normalidad <- shapiro.test(residuos)
tabla_shapiro <- data.frame(
Prueba = "Shapiro-Wilk",
Estadistico_W = unname(prueba_normalidad$statistic),
p_valor = prueba_normalidad$p.value,
Decision = ifelse(prueba_normalidad$p.value < 0.05,
"Rechazar H0: evidencia contra normalidad",
"No rechazar H0: no hay evidencia suficiente contra normalidad")
)
kable(tabla_shapiro |> mutate(across(where(is.numeric), ~ round(.x, 4))),
caption = "Prueba de normalidad de los residuos")
| Prueba | Estadistico_W | p_valor | Decision |
|---|---|---|---|
| Shapiro-Wilk | 0.9467 | 0.2299 | No rechazar H0: no hay evidencia suficiente contra normalidad |
Con el resultado proporcionado (\(W=0.94672\), \(p=0.2299\)), al nivel de significación de 0.05 no se rechaza la hipótesis nula. Esto significa que no se encontró evidencia estadística suficiente contra la normalidad; no demuestra que los residuos sean perfectamente normales.
Hipótesis:
prueba_homocedasticidad <- car::leveneTest(Rendimiento ~ Variedad,
data = datos_dca,
center = median)
tabla_levene <- data.frame(
Prueba = "Levene (centrada en la mediana)",
F = prueba_homocedasticidad[1, "F value"],
gl1 = prueba_homocedasticidad[1, "Df"],
gl2 = prueba_homocedasticidad[2, "Df"],
p_valor = prueba_homocedasticidad[1, "Pr(>F)"]
)
kable(tabla_levene |> mutate(across(where(is.numeric), ~ round(.x, 4))),
caption = "Prueba de homogeneidad de varianzas")
| Prueba | F | gl1 | gl2 | p_valor |
|---|---|---|---|---|
| Levene (centrada en la mediana) | 1.899 | 3 | 20 | 0.1623 |
Con el resultado proporcionado (\(F=1.899\), \(p=0.1623\)), no se rechaza la igualdad de varianzas al 5 %. Por tanto, no se detectó evidencia suficiente de heterocedasticidad mediante esta prueba.
par(mfrow = c(2, 2))
plot(modelo_lineal)
par(mfrow = c(1, 1))
Los gráficos permiten revisar patrones en residuos frente a valores ajustados, la forma de la distribución y observaciones potencialmente influyentes. La interpretación debe combinarse con las pruebas formales y el conocimiento del experimento.
Hipótesis:
resultado_anova <- aov(Rendimiento ~ Variedad, data = datos_dca)
tabla_anova <- broom::tidy(resultado_anova)
kable(tabla_anova |> mutate(across(where(is.numeric), ~ round(.x, 5))),
caption = "Tabla ANOVA de un factor")
| term | df | sumsq | meansq | statistic | p.value |
|---|---|---|---|---|---|
| Variedad | 3 | 82.88976 | 27.62992 | 16.42183 | 1e-05 |
| Residuals | 20 | 33.65024 | 1.68251 | NA | NA |
Con los resultados proporcionados, \(F(3,20)=16.42\) y \(p=1.28\times10^{-5}\). Como \(p<0.05\), se rechaza la hipótesis nula de igualdad de medias. Existe evidencia estadística de diferencias en el rendimiento medio entre las variedades. El ANOVA global no indica qué variedades difieren entre sí.
El eta cuadrado (\(\eta^2\)) estima la proporción de variabilidad total del rendimiento asociada con la variedad en esta muestra.
tab_aov <- summary(resultado_anova)[[1]]
eta2 <- tab_aov["Variedad", "Sum Sq"] / sum(tab_aov[, "Sum Sq"])
kable(data.frame(Indicador = "Eta cuadrado (eta²)",
Valor = round(eta2, 4),
Porcentaje = paste0(round(100 * eta2, 1), "%")),
caption = "Tamaño del efecto de la variedad")
| Indicador | Valor | Porcentaje |
|---|---|---|
| Eta cuadrado (eta²) | 0.7113 | 71.1% |
Este valor describe la magnitud de la asociación observada en estos datos; no implica por sí solo causalidad fuera de las condiciones del experimento.
Kruskal–Wallis compara los rangos de los grupos y puede ser útil como análisis complementario cuando se desea una alternativa no paramétrica al ANOVA. No contrasta exactamente la igualdad de medias.
resultado_kruskal <- kruskal.test(Rendimiento ~ Variedad, data = datos_dca)
tabla_kruskal <- data.frame(
Prueba = "Kruskal-Wallis",
Chi_cuadrado = unname(resultado_kruskal$statistic),
gl = unname(resultado_kruskal$parameter),
p_valor = resultado_kruskal$p.value,
Decision = ifelse(resultado_kruskal$p.value < 0.05,
"Rechazar H0: existen diferencias entre grupos",
"No rechazar H0")
)
kable(tabla_kruskal |> mutate(across(where(is.numeric), ~ round(.x, 5))),
caption = "Resultado de Kruskal–Wallis")
| Prueba | Chi_cuadrado | gl | p_valor | Decision |
|---|---|---|---|---|
| Kruskal-Wallis | 15.22975 | 3 | 0.00163 | Rechazar H0: existen diferencias entre grupos |
Con el resultado proporcionado (\(\chi^2(3)=15.23\), \(p=0.00163\)), se rechaza la hipótesis nula al 5 %. La conclusión coincide con el ANOVA en que hay diferencias globales entre variedades.
Dado que el ANOVA global resultó significativo, se pueden realizar comparaciones por pares con ajuste por multiplicidad. Tukey HSD es una opción habitual para comparar todas las medias cuando los supuestos del ANOVA son razonables.
resultado_tukey <- TukeyHSD(resultado_anova)
resultado_tukey
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rendimiento ~ Variedad, data = datos_dca)
##
## $Variedad
## diff lwr upr p adj
## Ascolana-Sevillana -2.5309524 -4.5508023 -0.5111025 0.0109566
## Empeltre-Sevillana -3.5166667 -5.7150721 -1.3182613 0.0012178
## Ilo-Sevillana 1.2166667 -0.8794306 3.3127640 0.3880384
## Empeltre-Ascolana -0.9857143 -3.1115449 1.1401164 0.5748123
## Ilo-Ascolana 3.7476190 1.7277692 5.7674689 0.0002396
## Ilo-Empeltre 4.7333333 2.5349279 6.9317387 0.0000378
plot(resultado_tukey, las = 1, col = "blue")
Para complementar el análisis no paramétrico, puede usarse una comparación por pares de Wilcoxon con ajuste de Holm:
pares_wilcoxon <- pairwise.wilcox.test(
datos_dca$Rendimiento,
datos_dca$Variedad,
p.adjust.method = "holm",
exact = FALSE
)
pares_wilcoxon
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: datos_dca$Rendimiento and datos_dca$Variedad
##
## Sevillana Ascolana Empeltre
## Ascolana 0.11 - -
## Empeltre 0.11 0.28 -
## Ilo 0.28 0.02 0.04
##
## P value adjustment method: holm
Interprete las comparaciones ajustadas, no solo los valores p sin corrección. Las conclusiones por pares deben reportarse a partir de las tablas generadas al compilar el documento.
Para generar el informe en HTML desde RStudio:
.Rmd.install.packages(c("rmarkdown", "ggplot2", "dplyr", "knitr", "car", "broom")).El documento requiere conexión a internet solo si necesita instalar paquetes. Los resultados se recalculan a partir de los datos incluidos en este archivo.