En esta clase aprenderemos la lógica básica de un Diseño Completamente al Azar (DCA) usando R.
La idea principal es comprender la secuencia:
Experimento → datos → exploración → visualización → hipótesis → ANOVA → comparación de medias → supuestos → conclusión agropecuaria
Trabajaremos con el conjunto de datos sweetpotato,
disponible en el paquete agricolae.
Un Diseño Completamente al Azar (DCA) se utiliza cuando tenemos varias unidades experimentales relativamente homogéneas y queremos asignar tratamientos de forma aleatoria.
El modelo estadístico puede expresarse como:
\[Y_{ij} = \mu + \tau_i + \varepsilon_{ij}\]
En palabras simples:
Variable respuesta = media general + efecto del tratamiento + error
En este ejemplo estudiaremos el rendimiento de camote bajo diferentes tratamientos asociados con infección viral.
# IMPORTANTE:
# install.packages() se utiliza solamente la primera vez que
# instalamos un paquete en un computador.
# Si no tiene instalados estos paquetes, quite el símbolo #:
# install.packages("agricolae")
# install.packages("ggplot2")
# install.packages("dplyr")
# Cargar los paquetes
library(agricolae)
library(ggplot2)
library(dplyr)
# Cargar el conjunto de datos sweetpotato
data(sweetpotato)
# Mostrar los datos
sweetpotato
## virus yield
## 1 cc 28.5
## 2 cc 21.7
## 3 cc 23.0
## 4 fc 14.9
## 5 fc 10.6
## 6 fc 13.1
## 7 ff 41.8
## 8 ff 39.2
## 9 ff 28.0
## 10 oo 38.2
## 11 oo 40.4
## 12 oo 32.1
El conjunto contiene dos variables principales:
virus: tratamiento aplicado.yield: rendimiento obtenido en kg por parcela.Los tratamientos son:
cc: plantas infectadas con SPCSV.fc: plantas infectadas con dos virus.ff: plantas infectadas con SPFMV.oo: plantas sanas, utilizadas como control.Por lo tanto:
virusyieldLa unidad experimental es la parcela sobre la cual se aplica el tratamiento y se registra el rendimiento.
Antes de realizar cualquier análisis estadístico, debemos conocer nuestros datos.
head(sweetpotato)
## virus yield
## 1 cc 28.5
## 2 cc 21.7
## 3 cc 23.0
## 4 fc 14.9
## 5 fc 10.6
## 6 fc 13.1
head() permite observar rápidamente las primeras
filas.
str(sweetpotato)
## 'data.frame': 12 obs. of 2 variables:
## $ virus: Factor w/ 4 levels "cc","fc","ff",..: 1 1 1 2 2 2 3 3 3 4 ...
## $ yield: num 28.5 21.7 23 14.9 10.6 13.1 41.8 39.2 28 38.2 ...
str() muestra el tipo de cada variable y la estructura
general del objeto.
summary(sweetpotato)
## virus yield
## cc:3 Min. :10.60
## fc:3 1st Qu.:20.00
## ff:3 Median :28.25
## oo:3 Mean :27.62
## 3rd Qu.:38.45
## Max. :41.80
summary() proporciona un resumen rápido de cada
variable.
table(sweetpotato$virus)
##
## cc fc ff oo
## 3 3 3 3
table() permite contar cuántas observaciones existen
para cada tratamiento.
Ahora calcularemos estadísticas sencillas para cada tratamiento.
resumen <- sweetpotato %>%
group_by(virus) %>%
summarise(
n = n(), # Número de observaciones
media = mean(yield), # Rendimiento promedio
desviacion = sd(yield), # Desviación estándar
minimo = min(yield), # Valor mínimo
maximo = max(yield) # Valor máximo
)
resumen
## # A tibble: 4 × 6
## virus n media desviacion minimo maximo
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 cc 3 24.4 3.61 21.7 28.5
## 2 fc 3 12.9 2.16 10.6 14.9
## 3 ff 3 36.3 7.33 28 41.8
## 4 oo 3 36.9 4.3 32.1 40.4
Estas estadísticas nos permiten responder preguntas como:
Recuerde: una diferencia numérica entre medias no necesariamente significa una diferencia estadísticamente significativa.
ggplot(sweetpotato, aes(x = virus, y = yield, fill = virus)) +
geom_boxplot() +
labs(
title = "Rendimiento de camote según tratamiento",
x = "Tratamiento",
y = "Rendimiento (kg por parcela)"
) +
theme_minimal()
El boxplot ayuda a comparar la distribución de los datos, su dispersión y posibles valores extremos.
ggplot(sweetpotato, aes(x = virus, y = yield)) +
geom_point(size = 3) +
labs(
title = "Observaciones individuales por tratamiento",
x = "Tratamiento",
y = "Rendimiento (kg por parcela)"
) +
theme_minimal()
Este gráfico muestra directamente los valores registrados en cada tratamiento.
ggplot(resumen, aes(x = virus, y = media)) +
geom_col() +
labs(
title = "Rendimiento promedio por tratamiento",
x = "Tratamiento",
y = "Rendimiento promedio (kg)"
) +
theme_minimal()
Este gráfico facilita comparar visualmente las medias.
Las hipótesis son:
\[H_0: \mu_{cc} = \mu_{fc} = \mu_{ff} = \mu_{oo}\]
H₀: todos los tratamientos tienen el mismo rendimiento promedio.
H₁: al menos uno de los tratamientos presenta una media diferente.
modelo <- aov(yield ~ virus, data = sweetpotato)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## virus 3 1170.2 390.1 17.34 0.000733 ***
## Residuals 8 179.9 22.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Los elementos principales son:
Regla sencilla:
p < 0.05, rechazamos H₀.p >= 0.05, no tenemos evidencia suficiente para
rechazar H₀.Si rechazamos H₀, concluimos que al menos una media es diferente.
Si el ANOVA resulta significativo, podemos utilizar Tukey para identificar qué tratamientos son diferentes.
tukey <- HSD.test(
modelo,
"virus",
group = TRUE,
console = TRUE
)
##
## Study: modelo ~ "virus"
##
## HSD Test for yield
##
## Mean Square Error: 22.48917
##
## virus, means
##
## yield std r se Min Max Q25 Q50 Q75
## cc 24.40000 3.609709 3 2.737953 21.7 28.5 22.35 23.0 25.75
## fc 12.86667 2.159475 3 2.737953 10.6 14.9 11.85 13.1 14.00
## ff 36.33333 7.333030 3 2.737953 28.0 41.8 33.60 39.2 40.50
## oo 36.90000 4.300000 3 2.737953 32.1 40.4 35.15 38.2 39.30
##
## Alpha: 0.05 ; DF Error: 8
## Critical Value of Studentized Range: 4.52881
##
## Minimun Significant Difference: 12.39967
##
## Treatments with the same letter are not significantly different.
##
## yield groups
## oo 36.90000 a
## ff 36.33333 ab
## cc 24.40000 bc
## fc 12.86667 c
tukey$groups
## yield groups
## oo 36.90000 a
## ff 36.33333 ab
## cc 24.40000 bc
## fc 12.86667 c
La regla es:
Tratamientos con la misma letra no presentan diferencias significativas entre sí.
Por ejemplo:
Tratamiento Media Grupo
oo ... a
ff ... a
cc ... b
fc ... c
En este caso:
oo y ff comparten la letra a,
por lo tanto no son diferentes estadísticamente.cc pertenece a otro grupo.fc pertenece a otro grupo.Los tres supuestos principales son:
par(mfrow = c(2, 2))
plot(modelo)
par(mfrow = c(1, 1))
Los gráficos más importantes para una introducción son:
residuos <- residuals(modelo)
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.95878, p-value = 0.7663
Interpretación introductoria:
p > 0.05: no encontramos evidencia fuerte contra la
normalidad.p < 0.05: podría existir un problema de
normalidad.bartlett.test(yield ~ virus, data = sweetpotato)
##
## Bartlett test of homogeneity of variances
##
## data: yield by virus
## Bartlett's K-squared = 2.3886, df = 3, p-value = 0.4958
Interpretación introductoria:
p > 0.05: las varianzas pueden considerarse
razonablemente similares.p < 0.05: existen indicios de varianzas
diferentes.La independencia depende principalmente de cómo fue diseñado y ejecutado el experimento.
Podemos observar los residuos en el orden de los datos:
plot(
residuos,
pch = 19,
xlab = "Orden de las observaciones",
ylab = "Residuos",
main = "Residuos según orden de observación"
)
abline(h = 0, lty = 2)
Esperamos observar puntos distribuidos aproximadamente al azar alrededor de cero.
Una conclusión sencilla podría redactarse así:
El análisis de varianza mostró que los tratamientos asociados con infección viral producen diferencias significativas en el rendimiento del camote. La comparación de medias permite identificar cuáles tratamientos presentan rendimientos estadísticamente similares y cuáles son diferentes. En términos agronómicos, los tratamientos con menor rendimiento evidencian un mayor efecto negativo de la infección viral sobre la producción.
La pregunta central del ANOVA es:
¿Las diferencias que observamos entre las medias son suficientemente grandes como para atribuirlas a los tratamientos y no solamente al azar?
El ANOVA responde primero si existen diferencias generales.
La comparación de medias responde después:
¿Entre cuáles tratamientos están esas diferencias?