¡Bienvenido/a a este tutorial sobre Regresión Lineal Múltiple (RLM)!
En el tutorial anterior, exploramos cómo una variable (X) puede predecir a otra (Y) usando la regresión lineal simple. Sin embargo, en la investigación clínica y en la vida real, los fenómenos rara vez dependen de un solo factor.
Aquí es donde entra la Regresión Lineal Múltiple. Es una de las herramientas más poderosas y utilizadas en el análisis de datos, permitiéndonos modelar cómo múltiples variables predictoras influyen en una variable de respuesta al mismo tiempo.
En este documento, daremos el salto de la regresión simple a la múltiple. Usaremos un ejemplo clínico simulado sobre hipertensión para entender la teoría y la interpretación, y finalizaremos con un ejercicio práctico para que puedas aplicar tus conocimientos con un conjunto de datos reales.
Objetivos de Aprendizaje:
Explicar cómo se utiliza una variable cuantitativa explicativa (\(X\)) para predecir el valor de una variable de respuesta (\(Y\)).
Formular la ecuación de la línea de regresión.
Comprender que la regresión evalúa asociación, pero no implica causalidad.
La Regresión Lineal Múltiple (RLM) es una técnica
estadística que extiende la regresión lineal simple. Mientras que la
regresión simple modela la relación entre una variable de respuesta
(dependiente, \(Y\)) y una variable
predictora (independiente, \(X\)), la
regresión múltiple modela la relación entre \(Y\) y dos o más variables predictoras
(\(X_1, X_2, ..., X_k\)).
El objetivo es encontrar una ecuación lineal que mejor prediga el valor de \(Y\) a partir de un conjunto de predictores.
La ecuación de un modelo de regresión lineal múltiple con \(k\) predictores es:
\[ Y_i = \beta_0 + \beta_1X_{1i} + \beta_2X_{2i} + \dots + \beta_kX_{ki} + \epsilon_i \] Donde:
exposicion)
sobre la respuesta (ej. puntaje_C), “ajustando” o
“controlando” el efecto de otras variables (ej. edad,
genero).Al igual que la regresión simple, la RLM se basa en varios supuestos clave para que sus inferencias (p-values, intervalos de confianza) sean válidas:
Vamos a simular un conjunto de datos para ilustrar cómo modelar la Presión Arterial Sistólica (PAS) de un paciente basándonos en predictores clínicos conocidos.
Objetivo: Predecir la PAS (Y) usando la
edad (X1), el IMC (Índice de Masa Corporal,
X2) y el consumo_sal_g (gramos de sal diarios, X3).
Primero, cargamos los paquetes que usaremos. broom es
muy útil para limpiar los resultados del modelo.
library(tidyverse) # Para manipulación de datos (dplyr) y gráficos (ggplot2)
library(broom) # Para limpiar los 'outputs' de los modelos (tidy)
library(GGally) # Para gráficos de pares
Ahora, simulamos los datos. En un caso real, cargarías tus propios
datos (ej. read_csv o read_excel).
# Fijamos una semilla para que los resultados sean reproducibles
set.seed(123)
N <- 200 # Número de pacientes
# Creamos el dataframe
datos_hipertension <- tibble(
id_paciente = 1:N,
# X1: Edad (entre 40 y 80 años)
edad = rnorm(N, mean = 60, sd = 8) %>% round(0),
# X2: IMC (media 28, sd 4)
IMC = rnorm(N, mean = 28, sd = 4) %>% round(1),
# X3: Consumo de sal en gramos/día (media 5g, sd 1.5)
consumo_sal_g = rnorm(N, mean = 5, sd = 1.5) %>% round(1),
# Y: PAS (Presión Arterial Sistólica)
# Creamos una relación lineal + ruido aleatorio
PAS = 70 + (0.8 * edad) + (1.2 * IMC) + (0.5 * consumo_sal_g) + rnorm(N, mean = 0, sd = 10)
) %>%
# Asegurarnos que no haya valores negativos irreales
filter(IMC > 0, consumo_sal_g > 0)
# Vemos los primeros pacientes
head(datos_hipertension)
## # A tibble: 6 × 5
## id_paciente edad IMC consumo_sal_g PAS
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 56 36.8 4.9 172.
## 2 2 58 33.2 3.2 158.
## 3 3 72 26.9 4 162.
## 4 4 61 30.2 5 142.
## 5 5 61 26.3 6 161.
## 6 6 74 26.1 2.5 160.
Es útil ver las relaciones entre todas las variables. Usamos
ggpairs para esto.
# ggpairs(datos_hipertension, columns = c("PAS", "edad", "IMC", "consumo_sal_g"))
Idealmente, buscaríamos relaciones lineales entre
PAS y cada predictor en los gráficos de dispersión
(scatterplot).
Usamos la misma función lm() que en la regresión simple,
pero añadimos más predictores usando el símbolo +.
La fórmula PAS ~ edad + IMC + consumo_sal_g se lee como:
“Queremos modelar PAS en función de la edad, más el
IMC, más el consumo de sal.”
# Construir el modelo
modelo_pas <- lm(PAS ~ edad + IMC + consumo_sal_g, data = datos_hipertension)
La forma más común de ver los resultados es con
summary().
summary(modelo_pas)
##
## Call:
## lm(formula = PAS ~ edad + IMC + consumo_sal_g, data = datos_hipertension)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25.2831 -6.7085 0.7261 7.0962 26.8599
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 66.19632 8.43990 7.843 2.76e-13 ***
## edad 0.74122 0.09673 7.663 8.19e-13 ***
## IMC 1.40644 0.18306 7.683 7.27e-13 ***
## consumo_sal_g 0.75608 0.50266 1.504 0.134
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.27 on 196 degrees of freedom
## Multiple R-squared: 0.3698, Adjusted R-squared: 0.3602
## F-statistic: 38.34 on 3 and 196 DF, p-value: < 2.2e-16
Analicemos el summary:
Call: Simplemente nos recuerda la
fórmula que usamos.Residuals: Un resumen de la
distribución de los errores. Idealmente, la mediana
(Median) debería estar cerca de 0.Coefficients (La parte más
importante):(Intercept) \(\beta_0\): 68.0820.
Este es el valor predicho de la PAS cuando edad,
IMC y consumo_sal_g son todos cero.
Clínicamente, esto no tiene sentido (nadie tiene 0 años o 0 de IMC), por
lo que el intercepto a menudo no se interpreta.edad \(\beta_1\):
0.8066.Pr(>|t|)) es 3.28e-15 (muy pequeño, <
0.05). Esto significa que la edad es un predictor
estadísticamente significativo.IMC \(\beta_2\):
1.2483.7.49e-08)
es muy pequeño. El IMC es un predictor significativo.consumo_sal_g \(\beta_3\):
0.6277.0.142) es
mayor que 0.05. En nuestro modelo simulado, el consumo de sal
no es un predictor estadísticamente significativo (después de
ajustar por edad e IMC).Residual standard error: La desviación
estándar de los residuos (aprox. 10.15).Multiple R-squared (R Múltiple):
0.518. “El 51.8% de la variabilidad en la Presión
Arterial Sistólica (PAS) es explicada por nuestro modelo (edad, IMC y
consumo de sal).”Adjusted R-squared (R Ajustado):
0.5108. Este valor es mejor para regresión múltiple porque
penaliza la adición de variables que no mejoran el modelo. Es el que
deberías reportar.F-statistic (Estadístico F):
69.91 on 3 and 195 DF.p-value (del modelo F):
< 2.2e-16. Un p-value muy pequeño indica que nuestro
modelo en su conjunto es estadísticamente significativo (es decir, es
mejor que un modelo que solo predice la media de PAS).broomLa función tidy() del paquete broom nos da
un dataframe limpio con los coeficientes, sus errores estándar,
estadísticos t y p-values.
# Resultados de los coeficientes
tidy(modelo_pas)
## # A tibble: 4 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 66.2 8.44 7.84 2.76e-13
## 2 edad 0.741 0.0967 7.66 8.19e-13
## 3 IMC 1.41 0.183 7.68 7.27e-13
## 4 consumo_sal_g 0.756 0.503 1.50 1.34e- 1
Y glance() nos da las estadísticas globales del modelo
(como R2 ajustado).
# Estadísticas del modelo
glance(modelo_pas)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.370 0.360 10.3 38.3 1.53e-19 3 -748. 1505. 1522.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
logLik, AIC y
BIC?Cuando ejecutas glance(), ves estas tres métricas. A
diferencia de adj.r.squared, que mide la “calidad del
ajuste”, estas métricas se utilizan para comparar modelos entre
sí.
La idea central es la parsimonia: queremos un modelo que explique bien los datos (buen ajuste), pero que sea lo más simple posible (pocas variables). Añadir variables inútiles a un modelo se llama “sobreajuste” (overfitting).
La regla de oro para AIC y BIC es: el modelo con el valor MÁS BAJO es mejor.
logLik (Log-Likelihood /
Log-Verosimilitud):
AIC (Akaike Information Criterion):
logLik) y
la complejidad del modelo (el número de predictores).AIC más
bajo.BIC (Bayesian Information Criterion):
AIC, pero su penalización por
complejidad es más fuerte.AIC.AIC, el modelo con el BIC
más bajo es el preferido.En resumen, si estuvieras probando dos modelos (ej. uno completo y
otro con menos variables), podrías usar glance() en ambos y
comparar sus AIC y BIC para decidir cuál es
estadísticamente preferible.
Podemos usar plot() en el objeto lm para
revisar los supuestos.
par(mfrow = c(2, 2)) # Poner 4 gráficos en una cuadrícula
plot(modelo_pas)
par(mfrow = c(1, 1)) # Volver a la normalidad
Residuals vs Fitted: Busca un patrón.
Queremos ver una nube de puntos aleatoria (sin “forma de embudo”). Esto
revisa la linealidad y la
homocedasticidad.Normal Q-Q: Los puntos deben seguir la
línea discontinua. Esto revisa la normalidad de los
residuos.Scale-Location: Similar al primero,
busca homocedasticidad.Residuals vs Leverage: Busca puntos
influyentes (outliers) que puedan estar afectando desproporcionadamente
al modelo.Estos cuatro gráficos son un “chequeo de salud” para nuestro modelo. En un escenario de libro de texto, todo se vería perfecto. En la práctica (incluso con datos simulados como los nuestros), buscamos señales de alarma graves más que la perfección.
1. Residuals vs Fitted
(Arriba-Izquierda)
loess) muestra la
tendencia promedio de los residuos. Idealmente, debería ser
perfectamente plana en 0.edad^2).2. Normal Q-Q (Arriba-Derecha)
3. Scale-Location (Abajo-Izquierda)
4. Residuals vs Leverage
(Abajo-Derecha)
Resumen General: Los gráficos de diagnóstico en datos reales casi nunca son perfectos. Lo que vemos aquí es un modelo “bastante saludable” y sin “alarmas rojas” que nos impidan interpretar los resultados.
CAP_modifAhora es tu turno. Vas a construir un modelo de regresión lineal
múltiple usando una base de datos llamada CAP_modif.
Objetivo del Ejercicio: Modelar la variable
respuesta puntaje_C usando exposicion como
predictor principal, ajustando por un conjunto de
covariables.
Variables:
puntaje_Cexposiciongenero, edad, nivel_edu,
enfcro_dicot, area, empleo,
ingreso, prev_per, part_prev,
dosis.prev_per_dicot y
enfcro_dicotAsegúrate de tener tidyverse cargado. Luego, carga tus
datos. (Debes descomentar y ajustar la ruta a tu archivo).
# 1. Instalar paquetes si no los tiene
# install.packages(c("readxl", "tidyverse", "broom"))
library(readxl)
library(tidyverse)
library(broom)
# 2. Importar el archivo de Excel desde el directorio de trabajo
# Asignamos los datos a un objeto llamado "CAP_modif"
CAP_modif <- read_excel("CAP_modif.xlsx")
# 3. Inspeccionar la estructura
# Vemos los nombres de columnas y sus tipos
# str(CAP_modif)
print("Datos cargados (placeholder):")
## [1] "Datos cargados (placeholder):"
head(CAP_modif)
## # A tibble: 6 × 97
## id part_prev municipio edad genero nivel_edu enf_cro hipertension diabetes
## <dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 1 No Santa Te… 52 Femen… Nunca as… No No No
## 2 2 Si Santa Te… 50 Mascu… Primer c… Si No Si
## 3 3 No Santa Te… 27 Femen… Bachille… No No No
## 4 4 No Santa Te… 50 Mascu… Tercer c… No No No
## 5 5 No Santa Te… 47 Femen… Tercer c… Si Si No
## 6 6 No Santa Te… 47 Mascu… Segundo … Si Si Si
## # ℹ 88 more variables: epoc <chr>, renal <chr>, artritis <chr>,
## # cardiopatia <chr>, hipotiroidismo <chr>, glaucoma <chr>, lupus <chr>,
## # ulcera_venosa <chr>, ninguna <lgl>, area <chr>, hijxs <chr>, nucleo <dbl>,
## # empleo <chr>, ocupacion <chr>, ingreso <chr>, prev_per <chr>,
## # rec_apoyo <chr>, satisfaccion <chr>, prev_fam <chr>, mortalidad <chr>,
## # c1 <dbl>, c2 <dbl>, c3 <dbl>, c4 <dbl>, c5 <dbl>, c6 <dbl>, c7 <dbl>,
## # c8 <dbl>, c9 <dbl>, c10 <dbl>, a1 <dbl>, a2 <dbl>, a3 <dbl>, a4 <dbl>, …
# Primero, definimos la lista de todas las variables que son 'character'
# y que queremos convertir a 'factor'
variables_categoricas <- c(
"part_prev", "municipio", "genero", "nivel_edu", "enf_cro", "enfcro_dicot", "hipertension", "diabetes", "epoc", "renal", "artritis", "cardiopatia", "hipotiroidismo", "glaucoma", "lupus", "ulcera_venosa", "ninguna", "uso_de_mascarilla", "distanciamiento_social", "lavado_de_manos", "ponerse_la_vacuna", "no_recuerdo", "todas", "No_he_escuchado", "transmite_por_el_agua", "transmite_en_las_suelas", "rociar_desinfectantes", "beben_alcohol", "pueden_dejar_de_aplicar", "no_se_debe_vacunar", "producen_esterilidad", "producen_homosexualidad", "inyectan_el_virus", "antibioticos_son_buenos", "vitaminas_y_minerales", "edad_dicot", "niveledu_dicot", "dosis_dicot", "area", "hijxs", "empleo", "ocupacion", "ingreso", "prev_per", "rec_apoyo", "satisfaccion", "prev_fam", "mortalidad", "razon_nv", "periodico", "television", "redes_sociales", "personal_salud", "radio", "paginas_internet", "escuela", "mensajes", "patrocinio", "prev_per_dicot", "exposicion", "dosis"
)
# Modificar el dataframe 'CAP_modif'
CAP_modif <- CAP_modif %>%
mutate(
# 1. Crear 'exposicion' (como numérica 0/1 primero)
exposicion = case_when(
mensajes == "Si" ~ 1,
mensajes %in% c("No", "No recuerda") ~ 0,
TRUE ~ NA_real_
),
# 2. Crear 'prev_per_dicot' (como numérica 0/1 primero)
prev_per_dicot = case_when(
prev_per %in% c("Si, hubo sospecha pero no se hizo la prueba",
"Si, se hizo una prueba y el resultado fue positivo") ~ 1,
prev_per %in% c("No", "No, sabe") ~ 0,
TRUE ~ NA_real_
),
# 3. Convertir TODAS las variables de character a factor
# (Esto convertirá 'mensajes' y 'prev_per' originales)
across(all_of(variables_categoricas), as.factor)
) %>% # Fin del primer mutate
# 4. Ahora, convertir nuestras nuevas variables 0/1 a factores con etiquetas
mutate(
exposicion = factor(exposicion,
levels = c(0, 1),
labels = c("No", "Si")),
prev_per_dicot = factor(prev_per_dicot,
levels = c(0, 1),
labels = c("No", "Si"))
)
# Verificamos la estructura de los datos limpios
# Deberías ver que 'prev_per', 'mensajes', 'genero', etc.,
# ahora dicen 'Factor' en lugar de 'chr'
print("Estructura de los datos limpios:")
## [1] "Estructura de los datos limpios:"
# glimpse(CAP_modif)
# Comprobamos la creación de 'exposicion'
print("Tabla de 'exposicion':")
## [1] "Tabla de 'exposicion':"
table(CAP_modif$mensajes, CAP_modif$exposicion, useNA = "ifany")
##
## No Si
## No 182 0
## No recuerda 92 0
## Si 0 241
# Comprobamos la creación de 'prev_per_dicot'
print("Tabla de 'prev_per_dicot':")
## [1] "Tabla de 'prev_per_dicot':"
table(CAP_modif$prev_per, CAP_modif$prev_per_dicot, useNA = "ifany")
##
## No Si
## No 323 0
## No, sabe 6 0
## Si, hubo sospecha pero no se hizo la prueba 0 40
## Si, se hizo una prueba y el resultado fue positivo 0 146
# Reagrupar la variable nivel_edu
CAP_modif <- CAP_modif %>%
mutate(
nivel_edu_reagrupado = case_when(
# Grupo 1: Educación Básica (La nueva referencia)
nivel_edu %in% c("Nunca asistio", "Primer ciclo", "Segundo ciclo") ~ "Basica",
# Grupo 2: Educación Secundaria
nivel_edu %in% c("Tercer ciclo", "Bachillerato") ~ "Secundaria",
# Grupo 3: Educación Superior
nivel_edu %in% c("Tecnico", "Universitario") ~ "Superior",
# Seguridad
TRUE ~ NA_character_
) %>%
# Convertir a factor y establecer el nivel de referencia
as.factor() %>%
relevel(ref = "Basica")
)
# Opcional: Revisa que se haya creado bien
table(CAP_modif$nivel_edu_reagrupado, useNA = "ifany")
##
## Basica Secundaria Superior
## 151 302 62
# Crea la nueva variable dicotómica 'esta_desempleado'
CAP_modif <- CAP_modif %>%
mutate(
esta_desempleado = case_when(
# El grupo que te interesa
empleo == "Desempleo" ~ "Si",
# Agrupar a TODOS los demás
TRUE ~ "No"
) %>%
# Convertir a factor y poner "No" (el grupo más grande) como referencia
as.factor() %>%
relevel(ref = "No")
)
# Opcional: Revisa que se haya creado bien
table(CAP_modif$empleo, CAP_modif$esta_desempleado)
##
## No Si
## Desempleo 0 104
## Empleo 334 0
## En retiro 38 0
## Solo estudia 39 0
CAP_modif <- CAP_modif %>%
mutate(
# --- Variable: Familiar enfermo (Lógica actualizada) ---
prev_fam_dicot = case_when(
# Grupo "Si": Agrupamos ambas respuestas positivas
prev_fam %in% c("Si, hubo sospecha pero no se hizo la prueba",
"Si, se hizo una prueba y el resultado fue positivo") ~ "Si",
# Grupo "No": Agrupamos "No" y "No sabe"
prev_fam %in% c("No", "No sabe") ~ "No",
TRUE ~ NA_character_
) %>%
as.factor() %>%
relevel(ref = "No") # Ponemos "No" como referencia
)
# --- Verificación ---
print("Verificación de 'prev_fam_dicot':")
## [1] "Verificación de 'prev_fam_dicot':"
table(CAP_modif$prev_fam, CAP_modif$prev_fam_dicot)
##
## No Si
## No 274 0
## No sabe 70 0
## Si, hubo sospecha pero no se hizo la prueba 0 16
## Si, se hizo una prueba y el resultado fue positivo 0 155
Ahora, construye el modelo lm() usando la fórmula
completa especificada. Asegúrate de usar el dataframe
CAP_modif.
modelo_puntaje_C <- lm(puntaje_C ~
exposicion +
genero +
edad +
nivel_edu_reagrupado +
enfcro_dicot +
area +
esta_desempleado +
ingreso +
part_prev +
dosis +
prev_per_dicot,
data = CAP_modif)
Usa summary() y/o tidy() para ver los
resultados de tu modelo.
# Opción 1: Resumen estándar
summary(modelo_puntaje_C)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + genero + edad + nivel_edu_reagrupado +
## enfcro_dicot + area + esta_desempleado + ingreso + part_prev +
## dosis + prev_per_dicot, data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.1269 -1.0053 0.1439 0.9173 3.7722
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.256717 0.371112 16.859 < 2e-16 ***
## exposicionSi -0.419284 0.144569 -2.900 0.00389 **
## generoMasculino -0.076353 0.131263 -0.582 0.56105
## edad -0.005936 0.005993 -0.990 0.32243
## nivel_edu_reagrupadoSecundaria 0.255216 0.166500 1.533 0.12596
## nivel_edu_reagrupadoSuperior 0.679079 0.255468 2.658 0.00811 **
## enfcro_dicotSi -0.101367 0.173342 -0.585 0.55896
## areaUrbana 0.676237 0.143160 4.724 3.02e-06 ***
## esta_desempleadoSi 0.173120 0.161277 1.073 0.28360
## ingreso731 a 1,000 0.401238 0.318475 1.260 0.20831
## ingresoMas de 1,000 -0.290669 0.999015 -0.291 0.77121
## ingresoMenos de 365 -0.045396 0.188091 -0.241 0.80938
## ingresoPrefiero no contestar -0.144477 0.182141 -0.793 0.42803
## part_prevSi 0.082795 0.226771 0.365 0.71519
## dosis1 0.456853 0.303791 1.504 0.13326
## dosis2 0.293273 0.222226 1.320 0.18754
## dosis3 0.333001 0.247536 1.345 0.17916
## dosis4 0.378517 0.255576 1.481 0.13923
## prev_per_dicotSi 1.199565 0.145881 8.223 1.75e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.39 on 496 degrees of freedom
## Multiple R-squared: 0.3, Adjusted R-squared: 0.2745
## F-statistic: 11.81 on 18 and 496 DF, p-value: < 2.2e-16
# Opción 2: Resumen limpio con broom
tidy(modelo_puntaje_C)
## # A tibble: 19 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 6.26 0.371 16.9 9.52e-51
## 2 exposicionSi -0.419 0.145 -2.90 3.89e- 3
## 3 generoMasculino -0.0764 0.131 -0.582 5.61e- 1
## 4 edad -0.00594 0.00599 -0.990 3.22e- 1
## 5 nivel_edu_reagrupadoSecundaria 0.255 0.167 1.53 1.26e- 1
## 6 nivel_edu_reagrupadoSuperior 0.679 0.255 2.66 8.11e- 3
## 7 enfcro_dicotSi -0.101 0.173 -0.585 5.59e- 1
## 8 areaUrbana 0.676 0.143 4.72 3.02e- 6
## 9 esta_desempleadoSi 0.173 0.161 1.07 2.84e- 1
## 10 ingreso731 a 1,000 0.401 0.318 1.26 2.08e- 1
## 11 ingresoMas de 1,000 -0.291 0.999 -0.291 7.71e- 1
## 12 ingresoMenos de 365 -0.0454 0.188 -0.241 8.09e- 1
## 13 ingresoPrefiero no contestar -0.144 0.182 -0.793 4.28e- 1
## 14 part_prevSi 0.0828 0.227 0.365 7.15e- 1
## 15 dosis1 0.457 0.304 1.50 1.33e- 1
## 16 dosis2 0.293 0.222 1.32 1.88e- 1
## 17 dosis3 0.333 0.248 1.35 1.79e- 1
## 18 dosis4 0.379 0.256 1.48 1.39e- 1
## 19 prev_per_dicotSi 1.20 0.146 8.22 1.75e-15
# Opción 3: Estadísticas globales del modelo
glance(modelo_puntaje_C)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.300 0.275 1.39 11.8 1.13e-28 18 -891. 1821. 1906.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Basándote en el output de tu modelo
(summary(modelo_cap)):
Adjusted R-squared? ¿Qué te dice
sobre tu modelo?Estimate) de tu predictor
principal: exposicion.exposicion, el puntaje_C
[aumenta/disminuye] en [valor], manteniendo constantes todas las
demás variables del modelo.”)exposicion un predictor estadísticamente
significativo para puntaje_C en este modelo? (Mira su
p-value o Pr(>|t|)).genero, edad,
prev_per_dicot, etc.) parece ser un predictor
significativo?Ahora procedemos a eliminar una a una las variables que no sean estadísticamente significativas a fin de alcanzar la parsimonia.
# Backward selection
modelo2_puntaje_c <- lm(puntaje_C ~ exposicion + genero + edad + nivel_edu_reagrupado +
enfcro_dicot + area + esta_desempleado + ingreso +
# part_prev + <- ELIMINADA
dosis + prev_per_dicot,
data = CAP_modif)
summary(modelo2_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + genero + edad + nivel_edu_reagrupado +
## enfcro_dicot + area + esta_desempleado + ingreso + dosis +
## prev_per_dicot, data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.1267 -1.0181 0.1478 0.9310 3.7702
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.264852 0.370119 16.927 < 2e-16 ***
## exposicionSi -0.407559 0.140834 -2.894 0.00397 **
## generoMasculino -0.078030 0.131068 -0.595 0.55189
## edad -0.006068 0.005977 -1.015 0.31045
## nivel_edu_reagrupadoSecundaria 0.255386 0.166355 1.535 0.12537
## nivel_edu_reagrupadoSuperior 0.672493 0.254608 2.641 0.00852 **
## enfcro_dicotSi -0.102200 0.173175 -0.590 0.55536
## areaUrbana 0.680795 0.142490 4.778 2.34e-06 ***
## esta_desempleadoSi 0.175014 0.161052 1.087 0.27770
## ingreso731 a 1,000 0.409951 0.317302 1.292 0.19696
## ingresoMas de 1,000 -0.295995 0.998038 -0.297 0.76691
## ingresoMenos de 365 -0.048389 0.187749 -0.258 0.79672
## ingresoPrefiero no contestar -0.142184 0.181873 -0.782 0.43472
## dosis1 0.453456 0.303384 1.495 0.13564
## dosis2 0.289284 0.221763 1.304 0.19268
## dosis3 0.330752 0.247244 1.338 0.18159
## dosis4 0.376155 0.255271 1.474 0.14124
## prev_per_dicotSi 1.199940 0.145751 8.233 1.62e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.388 on 497 degrees of freedom
## Multiple R-squared: 0.2998, Adjusted R-squared: 0.2758
## F-statistic: 12.52 on 17 and 497 DF, p-value: < 2.2e-16
# Backward selection
modelo3_puntaje_c <- lm(puntaje_C ~ exposicion + genero + edad + nivel_edu_reagrupado +
enfcro_dicot + area + esta_desempleado +
# ingreso +
# part_prev + <- ELIMINADA
dosis + prev_per_dicot,
data = CAP_modif)
summary(modelo3_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + genero + edad + nivel_edu_reagrupado +
## enfcro_dicot + area + esta_desempleado + dosis + prev_per_dicot,
## data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0404 -1.0075 0.1551 0.9145 3.8446
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.197049 0.338345 18.316 < 2e-16 ***
## exposicionSi -0.382262 0.139778 -2.735 0.00646 **
## generoMasculino -0.084723 0.130539 -0.649 0.51662
## edad -0.006764 0.005935 -1.140 0.25491
## nivel_edu_reagrupadoSecundaria 0.279858 0.164572 1.701 0.08965 .
## nivel_edu_reagrupadoSuperior 0.758353 0.241711 3.137 0.00180 **
## enfcro_dicotSi -0.106996 0.172349 -0.621 0.53501
## areaUrbana 0.710429 0.140521 5.056 6.02e-07 ***
## esta_desempleadoSi 0.185464 0.159645 1.162 0.24590
## dosis1 0.430198 0.297253 1.447 0.14845
## dosis2 0.265599 0.220577 1.204 0.22912
## dosis3 0.296743 0.243576 1.218 0.22369
## dosis4 0.332220 0.252994 1.313 0.18973
## prev_per_dicotSi 1.244779 0.142302 8.747 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.387 on 501 degrees of freedom
## Multiple R-squared: 0.2953, Adjusted R-squared: 0.277
## F-statistic: 16.15 on 13 and 501 DF, p-value: < 2.2e-16
# Backward selection
modelo4_puntaje_c <- lm(puntaje_C ~ exposicion +
# genero
edad + nivel_edu_reagrupado +
enfcro_dicot + area + esta_desempleado +
# ingreso +
# part_prev + <- ELIMINADA
dosis + prev_per_dicot,
data = CAP_modif)
summary(modelo4_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + edad + nivel_edu_reagrupado +
## enfcro_dicot + area + esta_desempleado + dosis + prev_per_dicot,
## data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0735 -1.0147 0.1761 0.9309 3.7961
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.191831 0.338054 18.316 < 2e-16 ***
## exposicionSi -0.373889 0.139101 -2.688 0.00743 **
## edad -0.007673 0.005764 -1.331 0.18374
## nivel_edu_reagrupadoSecundaria 0.280640 0.164473 1.706 0.08857 .
## nivel_edu_reagrupadoSuperior 0.761387 0.241527 3.152 0.00172 **
## enfcro_dicotSi -0.100446 0.171954 -0.584 0.55938
## areaUrbana 0.712176 0.140414 5.072 5.55e-07 ***
## esta_desempleadoSi 0.194267 0.158976 1.222 0.22229
## dosis1 0.411595 0.295697 1.392 0.16455
## dosis2 0.266304 0.220448 1.208 0.22761
## dosis3 0.286862 0.242959 1.181 0.23828
## dosis4 0.332474 0.252848 1.315 0.18914
## prev_per_dicotSi 1.245975 0.142208 8.762 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.386 on 502 degrees of freedom
## Multiple R-squared: 0.2947, Adjusted R-squared: 0.2779
## F-statistic: 17.48 on 12 and 502 DF, p-value: < 2.2e-16
# Backward selection
modelo5_puntaje_c <- lm(puntaje_C ~ exposicion +
# genero
edad + nivel_edu_reagrupado +
#enfcro_dicot +
area + esta_desempleado +
# ingreso +
# part_prev + <- ELIMINADA
dosis + prev_per_dicot,
data = CAP_modif)
summary(modelo5_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + edad + nivel_edu_reagrupado +
## area + esta_desempleado + dosis + prev_per_dicot, data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0343 -0.9886 0.1782 0.9262 3.8070
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.226832 0.332484 18.728 < 2e-16 ***
## exposicionSi -0.380205 0.138589 -2.743 0.00630 **
## edad -0.009337 0.005007 -1.865 0.06279 .
## nivel_edu_reagrupadoSecundaria 0.292996 0.163000 1.798 0.07285 .
## nivel_edu_reagrupadoSuperior 0.774621 0.240304 3.223 0.00135 **
## areaUrbana 0.714257 0.140277 5.092 5.02e-07 ***
## esta_desempleadoSi 0.185834 0.158216 1.175 0.24073
## dosis1 0.404644 0.295264 1.370 0.17116
## dosis2 0.266314 0.220303 1.209 0.22729
## dosis3 0.279099 0.242437 1.151 0.25019
## dosis4 0.327667 0.252549 1.297 0.19507
## prev_per_dicotSi 1.248500 0.142049 8.789 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.386 on 503 degrees of freedom
## Multiple R-squared: 0.2942, Adjusted R-squared: 0.2788
## F-statistic: 19.06 on 11 and 503 DF, p-value: < 2.2e-16
# Backward selection
modelo6_puntaje_c <- lm(puntaje_C ~ exposicion +
# genero
edad + nivel_edu_reagrupado +
#enfcro_dicot +
area + esta_desempleado +
# ingreso +
# part_prev + <- ELIMINADA
# dosis +
prev_per_dicot,
data = CAP_modif)
summary(modelo6_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + edad + nivel_edu_reagrupado +
## area + esta_desempleado + prev_per_dicot, data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.2652 -0.9767 0.1665 0.9308 3.5801
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.458947 0.280906 22.993 < 2e-16 ***
## exposicionSi -0.334229 0.134276 -2.489 0.01313 *
## edad -0.009103 0.004634 -1.964 0.05004 .
## nivel_edu_reagrupadoSecundaria 0.279581 0.162080 1.725 0.08514 .
## nivel_edu_reagrupadoSuperior 0.728737 0.237368 3.070 0.00225 **
## areaUrbana 0.745311 0.137419 5.424 9.05e-08 ***
## esta_desempleadoSi 0.167662 0.155770 1.076 0.28229
## prev_per_dicotSi 1.246443 0.140824 8.851 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.383 on 507 degrees of freedom
## Multiple R-squared: 0.2909, Adjusted R-squared: 0.2811
## F-statistic: 29.71 on 7 and 507 DF, p-value: < 2.2e-16
# Backward selection
modelo7_puntaje_c <- lm(puntaje_C ~ exposicion +
# genero
edad +
nivel_edu_reagrupado +
# enfcro_dicot +
area +
empleo +
# ingreso +
# part_prev + <- ELIMINADA
# dosis +
prev_per_dicot,
data = CAP_modif)
summary(modelo7_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + edad + nivel_edu_reagrupado +
## area + empleo + prev_per_dicot, data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.3590 -0.9865 0.1369 0.9542 3.4957
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.621231 0.333253 19.868 < 2e-16 ***
## exposicionSi -0.374198 0.135888 -2.754 0.00610 **
## edad -0.008545 0.005519 -1.548 0.12221
## nivel_edu_reagrupadoSecundaria 0.277143 0.161648 1.714 0.08705 .
## nivel_edu_reagrupadoSuperior 0.701024 0.237084 2.957 0.00325 **
## areaUrbana 0.784241 0.138214 5.674 2.35e-08 ***
## empleoEmpleo -0.095018 0.159834 -0.594 0.55246
## empleoEn retiro -0.441208 0.288912 -1.527 0.12735
## empleoSolo estudia -0.521416 0.291692 -1.788 0.07445 .
## prev_per_dicotSi 1.191373 0.143067 8.327 7.82e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.38 on 505 degrees of freedom
## Multiple R-squared: 0.2975, Adjusted R-squared: 0.285
## F-statistic: 23.76 on 9 and 505 DF, p-value: < 2.2e-16
# Backward selection
modelo8_puntaje_c <- lm(puntaje_C ~ exposicion +
# genero
edad +
nivel_edu_reagrupado +
# enfcro_dicot +
area +
empleo +
# ingreso +
# part_prev + <- ELIMINADA
# dosis +
prev_per_dicot +
mortalidad +
prev_fam_dicot,
data = CAP_modif)
summary(modelo8_puntaje_c)
##
## Call:
## lm(formula = puntaje_C ~ exposicion + edad + nivel_edu_reagrupado +
## area + empleo + prev_per_dicot + mortalidad + prev_fam_dicot,
## data = CAP_modif)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.3092 -0.9774 0.1068 0.9598 3.5436
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.572583 0.332278 19.780 < 2e-16 ***
## exposicionSi -0.357314 0.135930 -2.629 0.008834 **
## edad -0.008659 0.005494 -1.576 0.115665
## nivel_edu_reagrupadoSecundaria 0.284839 0.161022 1.769 0.077509 .
## nivel_edu_reagrupadoSuperior 0.686323 0.236508 2.902 0.003872 **
## areaUrbana 0.802709 0.137967 5.818 1.06e-08 ***
## empleoEmpleo -0.097916 0.159113 -0.615 0.538576
## empleoEn retiro -0.439251 0.287650 -1.527 0.127381
## empleoSolo estudia -0.518065 0.291573 -1.777 0.076207 .
## prev_per_dicotSi 0.804670 0.208006 3.869 0.000124 ***
## mortalidadSi 0.154225 0.309960 0.498 0.619009
## prev_fam_dicotSi 0.497724 0.207621 2.397 0.016882 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.373 on 503 degrees of freedom
## Multiple R-squared: 0.3067, Adjusted R-squared: 0.2915
## F-statistic: 20.22 on 11 and 503 DF, p-value: < 2.2e-16
Solo hace falta verificar si se cunplen los supuestos para correr el modelo y para confiar en la validez, robustez y viabilidad del modelo
# 1. Asegúrate de que tu modelo final esté en la memoria
modelo_final_definitivo <- lm(puntaje_C ~
exposicion +
edad +
nivel_edu_reagrupado +
area +
empleo +
prev_per_dicot +
prev_fam_dicot,
data = CAP_modif)
# 2. Configura la ventana de gráficos para mostrar 4 gráficos (2x2)
par(mfrow = c(1, 1))
# 3. Genera los 4 gráficos de diagnóstico
plot(modelo_final_definitivo)
tidy(modelo_final_definitivo)
## # A tibble: 11 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 6.57 0.332 19.8 5.91e-65
## 2 exposicionSi -0.352 0.135 -2.60 9.58e- 3
## 3 edad -0.00867 0.00549 -1.58 1.15e- 1
## 4 nivel_edu_reagrupadoSecundaria 0.282 0.161 1.75 8.01e- 2
## 5 nivel_edu_reagrupadoSuperior 0.694 0.236 2.94 3.41e- 3
## 6 areaUrbana 0.798 0.138 5.80 1.15e- 8
## 7 empleoEmpleo -0.0984 0.159 -0.619 5.36e- 1
## 8 empleoEn retiro -0.442 0.287 -1.54 1.25e- 1
## 9 empleoSolo estudia -0.505 0.290 -1.74 8.23e- 2
## 10 prev_per_dicotSi 0.808 0.208 3.89 1.13e- 4
## 11 prev_fam_dicotSi 0.516 0.204 2.53 1.17e- 2
glance(modelo_final_definitivo)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.306 0.293 1.37 22.3 1.50e-34 10 -888. 1800. 1851.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Ahora debes ajustar un modelo para la variable Puntaje de Actitudes (puntaje_A) y Puntaje de Prácticas (Puntaje_P). Esto te servirá para tu informe final de resultados.
##¡Manos a la obra!