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.
El modelo general se puede expresar como: \[ y_i = \beta_0 + \beta_1x_{1i} + \beta_2x_{2i} + \cdots + \beta_kx_{ki} + e_i \]
donde:
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} \]
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} \]
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.
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:
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.
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)
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
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"
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.
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
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.
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)
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)
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
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.
##
## 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
##
## 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
##
## 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
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.