Práctico 01. Regresión lineal I

Métodos estadísticos para Ciencias Sociales III

Fecha de publicación

11 de agosto de 2025

Presentación

Objetivo de la práctica

El desarrollo de esta guía tiene por objetivo revisar algunos procedimientos para la estimación de regresiones lineales en R.

Antecedentes de los datos a utilizar

Confianza en vecinos con elsoc 2016.

Análisis

1. Librerías principales (de R) a utilizar en el análisis

pacman::p_load(dplyr,
               haven, 
               car, 
               sjmisc, 
               sjPlot, 
               sjlabelled, 
               stargazer, 
               kableExtra, 
               corrplot, 
               ggplot2,
               ggpubr)

2. Cargar base de datos

Ajustar espacio de trabajo

Previo a la carga de nuestra base de datos, se recomienda ejecutar los siguientes comandos:

rm(list=ls())       # borrar todos los objetos en el espacio de trabajo
options(scipen=999) # valores sin notación científica

La función rm(list=ls()) permite comenzar con un espacio de trabajo (environment) vacío y sin otros objetos. Así también, la función options(scipen=999) desactiva la notación científica, es decir, veremos los valores numéricos con todos sus decimales.

Datos

#cargamos la base de datos desde internet
load(url("https://dataverse.harvard.edu/api/access/datafile/7245118")) #Cargar base de datos

Realizamos un chequeo básico de la lectura de datos: nombres de las variables y tamaño de la base en términos de casos y variables (en este ejemplo, 18035, 750 ).

dim(elsoc_long_2016_2022.2) # dimension de la base
[1] 18035   750

3. Selección de variables a utilizar

Este paso consiste en crear un subset reducido de datos que contenga solo las variables de interés. Para ello lo más fácil es revisar el libro de códigos de cada base de datos. Además filtramos por la ola 1 para trabajar solo con datos del 2016.

proc_data <- elsoc_long_2016_2022.2 %>% filter(ola=="1") %>% 
  select(t01, # Confianza en vecinos
         m01,# nivel educacional
         m0_sexo,# sexo
         m0_edad# edad
         )

# Comprobar
names(proc_data)
[1] "t01"     "m01"     "m0_sexo" "m0_edad"

Mediante el comando get_label obtenemos el atributo label de las variables.

sjlabelled::get_label(proc_data)
                                 t01                                  m01 
"Cuanto confia usted en sus vecinos"                  "Nivel educacional" 
                             m0_sexo                              m0_edad 
             "Sexo del entrevistado"              "Edad del entrevistado" 

Podemos ver que son largas o con códigos poco informativos, por lo tanto, es necesario cambiarlas por etiquetas más cortas y de fácil identificación.

Procesamiento de variables

Para el procesamiento de cada variable se seguirá el siguiente flujo de trabajo:

  1. Descriptivo general
  2. Recodificación: de casos perdidos y otros valores (en caso necesario)
  3. Etiquetado: cambio de nombres de variables y valores (en caso necesario)
  4. Otros ajustes

Y se recomienda también un descriptivo final para revisar que el procesamiento de cada variable está ok.

Confianza en vecinos

a. Descriptivo

Para los descriptivos se utilizará la función frq, de la librería sjmisc:

frq(proc_data$t01)
Cuanto confia usted en sus vecinos (x) <numeric> 
# total N=2927 valid N=2927 mean=-2.78 sd=74.04

Value |                                 Label |   N | Raw % | Valid % | Cum. %
------------------------------------------------------------------------------
 -999 |                           No Responde |   5 |  0.17 |    0.17 |   0.17
 -888 |                               No Sabe |  14 |  0.48 |    0.48 |   0.65
 -777 |       Valor perdido por error tecnico |   0 |  0.00 |    0.00 |   0.65
 -666 | Valor perdido por encuesta incompleta |   0 |  0.00 |    0.00 |   0.65
    1 |                              Muy poco | 332 | 11.34 |   11.34 |  11.99
    2 |                                  Poco | 502 | 17.15 |   17.15 |  29.14
    3 |                                  Algo | 713 | 24.36 |   24.36 |  53.50
    4 |                              Bastante | 987 | 33.72 |   33.72 |  87.22
    5 |                                 Mucho | 374 | 12.78 |   12.78 | 100.00
 <NA> |                                  <NA> |   0 |  0.00 |    <NA> |   <NA>

En esta variable vemos valores asociados a la opción “No contesta” (-999) y “No sabe” (-888), (-777) y (-666) que corresponde definirlos como casos perdidos (en el caso de R, como casos NA). El resto de los valores y etiquetas se encuentran en un orden correcto.

b. Recodificación

Después de revisar el libro de códigos, no hay variables en que los valores negativos representen alguna otra característica, así que podemos usar set_na

proc_data <- proc_data %>% set_na(., na = c(-999, -888, -777, -666))
frq(proc_data$t01)
Cuanto confia usted en sus vecinos (x) <numeric> 
# total N=2927 valid N=2908 mean=3.20 sd=1.20

Value |    Label |   N | Raw % | Valid % | Cum. %
-------------------------------------------------
    1 | Muy poco | 332 | 11.34 |   11.42 |  11.42
    2 |     Poco | 502 | 17.15 |   17.26 |  28.68
    3 |     Algo | 713 | 24.36 |   24.52 |  53.20
    4 | Bastante | 987 | 33.72 |   33.94 |  87.14
    5 |    Mucho | 374 | 12.78 |   12.86 | 100.00
 <NA> |     <NA> |  19 |  0.65 |    <NA> |   <NA>

c - Etiquetado

Vamos a dar un nombre más sustantivo a las variables con la función rename, de la librería dplyr:

proc_data <- proc_data %>% rename("confianza_vecinos"=t01)

Además de cambiar el nombre, queremos cambiar las etiquetas de las variables.

proc_data$confianza_vecinos <- set_label(x = proc_data$confianza_vecinos,label = "Confianza en vecinos")
get_label(proc_data$confianza_vecinos)
[1] "Confianza en vecinos"

Revisión final

Nuevamente un descriptivo de la variable para confirmar que el procesamiento está ok:

frq(proc_data$confianza_vecinos)
Confianza en vecinos (x) <numeric> 
# total N=2927 valid N=2908 mean=3.20 sd=1.20

Value |    Label |   N | Raw % | Valid % | Cum. %
-------------------------------------------------
    1 | Muy poco | 332 | 11.34 |   11.42 |  11.42
    2 |     Poco | 502 | 17.15 |   17.26 |  28.68
    3 |     Algo | 713 | 24.36 |   24.52 |  53.20
    4 | Bastante | 987 | 33.72 |   33.94 |  87.14
    5 |    Mucho | 374 | 12.78 |   12.86 | 100.00
 <NA> |     <NA> |  19 |  0.65 |    <NA> |   <NA>

4.2. Educación

  • [m01] = Nivel de estudios alcanzado - Entrevistado

a. Descriptivo

frq(proc_data$m01)
Nivel educacional (x) <numeric> 
# total N=2927 valid N=2925 mean=5.26 sd=2.20

Value |                                       Label |   N | Raw % | Valid % | Cum. %
------------------------------------------------------------------------------------
    1 |                                Sin estudios |  37 |  1.26 |    1.26 |   1.26
    2 |  Educacion Basica o Preparatoria incompleta | 322 | 11.00 |   11.01 |  12.27
    3 |    Educacion Basica o Preparatoria completa | 297 | 10.15 |   10.15 |  22.43
    4 |    Educacion Media o Humanidades incompleta | 394 | 13.46 |   13.47 |  35.90
    5 |      Educacion Media o Humanidades completa | 857 | 29.28 |   29.30 |  65.20
    6 |                 Tecnica Superior incompleta | 102 |  3.48 |    3.49 |  68.68
    7 |                   Tecnica Superior completa | 381 | 13.02 |   13.03 |  81.71
    8 |                    Universitaria incompleta | 186 |  6.35 |    6.36 |  88.07
    9 |                      Universitaria completa | 303 | 10.35 |   10.36 |  98.43
   10 | Estudios de posgrado (magister o doctorado) |  46 |  1.57 |    1.57 | 100.00
 <NA> |                                        <NA> |   2 |  0.07 |    <NA> |   <NA>

Esta vez la vamos a dejar así

4.3. Sexo

  • [m0_sexo] = SEXO Sexo

a. Descriptivo

frq(proc_data$m0_sexo)
Sexo del entrevistado (x) <numeric> 
# total N=2927 valid N=2927 mean=1.60 sd=0.49

Value |  Label |    N | Raw % | Valid % | Cum. %
------------------------------------------------
    1 | Hombre | 1163 | 39.73 |   39.73 |  39.73
    2 |  Mujer | 1764 | 60.27 |   60.27 | 100.00
 <NA> |   <NA> |    0 |  0.00 |    <NA> |   <NA>

4.4 Edad

  • [m0_edad] = EDAD Edad.

a. Descriptivo

summary(proc_data$m0_edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   33.00   46.00   46.09   58.00   88.00 

Análisis descriptivo

sjmisc::descr(proc_data,
      show = c("label","range", "mean", "sd", "NA.prc", "n"))%>% # Selecciona estadísticos
      kable(.,"markdown") # Esto es para que se vea bien en quarto
Tabla 1: Descriptivos
var label n NA.prc mean sd range
1 confianza_vecinos Confianza en vecinos 2908 0.6491288 3.195667 1.202232 4 (1-5)
2 m01 Nivel educacional 2925 0.0683293 5.260513 2.201502 9 (1-10)
4 m0_sexo Sexo del entrevistado 2927 0.0000000 1.602665 0.489430 1 (1-2)
3 m0_edad Edad del entrevistado 2927 0.0000000 46.090878 15.286798 70 (18-88)

En la Tabla 1 podemos observar los descriptivos generales de la base de datos procesada. Notemos la Media de confianza en vecinos = 3.20

Y si queremos visualizar algo más:

proc_data %>% dplyr::select(confianza_vecinos) %>% 
  sjPlot::plot_stackfrq()+
  theme(legend.position = "bottom")
Figura 1: Frecuencias Confianza en vecinos

Asociación de variables

Podemos ver la asociación de todas las variables, como lo muestra la ?@cor-complete

M <- cor(proc_data, use = "complete.obs") # Usar solo casos con observaciones completas
corrplot.mixed(M)
Figura 2: variables elsoc 2016

La Figura 2 muestra que la asociación de la confianza en vecinos es baja, siendo positiva para educación y edad, y negativa para sexo. La asociación más alta es entre educación y edad, siendo negativa (-0,35).

Medias condicionales

Antes de avanzar desde la correlación al método de regresión es importante conocer el concepto de media condicional.

Imaginemos un juego de tacataca con dos variables: cantidad de juegos previos y puntos obtenidos en un partido. En estas variables, el promedio de puntos es 4. Es decir, si conocemos a algún individuo que pertence al grupo de “datos”, sabemos que su puntaje se encuentra probablemente cercano a 4. ¿Podemos mejorar nuestra estimación utilizando el puntaje de X? Si el sujeto nos dice que ha jugado antes 6 veces, probablemente vamos a estimar un puntaje superior de puntos, tal vez más cercano a 6.

Lo que estamos haciendo es utilizar la información que conocemos de X para dar una estimación de Y, que sea más precisa que el promedio bruto.

Mirando el gráfico de nube de puntos, sabemos que tres personas han jugado antes una vez, pero una de ellas tuvo 2 puntos, otra 3 y otra 4. Con estos datos podemos calcular la media de Y para X=1, que sería igual a 3. En otras palabras, la media condicional de Y cuando X=1 es 3. Con esto, uno podría calcular la media condicional para cada punto de X y hacer una estimación más precisa de Y. Sin embargo, este proceso todavía no nos permite generalizar más eficientemte la relación entre X e Y.

¿Cuántos puntos (Y) se obtienen según la experiencia previa de juego (X)? Esta pregunta nos conduce al cálculo de una recta que atraviese los puntos y que generalice la relación entre X e Y.

Residuos

En el gráfico anterior vemos que la línea resume la relación entre X e Y, pero claramente es una simplificación que no abarca toda la variabilidad de los datos.

Por ejemplo, para el sujeto cuya experiencia es haber jugado 1 vez y luego gana 3 puntos, esta línea predice exáctamente su puntaje basada en su experiencia. Sin embargo, el sujeto que ha jugado 3 veces y saca 6 puntos se encuentra más lejos de la línea y por lo tanto esta línea o “modelo predictivo” no representa tan bien su puntaje. A esto se refieren los residuos, que es la diferencia entre el valor predicho (o \(\widehat{Y}\)) y el observado \(Y\), siendo los valores predichos de Y los que pasan por la recta a la altura de cada valor de X. Por lo tanto, la mejor recta será aquella que minimice al máximo los residuos.

El sentido de la recta que resume de mejor manera la relación entre dos variables es que minimice la suma de todos los residuos. ¿Cómo realizar este procedimiento?

  • Para realizar la suma de los residuos estos se elevan al cuadrado, lo que se denomina Suma de residuos al cuadrado o \(SS_{residual}\). Se eleva al cuadrado ya que como hay residuos positivos y negativos, unos cancelarían a otros y la suma seía 0, tal como sucede en la formula de la varianza.

  • De la infinita cantidad de rectas que se pueden trazar, siempre hay una que tiene un valor menor de \(SS_{residual}\). Este procedimiento es el que da nombre al proceso de estimación: mínimos (residuos) cuadrados ordinarios, o OLS (Ordinary Least Squares).

¿Cómo funciona esto con nuestro ejemplo?

#Grafico x1 = ACT
graph1 <- ggplot(proc_data, aes(x = m0_edad, y = confianza_vecinos)) +
  geom_point(size = 1) +  # Puntos
  geom_smooth(method = "lm", se = FALSE) +  # Recta de regresión
  labs(x = "Edad", y = "Confianza en vecinos")  # Etiquetas de ejes

# Gráfico 2
graph2 <- ggplot(proc_data, aes(x = m01, y = confianza_vecinos)) +
  geom_point(size = 1) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Educación", y = "Confianza en vecinos")
ggarrange(graph1, graph2, nrow = 1) # Unir graficos

Con el gráfico anterior podemos notar que, si bien ambas variables tienen una asociación positiva con la confianza en vecinos, el tamaño efecto de esta relación es distinto.

Regresiones

Para facilitar la interpretación de los coeficientes de regresión nos aseguramos que las variables categóricas estén como variables categóricas con as_factor. De esta forma nos aseguramos que la estimación de los modelos sea correcta ya que no se puede interpretar sexo como si fuera una variable numérica.

proc_data$sexo <- as_factor(proc_data$m0_sexo)

proc_data <- na.omit(proc_data)

reg1 <- lm(confianza_vecinos ~ 1, data=proc_data)

tab_model(reg1,
          show.ci = FALSE)
  confianza vecinos
Predictors Estimates p
(Intercept) 3.20 <0.001
Observations 2906
R2 / R2 adjusted 0.000 / 0.000

¿Qué valor toma una regresión lineal cuando no incluímos predictores en nuestro modelo?

En este caso, lo que nos interesa observar es el intercepto. Un intercepto de 3.20 nos indica la media de la confianza en vecinos.

Regresión lineal simple

Una regresión lineal simple es aquel modelo que incluye solo un predictor. En este caso construiremos tres modelos distintos con tres variables independientes, es decir, reg2 que incluye como predictor ‘edad’, reg3 incluye educación y reg4 incluye sexo.

reg2 <- lm(confianza_vecinos ~ m0_edad, data=proc_data)
reg3 <- lm(confianza_vecinos ~ m01, data=proc_data)
reg4 <- lm(confianza_vecinos ~ sexo, data=proc_data)

tab_model(reg2, reg3, reg4,
          show.ci = FALSE,
          pred.labels = c("Intercepto",
                          "Edad",
                          "Educación",
                          "Sexo"))
  confianza vecinos confianza vecinos confianza vecinos
Predictors Estimates p Estimates p Estimates p
Intercepto 2.83 <0.001 2.94 <0.001 3.27 <0.001
Edad 0.01 <0.001
Educación 0.05 <0.001
Sexo -0.12 0.010
Observations 2906 2906 2906
R2 / R2 adjusted 0.010 / 0.010 0.008 / 0.008 0.002 / 0.002

La interpretación de una tabla de regresión debe seguir el orden de presentación de los modelos y el orden de los coeficientes de regresión. En este ejemplo se dará el paso a paso de cómo interpretar las tablas:

En el Modelo 1 se incluye edad como predictor, que tiene un coeficiente de regresión de 0,01. Esto indica que por cada unidad que aumenta edad, la confianza en vecinos aumenta en promedio 0,01 unidades. El intercepto es de 2,83, lo que indica que (teóricamente) una persona con edad 0 tendría un promedio de confianza en vecinos de 2,83. Finalmente, el modelo 1 logra explicar el 1% de la varianza de la variable dependiente (R2=0,01).

El Modelo 2 incluye la educación de los/as encuestados como variable independiente. Este Modelo indica que por cada unidad que aumenta la educación, la confianza en vecinos aumenta en promedio 0,5 unidades. Si observamos el intercepto, este nos indica que el promedio de confianza en vecinos para las personas sin educación es de 2.94.

El modelo 3 indica que las mujeres tendrían -0,12 unidades en la confianza en vecinos en comparación con los hombres. ¿Cómo sabemos que este el efecto de las mujeres? ¿Por qué no al revés? ¿Por qué “en comparación” con los hombres?

Tarea

Selección de variables

  • Cargar paquetes, cargar base de datos ELSOC y filtrar por la ola 4 (2019).

  • Seleccionar las siguientes variables:

    • Satisfacción con la democracia: c01

    • Sociodemográficas: m01 (educación), m0_sexo (sexo), m0_edad (edad).

  • Definir cuál es la variable dependiente y cuáles las independientes

Operacionalización de variables

  • Recodificar valores perdidos (-999, -888, -777, -666) como NA.

  • Cambiar etiquetas para que sean más descriptivas.

Análisis

  • Gráfico descriptivo para satisfacción con la democracia

  • Estimar, visualizar e interpretar una matriz de correlaciones con las 4 variables principales.

  • Estimar tres modelos de regresión lineal simple

    • Modelo 1: satisfaccion_democracia ~ sexo

    • Modelo 2: satisfaccion_democracia ~ educacion

    • Modelo 3: satisfaccion_democracia ~ edad

Reporte

  • Presentar una tabla con los tres modelos.

  • Incluir un párrafo breve (máx. 200 palabras) interpretando los coeficientes y \(R^2\).