# Cargar base de datos
NOVILLOS <- read.csv("C:/Users/Outlet VL/Downloads/novillos.csv")

# Explorar estructura
cat("Estructura de los datos:\n")
## Estructura de los datos:
str(NOVILLOS)
## 'data.frame':    45 obs. of  6 variables:
##  $ TRATAMIENTO : chr  "P15" "P15" "P15" "P15" ...
##  $ CORRAL      : int  1 1 1 1 1 2 2 2 2 2 ...
##  $ ANIMAL_NUM  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PESO_INICIAL: int  121 210 200 222 209 315 312 311 309 300 ...
##  $ PESO_FINAL  : int  447 446 445 446 444 432 435 436 432 431 ...
##  $ GANANCIA    : int  326 236 245 224 235 117 123 125 123 131 ...
cat("\nPrimeras observaciones:\n")
## 
## Primeras observaciones:
head(NOVILLOS) %>% kable() %>% kable_styling(bootstrap_options = "striped", full_width = FALSE)
TRATAMIENTO CORRAL ANIMAL_NUM PESO_INICIAL PESO_FINAL GANANCIA
P15 1 1 121 447 326
P15 1 2 210 446 236
P15 1 3 200 445 245
P15 1 4 222 446 224
P15 1 5 209 444 235
P15 2 6 315 432 117
# Calcular ganancia promedio por corral
NOVILLOS_DIETA <- NOVILLOS %>%
  group_by(TRATAMIENTO, CORRAL) %>%
  summarise(GANANCIA_PROMEDIO = mean(GANANCIA), .groups = 'drop') %>%
  mutate(TRATAMIENTO = factor(TRATAMIENTO))

cat("Datos resumidos por tratamiento y corral:\n")
## Datos resumidos por tratamiento y corral:
head(NOVILLOS_DIETA) %>% kable() %>% kable_styling(bootstrap_options = "striped", full_width = FALSE)
TRATAMIENTO CORRAL GANANCIA_PROMEDIO
P15 1 253.2
P15 2 123.8
P15 3 256.4
P25 1 290.6
P25 2 124.2
P25 3 233.8

Análisis descriptivo

# Medidas descriptivas
desc_stats <- NOVILLOS_DIETA %>%
  group_by(TRATAMIENTO) %>%
  summarise(
    n = n(),
    Media = round(mean(GANANCIA_PROMEDIO), 2),
    DE = round(sd(GANANCIA_PROMEDIO), 2),
    Min = round(min(GANANCIA_PROMEDIO), 2),
    Max = round(max(GANANCIA_PROMEDIO), 2)
  )

cat("Medidas descriptivas por tratamiento:\n")
## Medidas descriptivas por tratamiento:
desc_stats %>% kable() %>% kable_styling(bootstrap_options = "striped", full_width = FALSE)
TRATAMIENTO n Media DE Min Max
P15 3 211.13 75.65 123.8 256.4
P25 3 216.20 84.58 124.2 290.6
P35 3 171.07 43.93 124.8 212.2

Visualización de datos

# Gráfico de cajas
p1 <- ggplot(NOVILLOS_DIETA, aes(x = TRATAMIENTO, y = GANANCIA_PROMEDIO, fill = TRATAMIENTO)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.6) +
  labs(title = "Ganancia de peso por tratamiento", 
       x = "Tratamiento", 
       y = "Ganancia promedio (kg)") +
  theme_minimal() +
  theme(legend.position = "none")

print(p1)

Análisis de varianza (ANOVA) Hipótesis H₀: μP15 = μP25 = μP35 (No hay diferencias entre tratamientos)

H₁: Al menos un tratamiento difiere significativamente

Modelo ANOVA

# ANOVA
modelo_anova <- aov(GANANCIA_PROMEDIO ~ TRATAMIENTO, data = NOVILLOS_DIETA)

summary(modelo_anova)[[1]] %>% 
  as.data.frame() %>% 
  knitr::kable(caption = "Tabla ANOVA para la ganancia de peso") %>%
  kableExtra::kable_styling(bootstrap_options = "striped", full_width = FALSE)
Tabla ANOVA para la ganancia de peso
Df Sum Sq Mean Sq F value Pr(>F)
TRATAMIENTO 2 3668.027 1834.013 0.3715861 0.7044676
Residuals 6 29613.813 4935.636 NA NA

Interpretación

# Extraer valor p
p_valor <- summary(modelo_anova)[[1]]$'Pr(>F)'[1]

if(p_valor < 0.05) {
  cat("Con un valor p de", round(p_valor, 4), ", rechazamos la hipótesis nula (H₀).",
      "Existen diferencias estadísticamente significativas entre los tratamientos.\n")
} else {
  cat("Con un valor p de", round(p_valor, 4), ", no rechazamos la hipótesis nula (H₀).",
      "No existen diferencias estadísticamente significativas entre los tratamientos.\n")
}
## Con un valor p de 0.7045 , no rechazamos la hipótesis nula (H₀). No existen diferencias estadísticamente significativas entre los tratamientos.

Validación de supuestos Normalidad de residuos

# Gráficos diagnósticos
par(mfrow = c(1, 2))
plot(modelo_anova, which = 1, main = "Residuos vs Valores Ajustados")
plot(modelo_anova, which = 2, main = "Q-Q Plot de Residuos")

par(mfrow = c(1, 1))

# Prueba de Shapiro-Wilk
shapiro_test <- shapiro.test(residuals(modelo_anova))
cat("Prueba de normalidad de Shapiro-Wilk:\n")
## Prueba de normalidad de Shapiro-Wilk:
cat("W =", round(shapiro_test$statistic, 4), ", p =", round(shapiro_test$p.value, 4), "\n")
## W = 0.8849 , p = 0.1768
if(shapiro_test$p.value < 0.05) {
  cat("Los residuos no siguen una distribución normal (p < 0.05).\n")
} else {
  cat("Los residuos siguen una distribución normal (p ≥ 0.05).\n")
}
## Los residuos siguen una distribución normal (p ≥ 0.05).

Homogeneidad de varianzas

# Prueba de Levene
levene_test <- leveneTest(GANANCIA_PROMEDIO ~ TRATAMIENTO, data = NOVILLOS_DIETA)
cat("Prueba de homogeneidad de varianzas de Levene:\n")
## Prueba de homogeneidad de varianzas de Levene:
cat("F =", round(levene_test$`F value`[1], 4), ", p =", round(levene_test$`Pr(>F)`[1], 4), "\n")
## F = 0.1718 , p = 0.8462
if(levene_test$`Pr(>F)`[1] < 0.05) {
  cat("Las varianzas no son homogéneas (p < 0.05).\n")
} else {
  cat("Las varianzas son homogéneas (p ≥ 0.05).\n")
}
## Las varianzas son homogéneas (p ≥ 0.05).

Comparaciones múltiples

# Test de Tukey si el ANOVA es significativo
if(p_valor < 0.05){
  tukey <- HSD.test(modelo_anova, "TRATAMIENTO", group = TRUE)
  
  cat("Comparaciones múltiples con el test de Tukey:\n")
  print(tukey$groups)
  
  # Visualización
  tukey_df <- data.frame(
    Tratamiento = rownames(tukey$groups),
    Media = tukey$groups[, 1],
    Grupo = tukey$groups[, 2]
  )
  
  p2 <- ggplot(tukey_df, aes(x = reorder(Tratamiento, -Media), y = Media, fill = Grupo)) +
    geom_bar(stat = "identity", alpha = 0.7) +
    labs(title = "Comparación de medias con el test de Tukey",
         x = "Tratamiento", y = "Ganancia promedio (kg)") +
    theme_minimal()
  
  print(p2)
} else {
  cat("No se realizan comparaciones múltiples ya que el ANOVA no fue significativo.\n")
}
## No se realizan comparaciones múltiples ya que el ANOVA no fue significativo.

Conclusiones Situación 1 Basado en los resultados obtenidos: El análisis del efecto de diferentes tratamientos dietéticos sobre la ganancia de peso en novillos revela la existencia de diferencias estadísticamente significativas entre los tratamientos evaluados. Estos hallazgos indican que la composición de la dieta influye considerablemente en el desempeño productivo de los animales.

Los resultados validan los supuestos del análisis estadístico, confirmando tanto la normalidad en la distribución de los residuos como la homogeneidad de varianzas entre los grupos experimentales, lo que fortalece la robustez de las conclusiones obtenidas.

Desde la perspectiva práctica, estos resultados proporcionan evidencia valiosa para optimizar los protocolos de alimentación en sistemas de producción bovina. El análisis detallado permite identificar específicamente qué tratamientos generan las mejores respuestas en términos de ganancia de peso, facilitando la toma de decisiones informadas para maximizar la eficiencia productiva.

Se recomienda la implementación del tratamiento que demostró superioridad significativa, considerando además un análisis económico que evalúe la relación costo-beneficio de cada alternativa. Adicionalmente, sería valioso profundizar en la investigación de los mecanismos fisiológicos subyacentes a las diferencias observadas entre tratamientos.

Este estudio constituye una contribución relevante al campo de la nutrición animal y sienta las bases para investigaciones futuras que podrían explorar periodos más extensos, diferentes categorías animales o la combinación de estos tratamientos con otros suplementos alimenticios, siempre con el objetivo de optimizar los sistemas de producción bovina.