Los valores residuales se distribuyen normalmente . Esto puede comprobarse utilizando un gráfico de probabilidad normal o un histograma .
Debe haber una relación lineal entre las variables dependientes e independientes . Esto se puede ilustrar mediante diagramas de dispersión que muestran una relación lineal o curvilínea.
la multicolinealidad es otro supuesto, lo que significa que las variables independientes no están altamente correlacionadas entre sí. La multicolinealidad dificulta identificar qué variables explican mejor la variable dependiente. Esta suposición se verifica calculando una matriz de correlaciones bivariadas de Pearson entre todas las variables independientes. Si no hay colinealidad en los datos, todos los valores deben ser inferiores a 0,8.
La homocedasticidad asume que la varianza de los errores residuales es similar a través del valor de cada variable independiente. Una forma de comprobarlo es a través de un gráfico de los valores pronosticados frente a los valores residuales estandarizados para ver si los puntos se distribuyen por igual entre todos los valores de las variables independientes.
#cargamos la libreria en la que se encuentran los datos
library(MASS)
data(Boston)
#mostramos los primeros elementos de la data
head(Boston)
## crim zn indus chas nox rm age dis rad tax ptratio black lstat
## 1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98
## 2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14
## 3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03
## 4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94
## 5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33
## 6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21
## medv
## 1 24.0
## 2 21.6
## 3 34.7
## 4 33.4
## 5 36.2
## 6 28.7
El Boston marco de datos tiene 506 filas y 14 columnas.
crim: Tasa de criminalidad per cápita por ciudad.
zn: proporción de suelo residencial zonificado para lotes de más de 25,000 pies cuadrados.
indus: proporción de acres comerciales no minoristas por ciudad.
chas: Variable ficticia del río Charles (= 1 si el tramo limita con el río; 0 en caso contrario).
nox: concentración de óxidos de nitrógeno (partes por 10 millones).
rm: Número medio de habitaciones por vivienda.
age: proporción de unidades ocupadas por sus propietarios construidas antes de 1940.
dis: media ponderada de las distancias a cinco centros de empleo de Boston.
rad: índice de accesibilidad a las carreteras radiales.
tax: tasa de impuesto a la propiedad de valor total por $10,000.
ptratio:Relación alumno-docente por ciudad.
black: 1000(Bk - 0.63)^2 donde Bk es la proporción de negros por ciudad.
lstat: menor estatus de la población (porcentaje).
medv: valor medio de las viviendas ocupadas por sus propietarios en $1000s.
library(psych)
## Warning: package 'psych' was built under R version 4.2.3
# La variable chas es una variable categórica por lo que se transforma a factor
Boston$chas <- as.factor(Boston$chas)
summary(Boston)
## crim zn indus chas nox
## Min. : 0.00632 Min. : 0.00 Min. : 0.46 0:471 Min. :0.3850
## 1st Qu.: 0.08205 1st Qu.: 0.00 1st Qu.: 5.19 1: 35 1st Qu.:0.4490
## Median : 0.25651 Median : 0.00 Median : 9.69 Median :0.5380
## Mean : 3.61352 Mean : 11.36 Mean :11.14 Mean :0.5547
## 3rd Qu.: 3.67708 3rd Qu.: 12.50 3rd Qu.:18.10 3rd Qu.:0.6240
## Max. :88.97620 Max. :100.00 Max. :27.74 Max. :0.8710
## rm age dis rad
## Min. :3.561 Min. : 2.90 Min. : 1.130 Min. : 1.000
## 1st Qu.:5.886 1st Qu.: 45.02 1st Qu.: 2.100 1st Qu.: 4.000
## Median :6.208 Median : 77.50 Median : 3.207 Median : 5.000
## Mean :6.285 Mean : 68.57 Mean : 3.795 Mean : 9.549
## 3rd Qu.:6.623 3rd Qu.: 94.08 3rd Qu.: 5.188 3rd Qu.:24.000
## Max. :8.780 Max. :100.00 Max. :12.127 Max. :24.000
## tax ptratio black lstat
## Min. :187.0 Min. :12.60 Min. : 0.32 Min. : 1.73
## 1st Qu.:279.0 1st Qu.:17.40 1st Qu.:375.38 1st Qu.: 6.95
## Median :330.0 Median :19.05 Median :391.44 Median :11.36
## Mean :408.2 Mean :18.46 Mean :356.67 Mean :12.65
## 3rd Qu.:666.0 3rd Qu.:20.20 3rd Qu.:396.23 3rd Qu.:16.95
## Max. :711.0 Max. :22.00 Max. :396.90 Max. :37.97
## medv
## Min. : 5.00
## 1st Qu.:17.02
## Median :21.20
## Mean :22.53
## 3rd Qu.:25.00
## Max. :50.00
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(knitr)
## Warning: package 'knitr' was built under R version 4.2.3
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(patchwork) # PAra varias gráficos en el mismo renglón
## Warning: package 'patchwork' was built under R version 4.2.3
##
## Attaching package: 'patchwork'
## The following object is masked from 'package:MASS':
##
## area
Nuestra metodologia se basa en encontrar la forma mas adecuada para una seleccion de variables predictoras en el modelo, con el proposito de lograr un modelo para predecir el precio de venta de una casa en funci´on de la informaci´on disponible en el conjunto de datos.
g1 <- ggplot(data = Boston, mapping = aes(x = crim, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ crim', x = 'crim') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g2 <- ggplot(data = Boston, mapping = aes(x = zn, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ zn', x = 'zn') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g3 <- ggplot(data = Boston, mapping = aes(x = indus, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ indus', x = 'indus') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g4 <- ggplot(data = Boston, mapping = aes(x = chas, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ chas', x = 'chas') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g5 <- ggplot(data = Boston, mapping = aes(x = nox, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ nox', x = 'nox') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g6 <- ggplot(data = Boston, mapping = aes(x = rm, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ rm', x = 'rm') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g7 <- ggplot(data = Boston, mapping = aes(x = age, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ age', x = 'age') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g8 <- ggplot(data = Boston, mapping = aes(x = dis, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ dis', x = 'dis') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g9 <- ggplot(data = Boston, mapping = aes(x = rad, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ rad', x = 'rad') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g10 <- ggplot(data = Boston, mapping = aes(x = tax, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ tax', x = 'tax') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g11 <- ggplot(data = Boston, mapping = aes(x = ptratio, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ ptratio', x = 'ptratio') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g12 <- ggplot(data = Boston, mapping = aes(x = black, y = medv)) +
geom_point(color = "orange", size = 2) +
labs(title = 'medv ~ black', x = 'black') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
g13 <- ggplot(data = Boston, mapping = aes(x = lstat, y = medv)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'medv ~ lstat', x = 'lstat') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
#g1+g2+g3+g4+g5+g6+g7+g8+g9+g10
g1
## `geom_smooth()` using formula = 'y ~ x'
g2
## `geom_smooth()` using formula = 'y ~ x'
g3
## `geom_smooth()` using formula = 'y ~ x'
g4
## `geom_smooth()` using formula = 'y ~ x'
g5
## `geom_smooth()` using formula = 'y ~ x'
g6
## `geom_smooth()` using formula = 'y ~ x'
g7
## `geom_smooth()` using formula = 'y ~ x'
g8
## `geom_smooth()` using formula = 'y ~ x'
g9
## `geom_smooth()` using formula = 'y ~ x'
g10
## `geom_smooth()` using formula = 'y ~ x'
g11
## `geom_smooth()` using formula = 'y ~ x'
g12
## `geom_smooth()` using formula = 'y ~ x'
g13
## `geom_smooth()` using formula = 'y ~ x'
require(corrplot)
## Loading required package: corrplot
## corrplot 0.92 loaded
corrplot.mixed(corr = cor(Boston[,c("crim", "zn", "nox", "rm", "dis", "rad",
"tax", "ptratio", "black", "lstat", "medv")],
method = "pearson"))
modelo1 <- lm(formula = medv ~ ., data = Boston)
# También se pueden especificar una a una
summary(modelo1)
##
## Call:
## lm(formula = medv ~ ., data = Boston)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.595 -2.730 -0.518 1.777 26.199
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.646e+01 5.103e+00 7.144 3.28e-12 ***
## crim -1.080e-01 3.286e-02 -3.287 0.001087 **
## zn 4.642e-02 1.373e-02 3.382 0.000778 ***
## indus 2.056e-02 6.150e-02 0.334 0.738288
## chas1 2.687e+00 8.616e-01 3.118 0.001925 **
## nox -1.777e+01 3.820e+00 -4.651 4.25e-06 ***
## rm 3.810e+00 4.179e-01 9.116 < 2e-16 ***
## age 6.922e-04 1.321e-02 0.052 0.958229
## dis -1.476e+00 1.995e-01 -7.398 6.01e-13 ***
## rad 3.060e-01 6.635e-02 4.613 5.07e-06 ***
## tax -1.233e-02 3.760e-03 -3.280 0.001112 **
## ptratio -9.527e-01 1.308e-01 -7.283 1.31e-12 ***
## black 9.312e-03 2.686e-03 3.467 0.000573 ***
## lstat -5.248e-01 5.072e-02 -10.347 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.745 on 492 degrees of freedom
## Multiple R-squared: 0.7406, Adjusted R-squared: 0.7338
## F-statistic: 108.1 on 13 and 492 DF, p-value: < 2.2e-16
El p-value obtenido para el estadístico F es muy pequeño (< 2.2e-16) lo que indica que al menos uno de los predictores introducidos en el modelo está relacionado con la variable respuesta medv. El modelo es capaz de explicar el 74% de la variabilidad observada en el precio de la vivienda (R2=0.74)
En el summary se puede observar que algunos predictores tienen p-values muy altos, sugiriendo que no contribuyen al modelo por lo que deben ser excluidos, por ejemplo age e indus. La exclusión de predictores basándose en p-values no es aconsejable, en su lugar se recomienda emplear métodos de best subset selection, stepwise selection (forward, backward e hybrid) o Shrinkage/regularization. Para una descripción detallada de cada uno ver capítulo Selección de predictores y mejor modelo: Subset selection, Ridge, Lasso y dimension reduction.
Existen diversos métodos de selección de variables que son comúnmente utilizados. A continuación, se presentan de manera ordenada:
Selección hacia atrás (Backward Stepwise Regression): En este método, se introducen todas las variables en la ecuación del modelo y, posteriormente, se van excluyendo una a una. En cada etapa, se elimina la variable que tiene el menor impacto según algún criterio de contraste individual, como la estadística t o la estadística F.
Selección hacia adelante (Forward Stepwise Regression): En este enfoque, las variables se introducen secuencialmente en el modelo. La primera variable que se introduce es aquella que tiene la mayor correlación positiva o negativa con la variable dependiente. Dicha variable se incluirá en la ecuación solo si cumple con el criterio de entrada establecido. Luego, se considera la variable independiente cuya correlación parcial sea la mayor y que aún no esté presente en la ecuación. El procedimiento continúa hasta que no quedan más variables que cumplan el criterio de entrada.
Pasos sucesivos (Stepwise Regression): Este método combina los procedimientos anteriores. En cada paso, se introduce la variable independiente que no esté presente en la ecuación y que tenga la menor probabilidad para la estadística F (es decir, hacia adelante). Además, las variables que ya fueron incluidas en la ecuación pueden ser eliminadas del modelo (es decir, hacia atrás). El método finaliza cuando ya no hay más variables candidatas para ser incluidas o eliminadas.
Estos métodos son utilizados para seleccionar las variables más relevantes y adecuadas en un modelo de regresión múltiple. La elección del método a utilizar dependerá del contexto del problema y de los objetivos específicos del análisis. Es importante considerar que la selección de variables debe realizarse con precaución y validarse adecuadamente para evitar problemas como el sobreajuste del modelo.
step(modelo1, direction = "both", trace = 0)
##
## Call:
## lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad +
## tax + ptratio + black + lstat, data = Boston)
##
## Coefficients:
## (Intercept) crim zn chas1 nox rm
## 36.341145 -0.108413 0.045845 2.718716 -17.376023 3.801579
## dis rad tax ptratio black lstat
## -1.492711 0.299608 -0.011778 -0.946525 0.009291 -0.522553
La selección de predictores empleando stepwise selection (hybrid/doble): Este método se inicia al igual que el forward pero, tras cada nueva incorporación, se realiza un test de extracción de predictores no útiles (como en el backward). Este método se aproxima más al best subset selection pero sin caer en tantas limitaciones computacionales.
ha identificado como mejor modelo el formado por los predictores crim, zn, chas, nox, rm, dis, rad, tax, ptratio, black, lstat. Estas son las varaibles más importantes para predecir el precio
modelo2 <- lm(formula = medv ~ crim + zn + chas + nox + rm + dis +
rad + tax + ptratio + black + lstat, data = Boston)
summary(modelo2)
##
## Call:
## lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad +
## tax + ptratio + black + lstat, data = Boston)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.5984 -2.7386 -0.5046 1.7273 26.2373
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 36.341145 5.067492 7.171 2.73e-12 ***
## crim -0.108413 0.032779 -3.307 0.001010 **
## zn 0.045845 0.013523 3.390 0.000754 ***
## chas1 2.718716 0.854240 3.183 0.001551 **
## nox -17.376023 3.535243 -4.915 1.21e-06 ***
## rm 3.801579 0.406316 9.356 < 2e-16 ***
## dis -1.492711 0.185731 -8.037 6.84e-15 ***
## rad 0.299608 0.063402 4.726 3.00e-06 ***
## tax -0.011778 0.003372 -3.493 0.000521 ***
## ptratio -0.946525 0.129066 -7.334 9.24e-13 ***
## black 0.009291 0.002674 3.475 0.000557 ***
## lstat -0.522553 0.047424 -11.019 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.736 on 494 degrees of freedom
## Multiple R-squared: 0.7406, Adjusted R-squared: 0.7348
## F-statistic: 128.2 on 11 and 494 DF, p-value: < 2.2e-16
#par(mfrow = c(2, 2))
plot(modelo2)
Realizamos ahora una prueba de homocedasticidad y normalidad
Test de homocedasticidad: La función bptest() en R es un test de Breusch-Pagan para la heterocedasticidad en modelos de regresión. Esta función toma como entrada un modelo de regresión y devuelve el resultado de la prueba de hipótesis para la homocedasticidad de los residuos.
HO: los residuos tienen varianza constante (homocedasticidad)
HA: hay heterocedasticidad en los residuos
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo2)
##
## studentized Breusch-Pagan test
##
## data: modelo2
## BP = 59.907, df = 11, p-value = 9.647e-09
Vemos que el valor de p-valor (p) es muy inferior a nuestro nivel elegido (0,05), por lo querechazamos la hipótesis nula.
El test de Shapiro-Wilks plantea la hipótesis nula que una muestra proviene de una distribución normal. Eligimos un nivel de significanza, por ejemplo 0,05, y tenemos una hipótesis alternativa que sostiene que la distribución no es normal.
Tenemos:
H0: La distribución es normal
H1: La distribución no es normal
model_residuals = modelo2$residuals
shapiro.test(model_residuals)
##
## Shapiro-Wilk normality test
##
## data: model_residuals
## W = 0.90131, p-value < 2.2e-16
Vemos que el valor de p-valor (p) es muy inferior a nuestro nivel elegido (0,05), por lo que rechazamos la hipótesis nula.
Cuando observamos el gráfico QQ, podemos decir que los residuos no se distribuyen normalmente. Los residuos no se distribuyen normalmente. También vemos en el gráfico de ubicación extendida que la variabilidad (varianzas) de los puntos residuales aumenta con el valor de la variable de resultado ajustada, lo que sugiere variaciones no constantes en los errores residuales (o heteroscedasticidad). Según la prueba de normalidad de Shapiro-Wilk, el valor de p fue inferior a 0,05, por lo que se confirmó.
Como mencioné anteriormente, la regresión lineal asume que la dispersión de los residuos es constante a lo largo de la gráfica. Cada vez que viola una suposición, existe la posibilidad de que no pueda confiar en los resultados estadísticos.
¿Por qué solucionar este problema? Hay dos grandes razones por las que desea la homocedasticidad:
Si bien la heteroscedasticidad no genera sesgo en las estimaciones de los coeficientes , sí las hace menos precisas. Una menor precisión aumenta la probabilidad de que las estimaciones del coeficiente estén más alejadas del valor correcto de la población.
La heterocedasticidad tiende a producir valores de p que son más pequeños de lo que deberían ser. Este efecto ocurre porque la heteroscedasticidad aumenta la varianza de los coeficientes estimados pero el procedimiento OLS no detecta este aumento.
En un modelo lineal de regresión múltiple, los residuos son la diferencia entre los valores observados y los valores predichos por el modelo para cada uno de los puntos de datos. Matemáticamente, los residuos se calculan como la diferencia entre el valor observado (y) y el valor predicho (ŷ) para cada punto de datos, es decir:
e = y - ŷ
Los residuos son una medida de qué tan bien se ajusta el modelo a los datos. Idealmente, los residuos deberían ser aleatorios y tener una distribución normal con media cero y una varianza constante (homocedasticidad), lo que indica que el modelo captura correctamente la relación entre las variables independientes y la variable dependiente. Sin embargo, si los residuos no se distribuyen normalmente o no son homocedásticos, puede indicar que el modelo no es adecuado para los datos o que hay variables importantes que no se han incluido en el modelo.
Vamos a ver el grafico de cajad e las variables para luego ir limpiando los datos atipicos de estas y seguir viendo como se va comportando el modelo a medida que vamos mejorando las condiciones para la homocedasticidad y normalidad de los residuales. Vamos a identificar la varaible black con una serie de datos atipicos en su gran mayoria, en la cual descartaremos del modelo, seguiremos trabajadno con las varaibles identificando sus valores atpicos.
Cuando vamos realizando la limpieza de los datos atipicos vemos como varaibles dejan de ser estadisticamente significativa unas con respecto a modelo elimiando valores atipicos de unas variables, asi poco a poco iremos ajustando modelo
boxplot(Boston)
data <- Boston[,1:14]
dim(data)
## [1] 506 14
## [1] 150 4
quartiles <- quantile(data$crim, probs=c(.25, .75), na.rm = FALSE)
IQR <- IQR(data$crim)
Lower <- quartiles[1] - 1.5*IQR
Upper <- quartiles[2] + 1.5*IQR
data_no_outlier <- subset(data, data$crim > Lower & data$crim < Upper)
dim(data_no_outlier)
## [1] 440 14
## [1] 146 4
boxplot(data_no_outlier)
data <- data_no_outlier[,1:14]
dim(data)
## [1] 440 14
## [1] 150 4
quartiles <- quantile(data$tax, probs=c(.25, .75), na.rm = FALSE)
IQR <- IQR(data$crim)
Lower <- quartiles[1] - 1.5*IQR
Upper <- quartiles[2] + 1.5*IQR
data_no_outlier <- subset(data, data$tax > Lower & data$tax < Upper)
dim(data_no_outlier)
## [1] 234 14
## [1] 146 4
boxplot(data_no_outlier)
modelo3 <- lm(formula = medv ~ zn + chas + nox + rm + dis +
rad + tax + ptratio + black + lstat, data = data_no_outlier)
summary(modelo3)
##
## Call:
## lm(formula = medv ~ zn + chas + nox + rm + dis + rad + tax +
## ptratio + black + lstat, data = data_no_outlier)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.0688 -1.8443 -0.2824 1.4654 11.6397
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -18.873598 5.925155 -3.185 0.001653 **
## zn -0.005965 0.015440 -0.386 0.699622
## chas1 0.798188 0.779678 1.024 0.307067
## nox -7.175010 3.431690 -2.091 0.037678 *
## rm 8.249334 0.455291 18.119 < 2e-16 ***
## dis -0.582854 0.196672 -2.964 0.003371 **
## rad 0.104056 0.136506 0.762 0.446698
## tax 0.008193 0.005859 1.398 0.163398
## ptratio -0.600383 0.120604 -4.978 1.28e-06 ***
## black 0.017688 0.004866 3.635 0.000345 ***
## lstat -0.196361 0.053438 -3.675 0.000298 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.118 on 223 degrees of freedom
## Multiple R-squared: 0.8337, Adjusted R-squared: 0.8263
## F-statistic: 111.8 on 10 and 223 DF, p-value: < 2.2e-16
model_residuals = modelo3$residuals
shapiro.test(model_residuals)
##
## Shapiro-Wilk normality test
##
## data: model_residuals
## W = 0.97063, p-value = 9.057e-05
bptest(modelo3)
##
## studentized Breusch-Pagan test
##
## data: modelo3
## BP = 25.382, df = 10, p-value = 0.004666
plot(modelo3)
boxplot(data_no_outlier)
data <- data_no_outlier[,1:14]
dim(data)
## [1] 234 14
## [1] 150 4
quartiles <- quantile(data$medv, probs=c(.25, .75), na.rm = FALSE)
IQR <- IQR(data$crim)
Lower <- quartiles[1] - 1.5*IQR
Upper <- quartiles[2] + 1.5*IQR
data_no_outlier <- subset(data, data$medv > Lower & data$medv < Upper)
dim(data_no_outlier)
## [1] 130 14
## [1] 146 4
modelo4 <- lm(formula = medv ~ zn + nox + rm + dis +
ptratio + lstat, data = data_no_outlier)
summary(modelo4)
##
## Call:
## lm(formula = medv ~ zn + nox + rm + dis + ptratio + lstat, data = data_no_outlier)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.330 -1.074 0.109 1.026 4.694
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.112480 4.504780 3.577 0.000498 ***
## zn -0.012635 0.009690 -1.304 0.194677
## nox -3.009919 2.288820 -1.315 0.190939
## rm 2.075394 0.546769 3.796 0.000230 ***
## dis -0.006956 0.135539 -0.051 0.959152
## ptratio -0.219401 0.081007 -2.708 0.007724 **
## lstat -0.093437 0.041723 -2.239 0.026922 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.533 on 123 degrees of freedom
## Multiple R-squared: 0.319, Adjusted R-squared: 0.2857
## F-statistic: 9.601 on 6 and 123 DF, p-value: 1.187e-08
plot(modelo4)
model_residuals = modelo4$residuals
shapiro.test(model_residuals)
##
## Shapiro-Wilk normality test
##
## data: model_residuals
## W = 0.99232, p-value = 0.7014
bptest(modelo4)
##
## studentized Breusch-Pagan test
##
## data: modelo4
## BP = 16.184, df = 6, p-value = 0.0128
El código para eliminar las filas correspondientes del dataframe data_no_outlier es posible que las filas no se eliminen correctamente debido a un problema en la indexación de las filas.
Debemos asegurarnos que los números de fila que estás especificando en el código sean correctos y correspondan a las filas que queremos eliminar. Vamos a verificar la estructura del dataframe data_no_outlier y confirmar los índices de las filas.
nrow(data_no_outlier)
## [1] 130
data_no_outlier
## crim zn indus chas nox rm age dis rad tax ptratio black
## 1 0.00632 18.0 2.31 0 0.5380 6.575 65.2 4.0900 1 296 15.3 396.90
## 7 0.08829 12.5 7.87 0 0.5240 6.012 66.6 5.5605 5 311 15.2 395.60
## 10 0.17004 12.5 7.87 0 0.5240 6.004 85.9 6.5921 5 311 15.2 386.71
## 12 0.11747 12.5 7.87 0 0.5240 6.009 82.9 6.2267 5 311 15.2 396.90
## 13 0.09378 12.5 7.87 0 0.5240 5.889 39.0 5.4509 5 311 15.2 390.50
## 14 0.62976 0.0 8.14 0 0.5380 5.949 61.8 4.7075 4 307 21.0 396.90
## 16 0.62739 0.0 8.14 0 0.5380 5.834 56.5 4.4986 4 307 21.0 395.62
## 17 1.05393 0.0 8.14 0 0.5380 5.935 29.3 4.4986 4 307 21.0 386.85
## 19 0.80271 0.0 8.14 0 0.5380 5.456 36.6 3.7965 4 307 21.0 288.99
## 22 0.85204 0.0 8.14 0 0.5380 5.965 89.2 4.0123 4 307 21.0 392.53
## 30 1.00245 0.0 8.14 0 0.5380 6.674 87.3 4.2390 4 307 21.0 380.23
## 36 0.06417 0.0 5.96 0 0.4990 5.933 68.2 3.3603 5 279 19.2 396.90
## 37 0.09744 0.0 5.96 0 0.4990 5.841 61.4 3.3779 5 279 19.2 377.56
## 38 0.08014 0.0 5.96 0 0.4990 5.850 41.5 3.9342 5 279 19.2 396.90
## 39 0.17505 0.0 5.96 0 0.4990 5.966 30.2 3.8473 5 279 19.2 393.43
## 57 0.02055 85.0 0.74 0 0.4100 6.383 35.7 9.1876 2 313 17.3 396.90
## 59 0.15445 25.0 5.13 0 0.4530 6.145 29.2 7.8148 8 284 19.7 390.68
## 60 0.10328 25.0 5.13 0 0.4530 5.927 47.2 6.9320 8 284 19.7 396.90
## 63 0.11027 25.0 5.13 0 0.4530 6.456 67.8 7.2255 8 284 19.7 396.90
## 64 0.12650 25.0 5.13 0 0.4530 6.762 43.4 7.9809 8 284 19.7 395.58
## 66 0.03584 80.0 3.37 0 0.3980 6.290 17.8 6.6115 4 337 16.1 396.90
## 67 0.04379 80.0 3.37 0 0.3980 5.787 31.1 6.6115 4 337 16.1 396.90
## 68 0.05789 12.5 6.07 0 0.4090 5.878 21.4 6.4980 4 345 18.9 396.21
## 70 0.12816 12.5 6.07 0 0.4090 5.885 33.0 6.4980 4 345 18.9 396.90
## 71 0.08826 0.0 10.81 0 0.4130 6.417 6.6 5.2873 4 305 19.2 383.73
## 72 0.15876 0.0 10.81 0 0.4130 5.961 17.5 5.2873 4 305 19.2 376.94
## 73 0.09164 0.0 10.81 0 0.4130 6.065 7.8 5.2873 4 305 19.2 390.91
## 74 0.19539 0.0 10.81 0 0.4130 6.245 6.2 5.2873 4 305 19.2 377.17
## 75 0.07896 0.0 12.83 0 0.4370 6.273 6.0 4.2515 5 398 18.7 394.92
## 76 0.09512 0.0 12.83 0 0.4370 6.286 45.0 4.5026 5 398 18.7 383.23
## 77 0.10153 0.0 12.83 0 0.4370 6.279 74.5 4.0522 5 398 18.7 373.66
## 78 0.08707 0.0 12.83 0 0.4370 6.140 45.8 4.0905 5 398 18.7 386.96
## 79 0.05646 0.0 12.83 0 0.4370 6.232 53.7 5.0141 5 398 18.7 386.40
## 80 0.08387 0.0 12.83 0 0.4370 5.874 36.6 4.5026 5 398 18.7 396.06
## 82 0.04462 25.0 4.86 0 0.4260 6.619 70.4 5.4007 4 281 19.0 395.63
## 83 0.03659 25.0 4.86 0 0.4260 6.302 32.2 5.4007 4 281 19.0 396.90
## 84 0.03551 25.0 4.86 0 0.4260 6.167 46.7 5.4007 4 281 19.0 390.64
## 97 0.11504 0.0 2.89 0 0.4450 6.163 69.6 3.4952 2 276 18.0 391.83
## 104 0.21161 0.0 8.56 0 0.5200 6.137 87.4 2.7147 5 384 20.9 394.47
## 105 0.13960 0.0 8.56 0 0.5200 6.167 90.0 2.4210 5 384 20.9 392.69
## 106 0.13262 0.0 8.56 0 0.5200 5.851 96.7 2.1069 5 384 20.9 394.05
## 107 0.17120 0.0 8.56 0 0.5200 5.836 91.9 2.2110 5 384 20.9 395.67
## 108 0.13117 0.0 8.56 0 0.5200 6.127 85.2 2.1224 5 384 20.9 387.69
## 109 0.12802 0.0 8.56 0 0.5200 6.474 97.1 2.4329 5 384 20.9 395.24
## 110 0.26363 0.0 8.56 0 0.5200 6.229 91.2 2.5451 5 384 20.9 391.23
## 111 0.10793 0.0 8.56 0 0.5200 6.195 54.4 2.7778 5 384 20.9 393.49
## 151 1.65660 0.0 19.58 0 0.8710 6.122 97.3 1.6180 5 403 14.7 372.80
## 152 1.49632 0.0 19.58 0 0.8710 5.404 100.0 1.5916 5 403 14.7 341.60
## 154 2.14918 0.0 19.58 0 0.8710 5.709 98.5 1.6232 5 403 14.7 261.95
## 159 1.34284 0.0 19.58 0 0.6050 6.066 100.0 1.7573 5 403 14.7 353.89
## 160 1.42502 0.0 19.58 0 0.8710 6.510 100.0 1.7659 5 403 14.7 364.31
## 165 2.24236 0.0 19.58 0 0.6050 5.854 91.8 2.4220 5 403 14.7 395.11
## 166 2.92400 0.0 19.58 0 0.6050 6.101 93.0 2.2834 5 403 14.7 240.16
## 168 1.80028 0.0 19.58 0 0.6050 5.877 79.2 2.4259 5 403 14.7 227.61
## 169 2.30040 0.0 19.58 0 0.6050 6.319 96.1 2.1000 5 403 14.7 297.09
## 170 2.44953 0.0 19.58 0 0.6050 6.402 95.2 2.2625 5 403 14.7 330.04
## 172 2.31390 0.0 19.58 0 0.6050 5.880 97.3 2.3887 5 403 14.7 348.13
## 173 0.13914 0.0 4.05 0 0.5100 5.572 88.5 2.5961 5 296 16.6 396.90
## 174 0.09178 0.0 4.05 0 0.5100 6.416 84.1 2.6463 5 296 16.6 395.50
## 175 0.08447 0.0 4.05 0 0.5100 5.859 68.7 2.7019 5 296 16.6 393.23
## 177 0.07022 0.0 4.05 0 0.5100 6.020 47.2 3.5549 5 296 16.6 393.23
## 178 0.05425 0.0 4.05 0 0.5100 6.315 73.4 3.3175 5 296 16.6 395.60
## 202 0.03445 82.5 2.03 0 0.4150 6.162 38.4 6.2700 2 348 14.7 393.77
## 206 0.13642 0.0 10.59 0 0.4890 5.891 22.3 3.9454 4 277 18.6 396.90
## 207 0.22969 0.0 10.59 0 0.4890 6.326 52.5 4.3549 4 277 18.6 394.87
## 208 0.25199 0.0 10.59 0 0.4890 5.783 72.7 4.3549 4 277 18.6 389.43
## 209 0.13587 0.0 10.59 1 0.4890 6.064 59.1 4.2392 4 277 18.6 381.32
## 210 0.43571 0.0 10.59 1 0.4890 5.344 100.0 3.8750 4 277 18.6 396.90
## 211 0.17446 0.0 10.59 1 0.4890 5.960 92.1 3.8771 4 277 18.6 393.25
## 212 0.37578 0.0 10.59 1 0.4890 5.404 88.6 3.6650 4 277 18.6 395.24
## 213 0.21719 0.0 10.59 1 0.4890 5.807 53.8 3.6526 4 277 18.6 390.94
## 215 0.28955 0.0 10.59 0 0.4890 5.412 9.8 3.5875 4 277 18.6 348.93
## 216 0.19802 0.0 10.59 0 0.4890 6.182 42.4 3.9454 4 277 18.6 393.63
## 217 0.04560 0.0 13.89 1 0.5500 5.888 56.0 3.1121 5 276 16.4 392.80
## 219 0.11069 0.0 13.89 1 0.5500 5.951 93.8 2.8893 5 276 16.4 396.90
## 220 0.11425 0.0 13.89 1 0.5500 6.373 92.4 3.3633 5 276 16.4 393.74
## 222 0.40771 0.0 6.20 1 0.5070 6.164 91.3 3.0480 8 307 17.4 395.24
## 231 0.53700 0.0 6.20 0 0.5040 5.981 68.1 3.6715 8 307 17.4 378.35
## 236 0.33045 0.0 6.20 0 0.5070 6.086 61.5 3.6519 8 307 17.4 376.75
## 237 0.52058 0.0 6.20 1 0.5070 6.631 76.5 4.1480 8 307 17.4 388.45
## 239 0.08244 30.0 4.93 0 0.4280 6.481 18.5 6.1899 6 300 16.6 379.41
## 240 0.09252 30.0 4.93 0 0.4280 6.606 42.2 6.1899 6 300 16.6 383.78
## 241 0.11329 30.0 4.93 0 0.4280 6.897 54.3 6.3361 6 300 16.6 391.25
## 242 0.10612 30.0 4.93 0 0.4280 6.095 65.1 6.3361 6 300 16.6 394.62
## 243 0.10290 30.0 4.93 0 0.4280 6.358 52.9 7.0355 6 300 16.6 372.75
## 244 0.12757 30.0 4.93 0 0.4280 6.393 7.8 7.0355 6 300 16.6 374.71
## 247 0.33983 22.0 5.86 0 0.4310 6.108 34.9 8.0555 7 330 19.1 390.18
## 248 0.19657 22.0 5.86 0 0.4310 6.226 79.2 8.0555 7 330 19.1 376.14
## 249 0.16439 22.0 5.86 0 0.4310 6.433 49.1 7.8265 7 330 19.1 374.71
## 251 0.14030 22.0 5.86 0 0.4310 6.487 13.0 7.3967 7 330 19.1 396.28
## 252 0.21409 22.0 5.86 0 0.4310 6.438 8.9 7.3967 7 330 19.1 377.07
## 255 0.04819 80.0 3.64 0 0.3920 6.108 32.0 9.2203 1 315 16.4 392.89
## 256 0.03548 80.0 3.64 0 0.3920 5.876 19.1 9.2203 1 315 16.4 395.18
## 286 0.01096 55.0 2.25 0 0.3890 6.453 31.9 7.3073 1 300 15.3 394.72
## 288 0.03871 52.5 5.32 0 0.4050 6.209 31.3 7.3172 6 293 16.6 396.90
## 289 0.04590 52.5 5.32 0 0.4050 6.315 45.6 7.3172 6 293 16.6 396.90
## 290 0.04297 52.5 5.32 0 0.4050 6.565 22.9 7.3172 6 293 16.6 371.72
## 294 0.08265 0.0 13.92 0 0.4370 6.127 18.4 5.5027 4 289 16.0 396.90
## 295 0.08199 0.0 13.92 0 0.4370 6.009 42.3 5.5027 4 289 16.0 396.90
## 298 0.14103 0.0 13.92 0 0.4370 5.790 58.0 6.3200 4 289 16.0 396.90
## 299 0.06466 70.0 2.24 0 0.4000 6.345 20.1 7.8278 5 358 14.8 368.24
## 301 0.04417 70.0 2.24 0 0.4000 6.871 47.4 7.8278 5 358 14.8 390.86
## 302 0.03537 34.0 6.09 0 0.4330 6.590 40.4 5.4917 7 329 16.1 395.75
## 309 0.49298 0.0 9.90 0 0.5440 6.635 82.5 3.3175 4 304 18.4 396.90
## 310 0.34940 0.0 9.90 0 0.5440 5.972 76.7 3.1025 4 304 18.4 396.24
## 312 0.79041 0.0 9.90 0 0.5440 6.122 52.8 2.6403 4 304 18.4 396.90
## 313 0.26169 0.0 9.90 0 0.5440 6.023 90.4 2.8340 4 304 18.4 396.30
## 314 0.26938 0.0 9.90 0 0.5440 6.266 82.8 3.2628 4 304 18.4 393.39
## 315 0.36920 0.0 9.90 0 0.5440 6.567 87.3 3.6023 4 304 18.4 395.69
## 318 0.24522 0.0 9.90 0 0.5440 5.782 71.7 4.0317 4 304 18.4 396.90
## 319 0.40202 0.0 9.90 0 0.5440 6.382 67.2 3.5325 4 304 18.4 395.21
## 320 0.47547 0.0 9.90 0 0.5440 6.113 58.8 4.0019 4 304 18.4 396.23
## 321 0.16760 0.0 7.38 0 0.4930 6.426 52.3 4.5404 5 287 19.6 396.90
## 322 0.18159 0.0 7.38 0 0.4930 6.376 54.3 4.5404 5 287 19.6 396.90
## 323 0.35114 0.0 7.38 0 0.4930 6.041 49.9 4.7211 5 287 19.6 396.90
## 325 0.34109 0.0 7.38 0 0.4930 6.415 40.1 4.7211 5 287 19.6 396.90
## 326 0.19186 0.0 7.38 0 0.4930 6.431 14.7 5.4159 5 287 19.6 393.68
## 327 0.30347 0.0 7.38 0 0.4930 6.312 28.9 5.4159 5 287 19.6 396.90
## 328 0.24103 0.0 7.38 0 0.4930 6.083 43.7 5.4159 5 287 19.6 396.90
## 333 0.03466 35.0 6.06 0 0.4379 6.031 23.3 6.6407 1 304 16.9 362.25
## 344 0.02543 55.0 3.78 0 0.4840 6.696 56.4 5.7321 5 370 17.6 396.90
## 348 0.01870 85.0 4.15 0 0.4290 6.516 27.7 8.5353 4 351 17.9 392.43
## 349 0.01501 80.0 2.01 0 0.4350 6.635 29.7 8.3440 4 280 17.0 390.94
## 351 0.06211 40.0 1.25 0 0.4290 6.490 44.4 8.7921 1 335 19.7 396.90
## 356 0.10659 80.0 1.91 0 0.4130 5.936 19.5 10.5857 4 334 22.0 376.04
## 494 0.17331 0.0 9.69 0 0.5850 5.707 54.0 2.3817 6 391 19.2 396.90
## 495 0.27957 0.0 9.69 0 0.5850 5.926 42.6 2.3817 6 391 19.2 396.90
## 496 0.17899 0.0 9.69 0 0.5850 5.670 28.8 2.7986 6 391 19.2 393.29
## 497 0.28960 0.0 9.69 0 0.5850 5.390 72.9 2.7986 6 391 19.2 396.90
## 499 0.23912 0.0 9.69 0 0.5850 6.019 65.3 2.4091 6 391 19.2 396.90
## lstat medv
## 1 4.98 24.0
## 7 12.43 22.9
## 10 17.10 18.9
## 12 13.27 18.9
## 13 15.71 21.7
## 14 8.26 20.4
## 16 8.47 19.9
## 17 6.58 23.1
## 19 11.69 20.2
## 22 13.83 19.6
## 30 11.98 21.0
## 36 9.68 18.9
## 37 11.41 20.0
## 38 8.77 21.0
## 39 10.13 24.7
## 57 5.77 24.7
## 59 6.86 23.3
## 60 9.22 19.6
## 63 6.73 22.2
## 64 9.50 25.0
## 66 4.67 23.5
## 67 10.24 19.4
## 68 8.10 22.0
## 70 8.79 20.9
## 71 6.72 24.2
## 72 9.88 21.7
## 73 5.52 22.8
## 74 7.54 23.4
## 75 6.78 24.1
## 76 8.94 21.4
## 77 11.97 20.0
## 78 10.27 20.8
## 79 12.34 21.2
## 80 9.10 20.3
## 82 7.22 23.9
## 83 6.72 24.8
## 84 7.51 22.9
## 97 11.34 21.4
## 104 13.44 19.3
## 105 12.33 20.1
## 106 16.47 19.5
## 107 18.66 19.5
## 108 14.09 20.4
## 109 12.27 19.8
## 110 15.55 19.4
## 111 13.00 21.7
## 151 14.10 21.5
## 152 13.28 19.6
## 154 15.79 19.4
## 159 6.43 24.3
## 160 7.39 23.3
## 165 11.64 22.7
## 166 9.81 25.0
## 168 12.14 23.8
## 169 11.10 23.8
## 170 11.32 22.3
## 172 12.03 19.1
## 173 14.69 23.1
## 174 9.04 23.6
## 175 9.64 22.6
## 177 10.11 23.2
## 178 6.29 24.6
## 202 7.43 24.1
## 206 10.87 22.6
## 207 10.97 24.4
## 208 18.06 22.5
## 209 14.66 24.4
## 210 23.09 20.0
## 211 17.27 21.7
## 212 23.98 19.3
## 213 16.03 22.4
## 215 29.55 23.7
## 216 9.47 25.0
## 217 13.51 23.3
## 219 17.92 21.5
## 220 10.50 23.0
## 222 21.46 21.7
## 231 11.65 24.3
## 236 10.88 24.0
## 237 9.54 25.1
## 239 6.36 23.7
## 240 7.37 23.3
## 241 11.38 22.0
## 242 12.40 20.1
## 243 11.22 22.2
## 244 5.19 23.7
## 247 9.16 24.3
## 248 10.15 20.5
## 249 9.52 24.5
## 251 5.90 24.4
## 252 3.59 24.8
## 255 6.57 21.9
## 256 9.25 20.9
## 286 8.23 22.0
## 288 7.14 23.2
## 289 7.60 22.3
## 290 9.51 24.8
## 294 8.58 23.9
## 295 10.40 21.7
## 298 15.84 20.3
## 299 4.97 22.5
## 301 6.07 24.8
## 302 9.50 22.0
## 309 4.54 22.8
## 310 9.97 20.3
## 312 5.98 22.1
## 313 11.72 19.4
## 314 7.90 21.6
## 315 9.28 23.8
## 318 15.94 19.8
## 319 10.36 23.1
## 320 12.73 21.0
## 321 7.20 23.8
## 322 6.87 23.1
## 323 7.70 20.4
## 325 6.12 25.0
## 326 5.08 24.6
## 327 6.15 23.0
## 328 12.79 22.2
## 333 7.83 19.4
## 344 7.18 23.9
## 348 6.36 23.1
## 349 5.99 24.5
## 351 5.98 22.9
## 356 5.57 20.6
## 494 12.01 21.8
## 495 13.59 24.5
## 496 17.60 23.1
## 497 21.14 19.7
## 499 12.92 21.2
posicion <- 72
fila <- row.names(data_no_outlier)[posicion]
print(fila)
## [1] "215"
data_no_outlier_new = data_no_outlier[-c(127,72,3,4),]
dim(data_no_outlier_new)
## [1] 126 14
Vemos que para observacion 495 es 127 215 es 72 10 es 3 12 es 4
modelo_final <- lm(formula = medv ~ zn + nox + rm + dis +
ptratio + lstat, data = data_no_outlier_new)
summary(modelo_final)
##
## Call:
## lm(formula = medv ~ zn + nox + rm + dis + ptratio + lstat, data = data_no_outlier_new)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.134 -1.079 0.021 0.924 3.231
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.71713 4.09481 4.083 8.10e-05 ***
## zn -0.02198 0.00905 -2.429 0.016644 *
## nox -2.00720 2.09279 -0.959 0.339450
## rm 2.07779 0.49636 4.186 5.47e-05 ***
## dis 0.13034 0.12976 1.004 0.317197
## ptratio -0.29342 0.07571 -3.875 0.000175 ***
## lstat -0.12422 0.04159 -2.987 0.003425 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.39 on 119 degrees of freedom
## Multiple R-squared: 0.4184, Adjusted R-squared: 0.389
## F-statistic: 14.27 on 6 and 119 DF, p-value: 3.386e-12
plot(modelo_final)
model_residuals = modelo_final$residuals
shapiro.test(model_residuals)
##
## Shapiro-Wilk normality test
##
## data: model_residuals
## W = 0.99129, p-value = 0.619
bptest(modelo_final)
##
## studentized Breusch-Pagan test
##
## data: modelo_final
## BP = 3.7611, df = 6, p-value = 0.709
Como podemos ver logramos cumplir los supuestos de homocedasticidad y normalidad para el modelo de regression multiple. Donde tenemos como variables predictoras para predecir predecir el precio de venta de una casa en funcion de
zn: proporción de suelo residencial zonificado para lotes de más de 25,000 pies cuadrados.
nox: concentración de óxidos de nitrógeno (partes por 10 millones).
age: proporción de unidades ocupadas por sus propietarios construidas antes de 1940.
dis: media ponderada de las distancias a cinco centros de empleo de Boston.
ptratio:Relación alumno-docente por ciudad.
lstat: menor estatus de la población (porcentaje).
El modelo de regresión lineal múltiple es una técnica estadística que busca establecer una relación lineal entre una variable de respuesta (en este caso, medv, que representa el valor medio de las viviendas) y varias variables predictoras (en este caso, zn, nox, rm, dis, ptratio y lstat).
El resumen proporcionado muestra los resultados de ajustar el modelo de regresión lineal múltiple a los datos. Aquí hay algunos puntos clave para interpretar el resumen:
Coeficientes: Los coeficientes de regresión estimados se encuentran en la columna “Estimate”. Cada coeficiente representa el cambio esperado en la variable de respuesta por unidad de cambio en la variable predictora correspondiente, manteniendo todas las demás variables constantes. Por ejemplo, para zn, un aumento de una unidad en zn se asocia, en promedio, con una disminución de 0.02198 en medv.
Significancia estadística: La columna “Pr(>|t|)” muestra los valores p asociados a cada coeficiente. Estos valores p indican la probabilidad de observar un valor del coeficiente igual o más extremo si la verdadera relación entre la variable de respuesta y la variable predictora fuera cero. Si el valor p es menor que un nivel de significancia predefinido (como 0.05), se considera que el coeficiente es estadísticamente significativo. En este caso, los coeficientes zn, rm, ptratio y lstat son significativos, lo que sugiere que estas variables tienen un efecto significativo en medv. Los coeficientes nox, dis y el término de intercepción no son significativos.
R-cuadrado: El valor de R-cuadrado (Multiple R-squared) es una medida de la cantidad de variabilidad en la variable de respuesta que es explicada por el modelo. En este caso, el R-cuadrado es 0.4184, lo que significa que aproximadamente el 41.84% de la variabilidad en medv se explica por las variables predictoras incluidas en el modelo. El R-cuadrado ajustado (Adjusted R-squared) tiene en cuenta el número de variables predictoras y los grados de libertad del modelo, y en este caso es 0.389.
Estadísticos de ajuste: El valor F-estadístico (F-statistic) evalúa si el modelo en su conjunto es estadísticamente significativo. Un valor F grande con un valor p pequeño sugiere que el modelo es significativo y que al menos una de las variables predictoras tiene un efecto significativo en la variable de respuesta. En este caso, el valor F-estadístico es 14.27 y el valor p correspondiente es extremadamente pequeño (3.386e-12), lo que indica que el modelo en general es estadísticamente significativo.
En resumen, el modelo de regresión lineal múltiple muestra que las variables zn, rm, ptratio y lstat tienen un efecto significativo en la variable de respuesta medv. Sin embargo, las variables nox y dis no tienen un efecto significativo. El modelo explica aproximadamente el 41.84% de la variabilidad en medv
Realizando un estudio sobre los intervalos de confianza de los coeficientes obtenidos
confint(modelo_final, level = 0.95)
## 2.5 % 97.5 %
## (Intercept) 8.60900192 24.825252989
## zn -0.03990208 -0.004061055
## nox -6.15112824 2.136721551
## rm 1.09495077 3.060631195
## dis -0.12660315 0.387287113
## ptratio -0.44334432 -0.143503627
## lstat -0.20656831 -0.041862755
library(knitr)
library(ISLR)
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(caret)
## Loading required package: lattice
library(ggplot2)
library(patchwork)
library(MASS)
library(dplyr)
library(readr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ purrr::lift() masks caret::lift()
## ✖ dplyr::select() masks MASS::select()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
De los datos sobre diabetes de la Clínica de Cleveland obtenidos del repositorio “UCI Machine Learning” se seleccionaron las siguientes características para identificar si una persona sufre de diabetes o no.
Polyuria: El cuerpo orina más de lo normal y expulsa cantidades excesivas o anormalmente grandes de orina cada vez.
Polydipsia: Boca seca y sed excesiva.
weakness: Fatiga / sensación de agotamiento y letargo.
delayed healing: Retraso en la cicatrización de las heridas, infecciones recurrentes o graves.
Polyuria (poliuria): La poliuria se caracteriza por una producción excesiva de orina y la necesidad de orinar con frecuencia. Este síntoma puede estar presente en personas con diabetes debido a niveles altos de glucosa en sangre, lo que lleva a un aumento en la producción de orina.
Polydipsia (polidipsia): La polidipsia es la sensación constante de sed excesiva y sequedad en la boca. En la diabetes, la polidipsia puede ser consecuencia de la poliuria y de la pérdida de líquidos debido a la micción frecuente.
Weakness (debilidad): La fatiga y sensación de agotamiento pueden ser síntomas de diabetes debido a que la glucosa no puede ingresar adecuadamente a las células para obtener energía. Esto puede llevar a una sensación general de debilidad y falta de energía.
Delayed healing (cicatrización retardada): La diabetes puede afectar la capacidad del cuerpo para cicatrizar adecuadamente las heridas. Los altos niveles de glucosa en sangre pueden dificultar la función inmunológica y la circulación sanguínea, lo que puede llevar a una cicatrización lenta de las heridas y aumentar el riesgo de infecciones.
library(psych)
Diabetes <- read_csv("diabetes.csv")
## Rows: 520 Columns: 17
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (16): Gender, Polyuria, Polydipsia, sudden weight loss, weakness, Polyph...
## dbl (1): Age
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
summary(Diabetes)
## Age Gender Polyuria Polydipsia
## Min. :16.00 Length:520 Length:520 Length:520
## 1st Qu.:39.00 Class :character Class :character Class :character
## Median :47.50 Mode :character Mode :character Mode :character
## Mean :48.03
## 3rd Qu.:57.00
## Max. :90.00
## sudden weight loss weakness Polyphagia Genital thrush
## Length:520 Length:520 Length:520 Length:520
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## visual blurring Itching Irritability delayed healing
## Length:520 Length:520 Length:520 Length:520
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## partial paresis muscle stiffness Alopecia Obesity
## Length:520 Length:520 Length:520 Length:520
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## class
## Length:520
## Class :character
## Mode :character
##
##
##
Diabetes <- Diabetes %>% select (class, Polyuria, Polydipsia, weakness, `delayed healing`) %>% mutate(class = recode(class,"Positive" = 1, "Negative" = 0)) %>% mutate(Polyuria = recode(Polyuria,"No" = 0, "Yes" = 1)) %>% mutate(Polydipsia = recode(Polydipsia,"No" = 0, "Yes" = 1)) %>% mutate(weakness = recode(weakness,"No" = 0, "Yes" = 1)) %>% mutate(`delayed healing` = recode(`delayed healing`,"No" = 0, "Yes" = 1))
modelo <- glm(formula = class ~ ., data = Diabetes, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = class ~ ., family = "binomial", data = Diabetes)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.32936 -0.57907 0.07938 0.20218 2.28170
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.3416 0.2097 -6.399 1.57e-10 ***
## Polyuria 3.1142 0.3582 8.694 < 2e-16 ***
## Polydipsia 3.2920 0.4263 7.723 1.14e-14 ***
## weakness 0.6939 0.3256 2.131 0.033059 *
## `delayed healing` -1.1845 0.3574 -3.314 0.000919 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 692.93 on 519 degrees of freedom
## Residual deviance: 327.34 on 515 degrees of freedom
## AIC: 337.34
##
## Number of Fisher Scoring iterations: 6
Intervalos de confianza para los coeficientes
confint(modelo, level = 0.95)
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -1.76759804 -0.9432923
## Polyuria 2.44363432 3.8547176
## Polydipsia 2.51080056 4.1987296
## weakness 0.05532442 1.3355651
## `delayed healing` -1.90624348 -0.5002945
Ninguno de los intervalos con un nivel de confianza del 95% contiene al 0 para su respectivo coeficiente.Otra manera de evaluar la bondad de ajuste para un modelo de regresión logística es a través de la matriz de confusión.
Primero, debemos establecer un umbral de clasificación. En la regresión logística, los valores predichos son probabilidades, por lo que necesitamos decidir un umbral para clasificar las observaciones como positivas o negativas. Por ejemplo, podemos elegir un umbral de 0.5, lo que significa que todas las observaciones con una probabilidad predicha superior a 0.5 se clasificarán como positivas, mientras que las inferiores se clasificarán como negativas.
Luego, podemos calcular las predicciones de clase utilizando el umbral de clasificación. Si el valor predicho es mayor que el umbral, se clasifica como positivo; de lo contrario, se clasifica como negativo.
Finalmente, podemos construir la matriz de confusión utilizando las predicciones de clase y las etiquetas de clase reales. La matriz de confusión tendrá 4 elementos: verdaderos positivos (TP), verdaderos negativos (TN), falsos positivos (FP) y falsos negativos (FN).
probs <- predict(modelo, type = "response")
rocobj <- roc(Diabetes$class, probs)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
predicted_class <- ifelse(probs >= 0.5, "1", "0")
probs <- factor(probs)
factordata <- factor(predicted_class)
factorreference <- factor(Diabetes$class)
confusionMatrix(factordata, factorreference)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 177 45
## 1 23 275
##
## Accuracy : 0.8692
## 95% CI : (0.8372, 0.897)
## No Information Rate : 0.6154
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.7293
##
## Mcnemar's Test P-Value : 0.01088
##
## Sensitivity : 0.8850
## Specificity : 0.8594
## Pos Pred Value : 0.7973
## Neg Pred Value : 0.9228
## Prevalence : 0.3846
## Detection Rate : 0.3404
## Detection Prevalence : 0.4269
## Balanced Accuracy : 0.8722
##
## 'Positive' Class : 0
##
En este caso, los resultados de la matriz de confusiónson los siguientes:
177 observaciones fueron clasificadas correctamente como clase 0 (etiqueta Reference) y también predichas correctamente como clase 0 (etiqueta ‘Prediction’). Estos son los verdaderos negativos (TN).
45 observaciones fueron clasificadas incorrectamente como clase 1 (etiqueta Reference), pero predichas como clase 0 (etiqueta Prediction). Estos son los falsos negativos (FN).
23 observaciones fueron clasificadas incorrectamente como clase 0 (etiqueta Reference), pero predichas como clase 1 (etiqueta Prediction). Estos son los falsos positivos (FP).
275 observaciones fueron clasificadas correctamente como clase 1 (etiqueta ‘Reference’) y también predichas correctamente como clase 1 (etiqueta ‘Prediction’). Estos son los verdaderos positivos (TP). Las estadísticas adicionales proporcionadas en la salida son las siguientes:
Accuracy: La precisión del modelo es del 0.8692, lo que significa que el modelo clasificó correctamente el 86.92% de las observaciones.
95% CI: El intervalo de confianza del 95% para la precisión del modelo está entre 0.8372 y 0.897.
No Information Rate: La tasa de no información es del 0.6154, que representa la precisión que se obtendría al clasificar todas las observaciones en la clase más prevalente.
Kappa: El coeficiente Kappa mide la concordancia entre las clasificaciones observadas y las clasificaciones esperadas al azar. En este caso, el valor de Kappa es de 0.7293, lo que indica una concordancia moderada entre las clasificaciones.
Mcnemar’s Test P-Value: El valor p del test de McNemar indica si hay una diferencia significativa en la clasificación entre el modelo y la tasa de no información. En este caso, el valor p es 0.01088, lo que sugiere que hay una diferencia significativa.
Sensitivity: La sensibilidad del modelo es del 0.8850, lo que indica la proporción de verdaderos positivos (TP) sobre el total de casos positivos.
Specificity: La especificidad del modelo es del 0.8594, lo que indica la proporción de verdaderos negativos (TN) sobre el total de casos negativos.
Pos Pred Value: El valor predictivo positivo es del 0.7973, lo que indica la proporción de verdaderos positivos (TP) sobre el total de casos clasificados como positivos.
Neg Pred Value: El valor predictivo negativo es del 0.9228, lo que indica la proporción de verdaderos negativos (TN) sobre el total de casos clasificados como negativos.
La curva ROC (Receiver Operating Characteristic) en regresión logística es una representación gráfica que muestra la relación entre la tasa de verdaderos positivos (Sensibilidad) y la tasa de falsos positivos (1 - Especificidad) para diferentes umbrales de clasificación.
En la regresión logística, se obtienen probabilidades predichas para cada observación. Estas probabilidades pueden interpretarse como la probabilidad de pertenecer a la clase positiva. Sin embargo, para tomar una decisión de clasificación binaria, es necesario establecer un umbral de clasificación. Si la probabilidad predicha es mayor que el umbral, se clasifica como positiva; de lo contrario, se clasifica como negativa.
La curva ROC traza la sensibilidad en el eje vertical y la especificidad en el eje horizontal. Cada punto en la curva representa un umbral de clasificación diferente. Al variar el umbral de clasificación, se calculan la sensibilidad y la especificidad correspondientes, lo que permite explorar el rendimiento del modelo en diferentes puntos de corte.
La curva ROC es útil para evaluar el rendimiento global del modelo de regresión logística y determinar el mejor umbral de clasificación. Cuanto más cerca esté la curva ROC del vértice superior izquierdo del gráfico, mejor será el rendimiento del modelo.
ggroc(rocobj)
El área bajo la curva ROC (AUC-ROC) también se utiliza como una medida de la capacidad de discriminación del modelo, donde un valor de 1 indica una capacidad perfecta de discriminación y un valor de 0.5 indica una capacidad de discriminación aleatoria.
auc(rocobj)
## Area under the curve: 0.9249
Un área bajo la curva ROC (AUC-ROC) de 0.9249 indica un excelente rendimiento del modelo de regresión logística en términos de su capacidad de discriminación.
La escala de valores para el AUC-ROC va de 0 a 1, donde un valor de 1 indica una capacidad de discriminación perfecta, lo que significa que el modelo puede distinguir perfectamente entre las clases positiva y negativa. Un valor de 0.5 indica una capacidad de discriminación aleatoria, donde el modelo no tiene capacidad para discriminar entre las clases mejor que lanzar una moneda al azar.
En este caso, con un AUC-ROC de 0.9249, podemos concluir que el modelo tiene una alta capacidad de discriminación y es capaz de clasificar correctamente la mayoría de las observaciones. Cuanto más cercano esté el AUC-ROC a 1, mejor será el rendimiento del modelo.
La interpretación práctica de un AUC-ROC de 0.9249 implica que el modelo tiene una alta probabilidad de clasificar correctamente una observación seleccionada al azar de la clase positiva por encima de una observación seleccionada al azar de la clase negativa.
En general, un AUC-ROC de 0.9249 sugiere que el modelo de regresión logística tiene un buen poder predictivo y puede ser considerado como un modelo sólido** para la clasificación de las observaciones en las clases positiva y negativa.