6.1 Regresión lineal múltiple

Como ya se comentó, el método tradicional considera el siguiente modelo: \[\begin{equation} Y = \beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{p}X_{p} + \varepsilon, \tag{6.1} \end{equation}\] donde \(\left( \beta_{0},\beta_{1},\ldots,\beta_{p}\right)^t\) es un vector de parámetros (desconocidos) y \(\varepsilon\) es un error aleatorio normal de media cero y varianza \(\sigma^2\).

Por tanto las hipótesis estructurales del modelo son:

  • Linealidad

  • Homocedasticidad (varianza constante del error)

  • Normalidad (y homogeneidad: ausencia de valores atípicos y/o influyentes)

  • Independencia de los errores

Hipótesis adicional en regresión múltiple:

  • Ninguna de las variables explicativas es combinación lineal de las demás.

En el caso de regresión múltiple es de especial interés el fenómeno de la colinealidad (o multicolinealidad) relacionado con la última de estas hipótesis (que se tratará en la Sección 6.2). Además se da por hecho que el número de observaciones disponible es como mínimo el número de parámetros, \(n \geq p + 1\).

El procedimiento habitual para ajustar un modelo de regresión lineal a un conjunto de datos es emplear mínimos cuadrados (ordinarios):

\[\mbox{min}_{\beta_{0},\beta_{1},\ldots,\beta_{p}} \sum\limits_{i=1}^{n}\left( y_{i} - \beta_0 - \beta_1 x_{1i} - \cdots - \beta_p x_{pi} \right)^{2}\]

En R podemos emplear la función lm():

ajuste <- lm(formula, data, subset, weights, na.action)
  • formula: fórmula que especifica el modelo.

  • data: data.frame (opcional) con las variables de la formula.

  • subset: vector (opcional) que especifica un subconjunto de observaciones.

  • weights: vector (opcional) de pesos (mínimos cuadrados ponderados, WLS).

  • na.action: opción para manejar los datos faltantes; por defecto na.omit.

Alternativamente se puede emplear la función biglm() del paquete biglm para ajustar modelos lineales a grandes conjuntos de datos (especialmente cuando el número de observaciones es muy grande, incluyendo el caso de que los datos excedan la capacidad de memoria del equipo). También se podría utilizar la función rlm() del paquete MASS para ajustar modelos lineales empleando un método robusto cuando hay datos atípicos.

Como ejemplo consideraremos el conjunto de datos hbat.RData que contiene observaciones de clientes de la compañía de distribución industrial HBAT (Hair et al., 1998). Las variables se pueden clasificar en tres grupos: las 6 primeras (categóricas) son características del comprador, las variables de la 7 a la 19 (numéricas) miden percepciones de HBAT por parte del comprador y las 5 últimas son posibles variables de interés (respuestas).

load("data/hbat.RData")
as.data.frame(attr(hbat, "variable.labels"))
##             attr(hbat, "variable.labels")
## empresa                           Empresa
## tcliente                  Tipo de cliente
## tindustr                   Tipo Industria
## tamaño               Tamaño de la empresa
## region                             Región
## distrib           Sistema de distribución
## calidadp              Calidad de producto
## web      Actividades comercio electrónico
## soporte                   Soporte técnico
## quejas               Resolución de quejas
## publi                          Publicidad
## producto               Línea de productos
## imgfvent       Imagen de fuerza de ventas
## precio                   Nivel de precios
## garantia         Garantía y reclamaciones
## nprod                    Nuevos productos
## facturac            Encargo y facturación
## flexprec          Flexibilidad de precios
## velocida             Velocidad de entrega
## satisfac            Nivel de satisfacción
## precomen          Propensión a recomendar
## pcompra              Propensión a comprar
## fidelida      Porcentaje de compra a HBAT
## alianza  Consideraría alianza estratégica

Consideraremos como respuesta la variable fidelida y, por comodidad, únicamente las variables continuas correspondientes a las percepciones de HBAT como variables explicativas (para una introducción al tratamiento de variables predictoras categóricas ver por ejemplo la Sección 8.5 de Fernández-Casal et al., 2019).

Como ya se comentó, se trata de un método clásico de Estadística y el procedimiento habitual es emplear toda la información disponible para construir el modelo y posteriormente (asumiendo que es el verdadero) utilizar métodos de inferencia para evaluar su precisión. Sin embargo seguiremos el procedimiento habitual en AE y particionaremos los datos en una muestra de entrenamiento y en otra de test.

df <- hbat[c(23, 7:19)]  # Nota: realmente no copia el objeto...
set.seed(1)
nobs <- nrow(df)
itrain <- sample(nobs, 0.8 * nobs)
train <- df[itrain, ]
test <- df[-itrain, ]

El primer paso antes del modelado suele ser realizar un análisis descriptivo. Por ejemplo podemos generar un gráfico de dispersión matricial y calcular la matriz de correlaciones (lineal de Pearson). Sin embargo en muchos casos el número de variables es grande y en lugar de emplear gráficos de dispersión puede ser preferible representar gráficamente las correlaciones mediante un mapa de calor o algún gráfico similar. Por ejemplo en la Figura 6.1 se combinan elipses con colores para representar las correlaciones.

# plot(train) # gráfico de dispersión matricial
mcor <- cor(train)
corrplot::corrplot(mcor, method = "ellipse")
Representación de las correlaciones lineales entre las variables continuas del conjunto de datos HBAT, generada con la función corrplot::corrplot().

Figura 6.1: Representación de las correlaciones lineales entre las variables continuas del conjunto de datos HBAT, generada con la función corrplot::corrplot().

print(mcor, digits = 1)
##          fidelida calidadp    web soporte quejas publi producto imgfvent precio
## fidelida     1.00     0.55  0.219   0.070   0.61  0.27     0.67     0.21  -0.19
## calidadp     0.55     1.00 -0.088   0.051   0.05 -0.05     0.51    -0.15  -0.43
## web          0.22    -0.09  1.000  -0.009   0.14  0.53     0.03     0.79   0.20
## soporte      0.07     0.05 -0.009   1.000   0.17  0.03     0.17     0.04  -0.11
##          garantia nprod facturac flexprec velocida
## fidelida     0.14  0.14     0.50    0.055     0.68
## calidadp     0.09  0.17     0.04   -0.509     0.04
## web          0.08 -0.05     0.21    0.221     0.23
## soporte      0.84  0.02     0.13   -0.005     0.14
##  [ reached getOption("max.print") -- omitted 10 rows ]

En este caso observamos que aparentemente hay una relación (lineal) entre la respuesta y algunas de las variables explicativas (que en principio no parece razonable suponer que son independientes). Vemos también que, si consideramos un modelo de regresión lineal simple, el mejor ajuste se obtendría empleando velocida como variable explicativa (ver Figura 6.2):

modelo <- lm(fidelida ~ velocida, train)
summary(modelo)
## 
## Call:
## lm(formula = fidelida ~ velocida, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -13.8349  -4.3107   0.3677   4.3413  12.3677 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  27.5486     2.6961   10.22   <2e-16 ***
## velocida      7.9736     0.6926   11.51   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.403 on 158 degrees of freedom
## Multiple R-squared:  0.4562, Adjusted R-squared:  0.4528 
## F-statistic: 132.6 on 1 and 158 DF,  p-value: < 2.2e-16
plot(fidelida ~ velocida, train)
abline(modelo)
Gráfico de dispersión y recta de regresión ajustada para fidelida en función de la velocida.

Figura 6.2: Gráfico de dispersión y recta de regresión ajustada para fidelida en función de la velocida.

Para calcular predicciones (estimaciones de la media condicionada), también intervalos de confianza o de predicción, se puede emplear el correspondiente método predict() (consultar la ayuda de predict.lm() para ver todas las opciones disponibles).

valores <- seq(1, 6, len = 100)
newdata <- data.frame(velocida = valores)
pred <- predict(modelo, newdata = newdata, interval = c("confidence"))
# head(pred)

Por ejemplo, en la Figura 6.3 se representan las predicciones, los intervalos de confianza para la media condicional y los intervalos de predicción para nuevas observaciones.

plot(fidelida ~ velocida, train)
matlines(valores, pred, lty = c(1, 2, 2), col = 1)
pred2 <- predict(modelo, newdata = newdata, interval = c("prediction"))
matlines(valores, pred2[, -1], lty = 3, col = 1)
legend("topleft", c("Ajuste", "Int. confianza", "Int. predicción"), lty = 1:3)
Ajuste lineal (predicciones) e intervalos de confianza y predicción (puntuales).

Figura 6.3: Ajuste lineal (predicciones) e intervalos de confianza y predicción (puntuales).

Para la extracción de información se pueden acceder a los componentes del modelo ajustado o emplear funciones (genéricas; muchas de ellas válidas para otro tipo de modelos: rlm, glm…). Algunas de las más utilizadas se muestran en la Tabla 6.1.

Tabla 6.1: Listado de las principales funciones auxiliares para modelos ajustados.
Función Descripción
fitted() valores ajustados
coef() coeficientes estimados (y errores estándar)
confint() intervalos de confianza para los coeficientes
residuals() residuos
plot() gráficos de diagnóstico
termplot() gráfico de efectos parciales
anova() calcula tablas de análisis de varianza (también permite comparar modelos)
influence.measures() calcula medidas de diagnóstico (“dejando uno fuera”; LOOCV)
update() actualiza un modelo (p.e. eliminando o añadiendo variables)

Ejemplos (no evaluados):

modelo2 <- update(modelo, . ~ . + calidadp)
summary(modelo2)
confint(modelo2)
anova(modelo2)
anova(modelo, modelo2)
oldpar <- par(mfrow=c(1,2))
termplot(modelo2, partial.resid = TRUE)
par(oldpar)

References

Fernández-Casal, R., Roca-Pardiñas, J., y Costa, J. (2019). Introducción al Análisis de Datos con R. https://rubenfcasal.github.io/intror
Hair, J. F., Anderson, R. E., Tatham, R. L., y Black, W. (1998). Multivariate Data Analysis. Prentice Hall.