5.2 Práctica en R

5.2.1 Regresión lineal simple

Para realizarla usaremos la base de datos Boston de la librería MASS.

library(MASS)

Veamos la descripción de Boston en la ayuda de R:

?Boston
## starting httpd help server ... done

Observamos que es un data.frame con 506 observaciones y 14 variables.

Podemos explorar un poco más los datos usando las funciones head, tail y summary.

head(Boston,5)
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90
##   lstat medv
## 1  4.98 24.0
## 2  9.14 21.6
## 3  4.03 34.7
## 4  2.94 33.4
## 5  5.33 36.2
tail(Boston,5)
##        crim zn indus chas   nox    rm  age    dis rad tax ptratio  black
## 502 0.06263  0 11.93    0 0.573 6.593 69.1 2.4786   1 273      21 391.99
## 503 0.04527  0 11.93    0 0.573 6.120 76.7 2.2875   1 273      21 396.90
## 504 0.06076  0 11.93    0 0.573 6.976 91.0 2.1675   1 273      21 396.90
## 505 0.10959  0 11.93    0 0.573 6.794 89.3 2.3889   1 273      21 393.45
## 506 0.04741  0 11.93    0 0.573 6.030 80.8 2.5050   1 273      21 396.90
##     lstat medv
## 502  9.67 22.4
## 503  9.08 20.6
## 504  5.64 23.9
## 505  6.48 22.0
## 506  7.88 11.9
summary(Boston)
##       crim                zn             indus            chas        
##  Min.   : 0.00632   Min.   :  0.00   Min.   : 0.46   Min.   :0.00000  
##  1st Qu.: 0.08204   1st Qu.:  0.00   1st Qu.: 5.19   1st Qu.:0.00000  
##  Median : 0.25651   Median :  0.00   Median : 9.69   Median :0.00000  
##  Mean   : 3.61352   Mean   : 11.36   Mean   :11.14   Mean   :0.06917  
##  3rd Qu.: 3.67708   3rd Qu.: 12.50   3rd Qu.:18.10   3rd Qu.:0.00000  
##  Max.   :88.97620   Max.   :100.00   Max.   :27.74   Max.   :1.00000  
##       nox               rm             age              dis        
##  Min.   :0.3850   Min.   :3.561   Min.   :  2.90   Min.   : 1.130  
##  1st Qu.:0.4490   1st Qu.:5.886   1st Qu.: 45.02   1st Qu.: 2.100  
##  Median :0.5380   Median :6.208   Median : 77.50   Median : 3.207  
##  Mean   :0.5547   Mean   :6.285   Mean   : 68.57   Mean   : 3.795  
##  3rd Qu.:0.6240   3rd Qu.:6.623   3rd Qu.: 94.08   3rd Qu.: 5.188  
##  Max.   :0.8710   Max.   :8.780   Max.   :100.00   Max.   :12.127  
##       rad              tax           ptratio          black       
##  Min.   : 1.000   Min.   :187.0   Min.   :12.60   Min.   :  0.32  
##  1st Qu.: 4.000   1st Qu.:279.0   1st Qu.:17.40   1st Qu.:375.38  
##  Median : 5.000   Median :330.0   Median :19.05   Median :391.44  
##  Mean   : 9.549   Mean   :408.2   Mean   :18.46   Mean   :356.67  
##  3rd Qu.:24.000   3rd Qu.:666.0   3rd Qu.:20.20   3rd Qu.:396.23  
##  Max.   :24.000   Max.   :711.0   Max.   :22.00   Max.   :396.90  
##      lstat            medv      
##  Min.   : 1.73   Min.   : 5.00  
##  1st Qu.: 6.95   1st Qu.:17.02  
##  Median :11.36   Median :21.20  
##  Mean   :12.65   Mean   :22.53  
##  3rd Qu.:16.95   3rd Qu.:25.00  
##  Max.   :37.97   Max.   :50.00

Antes de continuar, hacemos la división de Boston en trainy test.

id_train <- sample(1:nrow(Boston), size = 0.8*nrow(Boston))
train <- Boston[id_train, ]
test <- Boston[-id_train, ]

Ajustamos el modelo de regresión lineal simple para predecir la variable medv utilizando la variable lstat de nuestro conjunto de datos Boston. Para ello usaremos la función lm.

reg_ls <- lm(medv~lstat, data = train)
reg_ls
## 
## Call:
## lm(formula = medv ~ lstat, data = train)
## 
## Coefficients:
## (Intercept)        lstat  
##      34.406       -0.948

Veamos los coeficientes de la regresión

reg_ls$coefficients
## (Intercept)       lstat 
##  34.4061181  -0.9480419

Donde el término independiente es:

reg_ls$coefficients[1]
## (Intercept) 
##    34.40612

y el coeficiente de la variable lstates:

reg_ls$coefficients[2]
##      lstat 
## -0.9480419

De manera que la recta de regresión lineal, siendo \(y\) la variable medv y \(x\) la variable lstat, es:

## y =  34.40612 +  -0.9480419 x

Si queremos obtener los errores residuales de las observaciones correspondientes:

residuales <- reg_ls$residuals
# Veamos los residuales de las 10 primeras observaciones
residuales[1:10]
##         160         428         449         312         132         181 
## -4.10008860 -9.74054994 -3.11811873 -6.63682766 -3.18312461 12.56107852 
##          45         468         408         154 
## -4.15231812  4.90613489  4.99362995 -0.03653674

Una vez obtenido el modelo de regresión lineal, para realizar la predicción sobre un nuevo conjunto de datos, utilizamos la función predict, de la siguiente manera:

predic <- predict(reg_ls, newdata = test)
#Veamos la predicción de las 10 primeras observaciones
predic[1:10]
##         5        11        15        19        20        28        30 
## 29.353055 15.018662 24.679208 23.323508 23.712206 18.023954 23.048576 
##        33        36        38 
##  8.135877 25.229073 26.091791

Algunas representaciones gráficas de un modelo de regresión son:

  • Dispersión de los puntos y la recta de regresión lineal simple obtenida:
regresion <- lm(medv~lstat, data = Boston)

plot(Boston$lstat, Boston$medv, xlab = "lstat", ylab = "medv")
abline(regresion, col='red', lwd=2)
a <- regresion$coefficients[[1]]
b <- regresion$coefficients[[2]] 
text(30,40,labels = paste('Y = ', round(b,2),'x +', round(a,2)), col='red')

  • Análisis de residuos:
par(mfrow=c(2,2))
plot(regresion)

5.2.2 Regresión lineal múltiple

Utilizamos lo mismo que hemos hecho para la regresión lineal simple, con la diferencia de que ahora hay más de una variable independiente. Usamos la misma función, lm, y la sucesión de variables independientes estarán separadas con un +, es decir:

reg_lm <- lm(medv~lstat + age, data = train)
reg_lm
## 
## Call:
## lm(formula = medv ~ lstat + age, data = train)
## 
## Coefficients:
## (Intercept)        lstat          age  
##    33.14816     -1.03036      0.03329

Veamos los coeficientes de la regresión

reg_lm$coefficients
## (Intercept)       lstat         age 
## 33.14815946 -1.03036412  0.03328534

Donde el término independiente es:

reg_lm$coefficients[1]
## (Intercept) 
##    33.14816

el coeficiente de la variable lstat es:

reg_lm$coefficients[2]
##     lstat 
## -1.030364

y el coeficiente de la variable age es:

reg_lm$coefficients[3]
##        age 
## 0.03328534

De manera que la recta de regresión lineal, siendo \(y\) la variable medv, \(x1\) la variable lstat y \(x2\) la variable age, será:

## y =  33.14816 +  -1.030364 x1 + 0.03328534 x2

Veamos los gráficos de dispersión 2 a 2:

pairs(Boston[,c('medv','lstat', 'age')],panel = panel.smooth)

Análogamente a como hemos hecho con la regresión lineal, podemos obtener los residuos y utilizar la función predict en un nuevo conjunto de datos.

Hay otras opciones de poner la variables independientes. Por ejemplo, si quisieramos usar todas las variables, como conjunto de variables independientes, bastaría con escribir:

reg_lm2 <- lm(medv~., data = train)
reg_lm2
## 
## Call:
## lm(formula = medv ~ ., data = train)
## 
## Coefficients:
## (Intercept)         crim           zn        indus         chas  
##   34.785192    -0.118096     0.048020     0.030283     2.828830  
##         nox           rm          age          dis          rad  
##  -13.909169     3.644206    -0.001432    -1.436879     0.333283  
##         tax      ptratio        black        lstat  
##   -0.013701    -0.910308     0.011107    -0.581303

Por otro lado, si quisieramos usarlas todas excepto alguna, podemos escribir:

reg_lm3 <- lm(medv~.-age, data = train)
reg_lm3
## 
## Call:
## lm(formula = medv ~ . - age, data = train)
## 
## Coefficients:
## (Intercept)         crim           zn        indus         chas  
##    34.81143     -0.11822      0.04816      0.03027      2.82593  
##         nox           rm          dis          rad          tax  
##   -14.01174      3.63657     -1.42979      0.33375     -0.01371  
##     ptratio        black        lstat  
##    -0.91157      0.01109     -0.58302