Regresion Lineal

En nuestra carrera aprendemos sobre técnicas de inferencia estadística, incluidas la prueba t, la prueba de chi-cuadrado y ANOVA, que le permiten analizar diferencias entre muestras de datos y poblaciones. El modelado predictivo (usar muestras de datos para hacer predicciones sobre datos invisibles, como los que aún no se han generado) es otra tarea común de análisis de datos. El modelado predictivo es una forma de Machine Learning, que describe el uso de computadoras para automatizar el proceso de búsqueda de patrones en los datos.

El Machine Learning es la fuerza impulsora detrás de todo tipo de comodidades y sistemas de automatización modernos, como cajeros automáticos que pueden leer texto escrito a mano, teléfonos inteligentes que traducen voz a texto y automóviles sin conductor. Los métodos utilizados en estas aplicaciones de vanguardia son más avanzados que cualquier cosa que cubramos en esta introducción, pero todos se basan en los principios de tomar datos y aplicarles algún algoritmo de aprendizaje para llegar a algún tipo de predicción.

Bases Del Modelo de Regresion Lineal

La regresión lineal es una técnica de modelado para predecir una variable de respuesta numérica basada en una o más variables explicativas. El término “regresión” en el modelado predictivo generalmente se refiere a cualquier tarea de modelado que implique predecir un número real (a diferencia de la clasificación, que implica predecir una categoría o clase). El término “lineal” en el nombre de regresión lineal se refiere al hecho de que el método modela datos con una combinación lineal de las variables explicativas. Una combinación lineal es una expresión en la que una o más variables se escalan mediante un factor constante y se suman. En el caso de la regresión lineal con una única variable explicativa, la combinación lineal utilizada en la regresión lineal se puede expresar como:

response = intercept + constant ∗ explanatory

El lado derecho de la ecuación define una línea con una determinada intersección en el eje y y pendiente multiplicada por la variable explicativa. En otras palabras, la regresión lineal en su forma más básica ajusta una línea recta a la variable de respuesta. El modelo está diseñado para ajustarse a una línea que minimice las diferencias al cuadrado (también llamadas errores o residuos). No entraremos en todos los detalles matemáticos detrás de cómo el modelo realmente minimiza los errores al cuadrado, pero el resultado final es una línea destinada a dar el “mejor ajuste” a los datos. Dado que la regresión lineal ajusta los datos con una línea, es más eficaz en los casos en que la respuesta y la variable explicativa tienen una relación lineal.

Revisemos el conjunto de datos de mtcars y usemos la regresión lineal para predecir el consumo de gasolina del vehículo en función del peso del vehículo. Primero, veamos un diagrama de dispersión de peso y mpg para tener una mejor idea de los datos:

ggplot(data=mtcars, aes(x=wt, y=mpg)) +
    geom_point()

El diagrama de dispersión muestra una relación aproximadamente lineal entre el peso y las millas por galón, lo que sugiere que un modelo de regresión lineal podría funcionar bien.

Diccionario de Datos

mpg - Millas por Galon
cyl - # de cilindros
disp - desplazamiento, en pulgadas cúbicas
hp - caballos de fuerza
drat - relación del eje de transmisión

wt - peso
qsec - tiempo de 1/4 de milla; una medida de aceleración
vs - ‘V’ o recto - forma de motor
am - transmisión; automático o manual
gear - # de engranajes
carb - # de carburadores.

Para ajustar un modelo lineal en R, usamos una fórmula que especifica el modelo a la función lm().

mpg_model <- lm(mpg ~ wt,       # Fórmula de la forma respuesta ~ explicativa
                data=mtcars)    # Conjunto de datos a utilizar

summary(mpg_model)              # Ver un resumen del modelo de regresión
## 
## Call:
## lm(formula = mpg ~ wt, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5432 -2.3647 -0.1252  1.4096  6.8727 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  37.2851     1.8776  19.858  < 2e-16 ***
## wt           -5.3445     0.5591  -9.559 1.29e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.046 on 30 degrees of freedom
## Multiple R-squared:  0.7528, Adjusted R-squared:  0.7446 
## F-statistic: 91.38 on 1 and 30 DF,  p-value: 1.294e-10

El resultado anterior muestra la fórmula utilizada para crear el modelo, seguida de un resumen de cinco números de los residuos y un resumen de los coeficientes del modelo. Los coeficientes son las constantes utilizadas para crear la línea de mejor ajuste: en este caso, el término de la intersección con el eje y se establece en 37,2851 y el coeficiente de la variable de peso es -5,3445. En otras palabras, el modelo se ajusta a la línea mpg = 37,2851 - 5,3445 * wt.

Las columnas valor t y Pr(>|t|) (valor p) indican los resultados de realizar una prueba t que comprueba si los coeficientes elegidos difieren significativamente de cero. En este caso, existe casi certeza de que tanto la intersección con el eje y como los coeficientes variables de peso no son cero dados los valores p extremadamente bajos, lo que significa que tanto el término de la intersección como el peso probablemente sean útiles para predecir las millas por galón.

En la parte inferior del resultado resumido, los valores que nos interesan son “R cuadrado múltiple” y “R cuadrado ajustado”. R cuadrado múltiple es un valor que describe la proporción de la varianza en la variable de respuesta explicada por el modelo. En este caso, básicamente indica qué parte de la variación en mpg puede explicarse por el peso. El R cuadrado ajustado es una modificación del R cuadrado normal que se ajusta a modelos que involucran múltiples variables explicativas. A medida que se agregan más variables explicativas a un modelo, la lectura normal de R cuadrado solo puede aumentar, incluso si esas variables agregan poca información al modelo. En general, nos gustaría mantener los modelos lo más simples posible, por lo que es preferible el R cuadrado ajustado para evaluar el poder explicativo del modelo. En este caso, aproximadamente el 75% de la variación del mpg se explica por el peso.

Tracemos la línea de regresión en el diagrama de dispersión para tener una idea de qué tan bien se ajusta a los datos.

ggplot(data=mtcars, aes(x=wt, y=mpg)) +
    geom_point() +
    geom_abline(intercept = 37.2851, slope = -5.3445, color="red")

La línea de regresión parece un ajuste razonable y sigue nuestra intuición: a medida que aumenta el peso del automóvil, esperaríamos que la economía de combustible disminuya.

Los valores atípicos pueden tener una gran influencia en los modelos de regresión lineal: dado que la regresión trata de minimizar los residuos cuadrados, los residuos grandes tienen una influencia desproporcionadamente grande en el modelo. Trazar el resultado nos ayuda a detectar valores atípicos influyentes. En este caso no parece haber valores atípicos influyentes. Agreguemos un valor atípico (un automóvil súper pesado que ahorra combustible) y tracemos un nuevo modelo de regresión.

super_car <- c(50,10)                                 # Carro atípico 
new_cars <- rbind(mtcars[,c("mpg","wt")], super_car) # Agregar valor atípico a mtcars

ggplot(data=new_cars, aes(x=new_cars$wt, y=new_cars$mpg))+
    geom_point() +
    geom_smooth(method=lm,      # Agregar una línea de regresión lineal
                se=FALSE,       # No agregue la región de confianza sombreada
                color="red")

Aunque se trata de un caso extremo y artificial, el gráfico anterior ilustra cuánta influencia puede tener un único valor atípico en un modelo de regresión lineal.

Haciendo predicciones

Después de crear un modelo, nos gustaría poder usarlo para hacer predicciones. R contiene una función incorporada llamada predict() que puede usar para generar predicciones basadas en un modelo específico para el conjunto de datos original o para datos nuevos con las mismas variables que los datos originales. Usemos predict() para hacer predicciones sobre los datos originales.

preds <- predict(mpg_model,    # Modelo a utilizar para la predicción.
         newdata=mtcars)       # Datos a utilizar para la predicción

preds                          # Consultar predicciones
##           Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive 
##           23.282611           21.919770           24.885952           20.102650 
##   Hornet Sportabout             Valiant          Duster 360           Merc 240D 
##           18.900144           18.793255           18.205363           20.236262 
##            Merc 230            Merc 280           Merc 280C          Merc 450SE 
##           20.450041           18.900144           18.900144           15.533127 
##          Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental 
##           17.350247           17.083024            9.226650            8.296712 
##   Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
##            8.718926           25.527289           28.653805           27.478021 
##       Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28 
##           24.111004           18.472586           18.926866           16.762355 
##    Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa 
##           16.735633           26.943574           25.847957           29.198941 
##      Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E 
##           20.343151           22.480940           18.205363           22.427495

Nota: En la práctica, normalmente querríamos hacer predicciones basadas en algunos datos nuevos desconocidos (datos de prueba) que no influyeron en la creación del modelo original.

Podemos comprobar las diferencias entre nuestras predicciones y los valores reales restando las predicciones de los valores reales.

residuals <- mtcars$mpg-preds      # Verificar residuos
residuals
##           Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive 
##          -2.2826106          -0.9197704          -2.0859521           1.2973499 
##   Hornet Sportabout             Valiant          Duster 360           Merc 240D 
##          -0.2001440          -0.6932545          -3.9053627           4.1637381 
##            Merc 230            Merc 280           Merc 280C          Merc 450SE 
##           2.3499593           0.2998560          -1.1001440           0.8668731 
##          Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental 
##          -0.0502472          -1.8830236           1.1733496           2.1032876 
##   Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
##           5.9810744           6.8727113           1.7461954           6.4219792 
##       Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28 
##          -2.6110037          -2.9725862          -3.7268663          -3.4623553 
##    Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa 
##           2.4643670           0.3564263           0.1520430           1.2010593 
##      Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E 
##          -4.5431513          -2.7809399          -3.2053627          -1.0274952

En un modelo de regresión lineal de buen comportamiento, nos gustaría que los residuos tuvieran una distribución aproximadamente normal. Es decir, nos gustaría una distribución aproximadamente uniforme del error por encima y por debajo de la línea de regresión. Podemos investigar la normalidad de los residuos con un gráfico Q-Q (cuantil-cuantil).

qqnorm(residuals)       # Haga una gráfica QQ de residuos
qqline(residuals)

Cuando los residuos se distribuyen normalmente, tienden a ubicarse a lo largo de la línea recta en el gráfico Q-Q. En este caso, los residuos parecen seguir un patrón ligeramente no lineal: los residuos están un poco inclinados lejos de la línea de normalidad en cada extremo. Esto es una indicación de que una simple línea recta podría no ser suficiente para describir completamente la relación entre el peso y las mpg.

Después de hacer predicciones del modelo, es útil tener algún tipo de métrica para evaluar el desempeño del modelo. El R cuadrado ajustado es una medida útil, pero solo se aplica al modelo de regresión en sí: nos gustaría alguna métrica de evaluación universal que nos permita comparar el desempeño de diferentes tipos de modelos. El error cuadrático medio (RMSE) es una métrica de evaluación común para predicciones que involucran números reales. El error cuadrático medio es la raíz cuadrada del promedio del error cuadrático (los residuos al cuadrado). Escribiremos una función para calcular el RMSE.

root_mean_squared_error <- function(predicted, targets){  
    # Calcula el error cuadrático medio entre dos vectores
    #
    # Args:
    #    predicted: un vector numérico de predicciones
    #    targets: un vector numérico de valores objetivo para cada predicción
    #
    # Returns:
    #    La raíz del error cuadrático medio entre los valores previstos y los objetivos
    
    sqrt(mean((targets-predicted)^2))                 
}

root_mean_squared_error(preds, mtcars$mpg)           # calcula RMSE
## [1] 2.949163

Regresión polinomial

Las variables a menudo presentan relaciones no lineales que no se pueden ajustar bien con una línea recta. En estos casos, podemos usar la regresión lineal para ajustar los datos a una línea curva agregando términos adicionales de orden superior (cuadrado, cúbico, etc.) a la fórmula del modelo. Una regresión lineal que involucra términos de orden superior se conoce como “regresión polinómica”. Puede incluir términos de orden superior agregando términos explicativos adicionales incluidos en la función I().

quadratic_model <- lm(mpg ~ wt + I(wt^2),  # Agrega el término de peso al cuadrado al modelo.
                      data=mtcars) 

summary(quadratic_model)                   # Verifica el resultado del modelo
## 
## Call:
## lm(formula = mpg ~ wt + I(wt^2), data = mtcars)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.483 -1.998 -0.773  1.462  6.238 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  49.9308     4.2113  11.856 1.21e-12 ***
## wt          -13.3803     2.5140  -5.322 1.04e-05 ***
## I(wt^2)       1.1711     0.3594   3.258  0.00286 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.651 on 29 degrees of freedom
## Multiple R-squared:  0.8191, Adjusted R-squared:  0.8066 
## F-statistic: 65.64 on 2 and 29 DF,  p-value: 1.715e-11

El resultado resumido nos muestra que incluir el término de peso al cuadrado parece mejorar el rendimiento del modelo porque el R cuadrado ajustado aumentó a 0,8066 y el término polinómico de segundo orden tiene un valor p de 0,00286, lo que indica que es altamente significativo. Tracemos la línea curva definida por el nuevo modelo para ver si el ajuste se ve mejor que el anterior.

model_function <- function(x){        # Crea una función basada en el modelo.
    49.9308 + -13.3803*x + 1.1711*x^2
}

ggplot(data=mtcars, aes(x=wt, y=mpg)) +
    geom_point() +
    stat_function(fun=model_function, color="red")  # Traza la función

La función cuadrática parece ajustarse a los datos un poco mejor que la lineal. Investiguemos más a fondo utilizando el nuevo modelo para hacer predicciones y verificar la raíz del error cuadrático medio:

preds <- predict(quadratic_model,    # Modelo a utilizar para la predicción.
         newdata=mtcars)             # Datos a utilizar para la predicción

root_mean_squared_error(preds, mtcars$mpg)
## [1] 2.5233

Dado que el RMSE del modelo cuadrático es menor que el anterior y el R cuadrado ajustado es mayor, probablemente sea un mejor modelo. Sin embargo, debemos tener cuidado de no sobreajustar los datos.

Conclusion

La regresión lineal es una de las técnicas más comunes para realizar predicciones numeradas reales a partir de datos. Es un buen punto de partida cada vez que necesites hacer una predicción numérica. El error cuadrático medio (RMSE) es una métrica de evaluación común para comparar el desempeños de dos o más modelos predictivos. Mientras más cercano a 0 es el RMSE más robusto es dicho modelo.