Business Analytics

Regresión Lineal y Múltiple

Author

Wilson H. Guamán L.

Published

May 24, 2025

1 Librerias

Este bloque de código carga paquetes en R como dplyr, ggplot2, etc., y usa suppressWarnings() y suppressPackageStartupMessages() para ocultar advertencias y mensajes al cargar los paquetes, manteniendo la consola más limpia.

ver código
suppressWarnings(suppressPackageStartupMessages(library(dplyr)))   
suppressWarnings(suppressPackageStartupMessages(library(ggplot2)))
suppressWarnings(suppressPackageStartupMessages(library(haven)))
suppressWarnings(suppressPackageStartupMessages(library(ggcorrplot))) 
suppressWarnings(suppressPackageStartupMessages(library(ggcorrplot)))
suppressWarnings(suppressPackageStartupMessages(library(car)))
suppressWarnings(suppressPackageStartupMessages(library(foreign))) 
suppressWarnings(suppressPackageStartupMessages(library(msm)))
suppressWarnings(suppressPackageStartupMessages(library(knitr)))
suppressWarnings(suppressPackageStartupMessages(library(kableExtra)))
suppressWarnings(suppressPackageStartupMessages(library(broom)))
suppressWarnings(suppressPackageStartupMessages(library(reshape2)))

2 Cargar datos

El siguiente código carga un archivo .dta (formato Stata) desde una ruta específica usando read_dta(), lo guarda en el objeto base_p, y luego muestra un mensaje en la consola confirmando que la carga fue exitosa.

ver código
ruta <- "C:/Users/USUARIO 2020/Documents/Maestria_EDE_2/Mod_09_Busnicess_Analityc/BA_U1/Clase_03_18_04/Tarea/base_panel_largo.dta"

base_p <- read_dta(ruta)

cat("✅ Archivo exportado exitosamente a:\n", ruta)
✅ Archivo exportado exitosamente a:
 C:/Users/USUARIO 2020/Documents/Maestria_EDE_2/Mod_09_Busnicess_Analityc/BA_U1/Clase_03_18_04/Tarea/base_panel_largo.dta

3 Especificaión de las variables

  1. grow: Representa la tasa de crecimiento anual del PIB de Argentina, expresada en porcentaje. Indica si la economía se expandió o contrajo en un año determinado.

  2. infl: Mide la tasa de inflación anual, en porcentaje. Refleja el aumento general de precios y el nivel de estabilidad económica.

  3. inv: Corresponde a la inversión total como porcentaje del PIB. Indica qué parte de la producción se destinó a bienes de capital.

  4. x: Representa las exportaciones como porcentaje del PIB. Muestra el grado de apertura comercial hacia el exterior.

  5. m: Indica las importaciones como porcentaje del PIB. Refleja la dependencia del país de bienes y servicios externos.

  6. debt: Mide la deuda externa total como porcentaje del PIB. Permite observar el nivel de endeudamiento internacional del país.

4 Tratamiento de de la base de datos

Este código filtra la base de datos base_p para quedarse solo con las filas donde la variable pais contiene a Argentina, y guarda el resultado en base_arg. Luego, head(base_arg) muestra las primeras filas de esa base filtrada.

ver código
base_arg <- base_p %>% filter(pais == 6)
head(base_arg)
# A tibble: 6 × 8
  pais            año    grow  infl   inv     x     m  debt
  <dbl+lbl>     <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 6 [Argentina]  1980 -0.0296  87.6  25.3  5.06  6.48  12.6
2 6 [Argentina]  1981 -6.67   131.   22.7  6.92  7.37  21.3
3 6 [Argentina]  1982 -2.31   210.   21.8  9.09  6.52  36.0
4 6 [Argentina]  1983  2.68   434.   20.9  9.15  5.84  46.7
5 6 [Argentina]  1984 -0.0518 688    20.0  7.59  4.76  40.5
6 6 [Argentina]  1985 -6.69   385.   17.6 11.7   6.27  60.5

Este código convierte las variables categóricas de base_arg en factores (as_factor()), luego crea dos nuevas variables:

  1. xneta (exportaciones netas), que es la resta de x (exportaciones) menos m (importaciones),

  2. linflacion, que es el logaritmo natural de 1+inflación/100.

Después, head(base_arg) muestra las primeras filas con las nuevas variables.

ver código
base_arg <- base_arg %>% 
              as_factor() %>% 
              mutate(xneta = x - m, linflacion = log(1+infl/100))
head(base_arg)
# A tibble: 6 × 10
  pais        año    grow  infl   inv     x     m  debt  xneta linflacion
  <fct>     <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>      <dbl>
1 Argentina  1980 -0.0296  87.6  25.3  5.06  6.48  12.6 -1.42       0.629
2 Argentina  1981 -6.67   131.   22.7  6.92  7.37  21.3 -0.451      0.839
3 Argentina  1982 -2.31   210.   21.8  9.09  6.52  36.0  2.57       1.13 
4 Argentina  1983  2.68   434.   20.9  9.15  5.84  46.7  3.32       1.67 
5 Argentina  1984 -0.0518 688    20.0  7.59  4.76  40.5  2.83       2.06 
6 Argentina  1985 -6.69   385.   17.6 11.7   6.27  60.5  5.46       1.58 

Luego se observa si existen observaciones ausentes en la nueva base de datos.

ver código
colSums(is.na(base_arg))
      pais        año       grow       infl        inv          x          m 
         0          0          0          0          0          0          0 
      debt      xneta linflacion 
         0          0          0 

5 Correlación de la variables

La Gráfica 1 representa la relación entre la inflación y el crecimiento económico en Argentina, utilizando una transformación logarítmica para la variable de inflación. El coeficiente de correlación (r=−0.39) indica una relación negativa moderada entre estas dos variables. Esto significa que, en general, a medida que aumenta la inflación (en su forma logarítmica), tiende a disminuir el crecimiento económico, y viceversa.

El valor de r=−0.39 sugiere que la correlación no es extremadamente fuerte, pero sí significativa. Una correlación negativa en este contexto podría reflejar que altos niveles de inflación suelen estar asociados con un menor crecimiento, posiblemente debido a la incertidumbre económica, la distorsión de precios o la reducción del poder adquisitivo de los consumidores. Sin embargo, es importante recordar que la correlación no implica causalidad, por lo que otros factores no considerados en este gráfico podrían estar influyendo en esta relación.

ver código
# Filtrar solo datos de Argentina
base_arg <- subset(base_p, pais == 6)

# Crear variables derivadas de forma segura
base_arg <- base_arg %>%
  mutate(
    pais = as_factor(pais),                     # Solo convertir 'pais' a factor (si lo necesitas)
    xneta = x - m,
    linflacion = log(1 + infl / 100)
  )

# Calcular correlación (omitiendo NAs)
correlacion <- cor(base_arg$grow, base_arg$linflacion, use = "complete.obs")

# Gráfico de dispersión con valor de correlación anotado
ggplot(base_arg, aes(x = linflacion, y = grow)) +
  geom_point(color = "steelblue", alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, color = "darkred") +
  annotate("text", 
           x = 2, y = 5, 
           label = paste0("r = ", round(correlacion, 3)), 
           hjust = 1.1, vjust = 1.5, 
           size = 5, color = "black") +
  labs(title = "Gráfica 1:",
       subtitle = "Relación entre inflación y crecimiento en Argentina",
       x = "Inflación (log transformada)",
       y = "Crecimiento (grow)") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

6 Matriz de Correlación Multivariante

La matriz de correlación presentada en la Gráfica 2 analiza las relaciones entre diversas variables económicas, mostrando tanto los coeficientes de correlación como sus respectivos p-valores. Entre los hallazgos más destacados se observa una correlación negativa moderada entre la inflación y el crecimiento económico (r=−0.39,p=0.013), confirmando que, en Argentina, niveles más altos de inflación tienden a asociarse con un menor crecimiento. Este resultado es estadísticamente significativo, ya que el p-valor es menor a 0.05, reforzando la idea de que la inflación podría actuar como un obstaculo para el desarrollo económico.

Por otro lado, se identifican correlaciones positivas fuertes y significativas entre algunas variables, como por ejemplo (debt) deuda y (xneta) exportaciones netas (r=0.75, p=0.000), indicando una relación directa entre estos factores. También resalta la correlación negativa entre (xneta) exportaciones netas e (inv) inversión neta (r=−0.35, p=0.026), señalando que un aumento en una de estas variables podría estar vinculado a una disminución en la otra. Sin embargo, otras correlaciones, como las que involucran la (debt) deuda con otras varaibles, no son significativas (p>0.05).

Es asi que, mientras algunas relaciones son claras y estadísticamente sólidas, como el vínculo negativo entre inflación y crecimiento, otras carecen de significancia estadística. Estos resultados subrayan la importancia de considerar múltiples factores y su contexto al interpretar las dinámicas económicas, evitando conclusiones simplistas basadas en correlaciones aisladas.

ver código
# Función para calcular correlaciones y p-valores
cor_with_pval <- function(data, vars) {
  n <- length(vars)
  cor_matrix <- matrix(NA, n, n, dimnames = list(vars, vars))
  pval_matrix <- matrix(NA, n, n, dimnames = list(vars, vars))
  
  for (i in 1:n) {
    for (j in 1:n) {
      if (i == j) {
        cor_matrix[i, j] <- 1
        pval_matrix[i, j] <- 0
      } else {
        test <- cor.test(data[[vars[i]]], data[[vars[j]]], use = "complete.obs")
        cor_matrix[i, j] <- test$estimate
        pval_matrix[i, j] <- test$p.value
      }
    }
  }
  list(cor_matrix = cor_matrix, pval_matrix = pval_matrix)
}

# Seleccionar las variables de interés desde base.arg
variables <- base_arg[, c("grow", "linflacion", "inv", "xneta", "debt")]

# Calcular correlaciones y p-valores
result <- cor_with_pval(variables, c("grow", "linflacion", "inv", "xneta", "debt"))
cor_matrix <- result$cor_matrix
pval_matrix <- result$pval_matrix

# Convertir matrices en formato largo para ggplot2
cor_melted <- melt(cor_matrix, varnames = c("Var1", "Var2"), value.name = "correlation")
pval_melted <- melt(pval_matrix, varnames = c("Var1", "Var2"), value.name = "pvalue")

# Combinar correlaciones y p-valores
cor_melted$pvalue <- pval_melted$pvalue
cor_melted$label <- sprintf("%.2f\n(p=%.3f)", cor_melted$correlation, cor_melted$pvalue)
cor_melted$significant <- cor_melted$pvalue < 0.05  # Marcar correlaciones significativas (p < 0.05)

# Crear el mapa de calor con ggplot2
ggplot(data = cor_melted, aes(x = Var1, y = Var2, fill = correlation)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1, 1), space = "Lab", 
                       name = "Correlación") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  coord_fixed() +
  geom_text(aes(label = label, color = significant), size = 3) +
  scale_color_manual(values = c("black", "red"), guide = FALSE) +  # Resaltar p < 0.05 en rojo
  labs(title = "Gráfico 2:",
       subtitle = "Matriz de Correlación con P-valores",
       x = "", 
       y = "")
Warning: The `guide` argument in `scale_*()` cannot be `FALSE`. This was deprecated in
ggplot2 3.3.4.
ℹ Please use "none" instead.

7 Modelo de Regresión Lineal

El modelo de regresión lineal (Tabla 1) evalúa el impacto de la inflación (en logaritmos) sobre el crecimiento económico en Argentina. Los resultados muestran una relación negativa y estadísticamente significativa entre ambas variables. El coeficiente de la inflación es de -2.522 (p=0.013), lo que indica que un aumento del 1% en la tasa de inflación se asocia con una reducción aproximada de 0.025 puntos porcentuales en el crecimiento económico. Este efecto sugiere que aumentos proporcionales en la inflación afectan negativamente el desempeño económico, probablemente debido a la incertidumbre que generan.

El intercepto del modelo (2.027, p=0.041) representa la tasa de crecimiento esperada cuando la inflación es igual a 1 (log(1) = 0), aunque este caso es poco realista. En conjunto, el modelo es estadísticamente significativo (p=0.013 para el estadístico F), respaldando el papel de la inflación como un determinante relevante del crecimiento económico.

A pesar de estas relaciones significativas, el poder explicativo del modelo es relativamente bajo (R²=0.152), determinado que solo el 15.2% de las variaciones en el crecimiento económico pueden atribuirse a cambios en la inflación. Este bajo porcentaje indica que existen otros factores relevantes -como el tipo de cambio, las políticas fiscales o las condiciones externas- que también influyen en el crecimiento pero que no son incluidos en este análisis. El error estándar residual de 5.094 puntos porcentuales refleja una dispersión considerable de los datos alrededor de la línea de regresión, reforzando la idea de que el crecimiento económico está sujeto a múltiples determinantes (Tabla 2).

ver código
# Ajustar modelo
modelo1 <- lm(grow ~ linflacion, data = base_arg)

# --- 1. Tabla de coeficientes ---
tabla_coef <- tidy(modelo1)

tabla_coef |>
  kable(digits = 3,
        caption = "Tabla 1. Coeficientes del modelo de regresión lineal") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 1. Coeficientes del modelo de regresión lineal
term estimate std.error statistic p.value
(Intercept) 2.027 0.959 2.114 0.041
linflacion -2.522 0.965 -2.613 0.013
ver código
# --- 2. Estadísticos del modelo ---
resumen_modelo <- glance(modelo1)

tabla_stats <- data.frame(
  Estadístico = c("R²", "R² ajustado", "Error estándar residual", "F", "p-valor F"),
  Valor = c(
    round(resumen_modelo$r.squared, 3),
    round(resumen_modelo$adj.r.squared, 3),
    round(resumen_modelo$sigma, 3),
    round(resumen_modelo$statistic, 3),
    round(resumen_modelo$p.value, 4)
  )
)

tabla_stats |>
  kable(caption = "Tabla 2. Estadísticos del modelo",
        digits = 3,
        col.names = c("Estadístico", "Valor")) |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 2. Estadísticos del modelo
Estadístico Valor
0.152
R² ajustado 0.130
Error estándar residual 5.094
F 6.825
p-valor F 0.013

7.1 Proyecciones usando la Regresión Simple

ver código
# 1. Crear un nuevo data frame con 6 valores de linflacion
nuevos_datos <- data.frame(
  linflacion = c(2, 4, 6, 8, 10, 12)
)

# 2. Predecir usando el modelo
predicciones <- predict(modelo1, newdata = nuevos_datos, interval = "confidence")

# 3. Combinar en un solo data frame
tabla_predicciones <- cbind(nuevos_datos, predicciones)

# 4. Mostrar tabla elegante con kable
library(kableExtra)

tabla_predicciones |>
  kable(digits = 2,
        caption = "Tabla 3. Predicciones del crecimiento según la inflación",
        col.names = c("Inflación (%)", "Predicción", "Límite inferior", "Límite superior")) |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Tabla 3. Predicciones del crecimiento según la inflación
Inflación (%) Predicción Límite inferior Límite superior
2 -3.02 -6.31 0.27
4 -8.06 -15.02 -1.10
6 -13.11 -23.90 -2.31
8 -18.15 -32.82 -3.48
10 -23.19 -41.76 -4.63
12 -28.24 -50.70 -5.78

8 Regresión Múltiple

El modelo de regresión múltiple (Tabla 4) examina cómo cuatro variables clave - inflación (en logaritmos), inversión, exportaciones netas y deuda - afectan el crecimiento económico (medido en porcentaje). Los resultados muestran relaciones estadísticamente significativas que tienen importantes implicaciones para la política económica.

La inflación muestra una fuerte relación negativa con el crecimiento económico, con un coeficiente de -2.217 (p = 0.000). Esto indica que un aumento del 1% relativo en la tasa de inflación (por ejemplo, de 20.00% a 20.20%) está asociado con una disminución de aproximadamente 0.022 puntos porcentuales en la tasa de crecimiento económico, manteniendo constantes los demás factores. Este efecto negativo subraya la importancia de mantener la estabilidad de precios para favorecer el crecimiento.

Por otro lado, tanto la inversión como las exportaciones netas presentan impactos positivos significativos sobre el crecimiento. Un incremento de una unidad en la inversión está asociado con un aumento de 0.346 puntos porcentuales en la tasa de crecimiento (p=0.000), mientras que las exportaciones netas muestran un efecto positivo más moderado de 0.117 puntos porcentuales (p=0.019). Estos resultados sugieren que políticas que fomenten la inversión productiva y las exportaciones pueden ser efectivas para estimular el crecimiento económico. En contraste, el nivel de deuda no muestra un efecto estadísticamente significativo (p=0.265), lo que podría indicar que su impacto depende de otros factores no considerados en este modelo.

El modelo en su conjunto es estadísticamente significativo (p=0.000) y explica aproximadamente el 23.4% de la variación en las tasas de crecimiento económico (R²=0.234). Aunque este poder explicativo es moderado, representa una mejora sustancial respecto a modelos más simples. El error estándar residual de 3.466 puntos porcentuales indica que, si bien el modelo es útil, existe una variación considerable en el crecimiento que no es capturada por estas variables.

ver código
base_p <- base_p %>% 
              as_factor() %>% 
              mutate(xneta = x - m, linflacion = log(1+infl/100))

modelo2 <- lm(grow ~ linflacion + inv + xneta + debt, data = base_p)
library(broom)
library(kableExtra)

tabla_coef2 <- tidy(modelo2)

tabla_coef2 |>
  kable(digits = 3,
        caption = "Tabla 4. Coeficientes del modelo de regresión múltiple") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 4. Coeficientes del modelo de regresión múltiple
term estimate std.error statistic p.value
(Intercept) -5.015 1.672 -2.999 0.003
linflacion -2.217 0.306 -7.243 0.000
inv 0.346 0.073 4.758 0.000
xneta 0.117 0.050 2.364 0.019
debt 0.009 0.008 1.116 0.265
ver código
resumen_modelo2 <- glance(modelo2)

tabla_stats2 <- data.frame(
  Estadístico = c("R²", "R² ajustado", "Error estándar residual", "F", "p-valor F"),
  Valor = c(
    round(resumen_modelo2$r.squared, 3),
    round(resumen_modelo2$adj.r.squared, 3),
    round(resumen_modelo2$sigma, 3),
    round(resumen_modelo2$statistic, 3),
    round(resumen_modelo2$p.value, 4)
  )
)

tabla_stats2 |>
  kable(caption = "Tabla 5. Estadísticos del modelo múltiple",
        digits = 3,
        col.names = c("Estadístico", "Valor")) |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 5. Estadísticos del modelo múltiple
Estadístico Valor
0.234
R² ajustado 0.223
Error estándar residual 3.466
F 20.991
p-valor F 0.000

8.1 Multicolinealidad

El análisis de los Factores de Inflación de la Varianza (VIF) en la Tabla 6 permiten evaluar la presencia de multicolinealidad entre las variables independientes del modelo de regresión múltiple. Los resultados muestran valores de VIF notablemente bajos para todas las variables: inflación logarítmica (1.13), inversión (1.41), exportaciones netas (1.05) y deuda (1.50). Estos valores, todos significativamente menores que el umbral conservador de 5 (y muy por debajo del valor crítico de 10), indican que no existe un problema de multicolinealidad relevante en el modelo.

La ausencia de multicolinealidad es un resultado importante porque garantiza que los coeficientes estimados en la regresión son estables y confiables. En particular, el VIF extremadamente bajo de las exportaciones netas (1.05) y la inflación (1.13) sugiere que estas variables aportan información independiente al modelo. Aunque la deuda muestra el VIF más alto (1.50), este valor sigue siendo muy bajo y no representa ninguna amenaza para la validez de las estimaciones. Esta condición de independencia entre los predictores permite interpretar con mayor confianza los efectos individuales de cada variable sobre el crecimiento económico, sin preocupaciones por distorsiones en los coeficientes debido a relaciones lineales entre las variables explicativas.

ver código
vif(modelo2) |>
  as.data.frame() |>
  tibble::rownames_to_column("Variable") |>
  `colnames<-`(c("Variable", "VIF")) |>
  mutate(VIF = round(VIF, 2)) |>
  kable(caption = "Tabla 6. Diagnóstico de multicolinealidad (VIF)",
        col.names = c("Variable", "VIF")) |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Tabla 6. Diagnóstico de multicolinealidad (VIF)
Variable VIF
linflacion 1.13
inv 1.41
xneta 1.05
debt 1.50

8.2 Proyecciones usando la Regresión Múltiple

ver código
nuevos_datos2 <- data.frame(
  linflacion = c(3, 5, 7, 4, 6, 2),
  inv = c(20, 18, 22, 19, 21, 20),
  xneta = c(5, 4, 6, 5, 5.5, 4.5),
  debt = c(60, 65, 55, 58, 62, 59)
)

predicciones <- predict(modelo2, newdata = nuevos_datos2, interval = "confidence")

resultado <- cbind(nuevos_datos2, round(predicciones, 2))  # combinar con los valores originales

resultado |>
  kable(caption = "Tabla 7. Proyecciones del crecimiento económico (grow)",
        col.names = c("linflación", "inversión", "x.neta", "deuda", "Predicción", "Lím. Inferior", "Lím. Superior")) |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Tabla 7. Proyecciones del crecimiento económico (grow)
linflación inversión x.neta deuda Predicción Lím. Inferior Lím. Superior
3 20 5.0 60 -3.61 -5.23 -1.99
5 18 4.0 65 -8.81 -11.56 -6.05
7 22 6.0 55 -11.71 -15.67 -7.75
4 19 5.0 58 -6.19 -8.38 -4.00
6 21 5.5 62 -9.84 -13.18 -6.49
2 20 4.5 59 -1.46 -2.55 -0.37