Programación Básica en R Studio

Modelo de regresión lineal (MCRL)

Datos esperanza de vida

La base de datos state.x77 en R proporciona un conjunto de datos socioeconómicos y demográficos de los estados de EE.UU. correspondientes al año 1977. Este conjunto de datos incluye variables como la población, ingreso per cápita, porcentaje de analfabetismo, esperanza de vida, tasa de homicidios, porcentaje de graduados de secundaria, días de heladas y área del estado. Se utiliza principalmente para realizar análisis estadísticos y modelos de regresión múltiple que exploran las relaciones entre diferentes indicadores socioeconómicos y demográficos. Su finalidad es facilitar el estudio de cómo estas variables se interrelacionan y afectan diversos aspectos de la vida en los estados, permitiendo a los investigadores y estudiantes practicar el análisis de datos y la construcción de modelos predictivos en un contexto realista y representativo

Lectura del dataframe

df <- as.data.frame(state.x77)
df <- rename(habitantes = Population, analfabetismo = Illiteracy,
                ingresos = Income, esp_vida = `Life Exp`, asesinatos = Murder,
                universitarios = `HS Grad`, heladas = Frost, area = Area,
                .data = df)
df <- mutate(.data = df, densidad_pobl = habitantes * 1000 / area)
kable(head(df, 15))
habitantes ingresos analfabetismo esp_vida asesinatos universitarios heladas area densidad_pobl
Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708 71.2905261
Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432 0.6443845
Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417 19.5032491
Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945 40.6198864
California 21198 5114 1.1 71.71 10.3 62.6 20 156361 135.5708904
Colorado 2541 4884 0.7 72.06 6.8 63.9 166 103766 24.4877898
Connecticut 3100 5348 1.1 72.48 3.1 56.0 139 4862 637.5976964
Delaware 579 4809 0.9 70.06 6.2 54.6 103 1982 292.1291625
Florida 8277 4815 1.3 70.66 10.7 52.6 11 54090 153.0227399
Georgia 4931 4091 2.0 68.54 13.9 40.6 60 58073 84.9103714
Hawaii 868 4963 1.9 73.60 6.2 61.9 0 6425 135.0972763
Idaho 813 4119 0.6 71.87 5.3 59.5 126 82677 9.8334482
Illinois 11197 5107 0.9 70.14 10.3 52.6 127 55748 200.8502547
Indiana 5313 4458 0.7 70.88 7.1 52.9 122 36097 147.1867468
Iowa 2861 4628 0.5 72.56 2.3 59.0 140 55941 51.1431687

Análisis exploratorio de los datos

Antes de construir un modelo de regresión lineal, es crucial realizar un Análisis Exploratorio de Datos (EDA). Este proceso inicial permite comprender la estructura y las características del conjunto de datos, identificar patrones, anomalías y relaciones entre variables. El EDA ayuda a detectar valores faltantes, errores en los datos y la necesidad de transformaciones. Además, proporciona una visión general de cómo las variables se distribuyen y se correlacionan entre sí, lo cual es fundamental para seleccionar las variables adecuadas y mejorar la calidad del modelo predictivo. En el caso del conjunto de datos state.x77, que contiene información socioeconómica y demográfica de los estados de EE.UU., un EDA detallado facilitará una comprensión más profunda de los factores que podrían influir en el modelo de regresión lineal y contribuirá a una modelización más precisa y efectiva.

Estadística descriptiva

summary(df)
##    habitantes       ingresos    analfabetismo      esp_vida    
##  Min.   :  365   Min.   :3098   Min.   :0.500   Min.   :67.96  
##  1st Qu.: 1080   1st Qu.:3993   1st Qu.:0.625   1st Qu.:70.12  
##  Median : 2838   Median :4519   Median :0.950   Median :70.67  
##  Mean   : 4246   Mean   :4436   Mean   :1.170   Mean   :70.88  
##  3rd Qu.: 4968   3rd Qu.:4814   3rd Qu.:1.575   3rd Qu.:71.89  
##  Max.   :21198   Max.   :6315   Max.   :2.800   Max.   :73.60  
##    asesinatos     universitarios     heladas            area       
##  Min.   : 1.400   Min.   :37.80   Min.   :  0.00   Min.   :  1049  
##  1st Qu.: 4.350   1st Qu.:48.05   1st Qu.: 66.25   1st Qu.: 36985  
##  Median : 6.850   Median :53.25   Median :114.50   Median : 54277  
##  Mean   : 7.378   Mean   :53.11   Mean   :104.46   Mean   : 70736  
##  3rd Qu.:10.675   3rd Qu.:59.15   3rd Qu.:139.75   3rd Qu.: 81163  
##  Max.   :15.100   Max.   :67.30   Max.   :188.00   Max.   :566432  
##  densidad_pobl     
##  Min.   :  0.6444  
##  1st Qu.: 25.3352  
##  Median : 73.0154  
##  Mean   :149.2245  
##  3rd Qu.:144.2828  
##  Max.   :975.0033

Primeras aproximaciones del estadistico de resumen anterior

Habitantes

  • Rango: La población de los estados varía ampliamente, desde un mínimo de 365,000 hasta un máximo de 21,198,000. Esto sugiere una gran diversidad en el tamaño de la población entre los estados.

  • Mediana vs. Media: La mediana (2,838,000) es menor que la media (4,246,000), indicando que hay algunos estados con poblaciones muy grandes que están elevando el promedio. Esto podría señalar la presencia de unos pocos estados con poblaciones extremadamente altas que afectan la distribución general.

Ingresos - Los ingresos per cápita varían desde 3,098 hasta 6,315 dólares. - La mediana (4,519) es bastante cercana a la media (4,436), lo que sugiere que los ingresos per cápita están relativamente distribuidos de manera uniforme sin grandes sesgos.

Analfabetismo - El porcentaje de analfabetismo varía entre 0.5% y 2.8%. - La media (1.17%) es mayor que la mediana (0.95%), indicando que algunos estados tienen porcentajes de analfabetismo más altos, lo que puede estar sesgando la distribución hacia valores más altos.

Esperanza de vida

  • La esperanza de vida va desde 67.96 hasta 73.60 años.
  • La media (70.88) es ligeramente mayor que la mediana (70.67), sugiriendo que hay algunos estados con una esperanza de vida mucho mayor que están elevando el promedio.

en conclusión el análisis revela que algunas variables muestran una gran variabilidad entre los estados, como la población, el área y la tasa de homicidios. Otras variables, como los ingresos per cápita y el porcentaje de graduados de secundaria, están más equilibradas. También se observan sesgos en algunas distribuciones, como la de los homicidios y el porcentaje de analfabetismo, donde la media es mayor que la mediana, indicando la presencia de valores extremos. Estos hallazgos proporcionan una base sólida para comprender cómo las variables se distribuyen y se relacionan, y para ajustar la preparación de datos antes de construir el modelo de regresión lineal.

Análisis gráfico

df %>%
  gather(key = "variable", value = "value") %>%
  ggplot(aes(x = value)) +
  geom_histogram(bins = 30) +
  facet_wrap(~variable, scales = 'free_x') +
  theme_minimal()

df$State <- rownames(df)
ggplot(df, aes(x = reorder(State, esp_vida), y = esp_vida)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  coord_flip() +  
  labs(title = "Esperanza de Vida por Estado",
       x = "Estado",
       y = "Esperanza de Vida (años)") +
  theme_minimal()

valores atípicos

df_long <- df %>%
  select(where(is.numeric)) %>%  # Seleccionar solo columnas numéricas
  pivot_longer(everything(), names_to = "variable", values_to = "value") 

# Crear el boxplot
g2 <- ggplot(df_long, aes(x = variable, y = value)) +
  geom_boxplot() +
  theme_minimal() +
  coord_flip() +
  labs(title = "Boxplot de Variables Numéricas",
       x = "Variable",
       y = "Valor")
ggplotly(g2)

Valores perdidos

sum(is.na(df))
## [1] 0

Correlación entre variable

cor_matrix <- cor(df[, -ncol(df)], use = "pairwise.complete.obs")
melted_cor_matrix <- melt(cor_matrix)

g1 <- ggplot(melted_cor_matrix, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  geom_point(aes(size = abs(value)), shape = 21, color = "black") +  # Añadir círculos
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1, 1), name="Correlación") +
  scale_size_continuous(range = c(3, 10)) +  # Ajustar el tamaño de los círculos
  theme_minimal() +
  labs(title = "Heatmap de Correlación con Círculos",
       x = "Variables",
       y = "Variables") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(g1)

Del análisis preliminar se pueden extraer las siguientes conclusiones:

  • Las variables que tienen una mayor relación lineal con la esperanza de vida son: asesinatos (r= -0.78), analfabetismo (r= -0.59) y universitarios (r= 0.58).

  • Asesinatos y analfabetismo están medianamente correlacionados (r = 0.7) por lo que posiblemente no sea útil introducir ambos predictores en el modelo.

  • Las variables habitantes, área y densidad poblacional muestran una distribución exponencial, una transformación logarítmica posiblemente haría más normal su distribución.

Especificación del modelo

  • Variable Depeneiente: Esperanza de Vida (esperanza_vida)

  • Variables Independientes: Todas las demás (habitantes + ingresos + analfabetismo + asesinatos + universitarios + heladas + area + densidad_pob)

expresión matemática de la Regresión Lineal Múltiple

\[y=β_0+β_1x_1+β_2x_2+...+β_nx_n+ε\] En resumen

\[y=β_0+∑β_ix_i+ε\] Ajuste del modelo 1 sin tratamiento en los datos

fit <- lm(esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos +
               universitarios + heladas + area + densidad_pobl, data = df )

summary(fit)
## 
## Call:
## lm(formula = esp_vida ~ habitantes + ingresos + analfabetismo + 
##     asesinatos + universitarios + heladas + area + densidad_pobl, 
##     data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.47514 -0.45887 -0.06352  0.59362  1.21823 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     6.995e+01  1.843e+00  37.956  < 2e-16 ***
## habitantes      6.480e-05  3.001e-05   2.159   0.0367 *  
## ingresos        2.701e-04  3.087e-04   0.875   0.3867    
## analfabetismo   3.029e-01  4.024e-01   0.753   0.4559    
## asesinatos     -3.286e-01  4.941e-02  -6.652 5.12e-08 ***
## universitarios  4.291e-02  2.332e-02   1.840   0.0730 .  
## heladas        -4.580e-03  3.189e-03  -1.436   0.1585    
## area           -1.558e-06  1.914e-06  -0.814   0.4205    
## densidad_pobl  -1.105e-03  7.312e-04  -1.511   0.1385    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7337 on 41 degrees of freedom
## Multiple R-squared:  0.7501, Adjusted R-squared:  0.7013 
## F-statistic: 15.38 on 8 and 41 DF,  p-value: 3.787e-10

Tratamiento de los datos

en primera medida quitemos los valores atípicos de la variable área

df2 <- df %>% 
  filter(area < 262134 )
ggplot(df2, aes(y = area)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Boxplot del Área de Estados",
       y = "Área (millas cuadradas)",
       x = NULL) +
  theme_minimal()

Como un segundo punto realicemos un proceso de escalamiento

Estandarización

df2 <- df %>%
  mutate(across(where(is.numeric), ~ scale(.))) 

ajustemos el modelo

# Ajustar el modelo con datos estandarizados
fit_scaled <- lm(esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos +
                      universitarios + heladas + area + densidad_pobl, data = df2)

# Ver el resumen del modelo
summary(fit_scaled)
## 
## Call:
## lm(formula = esp_vida ~ habitantes + ingresos + analfabetismo + 
##     asesinatos + universitarios + heladas + area + densidad_pobl, 
##     data = df2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.09889 -0.34183 -0.04732  0.44221  0.90751 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -4.592e-15  7.729e-02   0.000   1.0000    
## habitantes      2.155e-01  9.981e-02   2.159   0.0367 *  
## ingresos        1.236e-01  1.413e-01   0.875   0.3867    
## analfabetismo   1.375e-01  1.827e-01   0.753   0.4559    
## asesinatos     -9.038e-01  1.359e-01  -6.652 5.12e-08 ***
## universitarios  2.582e-01  1.403e-01   1.840   0.0730 .  
## heladas        -1.774e-01  1.235e-01  -1.436   0.1585    
## area           -9.902e-02  1.217e-01  -0.814   0.4205    
## densidad_pobl  -1.819e-01  1.204e-01  -1.511   0.1385    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5465 on 41 degrees of freedom
## Multiple R-squared:  0.7501, Adjusted R-squared:  0.7013 
## F-statistic: 15.38 on 8 and 41 DF,  p-value: 3.787e-10

pidamos al R studio que me seleccione las mejores variables. En este caso se van a emplear la estrategia de stepwise mixto. El valor matemático empleado para determinar la calidad del modelo va a ser Akaike(AIC).

step(object = fit_scaled, direction = "both", trace = 1)
## Start:  AIC=-52.34
## esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos + 
##     universitarios + heladas + area + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - analfabetismo   1    0.1692 12.416 -53.653
## - area            1    0.1978 12.444 -53.538
## - ingresos        1    0.2286 12.475 -53.415
## <none>                        12.246 -52.339
## - heladas         1    0.6161 12.863 -51.885
## - densidad_pobl   1    0.6819 12.928 -51.630
## - universitarios  1    1.0114 13.258 -50.372
## - habitantes      1    1.3926 13.639 -48.954
## - asesinatos      1   13.2170 25.463 -17.739
## 
## Step:  AIC=-53.65
## esp_vida ~ habitantes + ingresos + asesinatos + universitarios + 
##     heladas + area + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - area            1    0.0792 12.495 -55.335
## - ingresos        1    0.1285 12.544 -55.138
## <none>                        12.416 -53.653
## - densidad_pobl   1    0.5153 12.931 -53.620
## - universitarios  1    0.8445 13.260 -52.363
## + analfabetismo   1    0.1692 12.246 -52.339
## - habitantes      1    1.2235 13.639 -50.954
## - heladas         1    1.7382 14.154 -49.102
## - asesinatos      1   14.8206 27.236 -16.374
## 
## Step:  AIC=-55.34
## esp_vida ~ habitantes + ingresos + asesinatos + universitarios + 
##     heladas + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - ingresos        1    0.0733 12.568 -57.043
## - densidad_pobl   1    0.4362 12.931 -55.620
## <none>                        12.495 -55.335
## - universitarios  1    0.7901 13.285 -54.270
## + area            1    0.0792 12.416 -53.653
## + analfabetismo   1    0.0506 12.444 -53.538
## - habitantes      1    1.2942 13.789 -52.408
## - heladas         1    1.8337 14.329 -50.488
## - asesinatos      1   18.1902 30.685 -12.412
## 
## Step:  AIC=-57.04
## esp_vida ~ habitantes + asesinatos + universitarios + heladas + 
##     densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - densidad_pobl   1    0.3663 12.934 -57.607
## <none>                        12.568 -57.043
## + ingresos        1    0.0733 12.495 -55.335
## + analfabetismo   1    0.0337 12.534 -55.177
## + area            1    0.0239 12.544 -55.138
## - habitantes      1    1.4758 14.044 -53.492
## - heladas         1    1.7641 14.332 -52.476
## - universitarios  1    2.2010 14.769 -50.974
## - asesinatos      1   18.6600 31.228 -13.535
## 
## Step:  AIC=-57.61
## esp_vida ~ habitantes + asesinatos + universitarios + heladas
## 
##                  Df Sum of Sq    RSS     AIC
## <none>                        12.934 -57.607
## + densidad_pobl   1    0.3663 12.568 -57.043
## + ingresos        1    0.0034 12.931 -55.620
## + analfabetismo   1    0.0022 12.932 -55.615
## + area            1    0.0004 12.934 -55.608
## - habitantes      1    1.1451 14.080 -55.365
## - heladas         1    1.7324 14.667 -53.322
## - universitarios  1    2.8370 15.771 -49.691
## - asesinatos      1   19.3206 32.255 -13.918
## 
## Call:
## lm(formula = esp_vida ~ habitantes + asesinatos + universitarios + 
##     heladas, data = df2)
## 
## Coefficients:
##    (Intercept)      habitantes      asesinatos  universitarios         heladas  
##     -4.592e-15       1.668e-01      -8.254e-01       2.803e-01      -2.301e-01

Boostrap

En el análisis de modelos de regresión lineal, la estimación de la precisión y la robustez de los parámetros del modelo es crucial para interpretar correctamente los resultados y tomar decisiones informadas. Tradicionalmente, la inferencia sobre los parámetros del modelo se basa en supuestos teóricos, como la normalidad de los errores y la homocedasticidad. Sin embargo, estos supuestos no siempre se cumplen en la práctica, lo que puede afectar la validez de las inferencias realizadas a partir del modelo.

El bootstrapping es una técnica de re-muestreo que ofrece una solución robusta y flexible para evaluar la incertidumbre en los modelos de regresión lineal, incluso cuando los supuestos teóricos pueden ser cuestionables o no cumplirse estrictamente. A continuación, se destacan algunas de las principales ventajas de utilizar bootstrapping en el ajuste de un modelo de regresión lineal:

  • Reducción de Dependencia de Supuestos Teóricos: El bootstrapping no requiere que los datos cumplan con los supuestos tradicionales de la regresión lineal, como la normalidad de los errores. En su lugar, se basa en el re-muestreo de la muestra original para estimar la variabilidad de los parámetros del modelo. Esto permite obtener estimaciones más robustas y confiables en presencia de datos que pueden no seguir una distribución normal o que pueden tener varianzas heterogéneas.

  • Estimación de Intervalos de Confianza: Mediante el bootstrapping, es posible calcular intervalos de confianza para los coeficientes del modelo sin depender de las distribuciones teóricas de los estimadores. Esto se logra evaluando la distribución de los coeficientes a través de múltiples muestras bootstrap, proporcionando intervalos de confianza que reflejan la variabilidad observada en los datos.

  • Evaluación de la Estabilidad del Modelo: El bootstrapping permite evaluar la estabilidad de los coeficientes del modelo al analizar cómo varían estos parámetros en diferentes muestras re-muestreadas. Esto ayuda a identificar si los coeficientes del modelo son sensibles a variaciones en los datos, proporcionando una medida adicional de la robustez del modelo.

  • Aplicación a Modelos Complejos: Esta técnica es especialmente útil para modelos complejos y no lineales donde los métodos paramétricos tradicionales pueden ser difíciles de aplicar. Al aplicar bootstrapping, se puede obtener una evaluación precisa de los parámetros del modelo y sus intervalos de confianza, incluso cuando la forma funcional del modelo no es sencilla.

  • Flexibilidad en el Re-muestreo: El bootstrapping ofrece flexibilidad en el tipo de estadísticas que se pueden evaluar. No se limita a la estimación de coeficientes, sino que puede aplicarse a una amplia gama de medidas de interés, incluyendo medias, varianzas, y otros estadísticos descriptivos y ajustados.

Preparemos el bootstraping para nuestro modelo con los siguientes códigos, para ello realicemos una función que determine nuestro modelos para el número de replicas a utilizar

Función del modelo de regresión lineal

model_coefficients <- function(data, indices) {
    sampled_data <- data[indices, ]
    model <- lm(esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos +
               universitarios + heladas + area + densidad_pobl, data = sampled_data)
    return(coef(model))
}

Preparación del Bootstraping

set.seed(123) # Semilla Para la reproducibilidad
results <- boot(data = df, statistic = model_coefficients, R = 1000)

Aplicación del bootstraping en la función previamente construida

results_df <- as.data.frame(results$t)
names(results_df) <- names(coef(lm(esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos +
                                   universitarios + heladas + area + densidad_pobl, data = df)))

summary_results <- results_df %>%
  summarise(across(everything(), list(
    Mean = mean,
    SD = sd,
    `2.5%` = ~ quantile(., 0.025),
    `97.5%` = ~ quantile(., 0.975)
  )))
print(summary_results)
##   (Intercept)_Mean (Intercept)_SD (Intercept)_2.5% (Intercept)_97.5%
## 1         70.05285       2.423292         65.48055          74.82567
##   habitantes_Mean habitantes_SD habitantes_2.5% habitantes_97.5% ingresos_Mean
## 1    5.851986e-05  3.539127e-05   -1.828108e-05     0.0001296769  0.0002650002
##    ingresos_SD ingresos_2.5% ingresos_97.5% analfabetismo_Mean analfabetismo_SD
## 1 0.0003987398 -0.0006162413   0.0009823491          0.1834254        0.4916036
##   analfabetismo_2.5% analfabetismo_97.5% asesinatos_Mean asesinatos_SD
## 1         -0.8197498            1.051093      -0.3132357     0.0556202
##   asesinatos_2.5% asesinatos_97.5% universitarios_Mean universitarios_SD
## 1      -0.4082402       -0.1877739          0.04047493        0.02698969
##   universitarios_2.5% universitarios_97.5% heladas_Mean  heladas_SD
## 1         -0.01591495           0.08954655 -0.004600628 0.003327426
##   heladas_2.5% heladas_97.5%    area_Mean      area_SD     area_2.5%
## 1  -0.01235107   0.001515286 -2.81145e-07 3.676817e-06 -5.938154e-06
##     area_97.5% densidad_pobl_Mean densidad_pobl_SD densidad_pobl_2.5%
## 1 8.813881e-06      -0.0009726088     0.0009062117       -0.002575903
##   densidad_pobl_97.5%
## 1        0.0007893371
# Ejemplo de gráfico para visualizar la distribución de un coeficiente específico
ggplot(results_df, aes(x = `(Intercept)`)) +
  geom_histogram(binwidth = 0.5, fill = "lightblue", color = "black") +
  labs(title = "Distribución del Coeficiente del Intercepto",
       x = "Valor del Coeficiente del Intercepto",
       y = "Frecuencia") +
  theme_minimal()

# Ajusta el tamaño del bin para ver si el histograma aparece correctamente
ggplot(results_df, aes(x = habitantes)) +
  geom_histogram(fill = "lightgreen", color = "black") +
  labs(title = "Distribución del Coeficiente de Habitantes",
       x = "Valor del Coeficiente de Habitantes",
       y = "Frecuencia") +
  theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.