Se desea determinar si la biomasa seca media de Arabidopsis thaliana difiere entre cuatro dosis de nitrógeno: N0, N50, N100 y N150. El diseño es un DCA con 24 unidades experimentales, 6 réplicas por tratamiento.
datos1 <- data.frame(
Tratamiento = rep(c("N0", "N50", "N100", "N150"), each = 6),
Biomasa = c(
0.42, 0.39, 0.47, 0.44, 0.41, 0.45,
0.58, 0.55, 0.62, 0.60, 0.57, 0.63,
0.74, 0.72, 0.78, 0.80, 0.75, 0.77,
0.70, 0.68, 0.73, 0.71, 0.69, 0.74
)
)
datos1
## Tratamiento Biomasa
## 1 N0 0.42
## 2 N0 0.39
## 3 N0 0.47
## 4 N0 0.44
## 5 N0 0.41
## 6 N0 0.45
## 7 N50 0.58
## 8 N50 0.55
## 9 N50 0.62
## 10 N50 0.60
## 11 N50 0.57
## 12 N50 0.63
## 13 N100 0.74
## 14 N100 0.72
## 15 N100 0.78
## 16 N100 0.80
## 17 N100 0.75
## 18 N100 0.77
## 19 N150 0.70
## 20 N150 0.68
## 21 N150 0.73
## 22 N150 0.71
## 23 N150 0.69
## 24 N150 0.74
El modelo para el DCA es:
\[ Y_{ij} = \mu + \tau_i + \varepsilon_{ij}, \qquad \varepsilon_{ij} \sim N(0,\sigma^2) \]
Donde:
Hipótesis:
\[ H_0: \mu_{N0} = \mu_{N50} = \mu_{N100} = \mu_{N150} \]
\[ H_1: \text{al menos una media difiere} \]
mod1 <- aov(Biomasa ~ Tratamiento, data = datos1)
summary(mod1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Tratamiento 3 0.3857 0.12856 163.1 3.17e-14 ***
## Residuals 20 0.0158 0.00079
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación. El valor-p del factor Tratamiento es menor que 0.05, por lo tanto se rechaza la hipótesis nula. Existe evidencia estadística de que la biomasa media difiere entre las dosis de nitrógeno.
par(mfrow = c(2,2))
plot(mod1)
par(mfrow = c(1,1))
shapiro.test(residuals(mod1))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod1)
## W = 0.94374, p-value = 0.1975
leveneTest(Biomasa ~ Tratamiento, data = datos1)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 0.2817 0.838
## 20
Conclusión sobre supuestos.
tukey1 <- TukeyHSD(mod1)
tukey1
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Biomasa ~ Tratamiento, data = datos1)
##
## $Tratamiento
## diff lwr upr p adj
## N100-N0 0.33000000 0.2846281 0.375371936 0.0000000
## N150-N0 0.27833333 0.2329614 0.323705269 0.0000000
## N50-N0 0.16166667 0.1162947 0.207038602 0.0000000
## N150-N100 -0.05166667 -0.0970386 -0.006294731 0.0220847
## N50-N100 -0.16833333 -0.2137053 -0.122961398 0.0000000
## N50-N150 -0.11666667 -0.1620386 -0.071294731 0.0000032
medias1 <- datos1 %>%
group_by(Tratamiento) %>%
summarise(
Media = mean(Biomasa),
DE = sd(Biomasa)
)
letras1 <- multcompLetters4(mod1, tukey1)
letras1_df <- data.frame(
Tratamiento = names(letras1$Tratamiento$Letters),
Grupo = letras1$Tratamiento$Letters
)
resumen1 <- left_join(medias1, letras1_df, by = "Tratamiento") %>%
arrange(desc(Media))
kable(resumen1, digits = 3,
caption = "Medias, desviaciones estándar y grupos de Tukey - Ejercicio 1") %>%
kable_styling(full_width = FALSE)
| Tratamiento | Media | DE | Grupo |
|---|---|---|---|
| N100 | 0.760 | 0.029 | a |
| N150 | 0.708 | 0.023 | b |
| N50 | 0.592 | 0.031 | c |
| N0 | 0.430 | 0.029 | d |
Interpretación. Todas las comparaciones por pares resultan significativas. El mayor promedio de biomasa se observa en N100, seguido de N150, luego N50 y finalmente N0. Por tanto, la dosis intermedia-alta (N100) produjo la mayor biomasa promedio.
ggplot(datos1, aes(x = Tratamiento, y = Biomasa, fill = Tratamiento)) +
geom_boxplot(alpha = 0.8) +
theme_minimal() +
labs(
title = "Biomasa seca por tratamiento de nitrógeno",
x = "Tratamiento",
y = "Biomasa seca (g)"
) +
theme(legend.position = "none")
Comentario del gráfico. La variabilidad dentro de cada tratamiento es baja y no se aprecian valores atípicos marcados. Se observa una clara separación entre tratamientos, especialmente entre N0 y los niveles superiores de nitrógeno.
La dosis de nitrógeno influye significativamente sobre la biomasa seca de las plántulas. En estos datos, la dosis N100 produjo la mayor biomasa promedio, mientras que N0 mostró el menor crecimiento. Biológicamente, esto sugiere que una fertilización intermedia-alta favorece el desarrollo de las plántulas, aunque incrementar de N100 a N150 no mejora la respuesta, sino que la reduce ligeramente.
Se desea evaluar diferencias en el rendimiento de tomate entre cuatro métodos de control biológico, controlando la variabilidad entre lotes mediante bloques. El diseño es un DBCA con 4 tratamientos y 6 bloques. fileciteturn0file0L27-L43
datos2 <- data.frame(
Bloque = rep(paste0("B", 1:6), times = 4),
Tratamiento = rep(c("Depredadores", "Hongos", "Extracto", "ControlQ"), each = 6),
Rendimiento = c(
5.9, 6.1, 6.0, 6.3, 6.2, 6.1,
5.5, 5.7, 5.6, 5.8, 5.7, 5.6,
5.2, 5.3, 5.4, 5.5, 5.4, 5.3,
6.0, 6.2, 6.1, 6.4, 6.3, 6.2
)
)
datos2
## Bloque Tratamiento Rendimiento
## 1 B1 Depredadores 5.9
## 2 B2 Depredadores 6.1
## 3 B3 Depredadores 6.0
## 4 B4 Depredadores 6.3
## 5 B5 Depredadores 6.2
## 6 B6 Depredadores 6.1
## 7 B1 Hongos 5.5
## 8 B2 Hongos 5.7
## 9 B3 Hongos 5.6
## 10 B4 Hongos 5.8
## 11 B5 Hongos 5.7
## 12 B6 Hongos 5.6
## 13 B1 Extracto 5.2
## 14 B2 Extracto 5.3
## 15 B3 Extracto 5.4
## 16 B4 Extracto 5.5
## 17 B5 Extracto 5.4
## 18 B6 Extracto 5.3
## 19 B1 ControlQ 6.0
## 20 B2 ControlQ 6.2
## 21 B3 ControlQ 6.1
## 22 B4 ControlQ 6.4
## 23 B5 ControlQ 6.3
## 24 B6 ControlQ 6.2
El modelo del DBCA es:
\[ Y_{ij} = \mu + \tau_i + \beta_j + \varepsilon_{ij}, \qquad \varepsilon_{ij} \sim N(0,\sigma^2) \]
Donde:
Hipótesis para tratamiento:
\[ H_0: \mu_1 = \mu_2 = \mu_3 = \mu_4 \]
Hipótesis para bloque:
\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_6 = 0 \]
mod2 <- aov(Rendimiento ~ Tratamiento + Bloque, data = datos2)
summary(mod2)
## Df Sum Sq Mean Sq F value Pr(>F)
## Tratamiento 3 2.835 0.945 472.5 4.56e-15 ***
## Bloque 5 0.280 0.056 28.0 4.21e-07 ***
## Residuals 15 0.030 0.002
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación. Tanto el factor Tratamiento como el factor Bloque presentan valores-p menores que 0.05. Entonces:
par(mfrow = c(2,2))
plot(mod2)
par(mfrow = c(1,1))
shapiro.test(residuals(mod2))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod2)
## W = 0.88983, p-value = 0.01318
leveneTest(Rendimiento ~ Tratamiento, data = datos2)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 0.1042 0.9567
## 20
Conclusión sobre supuestos.
mod2_trat <- aov(Rendimiento ~ Tratamiento, data = datos2)
tukey2 <- TukeyHSD(mod2_trat)
tukey2
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rendimiento ~ Tratamiento, data = datos2)
##
## $Tratamiento
## diff lwr upr p adj
## Depredadores-ControlQ -0.10 -0.30118621 0.1011862 0.5189818
## Extracto-ControlQ -0.85 -1.05118621 -0.6488138 0.0000000
## Hongos-ControlQ -0.55 -0.75118621 -0.3488138 0.0000013
## Extracto-Depredadores -0.75 -0.95118621 -0.5488138 0.0000000
## Hongos-Depredadores -0.45 -0.65118621 -0.2488138 0.0000228
## Hongos-Extracto 0.30 0.09881379 0.5011862 0.0024351
medias2 <- datos2 %>%
group_by(Tratamiento) %>%
summarise(
Media = mean(Rendimiento),
DE = sd(Rendimiento)
)
letras2 <- multcompLetters4(mod2_trat, tukey2)
letras2_df <- data.frame(
Tratamiento = names(letras2$Tratamiento$Letters),
Grupo = letras2$Tratamiento$Letters
)
resumen2 <- left_join(medias2, letras2_df, by = "Tratamiento") %>%
arrange(desc(Media))
kable(resumen2, digits = 3,
caption = "Medias, desviaciones estándar y grupos de Tukey - Ejercicio 2") %>%
kable_styling(full_width = FALSE)
| Tratamiento | Media | DE | Grupo |
|---|---|---|---|
| ControlQ | 6.20 | 0.141 | a |
| Depredadores | 6.10 | 0.141 | a |
| Hongos | 5.65 | 0.105 | b |
| Extracto | 5.35 | 0.105 | c |
Interpretación.
ggplot(datos2, aes(x = Tratamiento, y = Rendimiento, fill = Tratamiento)) +
stat_summary(fun = mean, geom = "bar", color = "black") +
stat_summary(fun.data = mean_cl_normal, geom = "errorbar", width = 0.2) +
theme_minimal() +
labs(
title = "Rendimiento medio por tratamiento",
x = "Tratamiento",
y = "Rendimiento (kg/parcela)"
) +
theme(legend.position = "none")
Para mostrar el efecto del bloqueo, comparamos el modelo DBCA con un DCA hipotético sin bloques.
mod2_sin_bloque <- aov(Rendimiento ~ Tratamiento, data = datos2)
anova(mod2_sin_bloque)
## Analysis of Variance Table
##
## Response: Rendimiento
## Df Sum Sq Mean Sq F value Pr(>F)
## Tratamiento 3 2.835 0.9450 60.968 3.057e-10 ***
## Residuals 20 0.310 0.0155
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod2)
## Analysis of Variance Table
##
## Response: Rendimiento
## Df Sum Sq Mean Sq F value Pr(>F)
## Tratamiento 3 2.835 0.945 472.5 4.558e-15 ***
## Bloque 5 0.280 0.056 28.0 4.207e-07 ***
## Residuals 15 0.030 0.002
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Discusión. En el modelo sin bloques, la suma de cuadrados residual es mayor. Al incorporar el bloque, parte de la variabilidad atribuible a diferencias entre lotes se separa del error experimental. Esto reduce el error residual y aumenta la precisión para detectar diferencias entre tratamientos. Aquí el bloqueo fue útil porque los lotes sí presentaban diferencias sistemáticas.
Conclusión biológica
El método de control aplicado influye significativamente en el rendimiento del tomate. Los tratamientos ControlQ y Depredadores presentaron los mayores rendimientos, mientras que Extracto tuvo el menor desempeño. Además, el efecto de los lotes fue significativo, indicando que la fertilidad inicial o las condiciones del terreno afectaron la respuesta y que el bloqueo fue apropiado.
Se desea determinar si el régimen de luz afecta el contenido de clorofila medido mediante índice SPAD, controlando diferencias entre bancales. El diseño es un DBCA con 3 tratamientos y 5 bloques.
datos3 <- data.frame(
Bloque = rep(paste0("B", 1:5), times = 3),
Luz = rep(c("Baja", "Media", "Alta"), each = 5),
SPAD = c(
31.2, 30.5, 31.0, 30.8, 31.3,
35.0, 34.6, 35.2, 34.8, 35.1,
33.1, 33.3, 33.0, 33.4, 33.2
)
)
datos3
## Bloque Luz SPAD
## 1 B1 Baja 31.2
## 2 B2 Baja 30.5
## 3 B3 Baja 31.0
## 4 B4 Baja 30.8
## 5 B5 Baja 31.3
## 6 B1 Media 35.0
## 7 B2 Media 34.6
## 8 B3 Media 35.2
## 9 B4 Media 34.8
## 10 B5 Media 35.1
## 11 B1 Alta 33.1
## 12 B2 Alta 33.3
## 13 B3 Alta 33.0
## 14 B4 Alta 33.4
## 15 B5 Alta 33.2
mod3 <- aov(SPAD ~ Luz + Bloque, data = datos3)
summary(mod3)
## Df Sum Sq Mean Sq F value Pr(>F)
## Luz 2 39.81 19.905 333.598 1.97e-08 ***
## Bloque 4 0.27 0.067 1.117 0.412
## Residuals 8 0.48 0.060
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación. El factor Luz presenta un valor-p muy pequeño, por lo que existe evidencia de diferencias en el índice SPAD entre regímenes de luz. En contraste, Bloque no resulta significativo, de modo que los bancales no parecen introducir una variación importante en esta respuesta.
par(mfrow = c(2,2))
plot(mod3)
par(mfrow = c(1,1))
shapiro.test(residuals(mod3))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod3)
## W = 0.91487, p-value = 0.1608
leveneTest(SPAD ~ Luz, data = datos3)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.871 0.4434
## 12
Conclusión sobre supuestos. Los residuales no muestran desviaciones importantes de normalidad y las varianzas entre tratamientos pueden considerarse homogéneas. Por tanto, el ANOVA es adecuado para estos datos.
mod3_trat <- aov(SPAD ~ Luz, data = datos3)
tukey3 <- TukeyHSD(mod3_trat)
tukey3
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = SPAD ~ Luz, data = datos3)
##
## $Luz
## diff lwr upr p adj
## Baja-Alta -2.24 -2.660136 -1.819864 0e+00
## Media-Alta 1.74 1.319864 2.160136 3e-07
## Media-Baja 3.98 3.559864 4.400136 0e+00
medias3 <- datos3 %>%
group_by(Luz) %>%
summarise(
Media = mean(SPAD),
DE = sd(SPAD)
)
letras3 <- multcompLetters4(mod3_trat, tukey3)
letras3_df <- data.frame(
Luz = names(letras3$Luz$Letters),
Grupo = letras3$Luz$Letters
)
resumen3 <- left_join(medias3, letras3_df, by = "Luz") %>%
arrange(desc(Media))
kable(resumen3, digits = 3,
caption = "Medias, desviaciones estándar y grupos de Tukey - Ejercicio 3") %>%
kable_styling(full_width = FALSE)
| Luz | Media | DE | Grupo |
|---|---|---|---|
| Media | 34.94 | 0.241 | a |
| Alta | 33.20 | 0.158 | b |
| Baja | 30.96 | 0.321 | c |
Interpretación. Todas las comparaciones por pares son significativas. El mayor contenido de clorofila se observa bajo Luz Media, seguido de Luz Alta, mientras que Luz Baja presenta el menor valor de SPAD.
ggplot(datos3, aes(x = Luz, y = SPAD, fill = Luz)) +
geom_boxplot(alpha = 0.8) +
theme_minimal() +
labs(
title = "Índice SPAD según régimen de luz",
x = "Régimen de luz",
y = "SPAD"
) +
theme(legend.position = "none")
El régimen de luz afecta significativamente el contenido de clorofila. En estos datos, la luz media genera el mayor índice SPAD, lo que sugiere una condición más favorable para la acumulación de clorofila. La luz baja produce los valores más reducidos, posiblemente por limitación en la actividad fotosintética. La luz alta, aunque supera a la baja, no alcanza los valores observados en el nivel medio, lo que podría sugerir una condición subóptima frente al régimen intermedio.