El diseño factorial de dos factores constituye una de las estructuras más importantes dentro del diseño de experimentos, debido a que permite estudiar de manera simultánea el efecto de dos factores sobre una variable respuesta. Su principal fortaleza radica en que no solo permite evaluar los efectos principales de cada factor, sino también la posible interacción entre ellos. Desde una perspectiva aplicada, esta característica resulta esencial, ya que en numerosos procesos reales el comportamiento de un factor depende del nivel en que se encuentre el otro.
En este documento se presentan varios ejemplos completos de diseño factorial de dos factores. En cada caso se sigue el mismo orden metodológico: primero se expone el proceso estadístico y matemático de forma detallada, y posteriormente se muestra la implementación en RStudio. De esta manera, el material puede ser utilizado tanto para la enseñanza conceptual como para la validación computacional de los resultados.
En un diseño factorial de dos factores se estudian:
El número total de observaciones es:
\[ N = abr \]
Cada tratamiento corresponde a una combinación entre un nivel del factor \(A\) y un nivel del factor \(B\). Por tanto, el número total de combinaciones es:
\[ a \times b \]
El modelo lineal para un diseño factorial de dos factores con replicación es:
\[ Y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \varepsilon_{ijk} \]
siendo:
\[ H_0: \alpha_1 = \alpha_2 = \cdots = \alpha_a = 0 \]
\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_b = 0 \]
\[ H_0: (\alpha\beta)_{ij} = 0 \quad \text{para todo } i,j \]
La suma de cuadrados total se descompone de la siguiente manera:
\[ SC_T = SC_A + SC_B + SC_{AB} + SC_E \]
Donde:
\[ SC_T = \sum y_{ijk}^2 - \frac{T^2}{N} \]
\[ SC_A = br \sum_{i=1}^{a}(\bar Y_{i..} - \bar Y_{...})^2 \]
\[ SC_B = ar \sum_{j=1}^{b}(\bar Y_{.j.} - \bar Y_{...})^2 \]
\[ SC_{AB} = r \sum_{i=1}^{a}\sum_{j=1}^{b}(\bar Y_{ij.} - \bar Y_{i..} - \bar Y_{.j.} + \bar Y_{...})^2 \]
\[ SC_E = SC_T - SC_A - SC_B - SC_{AB} \]
\[ gl_A = a - 1 \]
\[ gl_B = b - 1 \]
\[ gl_{AB} = (a - 1)(b - 1) \]
\[ gl_E = ab(r - 1) \]
\[ gl_T = abr - 1 \]
\[ CM_A = \frac{SC_A}{gl_A}, \quad CM_B = \frac{SC_B}{gl_B}, \quad CM_{AB} = \frac{SC_{AB}}{gl_{AB}}, \quad CM_E = \frac{SC_E}{gl_E} \]
\[ F_A = \frac{CM_A}{CM_E}, \quad F_B = \frac{CM_B}{CM_E}, \quad F_{AB} = \frac{CM_{AB}}{CM_E} \]
Se desea estudiar el efecto del tipo de fertilizante y del nivel de riego sobre la altura de una planta. Se consideran dos factores:
La variable respuesta es la altura de la planta en centímetros. Se tienen \(2\) repeticiones por tratamiento.
| Fertilizante | Riego | Observaciones |
|---|---|---|
| A1 | B1 | 20, 22 |
| A1 | B2 | 25, 27 |
| A1 | B3 | 24, 26 |
| A2 | B1 | 23, 25 |
| A2 | B2 | 28, 30 |
| A2 | B3 | 35, 37 |
\[ a = 2, \quad b = 3, \quad r = 2, \quad N = abr = 12 \]
\[ \bar Y_{11.} = \frac{20 + 22}{2} = 21 \]
\[ \bar Y_{12.} = \frac{25 + 27}{2} = 26 \]
\[ \bar Y_{13.} = \frac{24 + 26}{2} = 25 \]
\[ \bar Y_{21.} = \frac{23 + 25}{2} = 24 \]
\[ \bar Y_{22.} = \frac{28 + 30}{2} = 29 \]
\[ \bar Y_{23.} = \frac{35 + 37}{2} = 36 \]
| Fertilizante | B1 | B2 | B3 |
|---|---|---|---|
| A1 | 21 | 26 | 25 |
| A2 | 24 | 29 | 36 |
Para el factor \(A\):
\[ \bar Y_{1..} = \frac{144}{6} = 24 \]
\[ \bar Y_{2..} = \frac{178}{6} = 29.6667 \]
Para el factor \(B\):
\[ \bar Y_{.1.} = \frac{20 + 22 + 23 + 25}{4} = 22.5 \]
\[ \bar Y_{.2.} = \frac{25 + 27 + 28 + 30}{4} = 27.5 \]
\[ \bar Y_{.3.} = \frac{24 + 26 + 35 + 37}{4} = 30.5 \]
\[ T = 322, \quad \bar Y_{...} = \frac{322}{12} = 26.8333 \]
\[ \sum y_{ijk}^2 = 8922 \]
\[ SC_T = 8922 - \frac{322^2}{12} = 281.6667 \]
\[ SC_A = 6[(24 - 26.8333)^2 + (29.6667 - 26.8333)^2] = 96.3333 \]
\[ SC_B = 4[(22.5 - 26.8333)^2 + (27.5 - 26.8333)^2 + (30.5 - 26.8333)^2] = 130.6667 \]
\[ SC_{AB} = 2 \sum_{i=1}^{2}\sum_{j=1}^{3}(\bar Y_{ij.} - \bar Y_{i..} - \bar Y_{.j.} + \bar Y_{...})^2 = 42.6667 \]
\[ SC_E = 281.6667 - 96.3333 - 130.6667 - 42.6667 = 12 \]
\[ gl_A = 1, \quad gl_B = 2, \quad gl_{AB} = 2, \quad gl_E = 6, \quad gl_T = 11 \]
\[ CM_A = 96.3333 \]
\[ CM_B = 65.3333 \]
\[ CM_{AB} = 21.3333 \]
\[ CM_E = 2 \]
\[ F_A = \frac{96.3333}{2} = 48.1667 \]
\[ F_B = \frac{65.3333}{2} = 32.6667 \]
\[ F_{AB} = \frac{21.3333}{2} = 10.6667 \]
| Fuente de variación | SC | gl | CM | F |
|---|---|---|---|---|
| Fertilizante | 96.3333 | 1 | 96.3333 | 48.1667 |
| Riego | 130.6667 | 2 | 65.3333 | 32.6667 |
| Interacción | 42.6667 | 2 | 21.3333 | 10.6667 |
| Error | 12.0000 | 6 | 2.0000 | |
| Total | 281.6667 | 11 |
Se concluye que el tipo de fertilizante influye sobre la altura de la planta, que el nivel de riego también produce diferencias importantes y que, además, existe interacción entre ambos factores. Esto significa que el efecto del fertilizante depende del nivel de riego empleado.
datos <- data.frame(
Fertilizante = factor(c("A1","A1","A1","A1","A1","A1",
"A2","A2","A2","A2","A2","A2")),
Riego = factor(c("B1","B1","B2","B2","B3","B3",
"B1","B1","B2","B2","B3","B3")),
Altura = c(20,22,25,27,24,26,23,25,28,30,35,37)
)
datos
## Fertilizante Riego Altura
## 1 A1 B1 20
## 2 A1 B1 22
## 3 A1 B2 25
## 4 A1 B2 27
## 5 A1 B3 24
## 6 A1 B3 26
## 7 A2 B1 23
## 8 A2 B1 25
## 9 A2 B2 28
## 10 A2 B2 30
## 11 A2 B3 35
## 12 A2 B3 37
str(datos)
## 'data.frame': 12 obs. of 3 variables:
## $ Fertilizante: Factor w/ 2 levels "A1","A2": 1 1 1 1 1 1 2 2 2 2 ...
## $ Riego : Factor w/ 3 levels "B1","B2","B3": 1 1 2 2 3 3 1 1 2 2 ...
## $ Altura : num 20 22 25 27 24 26 23 25 28 30 ...
aggregate(Altura ~ Fertilizante + Riego, data = datos, mean)
## Fertilizante Riego Altura
## 1 A1 B1 21
## 2 A2 B1 24
## 3 A1 B2 26
## 4 A2 B2 29
## 5 A1 B3 25
## 6 A2 B3 36
modelo <- aov(Altura ~ Fertilizante * Riego, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizante 1 96.33 96.33 48.17 0.000444 ***
## Riego 2 130.67 65.33 32.67 0.000595 ***
## Fertilizante:Riego 2 42.67 21.33 10.67 0.010577 *
## Residuals 6 12.00 2.00
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
aggregate(Altura ~ Fertilizante, data = datos, mean)
## Fertilizante Altura
## 1 A1 24.00000
## 2 A2 29.66667
aggregate(Altura ~ Riego, data = datos, mean)
## Riego Altura
## 1 B1 22.5
## 2 B2 27.5
## 3 B3 30.5
interaction.plot(
x.factor = datos$Riego,
trace.factor = datos$Fertilizante,
response = datos$Altura,
fun = mean,
type = "b",
col = c(1, 2),
pch = c(16, 17),
xlab = "Nivel de riego",
ylab = "Altura promedio",
trace.label = "Fertilizante"
)
library(ggplot2)
ggplot(datos, aes(x = Riego, y = Altura, color = Fertilizante, group = Fertilizante)) +
stat_summary(fun = mean, geom = "point", size = 3) +
stat_summary(fun = mean, geom = "line", linewidth = 1) +
labs(
title = "Gráfica de interacción",
x = "Nivel de riego",
y = "Altura promedio"
) +
theme_minimal()
ggplot(datos, aes(x = interaction(Fertilizante, Riego), y = Altura, fill = Fertilizante)) +
geom_boxplot() +
labs(
title = "Distribución de la altura por tratamiento",
x = "Tratamientos",
y = "Altura"
) +
theme_minimal()
residuos <- residuals(modelo)
qqnorm(residuos)
qqline(residuos)
hist(residuos, main = "Histograma de residuos", xlab = "Residuos")
plot(modelo, which = 1)
Se desea estudiar el rendimiento de un cultivo de tomate evaluando dos factores:
La variable respuesta es el rendimiento por parcela en kilogramos. Se realizan \(3\) repeticiones por tratamiento.
| Fertilizante | Riego | Rendimiento |
|---|---|---|
| F1 | R1 | 40 |
| F1 | R1 | 42 |
| F1 | R1 | 41 |
| F1 | R2 | 48 |
| F1 | R2 | 50 |
| F1 | R2 | 49 |
| F1 | R3 | 51 |
| F1 | R3 | 52 |
| F1 | R3 | 53 |
| F2 | R1 | 44 |
| F2 | R1 | 45 |
| F2 | R1 | 46 |
| F2 | R2 | 55 |
| F2 | R2 | 56 |
| F2 | R2 | 54 |
| F2 | R3 | 65 |
| F2 | R3 | 66 |
| F2 | R3 | 64 |
\[ a = 2, \quad b = 3, \quad r = 3, \quad N = 18 \]
\[ \bar Y_{11.} = 41, \quad \bar Y_{12.} = 49, \quad \bar Y_{13.} = 52 \]
\[ \bar Y_{21.} = 45, \quad \bar Y_{22.} = 55, \quad \bar Y_{23.} = 65 \]
| Fertilizante | R1 | R2 | R3 |
|---|---|---|---|
| F1 | 41 | 49 | 52 |
| F2 | 45 | 55 | 65 |
Para el factor \(A\):
\[ \bar Y_{1..} = \frac{41 + 49 + 52}{3} = 47.3333 \]
\[ \bar Y_{2..} = \frac{45 + 55 + 65}{3} = 55 \]
Para el factor \(B\):
\[ \bar Y_{.1.} = 43, \quad \bar Y_{.2.} = 52, \quad \bar Y_{.3.} = 58.5 \]
\[ \bar Y_{...} = \frac{41 + 49 + 52 + 45 + 55 + 65}{6} = 51.1667 \]
La diferencia entre fertilizantes no es constante en todos los niveles de riego:
\[ 45 - 41 = 4, \quad 55 - 49 = 6, \quad 65 - 52 = 13 \]
Por tanto, la superioridad del fertilizante \(F_2\) aumenta conforme el riego es más alto, lo cual sugiere interacción.
datos2 <- data.frame(
Fertilizante = factor(c(rep("F1", 9), rep("F2", 9))),
Riego = factor(c(rep(c("R1", "R2", "R3"), each = 3),
rep(c("R1", "R2", "R3"), each = 3))),
Rendimiento = c(40,42,41, 48,50,49, 51,52,53,
44,45,46, 55,56,54, 65,66,64)
)
datos2
## Fertilizante Riego Rendimiento
## 1 F1 R1 40
## 2 F1 R1 42
## 3 F1 R1 41
## 4 F1 R2 48
## 5 F1 R2 50
## 6 F1 R2 49
## 7 F1 R3 51
## 8 F1 R3 52
## 9 F1 R3 53
## 10 F2 R1 44
## 11 F2 R1 45
## 12 F2 R1 46
## 13 F2 R2 55
## 14 F2 R2 56
## 15 F2 R2 54
## 16 F2 R3 65
## 17 F2 R3 66
## 18 F2 R3 64
str(datos2)
## 'data.frame': 18 obs. of 3 variables:
## $ Fertilizante: Factor w/ 2 levels "F1","F2": 1 1 1 1 1 1 1 1 1 2 ...
## $ Riego : Factor w/ 3 levels "R1","R2","R3": 1 1 1 2 2 2 3 3 3 1 ...
## $ Rendimiento : num 40 42 41 48 50 49 51 52 53 44 ...
aggregate(Rendimiento ~ Fertilizante + Riego, data = datos2, mean)
## Fertilizante Riego Rendimiento
## 1 F1 R1 41
## 2 F2 R1 45
## 3 F1 R2 49
## 4 F2 R2 55
## 5 F1 R3 52
## 6 F2 R3 65
modelo2 <- aov(Rendimiento ~ Fertilizante * Riego, data = datos2)
summary(modelo2)
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizante 1 264.5 264.5 264.5 1.54e-09 ***
## Riego 2 727.0 363.5 363.5 1.83e-11 ***
## Fertilizante:Riego 2 67.0 33.5 33.5 1.23e-05 ***
## Residuals 12 12.0 1.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
aggregate(Rendimiento ~ Fertilizante, data = datos2, mean)
## Fertilizante Rendimiento
## 1 F1 47.33333
## 2 F2 55.00000
aggregate(Rendimiento ~ Riego, data = datos2, mean)
## Riego Rendimiento
## 1 R1 43.0
## 2 R2 52.0
## 3 R3 58.5
ggplot(datos2, aes(x = Riego, y = Rendimiento, color = Fertilizante, group = Fertilizante)) +
stat_summary(fun = mean, geom = "point", size = 3) +
stat_summary(fun = mean, geom = "line", linewidth = 1) +
labs(
title = "Interacción: fertilizante y riego",
x = "Nivel de riego",
y = "Rendimiento promedio (kg)"
) +
theme_minimal()
ggplot(datos2, aes(x = interaction(Fertilizante, Riego), y = Rendimiento, fill = Fertilizante)) +
geom_boxplot() +
labs(
title = "Rendimiento por combinación de tratamientos",
x = "Tratamientos",
y = "Rendimiento"
) +
theme_minimal()
residuos2 <- residuals(modelo2)
qqnorm(residuos2)
qqline(residuos2)
hist(residuos2, main = "Histograma de residuos", xlab = "Residuos")
plot(modelo2, which = 1)
TukeyHSD(modelo2)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rendimiento ~ Fertilizante * Riego, data = datos2)
##
## $Fertilizante
## diff lwr upr p adj
## F2-F1 7.666667 6.639564 8.693769 0
##
## $Riego
## diff lwr upr p adj
## R2-R1 9.0 7.459708 10.540292 0e+00
## R3-R1 15.5 13.959708 17.040292 0e+00
## R3-R2 6.5 4.959708 8.040292 3e-07
##
## $`Fertilizante:Riego`
## diff lwr upr p adj
## F2:R1-F1:R1 4 1.2574526 6.7425474 0.0038099
## F1:R2-F1:R1 8 5.2574526 10.7425474 0.0000052
## F2:R2-F1:R1 14 11.2574526 16.7425474 0.0000000
## F1:R3-F1:R1 11 8.2574526 13.7425474 0.0000002
## F2:R3-F1:R1 24 21.2574526 26.7425474 0.0000000
## F1:R2-F2:R1 4 1.2574526 6.7425474 0.0038099
## F2:R2-F2:R1 10 7.2574526 12.7425474 0.0000005
## F1:R3-F2:R1 7 4.2574526 9.7425474 0.0000213
## F2:R3-F2:R1 20 17.2574526 22.7425474 0.0000000
## F2:R2-F1:R2 6 3.2574526 8.7425474 0.0001009
## F1:R3-F1:R2 3 0.2574526 5.7425474 0.0294028
## F2:R3-F1:R2 16 13.2574526 18.7425474 0.0000000
## F1:R3-F2:R2 -3 -5.7425474 -0.2574526 0.0294028
## F2:R3-F2:R2 10 7.2574526 12.7425474 0.0000005
## F2:R3-F1:R3 13 10.2574526 15.7425474 0.0000000
En una granja porcina se desea estudiar el efecto de dos factores sobre la ganancia de peso de los cerdos durante el periodo de engorde:
La variable respuesta es la ganancia de peso en kilogramos. Se toman \(3\) repeticiones por combinación.
| Alimento | Frecuencia | Observaciones |
|---|---|---|
| A1 | B1 | 18, 19, 21 |
| A1 | B2 | 21, 22, 24 |
| A1 | B3 | 22, 24, 25 |
| A2 | B1 | 20, 21, 23 |
| A2 | B2 | 24, 25, 27 |
| A2 | B3 | 27, 29, 31 |
\[ a = 2, \quad b = 3, \quad r = 3, \quad N = 18 \]
\[ \bar Y_{11.} = \frac{58}{3} = 19.3333 \]
\[ \bar Y_{12.} = \frac{67}{3} = 22.3333 \]
\[ \bar Y_{13.} = \frac{71}{3} = 23.6667 \]
\[ \bar Y_{21.} = \frac{64}{3} = 21.3333 \]
\[ \bar Y_{22.} = \frac{76}{3} = 25.3333 \]
\[ \bar Y_{23.} = \frac{87}{3} = 29 \]
| Alimento | B1 | B2 | B3 |
|---|---|---|---|
| A1 | 19.3333 | 22.3333 | 23.6667 |
| A2 | 21.3333 | 25.3333 | 29.0000 |
Para el factor \(A\):
\[ \bar Y_{1..} = \frac{196}{9} = 21.7778 \]
\[ \bar Y_{2..} = \frac{227}{9} = 25.2222 \]
Para el factor \(B\):
\[ \bar Y_{.1.} = \frac{122}{6} = 20.3333 \]
\[ \bar Y_{.2.} = \frac{143}{6} = 23.8333 \]
\[ \bar Y_{.3.} = \frac{158}{6} = 26.3333 \]
\[ T = 423, \quad \bar Y_{...} = \frac{423}{18} = 23.5 \]
\[ \sum y_{ijk}^2 = 10143 \]
\[ SC_T = 10143 - \frac{423^2}{18} = 202.5 \]
\[ SC_A = 9[(21.7778 - 23.5)^2 + (25.2222 - 23.5)^2] = 53.3889 \]
\[ SC_B = 6[(20.3333 - 23.5)^2 + (23.8333 - 23.5)^2 + (26.3333 - 23.5)^2] = 109 \]
\[ SC_{AB} = 3 \sum_{i=1}^{2}\sum_{j=1}^{3}(\bar Y_{ij.} - \bar Y_{i..} - \bar Y_{.j.} + \bar Y_{...})^2 = 8.7778 \]
\[ SC_E = 202.5 - 53.3889 - 109 - 8.7778 = 31.3333 \]
\[ gl_A = 1, \quad gl_B = 2, \quad gl_{AB} = 2, \quad gl_E = 12, \quad gl_T = 17 \]
\[ CM_A = 53.3889 \]
\[ CM_B = 54.5 \]
\[ CM_{AB} = 4.3889 \]
\[ CM_E = 2.6111 \]
\[ F_A = \frac{53.3889}{2.6111} = 20.4468 \]
\[ F_B = \frac{54.5}{2.6111} = 20.8723 \]
\[ F_{AB} = \frac{4.3889}{2.6111} = 1.6809 \]
| Fuente de variación | SC | gl | CM | F |
|---|---|---|---|---|
| Alimento | 53.3889 | 1 | 53.3889 | 20.4468 |
| Frecuencia | 109.0000 | 2 | 54.5000 | 20.8723 |
| Interacción | 8.7778 | 2 | 4.3889 | 1.6809 |
| Error | 31.3333 | 12 | 2.6111 | |
| Total | 202.5000 | 17 |
Se concluye que el tipo de alimento y la frecuencia de alimentación influyen sobre la ganancia de peso. Sin embargo, en este ejemplo la interacción no es dominante, lo que permite interpretar con mayor claridad los efectos principales.
datos_cerdos <- data.frame(
Alimento = factor(c(rep("A1", 9), rep("A2", 9))),
Frecuencia = factor(c(rep(c("B1", "B2", "B3"), each = 3),
rep(c("B1", "B2", "B3"), each = 3))),
Ganancia = c(18,19,21,
21,22,24,
22,24,25,
20,21,23,
24,25,27,
27,29,31)
)
datos_cerdos
## Alimento Frecuencia Ganancia
## 1 A1 B1 18
## 2 A1 B1 19
## 3 A1 B1 21
## 4 A1 B2 21
## 5 A1 B2 22
## 6 A1 B2 24
## 7 A1 B3 22
## 8 A1 B3 24
## 9 A1 B3 25
## 10 A2 B1 20
## 11 A2 B1 21
## 12 A2 B1 23
## 13 A2 B2 24
## 14 A2 B2 25
## 15 A2 B2 27
## 16 A2 B3 27
## 17 A2 B3 29
## 18 A2 B3 31
str(datos_cerdos)
## 'data.frame': 18 obs. of 3 variables:
## $ Alimento : Factor w/ 2 levels "A1","A2": 1 1 1 1 1 1 1 1 1 2 ...
## $ Frecuencia: Factor w/ 3 levels "B1","B2","B3": 1 1 1 2 2 2 3 3 3 1 ...
## $ Ganancia : num 18 19 21 21 22 24 22 24 25 20 ...
aggregate(Ganancia ~ Alimento + Frecuencia, data = datos_cerdos, mean)
## Alimento Frecuencia Ganancia
## 1 A1 B1 19.33333
## 2 A2 B1 21.33333
## 3 A1 B2 22.33333
## 4 A2 B2 25.33333
## 5 A1 B3 23.66667
## 6 A2 B3 29.00000
modelo_cerdos <- aov(Ganancia ~ Alimento * Frecuencia, data = datos_cerdos)
summary(modelo_cerdos)
## Df Sum Sq Mean Sq F value Pr(>F)
## Alimento 1 53.39 53.39 20.447 0.000700 ***
## Frecuencia 2 109.00 54.50 20.872 0.000124 ***
## Alimento:Frecuencia 2 8.78 4.39 1.681 0.227223
## Residuals 12 31.33 2.61
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
aggregate(Ganancia ~ Alimento, data = datos_cerdos, mean)
## Alimento Ganancia
## 1 A1 21.77778
## 2 A2 25.22222
aggregate(Ganancia ~ Frecuencia, data = datos_cerdos, mean)
## Frecuencia Ganancia
## 1 B1 20.33333
## 2 B2 23.83333
## 3 B3 26.33333
ggplot(datos_cerdos,
aes(x = Frecuencia, y = Ganancia,
color = Alimento, group = Alimento)) +
stat_summary(fun = mean, geom = "point", size = 3) +
stat_summary(fun = mean, geom = "line", linewidth = 1) +
labs(
title = "Interacción en crianza de cerdos",
x = "Frecuencia de alimentación",
y = "Ganancia de peso (kg)"
) +
theme_minimal()
ggplot(datos_cerdos,
aes(x = interaction(Alimento, Frecuencia),
y = Ganancia,
fill = Alimento)) +
geom_boxplot() +
labs(
title = "Ganancia de peso por tratamiento",
x = "Tratamientos",
y = "Ganancia de peso (kg)"
) +
theme_minimal()
residuos_cerdos <- residuals(modelo_cerdos)
qqnorm(residuos_cerdos)
qqline(residuos_cerdos)
hist(residuos_cerdos, main = "Histograma de residuos", xlab = "Residuos")
plot(modelo_cerdos, which = 1)