Los supuestos de regresión lineal múltiple

  1. Los valores residuales se distribuyen normalmente . Esto puede comprobarse utilizando un gráfico de probabilidad normal o un histograma .

  2. 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.

  3. 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.

  4. 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

Descripcion del dataset

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.

Inspeccion del dataset

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

Modelo 1

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

Metdologia

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.

  1. Realizamos un estudio de visualizacion de los datos
  2. Vemos que variables representan problema de multicolinealidad
  3. Vemos que variables son estadisticamente significativas (usando todas)
  4. Luego vamos usar un metodo de seleccio de variables predictoras y ver que el resultado concuerda con el estudio anterior
  5. Realizamos el estudio de los residuales(homocedasticidad y normalidad)

Visualizando los 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'

Multicolinealidad

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"))

Modelo 1 regresion multiple

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.

¿Como seleccionamos las varaibles predictoras?

Existen diversos métodos de selección de variables que son comúnmente utilizados. A continuación, se presentan de manera ordenada:

  1. 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.

  2. 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.

  3. 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.

Importancia a la hora de usar estos metodos de seleccion

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.

Aplicando metodo de seleccion

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

Estudio de los residuales

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

Problema de los residuales

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ó.

¿Qué problemas causa la heterocedasticidad?

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:

  1. 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.

  2. 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.

Importancia de la normalidad

Valores residuales se distribuyen normalmente

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.

Cumple normalidad pero disminuye R cuadrado

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

Resumen del modelo

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

Regresion Logistica

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

Dataset UCI MACHINE

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.

Descripcion de las varaibles y su importancia para el modelo

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.

Sobre el dataset

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

Filtramos el dataset

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

Definimos el modelo

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

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.

Curva ROC

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.