1 Introducción

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.

2 Fundamentos teóricos del diseño factorial de dos factores

2.1 Estructura general

En un diseño factorial de dos factores se estudian:

  • Un factor \(A\) con \(a\) niveles.
  • Un factor \(B\) con \(b\) niveles.
  • Una variable respuesta \(Y\).
  • \(r\) repeticiones por cada combinación de tratamientos.

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 \]

2.2 Modelo estadístico

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:

  • \(Y_{ijk}\) la respuesta observada en la repetición \(k\), bajo el nivel \(i\) del factor \(A\) y el nivel \(j\) del factor \(B\).
  • \(\mu\) la media general.
  • \(\alpha_i\) el efecto del nivel \(i\) del factor \(A\).
  • \(\beta_j\) el efecto del nivel \(j\) del factor \(B\).
  • \((\alpha\beta)_{ij}\) el efecto de interacción entre ambos factores.
  • \(\varepsilon_{ijk}\) el error experimental, con \(\varepsilon_{ijk} \sim N(0,\sigma^2)\).

2.3 Hipótesis de interés

2.3.1 Para el factor \(A\)

\[ H_0: \alpha_1 = \alpha_2 = \cdots = \alpha_a = 0 \]

2.3.2 Para el factor \(B\)

\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_b = 0 \]

2.3.3 Para la interacción \(A \times B\)

\[ H_0: (\alpha\beta)_{ij} = 0 \quad \text{para todo } i,j \]

2.4 Descomposición de la variabilidad

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} \]

2.5 Grados de libertad

\[ gl_A = a - 1 \]

\[ gl_B = b - 1 \]

\[ gl_{AB} = (a - 1)(b - 1) \]

\[ gl_E = ab(r - 1) \]

\[ gl_T = abr - 1 \]

2.6 Cuadrados medios y razones F

\[ 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} \]

3 Ejemplo 1. Fertilizante y riego sobre la altura de plantas

3.1 Contexto

Se desea estudiar el efecto del tipo de fertilizante y del nivel de riego sobre la altura de una planta. Se consideran dos factores:

  • Factor \(A\): fertilizante.
    • \(A_1\): orgánico.
    • \(A_2\): químico.
  • Factor \(B\): riego.
    • \(B_1\): bajo.
    • \(B_2\): medio.
    • \(B_3\): alto.

La variable respuesta es la altura de la planta en centímetros. Se tienen \(2\) repeticiones por tratamiento.

3.2 Datos experimentales

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

3.3 Proceso estadístico y matemático

3.3.1 Estructura del diseño

\[ a = 2, \quad b = 3, \quad r = 2, \quad N = abr = 12 \]

3.3.2 Medias por celda

\[ \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

3.3.3 Medias marginales

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 \]

3.3.4 Media general

\[ T = 322, \quad \bar Y_{...} = \frac{322}{12} = 26.8333 \]

3.3.5 Suma de cuadrados total

\[ \sum y_{ijk}^2 = 8922 \]

\[ SC_T = 8922 - \frac{322^2}{12} = 281.6667 \]

3.3.6 Suma de cuadrados del factor \(A\)

\[ SC_A = 6[(24 - 26.8333)^2 + (29.6667 - 26.8333)^2] = 96.3333 \]

3.3.7 Suma de cuadrados del factor \(B\)

\[ SC_B = 4[(22.5 - 26.8333)^2 + (27.5 - 26.8333)^2 + (30.5 - 26.8333)^2] = 130.6667 \]

3.3.8 Suma de cuadrados de la interacción

\[ 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 \]

3.3.9 Suma de cuadrados del error

\[ SC_E = 281.6667 - 96.3333 - 130.6667 - 42.6667 = 12 \]

3.3.10 Grados de libertad

\[ gl_A = 1, \quad gl_B = 2, \quad gl_{AB} = 2, \quad gl_E = 6, \quad gl_T = 11 \]

3.3.11 Cuadrados medios

\[ CM_A = 96.3333 \]

\[ CM_B = 65.3333 \]

\[ CM_{AB} = 21.3333 \]

\[ CM_E = 2 \]

3.3.12 Estadísticos F

\[ F_A = \frac{96.3333}{2} = 48.1667 \]

\[ F_B = \frac{65.3333}{2} = 32.6667 \]

\[ F_{AB} = \frac{21.3333}{2} = 10.6667 \]

3.3.13 Tabla ANOVA

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

3.3.14 Interpretación

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.

3.4 Desarrollo en RStudio

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)

4 Ejemplo 2. Fertilizante y riego sobre el rendimiento de tomate

4.1 Contexto

Se desea estudiar el rendimiento de un cultivo de tomate evaluando dos factores:

  • Factor \(A\): tipo de fertilizante.
    • \(F_1\): orgánico.
    • \(F_2\): mineral.
  • Factor \(B\): frecuencia de riego.
    • \(R_1\): baja.
    • \(R_2\): media.
    • \(R_3\): alta.

La variable respuesta es el rendimiento por parcela en kilogramos. Se realizan \(3\) repeticiones por tratamiento.

4.2 Datos experimentales

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

4.3 Proceso estadístico y matemático

4.3.1 Estructura

\[ a = 2, \quad b = 3, \quad r = 3, \quad N = 18 \]

4.3.2 Medias por combinación

\[ \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

4.3.3 Medias marginales

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 \]

4.3.4 Media general

\[ \bar Y_{...} = \frac{41 + 49 + 52 + 45 + 55 + 65}{6} = 51.1667 \]

4.3.5 Interpretación matemática preliminar

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.

4.4 Desarrollo en RStudio

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

5 Ejemplo 3. Crianza de cerdos: alimento y frecuencia de alimentación

5.1 Contexto

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:

  • Factor \(A\): tipo de alimento.
    • \(A_1\): alimento estándar.
    • \(A_2\): alimento enriquecido.
  • Factor \(B\): frecuencia de alimentación.
    • \(B_1\): dos veces al día.
    • \(B_2\): tres veces al día.
    • \(B_3\): cuatro veces al día.

La variable respuesta es la ganancia de peso en kilogramos. Se toman \(3\) repeticiones por combinación.

5.2 Datos experimentales

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

5.3 Proceso estadístico y matemático

5.3.1 Estructura del diseño

\[ a = 2, \quad b = 3, \quad r = 3, \quad N = 18 \]

5.3.2 Medias por celda

\[ \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

5.3.3 Medias marginales

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 \]

5.3.4 Media general

\[ T = 423, \quad \bar Y_{...} = \frac{423}{18} = 23.5 \]

5.3.5 Suma de cuadrados total

\[ \sum y_{ijk}^2 = 10143 \]

\[ SC_T = 10143 - \frac{423^2}{18} = 202.5 \]

5.3.6 Suma de cuadrados del factor \(A\)

\[ SC_A = 9[(21.7778 - 23.5)^2 + (25.2222 - 23.5)^2] = 53.3889 \]

5.3.7 Suma de cuadrados del factor \(B\)

\[ SC_B = 6[(20.3333 - 23.5)^2 + (23.8333 - 23.5)^2 + (26.3333 - 23.5)^2] = 109 \]

5.3.8 Suma de cuadrados de la interacción

\[ 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 \]

5.3.9 Suma de cuadrados del error

\[ SC_E = 202.5 - 53.3889 - 109 - 8.7778 = 31.3333 \]

5.3.10 Grados de libertad

\[ gl_A = 1, \quad gl_B = 2, \quad gl_{AB} = 2, \quad gl_E = 12, \quad gl_T = 17 \]

5.3.11 Cuadrados medios

\[ CM_A = 53.3889 \]

\[ CM_B = 54.5 \]

\[ CM_{AB} = 4.3889 \]

\[ CM_E = 2.6111 \]

5.3.12 Estadísticos F

\[ 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 \]

5.3.13 Tabla ANOVA

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

5.3.14 Interpretación

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.

5.4 Desarrollo en RStudio

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)