Situación 1

A - Exploración de datos

1. Cargar la base de datos novillos.csv en R. (Crear objeto llamado NOVILLOS)

library(tidyverse)
library(readxl)
library(car)
library(agricolae)
library(emmeans)
library(summarytools)
NOVILLOS <- read_excel("novillos.xlsx")

2. Explorar su estructura (nombres de variables, tipo de variables, primeros registros).

str(NOVILLOS)
## tibble [45 × 6] (S3: tbl_df/tbl/data.frame)
##  $ TRATAMIENTO : chr [1:45] "P15" "P15" "P15" "P15" ...
##  $ CORRAL      : num [1:45] 1 1 1 1 1 2 2 2 2 2 ...
##  $ ANIMAL_NUM  : num [1:45] 1 2 3 4 5 6 7 8 9 10 ...
##  $ PESO_INICIAL: num [1:45] 121 210 200 222 209 315 312 311 309 300 ...
##  $ PESO_FINAL  : num [1:45] 447 446 445 446 444 432 435 436 432 431 ...
##  $ GANANCIA    : num [1:45] 326 236 245 224 235 117 123 125 123 131 ...

3. Calcular la ganancia de peso promedio por corral para cada tratamiento.

#Transformación de variables y agregación por corral
# Agrupar los datos por 'CORRAL' y 'TRATAMIENTO' y calcular la ganancia de peso
#promedio.
NOVILLOS_DIETA <- NOVILLOS %>%
 group_by(TRATAMIENTO, CORRAL) %>%
 summarise(GANANCIA_PROMEDIO = mean(GANANCIA)) %>%
 ungroup()
# Transformar TRATAMIENTO a factor
NOVILLOS_DIETA <- NOVILLOS_DIETA %>%
 mutate(TRATAMIENTO = factor(TRATAMIENTO))
str(NOVILLOS_DIETA)
## tibble [9 × 3] (S3: tbl_df/tbl/data.frame)
##  $ TRATAMIENTO      : Factor w/ 3 levels "P15","P25","P35": 1 1 1 2 2 2 3 3 3
##  $ CORRAL           : num [1:9] 1 2 3 1 2 3 1 2 3
##  $ GANANCIA_PROMEDIO: num [1:9] 253 124 256 291 124 ...
glimpse(NOVILLOS_DIETA)
## Rows: 9
## Columns: 3
## $ TRATAMIENTO       <fct> P15, P15, P15, P25, P25, P25, P35, P35, P35
## $ CORRAL            <dbl> 1, 2, 3, 1, 2, 3, 1, 2, 3
## $ GANANCIA_PROMEDIO <dbl> 253.2, 123.8, 256.4, 290.6, 124.2, 233.8, 212.2, 124…

4. Obtener medidas descriptivas de la ganancia de peso ( a nivel de corral) por

tratamiento y sacar conclusiones.

# Opción 2: usando summarytools
NOVILLOS_DIETA %>% 
  group_by((CORRAL)) %>% 
  descr(GANANCIA_PROMEDIO)
## Descriptive Statistics  
## GANANCIA_PROMEDIO by (CORRAL)  
## Data Frame: NOVILLOS_DIETA  
## N: 9  
## 
##                          1        2        3
## ----------------- -------- -------- --------
##              Mean   252.00   124.27   222.13
##           Std.Dev    39.21     0.50    41.35
##               Min   212.20   123.80   176.20
##                Q1   212.20   123.80   176.20
##            Median   253.20   124.20   233.80
##                Q3   290.60   124.80   256.40
##               Max   290.60   124.80   256.40
##               MAD    55.45     0.59    33.51
##               IQR    39.20     0.50    40.10
##                CV     0.16     0.00     0.19
##          Skewness    -0.03     0.13    -0.26
##       SE.Skewness     1.22     1.22     1.22
##          Kurtosis    -2.33    -2.33    -2.33
##           N.Valid     3.00     3.00     3.00
##                 N     3.00     3.00     3.00
##         Pct.Valid   100.00   100.00   100.00
ggplot(NOVILLOS_DIETA, aes(x = TRATAMIENTO, y = GANANCIA_PROMEDIO, fill = TRATAMIENTO)) +
  geom_boxplot() +
  labs(title = "Ganancia promedio según tratamiento",
       x = "TRATAMIENTO", y = "GANANCIA_PROMEDIO (g)") +
  theme_minimal()

# B. Análisis de Varianza (ANOVA) ## 5. Plantear las hipótesis adecuadas.

H0: Todas las medias de los tratamientos son iguales.

H1: Al menos una media difiere entre tratamientos.

6. Ajustar un modelo de ANOVA.

modelo_dca <- aov(GANANCIA_PROMEDIO ~ TRATAMIENTO, data = NOVILLOS_DIETA)
summary(modelo_dca)
##             Df Sum Sq Mean Sq F value Pr(>F)
## TRATAMIENTO  2   3668    1834   0.372  0.704
## Residuals    6  29614    4936

Supuestos del modelo

##Trabajamos con los residuos y predichos del modelo para realizar las pruebas de los errores.

residuos_dca <- modelo_dca$residuals # residuos = observado - predicho
predichos_dca <- modelo_dca$fitted.values # predichos
tabla <- data.frame(
  Observado = NOVILLOS_DIETA$GANANCIA_PROMEDIO,
  Predichos  = predichos_dca,
  Residual  = residuos_dca,
  Tratamiento = NOVILLOS_DIETA$TRATAMIENTO)

print(tabla)
##   Observado Predichos   Residual Tratamiento
## 1     253.2  211.1333  42.066667         P15
## 2     123.8  211.1333 -87.333333         P15
## 3     256.4  211.1333  45.266667         P15
## 4     290.6  216.2000  74.400000         P25
## 5     124.2  216.2000 -92.000000         P25
## 6     233.8  216.2000  17.600000         P25
## 7     212.2  171.0667  41.133333         P35
## 8     124.8  171.0667 -46.266667         P35
## 9     176.2  171.0667   5.133333         P35

Análisis gráfico de los residuos

hist(residuos_dca, main = "Histograma de residuos")

boxplot(residuos_dca, main = "Boxplot de residuos")

Normalidad

Gráfico Q-Q plot

plot(modelo_dca, which = 2)

Prueba de Shapiro-Wilks

H0: SI se cumple el supuesto de Normalidad.

H1: NO se cumple el supuesto de Normalidad.

shapiro.test(modelo_dca$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_dca$residuals
## W = 0.88492, p-value = 0.1768

Homocedasticidad

Gráfico de residuos vs predichos

plot(modelo_dca, which = 1) # Residos vs predichos

Test de Levene

H0: SI cumple el supuesto de Homocedasticidad.

H1: NO se cumple el supuesto de Homocedasticidad

library(tidyverse)
library(readxl)
library(car)
library(agricolae)
library(emmeans)
library(summarytools)
# Para esta prueba usamos una función de la librería "car"
leveneTest(GANANCIA_PROMEDIO ~ TRATAMIENTO, data = NOVILLOS_DIETA)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.1718 0.8462
##        6

7. Interpretar si existen diferencias significativas entre tratamientos (α = 0.05).

# Usaremos una función del paquete agricolae
TUKEY <- HSD.test(modelo_dca, "TRATAMIENTO")
TUKEY
## $statistics
##    MSerror Df     Mean       CV     MSD
##   4935.636  6 199.4667 35.22096 176.003
## 
## $parameters
##    test      name.t ntr StudentizedRange alpha
##   Tukey TRATAMIENTO   3         4.339195  0.05
## 
## $means
##     GANANCIA_PROMEDIO      std r       se   Min   Max   Q25   Q50   Q75
## P15          211.1333 75.64981 3 40.56121 123.8 256.4 188.5 253.2 254.8
## P25          216.2000 84.58463 3 40.56121 124.2 290.6 179.0 233.8 262.2
## P35          171.0667 43.92554 3 40.56121 124.8 212.2 150.5 176.2 194.2
## 
## $comparison
## NULL
## 
## $groups
##     GANANCIA_PROMEDIO groups
## P25          216.2000      a
## P15          211.1333      a
## P35          171.0667      a
## 
## attr(,"class")
## [1] "group"
plot(TUKEY)

# Usamos librería agricolae
FISHER <- LSD.test(modelo_dca, "TRATAMIENTO")  
FISHER
## $statistics
##    MSerror Df     Mean       CV  t.value      LSD
##   4935.636  6 199.4667 35.22096 2.446912 140.3603
## 
## $parameters
##         test p.ajusted      name.t ntr alpha
##   Fisher-LSD      none TRATAMIENTO   3  0.05
## 
## $means
##     GANANCIA_PROMEDIO      std r       se       LCL      UCL   Min   Max   Q25
## P15          211.1333 75.64981 3 40.56121 111.88363 310.3830 123.8 256.4 188.5
## P25          216.2000 84.58463 3 40.56121 116.95029 315.4497 124.2 290.6 179.0
## P35          171.0667 43.92554 3 40.56121  71.81696 270.3164 124.8 212.2 150.5
##       Q50   Q75
## P15 253.2 254.8
## P25 233.8 262.2
## P35 176.2 194.2
## 
## $comparison
## NULL
## 
## $groups
##     GANANCIA_PROMEDIO groups
## P25          216.2000      a
## P15          211.1333      a
## P35          171.0667      a
## 
## attr(,"class")
## [1] "group"
plot(FISHER)

# CONCLUSIONES ## En el análisis de la ganancia de peso no se detectaron diferencias significativas entre los tres tratamientos. Si bien el tratamiento con un 25% de inclusión del subproducto fibroso mostró una mayor ganancia promedio, esta diferencia no resultó estadísticamente distinta respecto a los otros tratamientos. La ausencia de significancia puede deberse a la falta de homogeneidad en las unidades experimentales, en este caso los corrales, lo que incrementa la variabilidad dentro de los tratamientos. Cuando existe gran variación interna, se genera “ruido” en el análisis de varianza y disminuye la capacidad de detectar diferencias reales. La homogeneidad es fundamental, ya que asegura que el efecto observado se atribuya a los tratamientos y no a factores externos no controlados. En caso de no poder garantizarla, podría ser más adecuado emplear diseños experimentales más complejos (como bloques completos al azar o diseños en cuadrado latino), que permiten controlar la variabilidad y aumentar la precisión del análisis. Para dar solución y mejorar la uniformidad de las unidades experimentales, se podría aumentar las repeticiones por tratamiento y, de ser necesario, utilizar diseños más robustos que reduzcan la variabilidad y fortalezcan la validez de las conclusiones.