#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.
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.
# 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.
# 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)