Regresión y verificación de supuestos
Contexto del conjunto de datos
library(readr)
Fish <- read_csv("Fish.csv")Estos datos provienen de una muestra de 159 especÃmenes de 7 especies de peces que son distribuidos en determinado mercado. En estos especÃmenes se midieron las siguientes variables:
- Weight: Peso del pez en gramos
- Length 1: Longitud vertical en centÃmetros
- Length 2: Longitud diagonal en centÃmetros
- Length 3: Longitud transversal en centÃmetros
- Height: Altura en centimetros.
- Width: Ancho de la diagonal en centÃmetros.
- Species: Especie del pez
El objetivo de este conjunto de datos es explicar el peso del pez a través de las otras variables del conjunto de datos.
El siguiente comando establece un ajuste lineal de los datos usando la variable Weight como dependiente y las demás como explicativas. Se presentan los coeficientes de la regresión.
fit_peces<-lm(Weight~Length1+Length2+Length3+Height+Width+ Species, data=Fish)
coef(fit_peces)## (Intercept) Length1 Length2 Length3
## -918.332140 -80.302952 79.888631 32.535381
## Height Width SpeciesParkki SpeciesPerch
## 5.250988 -0.515438 164.722661 137.948910
## SpeciesPike SpeciesRoach SpeciesSmelt SpeciesWhitefish
## -208.429357 103.039955 446.073317 93.874168
De los coeficientes de Species tendremos que estos son puntos de comparación con respecto a los datos de la especie Bream.
anova(fit_peces)## Analysis of Variance Table
##
## Response: Weight
## Df Sum Sq Mean Sq F value Pr(>F)
## Length1 1 16978060 16978060 1928.5523 < 2.2e-16 ***
## Length2 1 235134 235134 26.7091 7.589e-07 ***
## Length3 1 74109 74109 8.4181 0.004287 **
## Height 1 619028 619028 70.3160 3.787e-14 ***
## Width 1 18474 18474 2.0985 0.149571
## Species 6 1028534 171422 19.4720 < 2.2e-16 ***
## Residuals 147 1294118 8804
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit_peces)$adj.r.squared ## R^2_C## [1] 0.9313021
Verificamos gráficamente el comportamiento de los residuales
plot(fit_peces)Verificación de supuestos
Haremos verificación de supuestos básicos en el ajuste del modelo, sobre todo aquellos relacionados con la distribución de la que provienen los datos:
\[e_{ij} \sim^{iid} N(0,\sigma^2)\] Guardamos en un conjunto los valores de los residuos de la regresión
residuos<-resid(fit_peces)Autocorrelación
En este caso no tiene sentido la aplicabilidad del supuesto de autocorrelación por la forma en que se observaron los especÃmenes, en caso de contar con un orden intrÃnseco que tenga relevancia en la obtención de los datos, allà debemos verificar el supuesto, adicionalmente cuando observamos datos con una estructura temporal definida.
El siguiente es el coeficiente de correlación de los residuos.
cor(residuos[-1],residuos[-159])## [1] 0.5095895
Normalidad
Para verificar el comportamiento distribucional de estos datos debemos tener en cuenta que la estos supuestos deben revisarse a partir del comportamiento de los residuales, los cuales podemos extraerlos directamente desde el modelo.
Se sugiere realizar un gráfico de quantil-quantil para verificar si hay indicios de no normalidad en la muestra seleccionada:
library(car)
qqPlot(residuos, pch = 20)## [1] 73 143
Hay valores que se salen de las bandas de confianza, por lo tanto, hacemos el cálculo de una prueba de normalidad. Si p-value es menor a 0.05 (dependiendo del caso) decimos que hay evidencia para afirmar que los datos no provienen de una distribución normal.
shapiro.test(residuos)##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.93335, p-value = 9.145e-07
Homocedasticidad
Verificamos que la varianza de los datos es igual en todas las particiones definidas para el tipo de especie.
boxplot(residuos~Fish$Species)bartlett.test(residuos~Fish$Species)##
## Bartlett test of homogeneity of variances
##
## data: residuos by Fish$Species
## Bartlett's K-squared = 16.183, df = 6, p-value = 0.01281
Multicolinealidad
Verificamos sobre las variables independientes si hay alguna que se correlacione directamente con otra, de tal manera que ambas otorguen la misma información.
plot(Fish) # Gráfico de dispersión multivariadocor.test(Fish$Length1,Fish$Length2)##
## Pearson's product-moment correlation
##
## data: Fish$Length1 and Fish$Length2
## t = 403.11, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9993394 0.9996473
## sample estimates:
## cor
## 0.9995173
cor.test(Fish$Length1,Fish$Length3)##
## Pearson's product-moment correlation
##
## data: Fish$Length1 and Fish$Length3
## t = 98.656, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9891090 0.9941713
## sample estimates:
## cor
## 0.992031
cor.test(Fish$Length1,Fish$Height)##
## Pearson's product-moment correlation
##
## data: Fish$Length1 and Fish$Height
## t = 10.042, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.5203840 0.7117451
## sample estimates:
## cor
## 0.6253779
cor.test(Fish$Length1,Fish$Width)##
## Pearson's product-moment correlation
##
## data: Fish$Length1 and Fish$Width
## t = 21.806, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8223868 0.9010912
## sample estimates:
## cor
## 0.8670497
cor.test(Fish$Length2,Fish$Length3)##
## Pearson's product-moment correlation
##
## data: Fish$Length2 and Fish$Length3
## t = 114.86, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9919372 0.9956878
## sample estimates:
## cor
## 0.9941026
cor.test(Fish$Length2,Fish$Height)##
## Pearson's product-moment correlation
##
## data: Fish$Length2 and Fish$Height
## t = 10.449, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.5384698 0.7239251
## sample estimates:
## cor
## 0.6404408
cor.test(Fish$Length2,Fish$Width)##
## Pearson's product-moment correlation
##
## data: Fish$Length2 and Fish$Width
## t = 22.487, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8308686 0.9060084
## sample estimates:
## cor
## 0.8735467
cor.test(Fish$Length3,Fish$Height)##
## Pearson's product-moment correlation
##
## data: Fish$Length3 and Fish$Height
## t = 12.4, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6151058 0.7742847
## sample estimates:
## cor
## 0.7034089
cor.test(Fish$Length3,Fish$Width)##
## Pearson's product-moment correlation
##
## data: Fish$Length3 and Fish$Width
## t = 23.043, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8373749 0.9097666
## sample estimates:
## cor
## 0.8785202
cor.test(Fish$Height,Fish$Width)##
## Pearson's product-moment correlation
##
## data: Fish$Height and Fish$Width
## t = 16.303, df = 157, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7269460 0.8443297
## sample estimates:
## cor
## 0.792881
Veamos un modelo solo con la variable Length1 y Species.
fit_2<-lm(Weight~Length1+Species,data=Fish)
anova(fit_2)## Analysis of Variance Table
##
## Response: Weight
## Df Sum Sq Mean Sq F value Pr(>F)
## Length1 1 16978060 16978060 1810.731 < 2.2e-16 ***
## Species 6 1853569 308928 32.948 < 2.2e-16 ***
## Residuals 151 1415830 9376
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit_2)$adj.r.squared## [1] 0.9268321
plot(fit_2)