Nota de integridad de datos. El segundo registro de Empeltre (4.9 tn/ha) se transcribió provisionalmente de una fotografía parcialmente ilegible. Debe contrastarse con el dato original antes de considerar definitivo el informe. La interpretación del DCA también presupone unidades experimentales independientes y asignación aleatoria efectiva, condiciones aún no documentadas en el enunciado disponible.
Se estudia el rendimiento agrícola de cuatro variedades de aceituna de mesa (Sevillana, Ascolana, Empeltre e Ilo), medido en toneladas por hectárea (tn/ha). Se dispone de 24 rendimientos, con tamaños muestrales desiguales por variedad. El propósito es determinar si el rendimiento medio depende de la variedad y precisar qué diferencias entre pares tienen respaldo estadístico.
Pregunta de investigación: ¿son iguales los rendimientos medios de las cuatro variedades en las condiciones del experimento?
Objetivo general: comparar los rendimientos medios mediante ANOVA de un factor para un diseño completamente aleatorizado (DCA) desbalanceado, examinar sus supuestos y comprobar la sensibilidad de las conclusiones ante varianzas desiguales.
Objetivos específicos: describir las distribuciones por variedad; contrastar la igualdad global de medias; evaluar residuos y dispersión; efectuar comparaciones de Tukey; contrastar los resultados con Welch y comparaciones por pares ajustadas mediante Holm.
El factor fijo es variedad, con cuatro
niveles. La variable respuesta es
rendimiento (tn/ha). Se analiza como un DCA de un factor,
sujeto a confirmar la unidad experimental y el proceso real de
aleatorización. El desbalance (6, 7, 5 y 6 observaciones) no invalida
por sí mismo un ANOVA de un factor.
sevillana <- c(4.9, 8.5, 9.4, 9.8, 7.4, 10.5)
ascolana <- c(8.2, 4.7, 5.6, 6.3, 6.4, 5.2, 4.8)
empeltre <- c(5.6, 4.9, 5.0, 4.7, 4.3) # Segundo valor provisional
ilo <- c(10.6, 9.6, 8.7, 10.3, 9.9, 8.7)
valores <- list(Sevillana=sevillana, Ascolana=ascolana,
Empeltre=empeltre, Ilo=ilo)
datos <- data.frame(
variedad=factor(rep(names(valores), lengths(valores)),
levels=names(valores)),
rendimiento=unlist(valores, use.names=FALSE)
)
stopifnot(nrow(datos)==24, !anyNA(datos))
knitr::kable(data.frame(Variedad=names(valores),
n=lengths(valores),
Mediciones=vapply(valores,
function(x) paste(x, collapse=", "), character(1))),
caption="Datos originales por variedad (tn/ha).")| Variedad | n | Mediciones | |
|---|---|---|---|
| Sevillana | Sevillana | 6 | 4.9, 8.5, 9.4, 9.8, 7.4, 10.5 |
| Ascolana | Ascolana | 7 | 8.2, 4.7, 5.6, 6.3, 6.4, 5.2, 4.8 |
| Empeltre | Empeltre | 5 | 5.6, 4.9, 5, 4.7, 4.3 |
| Ilo | Ilo | 6 | 10.6, 9.6, 8.7, 10.3, 9.9, 8.7 |
El modelo es:
\[Y_{ij}=\mu+\tau_i+\varepsilon_{ij},\quad i=1,\ldots,4;\quad j=1,\ldots,n_i.\]
En el ANOVA clásico se supone que los errores son independientes, normalmente distribuidos, con media cero y varianza común \(\sigma^2\). La hipótesis nula es \(H_0:\mu_1=\mu_2=\mu_3=\mu_4\), frente a que al menos una media difiere. Se adopta \(\alpha=0.05\).
resumen <- do.call(rbind, lapply(valores, function(x) {
data.frame(n=length(x), Media=mean(x), Mediana=median(x),
DE=sd(x), Varianza=var(x), Min=min(x), Max=max(x),
CV_porcentaje=100*sd(x)/mean(x))
}))
knitr::kable(round(resumen, 3), caption="Estadísticos descriptivos de rendimiento.")| n | Media | Mediana | DE | Varianza | Min | Max | CV_porcentaje | |
|---|---|---|---|---|---|---|---|---|
| Sevillana | 6 | 8.417 | 8.95 | 2.031 | 4.126 | 4.9 | 10.5 | 24.133 |
| Ascolana | 7 | 5.886 | 5.60 | 1.220 | 1.488 | 4.7 | 8.2 | 20.726 |
| Empeltre | 5 | 4.900 | 4.90 | 0.474 | 0.225 | 4.3 | 5.6 | 9.680 |
| Ilo | 6 | 9.633 | 9.75 | 0.799 | 0.639 | 8.7 | 10.6 | 8.296 |
Lectura: Ilo presenta el mayor promedio (9.633 tn/ha), seguida de Sevillana (8.417), Ascolana (5.886) y Empeltre (4.900). Sevillana presenta la mayor dispersión relativa (CV = 24.13%), mientras que Ilo presenta una dispersión observada menor (CV = 8.30%). La variabilidad en este conjunto no equivale a estabilidad varietal entre diferentes ambientes o años.
boxplot(rendimiento ~ variedad, data=datos, col="gray90", border="gray35",
outline=FALSE, xlab="Variedad", ylab="Rendimiento (tn/ha)",
main="Rendimiento por variedad")
set.seed(123)
stripchart(rendimiento ~ variedad, data=datos, vertical=TRUE,
method="jitter", jitter=.1, add=TRUE,
pch=19, col="navy")Distribución del rendimiento por variedad, con cada observación individual.
Df Sum Sq Mean Sq F value Pr(>F)
variedad 3 82.9 27.63 16.4 0.000013 ***
Residuals 20 33.7 1.68
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
eta2 <- sum((fitted(modelo)-mean(datos$rendimiento))^2) /
sum((datos$rendimiento-mean(datos$rendimiento))^2)
cat("Eta cuadrado =", round(eta2, 4), "\n")Eta cuadrado = 0.7113
El ANOVA detecta diferencias entre medias de rendimiento: \(F(3,20)=16.42\), \(p=0.0000128\). Se rechaza la hipótesis de igualdad global. El valor \(\eta^2=0.7113\) indica que alrededor del 71.13% de la variación total observada se asocia con el factor variedad dentro de este modelo, sin constituir una atribución causal universal.
medias <- tapply(datos$rendimiento, datos$variedad, mean)
n <- table(datos$variedad)
CME <- deviance(modelo)/df.residual(modelo)
EE <- sqrt(CME/as.numeric(n))
margen <- qt(.975, df.residual(modelo))*EE
x <- seq_along(medias)
plot(x, medias, ylim=range(medias-margen, medias+margen), xaxt="n",
pch=19, col="navy", cex=1.3, xlab="Variedad",
ylab="Rendimiento medio (tn/ha)", main="Medias e IC individuales del 95%")
axis(1, at=x, labels=names(medias))
arrows(x, medias-margen, x, medias+margen,
angle=90, code=3, length=.07, lwd=1.5)
abline(h=mean(datos$rendimiento), lty=2, col="gray50")Medias por variedad e intervalos individuales del 95% calculados con el error común del ANOVA. No son intervalos simultáneos de comparaciones por pares.
Shapiro-Wilk normality test
data: residuals(modelo)
W = 0.947, p-value = 0.23
Fligner-Killeen test of homogeneity of variances
data: rendimiento by variedad
Fligner-Killeen:med chi-squared = 5.86, df = 3, p-value = 0.12
Shapiro–Wilk (\(W=0.94672\), \(p=0.2299\)) no encontró evidencia significativa contra la normalidad de los residuos. Fligner–Killeen (\(\chi^2=5.8551\), \(p=0.1189\)) no encontró evidencia significativa contra la homogeneidad de varianzas. No rechazar estas hipótesis no demuestra su cumplimiento. Dado el tamaño muestral y la diferencia de varianzas muestrales entre Sevillana y Empeltre, conviene analizar la sensibilidad.
qqnorm(residuals(modelo), pch=19, col="navy",
main="Q-Q de residuos")
qqline(residuals(modelo), col="red3", lwd=2)Gráfico Q-Q de los residuos del ANOVA.
plot(fitted(modelo), residuals(modelo), pch=19, col="navy",
xlab="Valores ajustados (tn/ha)", ylab="Residuos",
main="Residuos frente a ajustados")
abline(h=0, col="red3", lty=2)Residuos frente a valores ajustados del ANOVA.
boxplot(residuals(modelo) ~ datos$variedad, col="gray90",
border="gray35", outline=FALSE,
xlab="Variedad", ylab="Residuos", main="Residuos por variedad")
set.seed(123)
stripchart(residuals(modelo) ~ datos$variedad, vertical=TRUE,
method="jitter", jitter=.1, add=TRUE, pch=19, col="navy")
abline(h=0, col="red3", lty=2)Residuos por variedad: inspección visual de su dispersión.
La independencia debe justificarse mediante el protocolo experimental (asignación aleatoria y unidades independientes); ningún gráfico o test de los anteriores puede verificarla por sí solo.
tukey <- TukeyHSD(modelo, "variedad", conf.level=.95)
knitr::kable(round(as.data.frame(tukey$variedad), 5),
caption="Diferencias entre medias, intervalos simultáneos del 95% y valores p ajustados (Tukey).")| diff | lwr | upr | p adj | |
|---|---|---|---|---|
| Ascolana-Sevillana | -2.53095 | -4.55080 | -0.5111 | 0.01096 |
| Empeltre-Sevillana | -3.51667 | -5.71507 | -1.3183 | 0.00122 |
| Ilo-Sevillana | 1.21667 | -0.87943 | 3.3128 | 0.38804 |
| Empeltre-Ascolana | -0.98571 | -3.11154 | 1.1401 | 0.57481 |
| Ilo-Ascolana | 3.74762 | 1.72777 | 5.7675 | 0.00024 |
| Ilo-Empeltre | 4.73333 | 2.53493 | 6.9317 | 0.00004 |
Tukey identifica diferencias significativas entre Sevillana y Ascolana; Sevillana y Empeltre; Ilo y Ascolana; e Ilo y Empeltre. No identifica diferencias significativas entre Ilo y Sevillana, ni entre Ascolana y Empeltre.
t <- tukey$variedad
dif <- t[,"diff"]; li <- t[,"lwr"]; ls <- t[,"upr"]
y <- seq_along(dif)
color <- ifelse(t[,"p adj"] < .05, "navy", "gray50")
op <- par(mar=c(5,13,4,2))
plot(dif, y, xlim=range(c(li,ls,0)), ylim=c(.5,length(y)+.5),
yaxt="n", pch=19, col=color, xlab="Diferencia de medias (tn/ha)",
ylab="", main="Tukey: intervalos simultáneos del 95%")
axis(2, at=y, labels=rownames(t), las=1, cex.axis=.85)
abline(v=0, lty=2, col="red3")
arrows(li,y,ls,y,angle=90,code=3,length=.05,col=color,lwd=1.6)Diferencias de medias e intervalos simultáneos del 95% de Tukey. Los intervalos que no cruzan cero representan comparaciones significativas al 5%.
El ANOVA de Welch no presupone varianzas iguales entre grupos; los contrastes por pares de Welch con ajuste de Holm tampoco requieren una varianza agrupada común. Welch–Holm no es lo mismo que Games–Howell.
welch <- oneway.test(rendimiento ~ variedad, data=datos,
var.equal=FALSE)
holm <- pairwise.t.test(datos$rendimiento, datos$variedad,
pool.sd=FALSE, p.adjust.method="holm")
print(welch)
One-way analysis of means (not assuming equal variances)
data: rendimiento and variedad
F = 46, num df = 3.0, denom df = 10.7, p-value = 0.0000021
Pairwise comparisons using t tests with non-pooled SD
data: datos$rendimiento and datos$variedad
Sevillana Ascolana Empeltre
Ascolana 0.09 - -
Empeltre 0.03 0.17 -
Ilo 0.22 0.000243 0.000009
P value adjustment method: holm
Welch confirma la diferencia global: \(F(3,10.686)=45.999\), \(p=0.000002099\). Los F de los dos enfoques no deben compararse como tamaños de efecto.
pares <- data.frame(
Par=c("Ilo - Sevillana", "Ilo - Ascolana", "Ilo - Empeltre",
"Sevillana - Ascolana", "Sevillana - Empeltre",
"Ascolana - Empeltre"),
Tukey_p=c(.3880384,.0002396,.0000378,.0109566,.0012178,.5748123),
Welch_Holm_p=c(.21743,.00024,.0000087,.08600,.02868,.17386)
)
pares$Tukey <- ifelse(pares$Tukey_p<.05,"Significativa","No significativa")
pares$Welch_Holm <- ifelse(pares$Welch_Holm_p<.05,"Significativa","No significativa")
knitr::kable(pares, digits=6,
caption="Contraste de decisiones de Tukey y Welch–Holm al 5%.")| Par | Tukey_p | Welch_Holm_p | Tukey | Welch_Holm |
|---|---|---|---|---|
| Ilo - Sevillana | 0.388038 | 0.217430 | No significativa | No significativa |
| Ilo - Ascolana | 0.000240 | 0.000240 | Significativa | Significativa |
| Ilo - Empeltre | 0.000038 | 0.000009 | Significativa | Significativa |
| Sevillana - Ascolana | 0.010957 | 0.086000 | Significativa | No significativa |
| Sevillana - Empeltre | 0.001218 | 0.028680 | Significativa | Significativa |
| Ascolana - Empeltre | 0.574812 | 0.173860 | No significativa | No significativa |
Resultado clave: cinco de las seis decisiones coinciden. La diferencia Sevillana–Ascolana es significativa con Tukey (\(p=0.01096\)), pero no con Welch–Holm (\(p=0.08600\)). Esta comparación es sensible al método, de modo que no debería presentarse como un hallazgo robusto.
Ilo obtuvo el mayor rendimiento medio observado, con variación relativa baja, pero no se demuestra una diferencia estadísticamente significativa entre Ilo y Sevillana con ninguno de los dos procedimientos de comparaciones múltiples. Tampoco se demuestra equivalencia entre ambas. La evidencia para Ilo frente a Ascolana y Empeltre, y para Sevillana frente a Empeltre, se mantiene bajo los dos enfoques.
El rendimiento de 4.9 tn/ha registrado para Sevillana contribuye a su mayor dispersión; no procede eliminar ninguna observación sin evidencia externa de error de medición o registro. Para recomendar una variedad de manera generalizable se requerirían datos del protocolo, replicación en diferentes condiciones y, potencialmente, varias campañas.
Este documento contiene todos los datos, el código R y las gráficas.
No necesita archivos de imágenes externos. Los resultados se producen en
el momento de compilar el .Rmd a HTML con
rmarkdown::render() o el botón Knit en
RStudio.
Programas empleados: R, rmarkdown y
knitr. Los análisis y gráficos utilizan funciones incluidas
en R base. Para RPubs, publique el HTML generado, no
directamente el archivo .Rmd.