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
## 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
## [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
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
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).
## 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`.