#Problema 3.30. El contenido medio de grasa butírica de la leche de vacas productoras se registró para cinco tipos de razas de ganado y se clasificaron las vacas como maduras o vacas de 2 años. La base de datos butterfat.

  1. Ajuste el “mejor” modelo de regresión que explique el porcentaje de grasa en la leche. Muestre las medidas de bondad de ajuste.

A1. Carga de Datos y Verificación

Cargar los datos:

library(GLMsData)
data(butterfat)
dim(butterfat)
[1] 100   3
sum(is.na(butterfat))  # La base de datos no cuenta con NAs
[1] 0
head(butterfat)
  Butterfat    Breed    Age
1      3.74 Ayrshire Mature
2      4.01 Ayrshire  2year
3      3.77 Ayrshire Mature
4      3.78 Ayrshire  2year
5      4.10 Ayrshire Mature
6      4.06 Ayrshire  2year

A2. Preparación de los Datos

# Crear variables dummy para las razas
butterfat$Ayrshire <- ifelse(butterfat$Breed == "Ayrshire", 1, 0)
butterfat$Canadian <- ifelse(butterfat$Breed == "Canadian", 1, 0)
butterfat$Guernsey <- ifelse(butterfat$Breed == "Guernsey", 1, 0)
butterfat$Holstein_Fresian <- ifelse(butterfat$Breed == "Holstein-Fresian", 1, 0)
butterfat$Jersey <- ifelse(butterfat$Breed == "Jersey", 1, 0)

# Crear variables dummy para la edad
butterfat$Age_Mature <- ifelse(butterfat$Age == "Mature", 1, 0)
butterfat$Age_2year <- ifelse(butterfat$Age == "2year", 1, 0)

# Eliminar la columna original de Breed y Age
butterfat$Breed <- NULL
butterfat$Age <- NULL
head(butterfat)
  Butterfat Ayrshire Canadian Guernsey Holstein_Fresian Jersey Age_Mature
1      3.74        1        0        0                0      0          1
2      4.01        1        0        0                0      0          0
3      3.77        1        0        0                0      0          1
4      3.78        1        0        0                0      0          0
5      4.10        1        0        0                0      0          1
6      4.06        1        0        0                0      0          0
  Age_2year
1         0
2         1
3         0
4         1
5         0
6         1

A3. Ajuste del Modelo de Regresión Lineal

MODELO 1

# Ajuste del modelo de regresión lineal
modelo_butterfat <- lm(Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian + Jersey + Age_Mature + Age_2year, data = butterfat)
summary(modelo_butterfat)  # Resumen del modelo

Call:
lm(formula = Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian + 
    Jersey + Age_Mature + Age_2year, data = butterfat)

Residuals:
   Min     1Q Median     3Q    Max 
-1.020 -0.237 -0.064  0.262  1.210 

Coefficients: (2 not defined because of singularities)
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)        5.2402     0.1014   51.70  < 2e-16 ***
Ayrshire          -1.2325     0.1308   -9.42  3.2e-15 ***
Canadian          -0.8540     0.1308   -6.53  3.4e-09 ***
Guernsey          -0.3425     0.1308   -2.62     0.01 *  
Holstein_Fresian  -1.6230     0.1308  -12.40  < 2e-16 ***
Jersey                 NA         NA      NA       NA    
Age_Mature         0.1046     0.0828    1.26     0.21    
Age_2year              NA         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.414 on 94 degrees of freedom
Multiple R-squared:  0.682, Adjusted R-squared:  0.666 
F-statistic: 40.4 on 5 and 94 DF,  p-value: <2e-16

MODELO 2

modelo_2_butterfat <- step(modelo_butterfat)
Start:  AIC=-171
Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian + 
    Jersey + Age_Mature + Age_2year


Step:  AIC=-171
Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian + 
    Jersey + Age_Mature


Step:  AIC=-171
Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian + 
    Age_Mature

                   Df Sum of Sq  RSS    AIC
- Age_Mature        1      0.27 16.4 -171.0
<none>                          16.1 -170.7
- Guernsey          1      1.17 17.3 -165.6
- Canadian          1      7.29 23.4 -135.3
- Ayrshire          1     15.19 31.3 -106.2
- Holstein_Fresian  1     26.34 42.4  -75.7

Step:  AIC=-171
Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian

                   Df Sum of Sq  RSS    AIC
<none>                          16.4 -171.0
- Guernsey          1      1.17 17.5 -166.1
- Canadian          1      7.29 23.7 -136.1
- Ayrshire          1     15.19 31.6 -107.3
- Holstein_Fresian  1     26.34 42.7  -77.1
# Resumen del mejor modelo
summary(modelo_2_butterfat)

Call:
lm(formula = Butterfat ~ Ayrshire + Canadian + Guernsey + Holstein_Fresian, 
    data = butterfat)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.0725 -0.2721 -0.0513  0.2236  1.2575 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)        5.2925     0.0928   57.02  < 2e-16 ***
Ayrshire          -1.2325     0.1313   -9.39  3.3e-15 ***
Canadian          -0.8540     0.1313   -6.51  3.6e-09 ***
Guernsey          -0.3425     0.1313   -2.61    0.011 *  
Holstein_Fresian  -1.6230     0.1313  -12.36  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.415 on 95 degrees of freedom
Multiple R-squared:  0.677, Adjusted R-squared:  0.664 
F-statistic: 49.8 on 4 and 95 DF,  p-value: <2e-16

CONCLUSIONES

La fórmula de regresión Modelo 1:

Butterfat = 5.2402 − 1.2325 * Ayrshire − 0.8540 * Canadian − 0.3425 * Guernsey − 1.6230 * Holstein_Fresian + 0.1046 * Age_Mature

La fórmula de regresión Modelo 2:

Butterfat = 5.2925 − 1.2325 * Ayrshire − 0.8540 * Canadian − 0.3425 * Guernsey − 1.6230 * Holstein_Fresian

Las variables Ayrshire, Canadian, Guernsey, y Holstein_Fresian son variables categóricas que se codifican como 0 o 1. Age_Mature solo aparece en el Modelo 1, ya que no se incluyó en el Modelo 2.

Coeficiente de Determinación (R²)

# Coeficiente de Determinación (R²) MOdelo 1
r_squared_modelo_butterfat <- summary(modelo_butterfat)$r.squared
cat("El Coeficiente de Determinación (R²) es:", r_squared_modelo_butterfat, "\n")
El Coeficiente de Determinación (R²) es: 0.682 
# Coeficiente de Determinación (R²) MOdelo 2
r_squared_modelo_2_butterfat <- summary(modelo_2_butterfat)$r.squared
cat("El Coeficiente de Determinación (R²) es:", r_squared_modelo_2_butterfat, "\n")
El Coeficiente de Determinación (R²) es: 0.677 

CONCLUSIONES COEFICIENTE DE DETERMINACION MODELO 1 Y 2

El Modelo 1 parece ofrecer un mejor ajuste general en comparación con el Modelo 2, que muestra un R² bajo y variables no significativas.

Cp de Mallows MODELO 1 Y 2

# Cp de Mallows Modelo 1
p <- length(coef(modelo_butterfat))  # Número de parámetros
n <- nrow(butterfat)  # Número de observaciones
mse <- sum(residuals(modelo_butterfat)^2) / (n - p)  # Error cuadrático medio
cp_mallows_modelo_butterfat <- (mse * (n - 2 * p)) / (n - p)
cat("Cp de Mallows:", cp_mallows_modelo_butterfat, "\n")
Cp de Mallows: 0.16 
# Cp de Mallows Modelo 1
p <- length(coef(modelo_2_butterfat))  # Número de parámetros
n <- nrow(butterfat)  # Número de observaciones
mse <- sum(residuals(modelo_2_butterfat)^2) / (n - p)  # Error cuadrático medio
cp_mallows_modelo_2_butterfat <- (mse * (n - 2 * p)) / (n - p)
cat("Cp de Mallows:", cp_mallows_modelo_2_butterfat, "\n")
Cp de Mallows: 0.163 

CONCLUSIONES Cp DE MALLOWS MODELO 1

Ambos modelos tienen valores de Cp cercanos a 0, lo que sugiere que ambos modelos son adecuados. El Modelo 1 tiene un Cp ligeramente más bajo (0.16) en comparación con el Modelo 2 (0.163), lo que indica que el Modelo 1 es preferible en términos de ajuste y parsimoniabilidad.

Prueba ANOVA MOdelo 1 y 2

# Prueba ANOVA
anova_results_modelo_butterfat<- anova(modelo_butterfat); anova_results_modelo_butterfat
Analysis of Variance Table

Response: Butterfat
                 Df Sum Sq Mean Sq F value  Pr(>F)    
Ayrshire          1   4.45    4.45   26.02 1.8e-06 ***
Canadian          1   0.59    0.59    3.46   0.066 .  
Guernsey          1   2.93    2.93   17.13 7.6e-05 ***
Holstein_Fresian  1  26.34   26.34  153.85 < 2e-16 ***
Age_Mature        1   0.27    0.27    1.60   0.209    
Residuals        94  16.09    0.17                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_results_modelo_2_butterfat<- anova(modelo_2_butterfat); anova_results_modelo_2_butterfat
Analysis of Variance Table

Response: Butterfat
                 Df Sum Sq Mean Sq F value  Pr(>F)    
Ayrshire          1   4.45    4.45   25.85 1.8e-06 ***
Canadian          1   0.59    0.59    3.44   0.067 .  
Guernsey          1   2.93    2.93   17.02 7.9e-05 ***
Holstein_Fresian  1  26.34   26.34  152.89 < 2e-16 ***
Residuals        95  16.37    0.17                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

CONCLUSIONES PRUEBA ANOVA MODELO 1 Y 2

Ambos modelos muestran que Holstein_Fresian, Ayrshire, y Guernsey son variables importantes. Sin embargo, el Modelo 1 incluye Age_Mature, que no es significativo, mientras que el Modelo 2 es más simple y también es efectivo.

Dado que el Modelo 2 elimina la variable no significativa (Age_Mature) y presenta un ajuste similar, podría ser preferible por su simplicidad y claridad en la interpretación.

Se sugiere utilizar el Modelo 2 para una interpretación más directa, a menos que se requiera información adicional que pueda proporcionar el Modelo 1.

Coeficiente de correlación simple MOdelo 1 y 2

# Coeficiente de correlación simple MOdelo 1 y 2
correlation_simple_modelo_butterfat <- cor(butterfat$Butterfat, fitted(modelo_butterfat))
cat("Coeficiente de Correlacion Simple modelo 1:", correlation_simple_modelo_butterfat, "\n")
Coeficiente de Correlacion Simple modelo 1: 0.826 
# Coeficiente de correlación simple MOdelo 1 y 2
correlation_simple_modelo_2_butterfat <- cor(butterfat$Butterfat, fitted(modelo_2_butterfat))
cat("Coeficiente de Correlacion Simple modelo 2:", correlation_simple_modelo_2_butterfat, "\n")
Coeficiente de Correlacion Simple modelo 2: 0.823 

CONCLUSIONES COEFICIENTE DE CORRELACION MODELO 1 Y 2

Dado que el Modelo 1 presenta un coeficiente de correlación ligeramente más alto, esto refuerza la conclusión anterior de que el Modelo 1 podría ser preferido por su capacidad para ajustar mejor la relación entre las variables.

  1. Existen algún dato atípico o influyente?. Muestre los estadísticos que sustentan la afirmación.
# Predicciones del modelo inicial
predicciones_modelo1_butterfat <- predict(modelo_butterfat)

# Predicciones del mejor modelo
predicciones_modelo2_butterfat <- predict(modelo_2_butterfat)

# Gráfica de comparación de modelos
plot(butterfat$Ayrshire, predicciones_modelo1_butterfat, 
     main = "Comparacion de Modelos de Regresion", 
     xlab = "Ayrshire", 
     ylab = "Butterfat", 
     col = "blue", pch = 19, 
     ylim = range(c(predicciones_modelo1_butterfat, predicciones_modelo2_butterfat)) + c(-10, 10))

points(butterfat$Ayrshire, predicciones_modelo2_butterfat, col = "red", pch = 19)

# Añadir líneas para los modelos ajustados
lines(sort(butterfat$Ayrshire), predicciones_modelo1_butterfat[order(butterfat$Ayrshire)], col = "blue", lwd = 2)
lines(sort(butterfat$Ayrshire), predicciones_modelo2_butterfat[order(butterfat$Ayrshire)], col = "red", lwd = 2)

# Agregar leyenda
legend("bottomright", legend = c("Modelo 1", "Modelo 2"), 
       col = c("blue", "red"), pch = c(19, 19), lty = 1)

# Cuando utilizas la función legend(), puedes especificar la posición de la leyenda mediante argumentos como "topright", "bottomright", etc. Aquí te explico algunas de las posiciones más comunes: "topleft": Coloca la leyenda en la esquina superior izquierda del gráfico. "topright": Coloca la leyenda en la esquina superior derecha del gráfico. "bottomleft": Coloca la leyenda en la esquina inferior izquierda del gráfico. "bottomright": Coloca la leyenda en la esquina inferior derecha del gráfico. "center": Centra la leyenda en el medio del gráfico.

PRUEBA DE HOMOCEDASTICIDAD MODELO 1 Y 2

# Prueba de Homocedasticidad
library(car)
Cargando paquete requerido: carData
ncv_test_modelo_butterfat <- ncvTest(modelo_butterfat); ncv_test_modelo_butterfat
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 16.8, Df = 1, p = 4e-05
# Prueba de Homocedasticidad
library(car)
ncv_test_modelo_2_butterfat <- ncvTest(modelo_2_butterfat); ncv_test_modelo_2_butterfat
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 19, Df = 1, p = 1e-05

CONCLUSION PRUEBA DE HOMOCEDASTICIDAD MODELO 1 Y 2

Ambos modelos de regresión muestran evidencia significativa de heterocedasticidad, como lo indican los resultados de la prueba de homocedasticidad (ncvTest):

Modelo 1: p-valor = 4e-05 Modelo 2: p-valor = 1e-05

MODELO HISTOGRAMA DE LOS RESIDUOS PARA MODELO 1 Y 2

par(mfrow=c(1, 2))
# Histograma de los residuos para el Modelo 1
hist(residuals(modelo_butterfat), 
     main = "Histograma de Residuos - Modelo 1", 
     xlab = "Residuos", 
     col = "blue", 
     border = "black", 
     breaks = 10)
abline(v = mean(residuals(modelo_butterfat)), col = "red", lwd = 2, lty = 2)

# Histograma de los residuos para el Modelo 2
hist(residuals(modelo_2_butterfat), 
     main = "Histograma de Residuos - Modelo 2", 
     xlab = "Residuos", 
     col = "green", 
     border = "black", 
     breaks = 10)
abline(v = mean(residuals(modelo_2_butterfat)), col = "red", lwd = 2, lty = 2)

par(mfrow=c(1, 1))

CONCLUSIONES HISTOGRAMA DE RESIDUOS

Este grafico indica que los residuos están distribuidos de manera equitativa a lo largo de todo el rango de valores, lo que sugiere que el modelo no está sistemáticamente subestimando o sobrestimando las predicciones.

Una distribución uniforme sugiere que el modelo está capturando adecuadamente la relación entre las variables dependientes e independientes, y que no hay patrones evidentes que indiquen que se han omitido variables importantes o que la forma del modelo es incorrecta.

La uniformidad en el histograma también es un indicativo de homocedasticidad, lo que significa que la variabilidad de los errores es constante en todos los niveles de la variable dependiente.

QQ-PLOT DE LOS RESIDUOS MODELO 1 Y 2

par(mfrow=c(1, 2))
# QQ-Plot de los residuos - Modelo 1
qqnorm(residuals(modelo_butterfat), 
       main = "QQ-Plot de Residuos - Modelo 1", 
       xlab = "Cuantiles Teoricos", 
       ylab = "Cuantiles de Residuos", 
       pch = 19, col = "blue")
qqline(residuals(modelo_butterfat), col = "red", lwd = 2)

# QQ-Plot de los residuos - Modelo 2
qqnorm(residuals(modelo_2_butterfat), 
       main = "QQ-Plot de Residuos - Modelo 2", 
       xlab = "Cuantiles Teoricos", 
       ylab = "Cuantiles de Residuos", 
       pch = 19, col = "violet")
qqline(residuals(modelo_2_butterfat), col = "red", lwd = 2)

par(mfrow=c(1, 1))

CONCLUSIONES QQ-PLOT DE LOS RESIDUOS MODELO 1 Y 2

Ajuste a la Normalidad:

Ambos QQ-plots muestran que los residuos de los modelos se alinean cerca de la línea diagonal. Esto sugiere que los residuos se distribuyen aproximadamente de manera normal, lo cual es una suposición importante en la regresión. Consistencia entre Modelos:

La alineación de los puntos con la línea en ambos QQ-plots indica que, a pesar de las diferencias en los modelos, ambos manejan bien la normalidad de los residuos.

MEJOR MODELO

eL Modelo 2 podría ser considerado más válido, ya que, aunque ambos modelos muestran heterocedasticidad, el Modelo 2 tiene un mejor coeficiente de determinación (R²) o predicciones más precisas en comparación con el Modelo 1, entonces sería preferido. Además, los histogramas y QQ-plots de los residuos del Modelo 2 muestran una mejor distribución y se alinean más cerca de la normalidad que los del Modelo 1, esto también apoyaría la elección del Modelo 2.

  1. Estime el porcentaje de grasa esperado en la leche en un animal de 2 años de raza Holstein.
# Nueva observación para la predicción del modelo 2 para un Holstein de 2 años
resistencia_modelo2 <- data.frame(
  Hardwood_low = 0,  # Ajusta según la observación
  Hardwood_high = 1,  # Ajusta según la observación
  Ayrshire = 0,  # 0 para Holstein
  Canadian = 0,  # 0 para Holstein
  Guernsey = 0,  # 0 para Holstein
  Holstein_Fresian = 1,  # 1 para Holstein
  Jersey = 0,  # 0 para Holstein
  Age_Mature = 0,  # 0 para menos de 2 años
  Age_2year = 1   # 1 para 2 años
)

# Predicción de la grasa en la leche usando el modelo 2
grasa_estimado_modelo2 <- predict(modelo_2_butterfat, resistencia_modelo2)

# Mostrar resultado
cat("El porcentaje de grasa esperado en la leche en un animal de 2 anos de raza Holstein es de aproximadamente", 
    round(grasa_estimado_modelo2, 2), "unidades.\n")
El porcentaje de grasa esperado en la leche en un animal de 2 anos de raza Holstein es de aproximadamente 3.67 unidades.

D) Compruebe los supuestos del modelo.

GRÁFICOS DE DIAGNÓSTICO

# Gráficos de diagnóstico
par(mfrow=c(2, 2))
plot(modelo_2_butterfat)
hat values (leverages) are all = 0.05
 and there are no factor predictors; no plot no. 5

par(mfrow=c(1, 1))

NORMALIDAD DE LOS RESIDUOS

Prueba de Normalidad de Shapiro-Wilk

test_shapiro_modelo_2_butterfat <- shapiro.test(residuals(modelo_2_butterfat)); test_shapiro_modelo_2_butterfat

    Shapiro-Wilk normality test

data:  residuals(modelo_2_butterfat)
W = 1, p-value = 0.02

CONCLUSIONES PRUEBA DE NORMALIDAD DE SHAPIRO-WILK

La hipótesis nula del test de Shapiro-Wilk es que los datos provienen de una distribución normal.

Un p-valor menor que 0.05 sugiere que se rechaza la hipótesis nula. En este caso, puedes concluir que los residuos del modelo 2 no siguen una distribución normal.

PRUEBA DE BREUSCH-PAGAN PARA HOMOCEDASTICIDAD

# Cargar el paquete lmtest
#install.packages('lmtest')
library(lmtest)
Cargando paquete requerido: zoo

Adjuntando el paquete: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
# Realizar la prueba de Breusch-Pagan para homocedasticidad
bptest_result_modelo_2_butterfat <- bptest(modelo_2_butterfat); bptest_result_modelo_2_butterfat

    studentized Breusch-Pagan test

data:  modelo_2_butterfat
BP = 13, df = 4, p-value = 0.01

CONCLUSIONES PRUEBA DE BREUSCH-PAGAN PARA HOMOCEDASTICIDAD

Estadístico BP = 13: Este es el valor calculado del estadístico de Breusch-Pagan, que mide la heterocedasticidad en los residuos del modelo.

Grados de Libertad (df) = 4: Este valor representa el número de restricciones bajo la hipótesis nula.

p-valor = 0.01: Un p-valor menor que 0.05 indica que se rechaza la hipótesis nula, que en este caso es que no hay heterocedasticidad en los residuos.

INDEPENDENCIA DE LOS ERRORES Prueba de Durbin-Watson para Independencia

library(car)
test_dw_modelo_2_butterfat <- durbinWatsonTest(modelo_2_butterfat); test_dw_modelo_2_butterfat
 lag Autocorrelation D-W Statistic p-value
   1         -0.0486          2.08   0.972
 Alternative hypothesis: rho != 0

CONCLUSIONES PRUEBA DE DURBIN-WATSON PARA INDEPENDENCIA

Estadístico D-W = 2.08: Este valor mide la autocorrelación de los residuos del modelo. El rango de este estadístico va de 0 a 4, donde:

Un valor cercano a 2 sugiere que no hay autocorrelación. Valores menores a 2 indican autocorrelación positiva. Valores mayores a 2 indican autocorrelación negativa. p-valor = 0.974: Este p-valor indica la probabilidad de observar un estadístico D-W tan extremo como el calculado, bajo la hipótesis nula de que no hay autocorrelación.

MULTICOLINEALIDAD (VIF)

vif_value_modelo_2_butterfat <- vif(modelo_2_butterfat); vif_value_modelo_2_butterfat
        Ayrshire         Canadian         Guernsey Holstein_Fresian 
             1.6              1.6              1.6              1.6 

CONCLUSIONES MULTICOLINEALIDAD (VIF)

VIF (Variance Inflation Factor): Un valor de VIF menor a 5 generalmente sugiere que no hay problemas serios de multicolinealidad entre las variables independientes en el modelo. Valores en este caso: Todos los valores de VIF son 1.6, lo que indica que la multicolinealidad no es una preocupación en este modelo. Esto significa que las variables independientes no están altamente correlacionadas entre sí.

PRUEBA SOBRE COEFICIENTES ESTIMADOS

Prueba t para Coeficientes

summary(modelo_2_butterfat)$coefficients
                 Estimate Std. Error t value Pr(>|t|)
(Intercept)         5.293     0.0928   57.02 2.76e-75
Ayrshire           -1.233     0.1313   -9.39 3.33e-15
Canadian           -0.854     0.1313   -6.51 3.60e-09
Guernsey           -0.343     0.1313   -2.61 1.05e-02
Holstein_Fresian   -1.623     0.1313  -12.36 1.69e-21

CONCLUSIONES PRUEBA T PARA COEFICIENTES

Butterfat = 5.293 − 1.233 * Ayrshire − 0.854 * Canadian − 0.343 * Guernsey − 1.623 * Holstein_Fresian

Un aumento en Ayrshire reduce el porcentaje de grasa en la leche en aproximadamente 1.233 unidades. Un aumento en Canadian reduce el porcentaje de grasa en la leche en aproximadamente 0.854 unidades. Un aumento en Guernsey reduce el porcentaje de grasa en la leche en aproximadamente 0.343 unidades. Un aumento en Holstein_Fresian reduce el porcentaje de grasa en la leche en aproximadamente 1.623 unidades.

Importante: Los coeficientes son negativos, lo que indica que las razas mencionadas tienden a tener un menor porcentaje de grasa en comparación con la raza de referencia (que es la raza no incluida en el modelo).

VISUALIZACIÓN DE RESIDUOS

Histograma de los Residuos

## Histograma de los residuos mejorado
hist(residuals(modelo_2_butterfat), 
     main = "Histograma de Residuos", 
     xlab = "Residuos", 
     col = "blue", 
     border = "black", 
     breaks = 15,  
     xlim = c(min(residuals(modelo_2_butterfat)), max(residuals(modelo_2_butterfat))),  
     ylim = c(0, 20),  
     cex.main = 1.5,  
     cex.lab = 1.2,   
     cex.axis = 1.2)  

# Agregar una línea vertical en la media
abline(v = mean(residuals(modelo_2_butterfat)), col = "red", lwd = 2, lty = 2)
legend("topright", legend = "Media", col = "red", lty = 2, lwd = 2)

QQ-Plot de los Residuos

# QQ-Plot de los residuos mejorado
qqnorm(residuals(modelo_2_butterfat), 
       main = "QQ-Plot de Residuos", 
       xlab = "Cuantiles Teóricos", 
       ylab = "Cuantiles de Residuos", 
       pch = 19,           
       col = "blue")       

# Agregar la línea de referencia
qqline(residuals(modelo_2_butterfat), col = "red", lwd = 2)