El Error o los Residuos de un Modelo de Regresión

Los residuales o residuos de un modelo de regresión son la diferencia entre el valor observado de la variable dependiente y el valor esperado de la misma que se calcula mediante la ecuación de regresión.

\[e = y - \hat{y}\] Donde:

\[\hat{y} = b_0 + b_1X_1 + b_2X_2...+ b_kX_k\]

Supuestos del Modelo de Regresión Lineal

La regresión lineal asume que los datos deben cumplir los siguientes supuestos, que se verifican analizando el patron de distribución de los residuos:

Problemas de violación de los supuestos

Es necesario verificar estos supuestos, los problemas potenciales que pueden aparecer son:

Diagnóstico de los supuestos de regresión

Para evaluar si un modelo de regresión cumple con los supuestos indicados se utilizan un conjunto de gráficos de residuales:

Ejemplo:

Como ejemplo vamos a utilizar los datos de la base de datos “dataWorld_q” para el quinquenio 2000-2004 y vamos a calcular inicialmente dos modelos de regresión para la variable “Mortalidad infantil” (childMort) como variable dependiente (Y). Las variables independendientes (X) para cada modelo serán:

Modelos de regresión

load(url("https://www.dropbox.com/s/fyobx9uswy3qgp3/dataWorld_q.rda?dl=1"))
library(ggplot2)
library(stargazer)
library(ggfortify)

modelo1 <- lm(childMort~vaccMeas, 
         data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
modelo2 <- lm(childMort~incomePp, 
         data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])

stargazer(modelo1, modelo2, type = "text",
          omit.stat=c("ser","f"), 
          star.cutoffs = c(0.05, 0.01, 0.001))
## 
## ===========================================
##                   Dependent variable:      
##              ------------------------------
##                        childMort           
##                    (1)            (2)      
## -------------------------------------------
## vaccMeas        -2.378***                  
##                  (0.148)                   
##                                            
## incomePp                       -0.001***   
##                                 (0.0002)   
##                                            
## Constant       248.718***      74.493***   
##                 (12.485)        (4.249)    
##                                            
## -------------------------------------------
## Observations       191            193      
## R2                0.576          0.259     
## Adjusted R2       0.574          0.255     
## ===========================================
## Note:         *p<0.05; **p<0.01; ***p<0.001

Gráfico para Diagnóstico de Linealidad

par(mfrow=c(1,2))
plot(modelo1, 1, caption = "Modelo 1")
plot(modelo2, 1, caption = "Modelo 2")

Lo que debemos esperar de este gráfico es que no aparezca un patrón lineal entre los residuales y los valores pronosticados de Y (\(\hat{y}\)). En tal sentido el modelo 1 cumple mejor este supuesto que el modelo 2.

Gráficos para Diagnóstico de Normalidad

par(mfrow=c(2,2))
plot(modelo1, 2, caption = "Modelo 1")
plot(modelo2, 2, caption = "Modelo 2")
plot(density(modelo1$residuals))
plot(density(modelo2$residuals))

Diagnóstico de normalidad

Para el primer par de gráficos, en el eje vertical se muestran los residuos estandarizados (\(Z_{e_i} = \frac{e_i}{\sigma_e})\) En este caso la expectativa es que los puntos se acercen lo más posible a la línea oblicua del gráfico que representa una distribución normal. Ambos modelos tienen una distribución de residuos asimétrica, pero la asimetría es más acentuada en el modelo 2.

Como puede verse en los gráficos de densidad, la distribución de los residuales del modelo 1 tiene cierta asimetría positiva, en cambio en el modelo 2 muestra una asimetría positiva mucho más marcada.

Diagnóstico de homocedasticidad

par(mfrow=c(1,2))
plot(modelo1, 3, caption = "Modelo 1")
plot(modelo2, 3, caption = "Modelo 2")

En este caso, se espera que la dispersión de la raiz cuadrada de los residuos estandarizados no presente muchas variaciones según los valores esperados de Y. Ambos modelos presentan algunos problemas de heterocedasticidad, pero mucho más acentuados en el caso del modelo 2.

Diagnóstico de Observaciones Influyentes: “Leverage” (palanca) y Valores Atípicos

par(mfrow=c(1,2))
plot(modelo1, 5, caption = "Modelo 1")
plot(modelo2, 5, caption = "Modelo 2")

Análisis de casos extremos e influyentes

Los residuos estandarizados nos indican qué tan extremos son los valores o casos en la variable dependiente (Y), por lo general residuos que exceden más de 3 desviaciones estándar indican casos muy atípicos.

Por otro lado el indicador de “leverage”, nos indica qué tanta “palanca” pueden tener los valores de los casos en la(s) variable(s) independientes (X) en la recta de regresion. La influencia o “leverage” mide la proporción de la suma total de cuadrados de la variable dependiente (Y) a la cual contibuye el valor en la variable independiente (X) del caso i. Para un modelo simple se calcula:

\[h_i = \frac{(x_i - \bar{x})^2}{\sum(x-\bar{x})^2} + \frac{1}{N}\]

Casos que sean muy extremos en Y y mucha palanca en X son los casos influyentes y pueden causar problemas al modelo. Estos casos se ubican en los extremos inferior y superior derecho del gráfico. Excluir un caso influyente puede afectar sustancialmente el estimado de los coeficientes de regresión. Por otro lado, cuanto mayor es el número de casos que analizamos, menor será la posibilidad de que un caso en particular tenga demasiada influencia (ver: http://www.shodor.org/interactivate/activities/Regression/)

En nuestro ejemplo no parece haber casos que ejerzan demasidada influencia.

¿Qué hacer si detectamos problemas?

Por lo general cuando nuestros modelos de regresión presentan alguno de los problemas mencionados, ello puede significar que:

Posible solución:

Transformar variables e incluir otras variables predictoras:

modelo3 <- lm(log(childMort)~ vaccMeas + log10(incomePp) + birthSkill, 
         data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])

stargazer(modelo1, modelo2, modelo3, type = "text",
          omit.stat=c("ser","f"), 
          star.cutoffs = c(0.05, 0.01, 0.001))
## 
## ===================================================
##                         Dependent variable:        
##                 -----------------------------------
##                      childMort       log(childMort)
##                    (1)        (2)         (3)      
## ---------------------------------------------------
## vaccMeas        -2.378***               -0.008*    
##                  (0.148)                (0.003)    
##                                                    
## incomePp                   -0.001***               
##                            (0.0002)                
##                                                    
## log10(incomePp)                        -1.230***   
##                                         (0.108)    
##                                                    
## birthSkill                             -0.010***   
##                                         (0.003)    
##                                                    
## Constant        248.718*** 74.493***    9.638***   
##                  (12.485)   (4.249)     (0.333)    
##                                                    
## ---------------------------------------------------
## Observations       191        193         174      
## R2                0.576      0.259       0.798     
## Adjusted R2       0.574      0.255       0.794     
## ===================================================
## Note:                 *p<0.05; **p<0.01; ***p<0.001

Gráficos de análisis de residuos para el modelo 3:

autoplot(modelo3)

Gráficos de análisis de residuos para el modelo 1:

autoplot(modelo1)

Gráficos de análisis de residuos para el modelo 2:

autoplot(modelo2)