logo

Introducción

En la mayoría de los problemas de investigación en los que se aplica el análisis de regresión existe más de una variable independiente para el modelo de regresión. Cuando un modelo lineal está compuesto por más de dos variables independientes se denomina modelo de regresión lineal múltiple.

Este modelo permite determinar la variable dependiente (\(y\)) a partir de un conjunto de variables independientes (\(x_1, x_2, \dots , x_k\)). Este tipo de modelo suele emplearse para predecir o para evaluar el grado de influencia que tienen las variables independientes sobre la variable dependiente.

Modelo RLM

El modelo general se puede expresar como: \[ y_i = \beta_0 + \beta_1x_{1i} + \beta_2x_{2i} + \cdots + \beta_kx_{ki} + e_i \]

donde:

  • \(\beta_0\): es la ordenada en el origen, cuando todos las variables independientes son cero.
  • \(\beta_i\): es el efecto que tiene el incremento en una unidad de la variable independiente \(x_i\) sobre la variable dependiente \(y\), manteniéndose constante el resto de las variables.
  • \(e_i\): es el residuo o error, la diferencia entre el valor observado y el estimado por el modelo \((e_i = y_i − \hat{y}_i)\).

Este modelo se puede representar de forma matricial de la siguiente manera:

\[ \begin{pmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{pmatrix} = \begin{pmatrix} 1 & x_{11} & x_{12} & \cdots & x_{1p} \\ 1 & x_{21} & x_{22} & \cdots & x_{2p} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n1} & x_{n2} & \cdots & x_{np} \\ \end{pmatrix} \begin{pmatrix} \beta_0\\ \beta_1 \\ \vdots \\ \beta_{p} \end{pmatrix} + \begin{pmatrix} e_1 \\ e_2 \\ \vdots \\ e_n \end{pmatrix} \]

Evaluación del modelo

Al igual que ocurre en los modelos lineales simples, \(R^2\) (coeficiente de determinación) es un cuantificador de la bondad de ajuste del modelo. Por lo tanto, permite cuantificar que tan bueno es el modelo para predecir el valor de las observaciones.

Pero, para el modelo múltiple, \(R^2\) aumenta cada vez que se agregue una nueva variable, aunque la variable no aporte al modelo. Es por esto que \(R^2\) no puede utilizarse para cuantificador de la bondad de ajuste en el modelo múltiple.

La solución a esta situación, es utilizar el valor de \(R^2\)-ajustado (coeficiente de determinación ajustado), el cual introduce una penalización por cada variable independiente que se introduce al modelo.

\[ R^2-\text{ajustado} = 1-\dfrac{(1-R^2)(n-1)}{n-p-1} \]

Selección de variables

En el ajuste de un modelo de regresión lineal es muy importante la selección de variables que componen al modelo, puesto que esto implica el cumplimiento de dos características muy importantes:

  • Precisión de predicción: cuando \(n\) es sustancialmente mayor que el número de variables \((p)\), las estimaciones tienden a menor varianza, por lo que las predicciones de las observaciones son bastante confiables. Sin embargo, si \(n\) no es pequeño respecto a \(p\), aumenta el riesgo de sobreajuste y alta variabilidad, lo que puede causar predicciones poco precisas.

  • Interpretabilidad del modelo: cuando alguna variable no está asociada con la variable respuesta, incluirla en el modelo añade complejidad innecesaria, por lo que eliminar dichas variables puede mejorar la interpretabilidad de los resultados y mejorar la predicción.

Selección de variables

Los métodos más conocidos para realizar selección de variables se pueden clasificar de la siguiente manera:

  • Selección por subconjuntos: prueba sistemáticamente combinaciones de predictores y elige la que optimiza un criterio \((BIC \text{ o } R^2-\text{ajustado})\), equilibrando ajuste y parsimonia.

  • Selección paso a paso (stepwise): construye el modelo agregando o eliminando variables una a una según un criterio \((AIC, BIC \text{ o } p-\text{values})\). Esta selección se puede realizar de diferentes formas:

    • Selección paso a paso hacia adelante (Forward stepwise selection).
    • Selección paso a paso hacia atrás (Backward stepwise selection).
    • Selección híbrida (Forward y backward)

Ejemplo 1

Con este primer ejemplo, ilustraremos como se realiza la selección de variables por medio del método de selección de variables por subconjunto.

Contexto del problema:

Una cadena minorista quiere predecir sus ventas mensuales (ventas) usando variables que el equipo controla u observa: inversión en marketing digital (inv_online), inversión en TV (inv_tv), precio promedio (precio), visitas al sitio web (visitas), número de tiendas activas (tiendas), descuentos vigentes (descuento), índice de competencia local (competencia) y un término de estacionalidad (estacionalidad) ligado al mes.

Desarrollo en R

Paso 1

Datos:

Simulamos una base bajo el contexto ejemplificado, donde la empresa desea predecir ventas mensuales a partir de variables de negocio (marketing, precio, visitas, tiendas, descuentos, competencia y estacionalidad). Redondeamos según cada contexto y fijamos un mínimo razonable para evitar ventas negativas.

# Datos simulados
set.seed(2025)  # semilla
n              <- 120

inv_online  <- round(runif(n,  5, 50))  # miles USD
inv_tv      <- round(runif(n,  0, 40))  # miles USD
precio      <- round(runif(n,  5, 20), 2)  # USD promedio
visitas     <- round(runif(n, 500, 8000))  # visitas/mes
tiendas     <- sample(5:50, n, replace = TRUE) 
descuento   <- round(runif(n,  0, 30), 1)  # % (puntos porcentuales)
competencia <- round(runif(n, 20, 80))  # índice aprox.
ruido       <- rnorm(n, 0, 30)

ventas <- 300 + 5*inv_online + 3*inv_tv  + 0.02*visitas +
          1.2*tiendas - 2*descuento + ruido

# Redondeo de ventas (en miles) y piso mínimo para evitar negativos
ventas <- round(pmax(ventas, 100), 0)

datos <- data.frame(ventas, inv_online, inv_tv, precio, visitas, tiendas,
  descuento, competencia)

Paso 2

Exploración de correlaciones:

Usamos un mapa de calor de correlaciones (corrplot()), para identificar de un vistazo qué variables tienen relaciones fuertes con ventas y entre sí. Esto ayuda a detectar posibles problemas de multicolinealidad y te va dando luz de las posibles variables que no aportarán.

library(corrplot)
R <- cor(datos, use = "pairwise.complete.obs")

corrplot(R,
  method = "color",        # colores en lugar de números
  type = "lower",          # solo triángulo inferior
  addCoef.col = "black",   # añadir valores en negro
  tl.col = "black",        # etiquetas de variables en negro
  tl.srt = 45,             # rotar etiquetas
  diag = FALSE)           # no mostrar diagonal

Paso 3

Selección de variables por subconjuntos:

Creamos el modelo saturado con todas las variables disponibles y con ayuda de la función regsubsets(), de la librería leaps buscamos la mejor combinación de variables.

# Creamos el modelo saturado
saturado <- ventas ~ inv_online + inv_tv + precio + visitas + tiendas + descuento + competencia 

reg  <- lm(saturado, data=datos) # todos los predictores
summary(reg)
## 
## Call:
## lm(formula = saturado, data = datos)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -73.64 -17.16   2.40  17.57  69.88 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 293.006379  18.460569  15.872  < 2e-16 ***
## inv_online    5.394059   0.218988  24.632  < 2e-16 ***
## inv_tv        3.293844   0.236030  13.955  < 2e-16 ***
## precio       -0.327476   0.649037  -0.505    0.615    
## visitas       0.020668   0.001422  14.530  < 2e-16 ***
## tiendas       1.254111   0.213092   5.885 4.21e-08 ***
## descuento    -2.275272   0.339670  -6.698 8.81e-10 ***
## competencia  -0.090543   0.177862  -0.509    0.612    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30.89 on 112 degrees of freedom
## Multiple R-squared:  0.9129, Adjusted R-squared:  0.9074 
## F-statistic: 167.6 on 7 and 112 DF,  p-value: < 2.2e-16
library(leaps)

ajuste <- regsubsets(
  saturado, data = datos,
  nvmax = 8,                 # total de predictores disponibles
  method = "exhaustive")    # todas las combinaciones

s <- summary(ajuste)

names(s)
## [1] "which"  "rsq"    "rss"    "adjr2"  "cp"     "bic"    "outmat" "obj"

Paso 4

Elegir el modelo óptimo:

Seleccionamos el número de predictores que minimiza BIC o maximice el \(R^2\)-ajustado.

# Número óptimo de predictores según cada criterio
best_bic  <- which.min(s$bic)
best_r2   <- which.max(s$adjr2)

# Visualización comparativa
par(mfrow = c(1,2))

plot(s$bic, type="b", col="red", pch=19,
     xlab="Número de predictores", ylab="BIC",
     main="Criterio BIC")
points(best_bic, s$bic[best_bic], pch=19, cex=1.5, col="blue")

plot(s$adjr2, type="b", col="darkgreen", pch=19,
     xlab="Número de predictores", ylab="R^2-ajustado",
     main="Criterio R^2-ajustado")
points(best_r2, s$adjr2[best_r2], pch=19, cex=1.5, col="blue")

Nota importante: BIC normalmente propone un modelo más pequeño porque penaliza mucho la complejidad, mientras que \(R^2\)-ajustado suele elegir un modelo más grande. Esta comparación muestra que la selección depende del criterio: si queremos parsimonia, usamos BIC; si queremos maximizar ajuste, usamos \(R^2\)-ajustado.

Paso 5

Ajustamos el mejor modelo:

# Opción 1
# extraemos las variables del mejor modelo
coef_best <- coef(ajuste, best_bic)
vars_best <- names(coef_best)[-1] # sin intercepto

# modelo final ajustado
f_final <- as.formula(paste("ventas ~", paste(vars_best, collapse = " + ")))

modelo_final <- lm(f_final, data = datos)
summary(modelo_final)
## 
## Call:
## lm(formula = f_final, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -75.086 -17.318   2.012  17.732  70.286 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 283.655001  12.708117  22.321  < 2e-16 ***
## inv_online    5.387522   0.216853  24.844  < 2e-16 ***
## inv_tv        3.301626   0.228616  14.442  < 2e-16 ***
## visitas       0.020744   0.001408  14.732  < 2e-16 ***
## tiendas       1.265783   0.210919   6.001 2.37e-08 ***
## descuento    -2.266687   0.331349  -6.841 4.15e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30.68 on 114 degrees of freedom
## Multiple R-squared:  0.9125, Adjusted R-squared:  0.9086 
## F-statistic: 237.7 on 5 and 114 DF,  p-value: < 2.2e-16
# Opción 2
# extraemos las variables del mejor modelo
coef_best <- coef(ajuste, best_r2)
vars_best <- names(coef_best)[-1] # sin intercepto

# modelo final ajustado
f_final <- as.formula(paste("ventas ~", paste(vars_best, collapse = " + ")))

modelo_final <- lm(f_final, data = datos)
summary(modelo_final)
## 
## Call:
## lm(formula = f_final, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -75.086 -17.318   2.012  17.732  70.286 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 283.655001  12.708117  22.321  < 2e-16 ***
## inv_online    5.387522   0.216853  24.844  < 2e-16 ***
## inv_tv        3.301626   0.228616  14.442  < 2e-16 ***
## visitas       0.020744   0.001408  14.732  < 2e-16 ***
## tiendas       1.265783   0.210919   6.001 2.37e-08 ***
## descuento    -2.266687   0.331349  -6.841 4.15e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30.68 on 114 degrees of freedom
## Multiple R-squared:  0.9125, Adjusted R-squared:  0.9086 
## F-statistic: 237.7 on 5 and 114 DF,  p-value: < 2.2e-16

Ejemplo 2

Con este segundo ejemplo, ilustraremos como se realiza la selección de variables por medio del método de selección de variables paso a paso.

Contexto del problema:

Una empresa quiere predecir su costo logístico mensual (costo_log, en miles de USD) usando variables operativas: pedidos, distancia promedio, precio del combustible, peajes, número de conductores, ocupación de flota, gastos de mantenimiento, nivel de tercerización y estacionalidad.

Desarrollo en R

Paso 1

Datos:

Simulamos una base bajo el contexto ejemplificado. Redondeamos según cada contexto.

set.seed(2025)
n              <- 120

# Predictores (con redondeos por contexto)
pedidos            <- round(runif(n,200,5000))    # órdenes/mes
distancia_prom     <- round(runif(n,10,200))      # km promedio por envío
precio_combustible <- round(runif(n,2.5,5.0),2)   # USD/gal
peajes             <- round(runif(n,0,50))        # miles USD/mes
conductores        <- round(runif(n,10,120))      # personas
ocupacion          <- round(runif(n,50,100),1)    # % de utilización
mantenimientos     <- round(runif(n,0,80))        # miles USD/mes
tercerizacion      <- round(runif(n,0,40),1)      # % de operaciones
ruido              <- rnorm(n, 0, 40)

costo_log <- 150 + 0.2*pedidos + 50*precio_combustible + 0.8*peajes+ 5*tercerizacion  + ruido

# Evitar negativos y redondear a miles USD
costo_log <- round(pmax(costo_log, 80), 0)

datos_log <- data.frame(
  costo_log, pedidos, distancia_prom, precio_combustible, peajes,
  conductores, ocupacion, mantenimientos, tercerizacion)

Paso 2

Exploración de correlaciones:

Exploramos un mapa de correlaciones permite detectar relaciones fuertes con costo_log y posibles colinealidades entre predictores antes de seleccionar.

library(corrplot)

Rlog     <- cor(datos_log, use = "pairwise.complete.obs")

corrplot(Rlog,
  method = "color",
  type = "lower",
  addCoef.col = "black",
  tl.col = "black",
  tl.srt = 45,
  diag = FALSE)

Paso 3

Selección de variables paso a paso:

Creamos el modelo nulo y el modelo saturado y con ayuda de la función step(), de la librería stats buscamos la mejor combinación de variables.

form_log <- costo_log ~ pedidos + distancia_prom + precio_combustible + peajes +
  conductores + ocupacion + mantenimientos + tercerizacion 

# Modelos de nulo y saturado
m0_log <- lm(costo_log ~ 1, data = datos_log)   # sin predictores
mF_log <- lm(form_log, data = datos_log)        # todos los predictores

# Hacia adelante 
m1_step_log <- step(m0_log,
  scope     = list(lower = ~1, upper = formula(mF_log)),
  direction = "forward",
  k         = log(nrow(datos_log)),
  trace     = TRUE)
## Start:  AIC=1364.83
## costo_log ~ 1
## 
##                      Df Sum of Sq      RSS    AIC
## + pedidos             1   9237750   793289 1065.2
## + tercerizacion       1    790593  9240445 1359.8
## <none>                            10031038 1364.8
## + precio_combustible  1    379132  9651906 1365.0
## + distancia_prom      1     55052  9975986 1369.0
## + ocupacion           1     38845  9992194 1369.2
## + conductores         1     13126 10017912 1369.5
## + mantenimientos      1      8548 10022490 1369.5
## + peajes              1      1192 10029847 1369.6
## 
## Step:  AIC=1065.15
## costo_log ~ pedidos
## 
##                      Df Sum of Sq    RSS    AIC
## + tercerizacion       1    421792 371496  978.9
## + precio_combustible  1    187275 606014 1037.6
## <none>                            793289 1065.2
## + conductores         1     20168 773120 1066.8
## + mantenimientos      1     17803 775486 1067.2
## + ocupacion           1     11057 782232 1068.2
## + peajes              1      4409 788879 1069.3
## + distancia_prom      1      3764 789525 1069.4
## 
## Step:  AIC=978.9
## costo_log ~ pedidos + tercerizacion
## 
##                      Df Sum of Sq    RSS    AIC
## + precio_combustible  1    145388 226109 924.10
## <none>                            371496 978.90
## + peajes              1     10221 361275 980.34
## + mantenimientos      1      6900 364596 981.44
## + conductores         1      4568 366929 982.20
## + distancia_prom      1      2080 369416 983.01
## + ocupacion           1       213 371283 983.62
## 
## Step:  AIC=924.1
## costo_log ~ pedidos + tercerizacion + precio_combustible
## 
##                  Df Sum of Sq    RSS    AIC
## + peajes          1   17960.1 208149 918.96
## <none>                        226109 924.10
## + distancia_prom  1    1131.9 224977 928.29
## + mantenimientos  1     781.3 225328 928.48
## + ocupacion       1      15.4 226093 928.88
## + conductores     1       0.1 226109 928.89
## 
## Step:  AIC=918.96
## costo_log ~ pedidos + tercerizacion + precio_combustible + peajes
## 
##                  Df Sum of Sq    RSS    AIC
## <none>                        208149 918.96
## + distancia_prom  1    874.06 207275 923.24
## + conductores     1     35.25 208113 923.73
## + ocupacion       1     21.74 208127 923.73
## + mantenimientos  1      7.80 208141 923.74
# Hacia atras 
m2_step_log <- step(mF_log,
  direction = "backward",
  k         = log(nrow(datos_log)),
  trace     = TRUE)
## Start:  AIC=937.58
## costo_log ~ pedidos + distancia_prom + precio_combustible + peajes + 
##     conductores + ocupacion + mantenimientos + tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## - mantenimientos      1         6  207233  932.79
## - conductores         1        13  207240  932.80
## - ocupacion           1        25  207252  932.80
## - distancia_prom      1       858  208084  933.28
## <none>                             207227  937.58
## - peajes              1     16951  224178  942.22
## - precio_combustible  1    144527  351754  996.28
## - tercerizacion       1    368365  575592 1055.38
## - pedidos             1   8541550 8748777 1381.93
## 
## Step:  AIC=932.79
## costo_log ~ pedidos + distancia_prom + precio_combustible + peajes + 
##     conductores + ocupacion + tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## - conductores         1        11  207244  928.01
## - ocupacion           1        29  207262  928.02
## - distancia_prom      1       861  208094  928.50
## <none>                             207233  932.79
## - peajes              1     17730  224963  937.86
## - precio_combustible  1    147466  354699  992.50
## - tercerizacion       1    371316  578550 1051.21
## - pedidos             1   8599073 8806306 1377.93
## 
## Step:  AIC=928.01
## costo_log ~ pedidos + distancia_prom + precio_combustible + peajes + 
##     ocupacion + tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## - ocupacion           1        31  207275  923.24
## - distancia_prom      1       883  208127  923.73
## <none>                             207244  928.01
## - peajes              1     17725  224969  933.07
## - precio_combustible  1    151101  358345  988.94
## - tercerizacion       1    374214  581458 1047.02
## - pedidos             1   8602441 8809685 1373.19
## 
## Step:  AIC=923.24
## costo_log ~ pedidos + distancia_prom + precio_combustible + peajes + 
##     tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## - distancia_prom      1       874  208149  918.96
## <none>                             207275  923.24
## - peajes              1     17702  224977  928.29
## - precio_combustible  1    151456  358731  984.28
## - tercerizacion       1    386986  594260 1044.85
## - pedidos             1   8604275 8811549 1368.43
## 
## Step:  AIC=918.96
## costo_log ~ pedidos + precio_combustible + peajes + tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## <none>                             208149  918.96
## - peajes              1     17960  226109  924.10
## - precio_combustible  1    153127  361275  980.34
## - tercerizacion       1    386772  594921 1040.19
## - pedidos             1   8735075 8943224 1365.42
# híbrido 
m3_step_log <- step(m0_log,
  scope     = list(lower = ~1, upper = formula(mF_log)),
  direction = "both",
  k         = log(nrow(datos_log)),
  trace     = TRUE)
## Start:  AIC=1364.83
## costo_log ~ 1
## 
##                      Df Sum of Sq      RSS    AIC
## + pedidos             1   9237750   793289 1065.2
## + tercerizacion       1    790593  9240445 1359.8
## <none>                            10031038 1364.8
## + precio_combustible  1    379132  9651906 1365.0
## + distancia_prom      1     55052  9975986 1369.0
## + ocupacion           1     38845  9992194 1369.2
## + conductores         1     13126 10017912 1369.5
## + mantenimientos      1      8548 10022490 1369.5
## + peajes              1      1192 10029847 1369.6
## 
## Step:  AIC=1065.15
## costo_log ~ pedidos
## 
##                      Df Sum of Sq      RSS    AIC
## + tercerizacion       1    421792   371496  978.9
## + precio_combustible  1    187275   606014 1037.6
## <none>                              793289 1065.2
## + conductores         1     20168   773120 1066.8
## + mantenimientos      1     17803   775486 1067.2
## + ocupacion           1     11057   782232 1068.2
## + peajes              1      4409   788879 1069.3
## + distancia_prom      1      3764   789525 1069.4
## - pedidos             1   9237750 10031038 1364.8
## 
## Step:  AIC=978.9
## costo_log ~ pedidos + tercerizacion
## 
##                      Df Sum of Sq     RSS     AIC
## + precio_combustible  1    145388  226109  924.10
## <none>                             371496  978.90
## + peajes              1     10221  361275  980.34
## + mantenimientos      1      6900  364596  981.44
## + conductores         1      4568  366929  982.20
## + distancia_prom      1      2080  369416  983.01
## + ocupacion           1       213  371283  983.62
## - tercerizacion       1    421792  793289 1065.15
## - pedidos             1   8868949 9240445 1359.77
## 
## Step:  AIC=924.1
## costo_log ~ pedidos + tercerizacion + precio_combustible
## 
##                      Df Sum of Sq     RSS     AIC
## + peajes              1     17960  208149  918.96
## <none>                             226109  924.10
## + distancia_prom      1      1132  224977  928.29
## + mantenimientos      1       781  225328  928.48
## + ocupacion           1        15  226093  928.88
## + conductores         1         0  226109  928.89
## - precio_combustible  1    145388  371496  978.90
## - tercerizacion       1    379905  606014 1037.62
## - pedidos             1   8720964 8947073 1360.68
## 
## Step:  AIC=918.96
## costo_log ~ pedidos + tercerizacion + precio_combustible + peajes
## 
##                      Df Sum of Sq     RSS     AIC
## <none>                             208149  918.96
## + distancia_prom      1       874  207275  923.24
## + conductores         1        35  208113  923.73
## + ocupacion           1        22  208127  923.73
## + mantenimientos      1         8  208141  923.74
## - peajes              1     17960  226109  924.10
## - precio_combustible  1    153127  361275  980.34
## - tercerizacion       1    386772  594921 1040.19
## - pedidos             1   8735075 8943224 1365.42

Paso 4

Ajustamos el mejor modelo:

Luego de aplicar los métodos de selección paso a paso, se debe decidir con cuál de ellos resulta más conveniente quedarse y, de esta manera, obtener el mejor modelo ajustado. Puede suceder, como en este ejemplo, que los tres métodos lleguen al mismo modelo; sin embargo, esto no siempre ocurre, por lo que el investigador debe complementar el proceso con otros análisis antes de tomar una decisión final.

summary(m1_step_log) 
## 
## Call:
## lm(formula = costo_log ~ pedidos + tercerizacion + precio_combustible + 
##     peajes, data = datos_log)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -93.479 -28.058  -3.828  22.405 135.900 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        1.670e+02  2.333e+01   7.155 8.36e-11 ***
## pedidos            1.956e-01  2.816e-03  69.470  < 2e-16 ***
## tercerizacion      5.056e+00  3.459e-01  14.618  < 2e-16 ***
## precio_combustible 4.810e+01  5.230e+00   9.198 1.92e-15 ***
## peajes             9.148e-01  2.904e-01   3.150  0.00208 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 42.54 on 115 degrees of freedom
## Multiple R-squared:  0.9792, Adjusted R-squared:  0.9785 
## F-statistic:  1357 on 4 and 115 DF,  p-value: < 2.2e-16
summary(m2_step_log) 
## 
## Call:
## lm(formula = costo_log ~ pedidos + precio_combustible + peajes + 
##     tercerizacion, data = datos_log)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -93.479 -28.058  -3.828  22.405 135.900 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        1.670e+02  2.333e+01   7.155 8.36e-11 ***
## pedidos            1.956e-01  2.816e-03  69.470  < 2e-16 ***
## precio_combustible 4.810e+01  5.230e+00   9.198 1.92e-15 ***
## peajes             9.148e-01  2.904e-01   3.150  0.00208 ** 
## tercerizacion      5.056e+00  3.459e-01  14.618  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 42.54 on 115 degrees of freedom
## Multiple R-squared:  0.9792, Adjusted R-squared:  0.9785 
## F-statistic:  1357 on 4 and 115 DF,  p-value: < 2.2e-16
summary(m3_step_log) 
## 
## Call:
## lm(formula = costo_log ~ pedidos + tercerizacion + precio_combustible + 
##     peajes, data = datos_log)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -93.479 -28.058  -3.828  22.405 135.900 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        1.670e+02  2.333e+01   7.155 8.36e-11 ***
## pedidos            1.956e-01  2.816e-03  69.470  < 2e-16 ***
## tercerizacion      5.056e+00  3.459e-01  14.618  < 2e-16 ***
## precio_combustible 4.810e+01  5.230e+00   9.198 1.92e-15 ***
## peajes             9.148e-01  2.904e-01   3.150  0.00208 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 42.54 on 115 degrees of freedom
## Multiple R-squared:  0.9792, Adjusted R-squared:  0.9785 
## F-statistic:  1357 on 4 and 115 DF,  p-value: < 2.2e-16

Ejercicio de clase

Para el ejercicio de clase, trabajaremos con datos descargados desde la página del Censo de PR. Se hizo la descarga de las variables relevantes para el estudio y se comparte ya la base de datos limpia en la plataforma de Moodle de la clase.

Contexto del problema:

El ingreso per cápita varía entre municipios de Puerto Rico. Factores como educación, desempleo, acceso a internet, pobreza y tamaño del hogar pueden ayudar a explicar estas diferencias. El objetivo es aplicar Regresión Lineal Múltiple (RLM) y técnicas de selección de variables para identificar los predictores más relevantes.

Variables incluidas en el modelo:

  • ing_pc: Ingreso per cápita.

  • bach_pct: % con bachillerato o más.

  • desem_pct: Tasa de desempleo.

  • banda_pct: % de hogares con internet de banda ancha.

  • pobreza_pct: % de población bajo pobreza.

  • tam_hogar: Tamaño promedio del hogar.

Instrucciones:

  • Explora los datos y realizar un análisis de correlaciones.

  • Ajusta un modelo por subconjuntos, comparando el \(BIC\) y \(R^2\)-ajustado.

  • Ajusta modelos paso a paso (forward, backward, both) usando \(BIC\).

  • Comparar los modelos obtenidos y justificar cuál sería el mejor.

  • Interpreta los coeficientes del modelo final.

  • Concluye de forma general sobre el trabajo realizado.