2 Regresión lineal

En este capítulo se presenta el modelo de regresión lineal clásico.

2.1 Modelo estadístico

El modelo estadístico en regresión lineal clásico permite modelar la media de una variable \(Y\) en función de \(k\) covariables. El modelo se puede expresar como sigue.

\[\begin{align} \label{mod2} y_i &\sim N(\mu_i, \sigma^2), \\ \mu_i &= \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + \cdots + \beta_k x_{ki}, \\ \sigma^2 &= \text{constante} \end{align}\]

donde \(i=1, 2, \ldots, n\) es el índice que identifica las \(n\) observaciones del conjunto de entrenamiento. El vector de parámetros del modelo es \(\boldsymbol{\theta}=(\beta_0, \beta_1, \cdots, \beta_k, \sigma)^\top\).

2.2 Verosimilitud del modelo

La función de verosimilitud \(L\) para el modelo es la siguiente:

\[ L(\boldsymbol{\theta}) = \prod_i^n f(y_i \vert \beta_0, \beta_1, \cdots, \beta_k, \sigma), \]

donde \(f\) corresponde a la función de densidad de la normal.

Para estimar el vector de parámetros \(\boldsymbol{\theta}\) del modelo se usa el método de Máxima Verosimilitud sobre la función \(L\) o sobre la función de log-verosimilitud siguiente:

\[ l(\boldsymbol{\theta}) = \sum_i^n \log(f(y_i \vert \beta_0, \beta_1, \cdots, \beta_k, \sigma)), \]

Ejemplo

Como ilustración vamos a usar los datos del ejemplo 3.1 del libro de Montgomery, Peck and Vining (2003). En el ejemplo 3.1 los autores ajustaron un modelo de regresión lineal múltiple para explicar el Tiempo necesario para que un trabajador haga el mantenimiento y surta una máquina dispensadora de refrescos en función de las variables Número de Cajas y Distancia.

Los datos del ejemplo están disponibles en el paquete MPV (por los apellidos de los autores). A continuación el código para cargar los datos y una muestra de las 6 primeras observaciones de la base de datos, en total se disponen de 20 observaciones.

require(MPV)
colnames(softdrink) <- c('tiempo', 'cantidad', 'distancia')
head(softdrink)
##   tiempo cantidad distancia
## 1  16.68        7       560
## 2  11.50        3       220
## 3  12.03        3       340
## 4  14.88        4        80
## 5  13.75        6       150
## 6  18.11        7       330

Un gráfico en 3d es obligratorio para explorar la relación entre las variables, este diagrama de puede obtener usando el paquete scatterplot3d. A continuación el código para construirlo.

library(scatterplot3d)
attach(softdrink)
scatterplot3d(x=cantidad, y=distancia, z=tiempo, pch=16, cex.lab=1,
              highlight.3d=TRUE, type="h", xlab='Cantidad de cajas',
              ylab='Distancia (pies)', zlab='Tiempo (min)')

De la figura anterior se ve claramente que a medida que aumenta el número de cajas y la distancia los tiempos tienden a ser mayores.

A continuación se define la función de menos log-verosimilitud para el modelo anterior. A pesar de que nos interesa maximizar la función de log-verosimilitud hemos creado su negativo, esto porque la mayoría de las funciones de optimización minimizan y no maximizan; maximizar \(f(x)\) es equivalente a minimizar \(-f(x)\).

minusll <- function(theta, y, x1, x2) {
  media <- theta[1] + theta[2] * x1 + theta[3] * x2  # Se define la media
  desvi <- theta[4]                             # Se define la desviación.
  - sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}

Ahora vamos a usar la función optim para encontrar los valores que maximizan la función de log-verosimilitud, el código para hacer eso se muestra a continuación. En el parámetro par se coloca un vector de posibles valores de \(\boldsymbol{\Theta}\) para iniciar la búsqueda, en fn se coloca la función de interés, en lower y upper se colocan vectores que indican los límites de búsqueda de cada parámetro, los \(\beta_k\) pueden variar entre \(-\infty\) y \(\infty\) mientras que el parámetro \(\sigma\) toma valores en el intervalo \((0, \infty)\). Como la función minusll tiene argumentos adicionales y, x1 y x2, estos pasan a la función optim al final como se muestra en el código.

mod1 <- optim(par=c(0, 0, 0, 1), fn=minusll,
              method='L-BFGS-B',
              lower=c(-Inf, -Inf, -Inf, 0),
              upper=c(Inf, Inf, Inf, Inf), 
              y=softdrink$tiempo, 
              x1=softdrink$cantidad, 
              x2=softdrink$distancia)

En el objeto res1 está el resultado de la optimización, para explorar los resultados usamos

mod1
## $par
## [1] 2.34103296 1.61590757 0.01438512 3.05769678
## 
## $value
## [1] 63.41469
## 
## $counts
## function gradient 
##       58       58 
## 
## $convergence
## [1] 0
## 
## $message
## [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

De esta forma el vector de parámetros estimados del modelo es \(\hat{\boldsymbol{\theta}}=(2.34, 1.62, 0.01, 3.06)^\top\).

Usualmente en la práctica se usa la función lm para estimar el vector de parámetros, a continuación el código necesario para usar la funcion lm.

mod2 <- lm(tiempo ~ cantidad + distancia, data=softdrink)
summary(mod2)
## 
## Call:
## lm(formula = tiempo ~ cantidad + distancia, data = softdrink)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.7880 -0.6629  0.4364  1.1566  7.4197 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.341231   1.096730   2.135 0.044170 *  
## cantidad    1.615907   0.170735   9.464 3.25e-09 ***
## distancia   0.014385   0.003613   3.981 0.000631 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.259 on 22 degrees of freedom
## Multiple R-squared:  0.9596, Adjusted R-squared:  0.9559 
## F-statistic: 261.2 on 2 and 22 DF,  p-value: 4.687e-16

De la salida anterior vemos que el vector de parámetros estimados del modelo es \(\hat{\boldsymbol{\theta}}=(2.34, 1.62, 0.01, 3.26)^\top\).

Para profundizar en el modelo de regresion lineal se recomienda consultar libro Modelos de Regresión con R