Bloque 5. Modelo de Regresión Lineal y Modelo Lineal Generalizado

Formación PDI - Universidad de Málaga

Antonio Elías

Agenda

  • Modelo de Regresión Lineal

  • Modelo de Regresión Lineal Generalizado (GLM)

Modelo de regresión lineal

Se extiende la regresión simple a varias variables explicativas:

\[ Y = \beta_0 + \beta_1 X_{1} + \beta_2 X_{2} + \dots + \beta_k X_{k} + \varepsilon \]

  • \(Y\): variable respuesta (ej. número de delitos en un barrio).
  • \(X_{j}\): variables explicativas (ej. pobreza, desempleo, nivel educativo).
  • \(\beta_j \in \mathbb{R}\): coeficientes a estimar.
  • \(\varepsilon\): error aleatorio.

Tests individuales (t de Student)

Objetivo: Queremos comprobar si el coeficiente \(\beta_j\) es significativamente distinto de cero.

\[H_0: \beta_j = 0\] \[H_1: \beta_j \neq 0\]

  • Si \(H_0\) es cierta: No hay relación lineal entre \(X_j\) y \(Y\).

  • Si rechazo \(H_0\): Sí existe relación lineal.

  • Estadístico del contraste \(t\):

\[ t = \frac{\hat{\beta}_j}{SD(\hat{\beta}_j)} \sim t_{n-k-1} \]

donde \(t_{n-2}\) representa la distribución t-Student con \(n-k-2\) grados de libertad y \(SD(\hat{\beta}_j)\) es la desviación estándar de \(\beta_j\).

Descomposición de la varianza

\[ \underbrace{\sum_{i=1}^n (Y_i - \bar{Y})^2}_{\text{Suma total (SCT)}} = \underbrace{\sum_{i=1}^n (\hat{Y}_i - \bar{Y})^2}_{\text{Suma explicada (SCE)}} + \underbrace{\sum_{i=1}^n (Y_i - \hat{Y}_i)^2}_{\text{Suma de residuos o no explicada (SCR)}} \]

El coeficiente de determinación \(R^2\) se define como:

\[ R^2 = \frac{\text{SCE}}{\text{SCT}} = 1 - \frac{\text{SCR}}{\text{SCT}} \]

Test global (F de Snedecor)

Objetivo: Verificar si al menos una \(\beta_j\) es distinta de cero.

\[ H_0: \beta_1 = \beta_2 = \dots = \beta_k = 0 \] \[ H_1: \text{Al menos una } \beta_j \neq 0 \]

  • Si \(H_0\) es cierta: las variables en conjunto no explican \(Y\).

  • Si rechazo \(H_0\): almenos una variable aporta para explicar a la \(Y\).

Estadístico del contraste \(F\):

\[ F = \frac{\frac{SSR}{k}}{\frac{SSE}{n-k-1}} \sim F_{k, \, n-k-1} \]

donde: - \(k\) = número de predictores - \(n\) = número de observaciones - \(SSR\) = suma de cuadrados de la regresión - \(SSE\) = suma de cuadrados del error

Generamos datos Regresión Simple

# Simulación de datos
n <- 100
x <- rnorm(n, mean = 5, sd = 2)
y <- 3 + 2 * x + rnorm(n, sd = 4)

datos <- data.frame(x = x, y = y)

plot(x, y, main = "Ajuste de regresión lineal")
abline(a = 3, b = 2, col = "blue")

Estimamos los parámetros: función lm

# Ajuste del modelo
modelo <- lm(y ~ x)
modelo <- lm(y ~ x, data = datos)
  • ¿Qué es el objeto modelo?

Detalle de la estimación: función summary

summary(modelo)

Call:
lm(formula = y ~ x, data = datos)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.0838 -2.9827  0.4478  2.9540 10.0316 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.8501     1.1693   3.293  0.00138 ** 
x             1.9074     0.2104   9.064  1.3e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.027 on 98 degrees of freedom
Multiple R-squared:  0.456, Adjusted R-squared:  0.4505 
F-statistic: 82.15 on 1 and 98 DF,  p-value: 1.302e-14
  • Columna “Estimate” → \(\hat{\beta}_j\)

  • Columna “Std. Error” → \(SE(\hat{\beta}_j)\)

  • Columna “t value” y “Pr(>|t|)” → estadístico y p-valor

Accedemos a los elementos del modelo

  • Coeficientes
modelo$coefficients
(Intercept)           x 
   3.850055    1.907439 
coef(modelo)
(Intercept)           x 
   3.850055    1.907439 
  • P-valores
resumen <- summary(modelo)

resumen$coefficients
            Estimate Std. Error  t value     Pr(>|t|)
(Intercept) 3.850055  1.1692594 3.292730 1.380765e-03
x           1.907439  0.2104486 9.063682 1.302128e-14

Predicción: función predict

Si predict es ejecutado sin darle el argumento newdata, nos devolverá las predicciones de todas las \(X\) con las que se estimó el modelo. Es lo mismo que lo obtenido de la función fitted.

hist(predict(modelo))

Si le damos un data.frame en newdata, nos devolverá la predicción de esos valores únicamente

predict(modelo, newdata = data.frame(x = 10))
       1 
22.92444 

Residuos: function residuals

La función residuals nos devuelve los residuos del modelo

hist(residuals(modelo))

Plot del objeto modelo: diagnostíco de las hipótesis

plot(modelo)

Muestra los siguientes gráficos:

  • Residuos Vs Valores Predichos

  • Normal Q-Q

  • Escala-Localización

  • Residuos VS Apalancamiento

Residuos Vs Valores Predichos

  • Qué muestra: Residuos vs valores ajustados.
  • Qué buscar:
    • Sin patrones (línea, curva o forma).
    • Distribución aleatoria indica linealidad y homoscedasticidad (varianza constante).
  • Problemas comunes:
    • Curvas o patrones → posible no linealidad.
    • Mayor dispersión en un rango → heterocedasticidad.

Normal Q-Q

  • Qué muestra: Distribución de residuos vs distribución normal teórica.
  • Qué buscar:
    • Puntos cerca de la línea diagonal → residuos normalmente distribuidos.
  • Problemas comunes:
    • Desviaciones grandes en los extremos → residuos no normales.

Escala-Localización

  • Qué muestra: Raíz cuadrada de residuos estandarizados vs valores ajustados.
  • Qué buscar:
    • Distribución homogénea sin tendencia → homoscedasticidad.
  • Problemas comunes:
    • Patrón en forma de abanico → varianza no constante.

Residuos VS Apalancamiento

  • Qué muestra: Residuos vs influencia/leverage de cada punto.
  • Qué buscar:
    • No hay puntos con alta influencia que distorsionen el modelo.
  • Problemas comunes:
    • Puntos fuera del rango (outliers o puntos influyentes) pueden afectar los resultados.

Descomposición de la varianza en R:

# Valores ajustados y residuos
y_hat <- fitted(modelo)
residuos <- residuals(modelo)

# Suma total de cuadrados (SCT)
SCT <- sum((y - mean(y))^2)

# Suma de cuadrados explicada (SCE)
SCE <- sum((y_hat - mean(y))^2)

# Suma de residuos (SCR)
SCR <- sum((y - y_hat)^2)

# R^2
R2 <- SCE / SCT
R2_alt <- 1 - SCR / SCT
# Resultados
cat("SCT =", SCT, "\n")
SCT = 2921.393 
cat("SCE =", SCE, "\n")
SCE = 1332.184 
cat("SCR =", SCR, "\n")
SCR = 1589.209 
cat("R^2 =", R2, " = ", R2_alt, "\n")
R^2 = 0.4560099  =  0.4560099 

Generamos datos Regresión Múltiple

n <- 100
x1 <- rnorm(n, mean = 0, sd = 2)
x2 <- rnorm(n, mean = 3, sd = 1)

y <- 3 + 2*x1 + 5*x2 + rnorm(n, sd = 4)

datos <- data.frame(y, x1, x2)

modelo <- lm(y ~ x1 + x2)
modelo <- lm(y ~ x1 + x2, data = datos)
summary(modelo)

Call:
lm(formula = y ~ x1 + x2, data = datos)

Residuals:
     Min       1Q   Median       3Q      Max 
-12.1094  -3.0378   0.2911   2.5026  10.7325 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.6020     1.4798   3.110  0.00246 ** 
x1            2.0682     0.2266   9.128 1.02e-14 ***
x2            4.5943     0.5098   9.012 1.82e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.17 on 97 degrees of freedom
Multiple R-squared:  0.6375,    Adjusted R-squared:   0.63 
F-statistic: 85.29 on 2 and 97 DF,  p-value: < 2.2e-16

Multicolinealidad y VIF

  • Definición VIF: Mide cuánto aumenta la varianza del estimador \(\hat{\beta}_j\) debido a la correlación con otras variables.

\[ VIF_j = \frac{1}{1 - R_j^2} \] donde \(R_j^2\) es el coeficiente de determinación al regresar \(X_j\) contra todas las demás \(X\).

Interpretación:

  • VIF = 1 → No hay correlación con otras variables.
  • VIF entre 1 y 5 → Correlación moderada, aceptable.
  • VIF > 10 → Alta multicolinealidad, problema grave.
# install.packages("car")
library(car)
vif(modelo)
      x1       x2 
1.001258 1.001258 

Modelos Lineales Generalizados GLMs

Modelos Lineales Generalizados GLMs

  • Es una extensión del modelo lineal clásico transformando del valor esperado mediante una función de enlace.

  • Permite modelar variables respuesta que no son normales a través de una función de enlace:

    • Binaria (0/1)
    • Conteo (0, 1, 2, …)
    • Proporciones (entre 0 y 1)
  • Ejemplos son el modelo logístico, el probit y el poisson.

Estructura general GLMs

\[g(\mathbb{E}[Y_i]) = \eta_i = \beta_0 + \beta_1 X_{i1} + \dots + \beta_p X_{ip}\]

  • Distribución de la variable \(Y_i\) de la familia exponencial (e.g., Binomial, Poisson, Normal).

  • \(Y_i\): variable respuesta

  • \(\mathbb{E}[Y_i]\): valor esperado

  • \(g(\cdot)\): Función de enlace que conecta la media con el predictor.

  • \(\eta_i\): predictor lineal

Modelo Enlace Fórmula del enlace Inversa del enlace
Lineal Identidad \(g(\mu) = \mu\) \(\mu = \eta\)
Logístico (binomial) Logit \(g(\mu) = \log\left(\frac{\mu}{1 - \mu}\right)\) \(\mu = \frac{e^\eta}{1 + e^\eta}\)
Poisson Log \(g(\mu) = \log(\mu)\) \(\mu = e^\eta\)

Estimación en R: glm()

modelo <- glm(y ~ x1 + x2, 
              family = binomial, 
              data = datos)

Parámetros:

  • family: Tipo de modelo (binomial, poisson, gaussian, etc.)
  • link: (opcional) Enlace, si se quiere cambiar el predeterminado.

Las funciones predict, residuals, summary, etc. que vimos anteriormente para el objeto lm se podrán usar también para el objeto creado con glm.

Modelo Logístico

Modelo de regresión logística

La regresión logística introduce una función que fuerza a las predicciones del modelo a estar entre \(0\) y \(1\). De esta forma, lo que conseguimos es modelar la probabilidad de que ocurra un evento.

Esta función es la función sigmoide:

\[ P(Y = 1 \mid X) = \pi(X) = \frac{e^{\beta_0 + \beta_1 X_{1} + \dots + \beta_k X_{k}}}{1 + e^{\beta_0 + \beta_1 X_{1} + \dots + \beta_k X_{k}}} \]

Modelo de regresión logística

Equivalentemente, haciendo la transformación logit, el modelo de regresión logística relaciona de forma lineal las variables explicativas \(X\) con el log-odds o función logit:

\[ \text{logit} (P(Y=1)) = \text{log}\left(\frac{P(Y=1)}{P(Y=0)}\right) = \log\left( \frac{\pi(X)}{1 - \pi(X)} \right) = \beta_0 + \beta_1 X_1 + \dots + \beta_k X_k \]

Test de hipótesis individual

Individual (Wald test):

\[H_0: \beta_j = 0\] \[H_1: \beta_j \neq 0 \text{ para } j=1, \dots, k\]

Estadístico:

\[z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)}\]

  • Distribución aproximada: Normal estándar.

Test de hipótesis global

Global (Likelihood Ratio Test):

\[H_0: \text{ Todos } \beta_j = 0 \text{ para } j=1, \dots, k\]

Estadístico: Contrasta log-verosimilitudes de modelo bajo la nula y el modelo contra la alternativa completo.

  • Distribución aproximada: Chi-cuadrado.

Simulación de datos logísticos

n <- 300
x <- rnorm(n)

eta <- -1 + 2 * x

p <- 1 / (1 + exp(-eta))

y <- rbinom(n, 1, p)

datos_log <- data.frame(x, y)

Ajuste del modelo logístico glm

modelo_log <- glm(y ~ x, data = datos_log, family = binomial)
summary(modelo_log)

Call:
glm(formula = y ~ x, family = binomial, data = datos_log)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -1.0876     0.1683  -6.461 1.04e-10 ***
x             1.8526     0.2335   7.934 2.11e-15 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 374.6  on 299  degrees of freedom
Residual deviance: 265.0  on 298  degrees of freedom
AIC: 269

Number of Fisher Scoring iterations: 5

Coeficientes y Bondad de Ajuste

Coeficientes:

  • Coeficientes están en log-odds

  • Para obtener odds ratio: exp(coef(modelo))

summary(modelo_log)$coefficients
             Estimate Std. Error   z value     Pr(>|z|)
(Intercept) -1.087616  0.1683436 -6.460693 1.042247e-10
x            1.852650  0.2334942  7.934459 2.114152e-15
exp(coef(modelo_log))
(Intercept)           x 
  0.3370189   6.3766952 

Bondad de Ajuste (Pseudo R2 de McFadden):

\[ R^2_{\text{McFadden}} = 1 - \frac{\log L_{\text{modelo}}}{\log L_{\text{nulo}}} \]

modelo_log <- glm(y ~ x, data = datos_log, family = binomial)
modelo_log_nulo <- glm(y ~ 1, data = datos_log, family = binomial)

ll_m <- logLik(modelo_log)
ll_0 <- logLik(modelo_log_nulo)

R2_mcfadden <- 1 - as.numeric(ll_m / ll_0)
R2_mcfadden
[1] 0.2925637

Curva logística ajustada

datos_orden <- datos_log[order(datos_log$x), ]

datos_log$pred <- predict(modelo_log, type = "response")

plot(datos_log$x, datos_log$pred,
     pch = 19,
     xlab = "x", ylab = "Predicción",
     main = "Curva logística ajustada")

lines(datos_orden$x, datos_orden$pred, col = "blue", lwd = 2)

Matriz de confusión

  • Dado un umbral \(\gamma\), es una herramienta para evaluar el rendimiento de un modelo de clasificación binaria.

  • Compara las predicciones con los valores reales.

  • Estructura:

Predicción: 1 Predicción: 0
Real: 1 VP FN
Real: 0 FP VN

Donde:

  • VP (Verdaderos Positivos): Casos positivos correctamente clasificados.
  • VN (Verdaderos Negativos): Casos negativos correctamente clasificados.
  • FP (Falsos Positivos): Casos negativos clasificados como positivos.
  • FN (Falsos Negativos): Casos positivos clasificados como negativos.
gamma <- 0.5
pred_class <- ifelse(datos_log$pred > gamma, 1, 0)
table(Pred = pred_class, Real = datos_log$y)
    Real
Pred   0   1
   0 185  41
   1  20  54

Curva ROC y AUC

Receiver Operating Characteristic (ROC):

Evalua la capacidad de un modelo para discriminar entre clases.

Se grafica Sensibilidad (True Positive Rate) vs 1 - Especificidad (False Positive Rate) para diferentes umbrales de decisión.

# install.packages("pROC")
library(pROC)

roc_obj <- roc(datos_log$y, datos_log$pred)
plot(roc_obj, col = "blue", lwd = 3, main = "Curva ROC")

AUC (Area Under the Curve):

Mide la capacidad del modelo para distinguir entre clases, resume el desempeño global del modelo.

auc(roc_obj)
Area under the curve: 0.8464

¿Preguntas?