El presente documento tiene por objetivo realizar la construcción de una Base de Datos de egos y alteris (anidados) en formato long para análisis posteriores considerando ELSOC 2017 (Ola 2) -esto eventualmente puede ser extendido a ELSOC 2019- Términamos con la construcción de tablas de descriptivos y la construcción de vectores de “distancia sociodemográfica” (mismatch) de parámetros de relevancia evidenciados en el paper de Bargsted et al. (2020) para el caso chileno. Para el cálculo de esta medida, utilizaremos la base de datos longitudinal, ELSOC (ola 2), en formato R la cual puede ser descargada en el siguiente link. Lo invitamos también a poder revisar el repositorio https://www.dataverse.harvard.edu/dataverse/coes_data_repository donde podrá encontrar disponible los datos de 2017, 2018 de la encuesta ELSOC en diversos formatos, así como también su cuestionario. En este link usted podrá también podrá encontrar las bases de datos corresponientes a otras encuestas realizadas por el centro. Para más información de COES o ELSOC, lo invitamos a revisar https://www.coes.cl/ y https://www.elsoc.cl/

Para el siguiente ejemplo usamos data egocentrada siguiendo el formato que se utiliza para manipulación de data con el paquete egor

Librerias

library(ggplot2)
library(ggthemes)
library(tidyverse)
library(sjlabelled)
library(sjPlot)
library(vcd)
library(texreg)
library(ordinal)
library(nnet)
library(MASS)
library(mlogit)
library(matrixStats)
library(expss)
library(sjlabelled)
library(sjmisc)
library(tidyverse)
library(egor)
library(haven)
library(car)
library(dplyr)
library(stargazer)
library(janitor)
library(haven)
libraRY(skimr)
library(weights)
library(ggcorrplot)
library(ggridges)
library(panelr)

Cargamos data 2017

load("C:/Users/Herman/Desktop/ETC/ELSOC_W02_v3.00_R.Rdata")
load("C:/Users/Herman/Desktop/ETC/ELSOC_W04_v2.01_R.RData")

Renombrar ID

a<-elsoc_2017 %>% rename(.egoID = idencuesta)
b<-elsoc_2019 %>% rename(.egoID = idencuesta)

Crear data frame alteris para 2017=a1

Creamos subset con data de cada uno de los alteris mencionados, manteniendo el ID de cada ego en el cual están anidados. Las columnas de cada uno de los subset deben tener los mismos nombres.

alter_1<-a %>%
        dplyr::select(.egoID, 
                      alter_sexo=r13_sexo_01, 
                      alter_edad=r13_edad_01, 
                      alter_rel=r13_relacion_01,
                      alter_tiempo=r13_tiempo_01,
                      alter_barrio=r13_barrio_01, 
                      alter_educ=r13_educ_01, 
                      alter_relig=r13_relig_01, 
                      alter_ideol=r13_ideol_01)

alter_2<-a %>%
        dplyr::select(.egoID, 
                      alter_sexo=r13_sexo_02, 
                      alter_edad=r13_edad_02, 
                      alter_rel=r13_relacion_02,
                      alter_tiempo=r13_tiempo_02,
                      alter_barrio=r13_barrio_02, 
                      alter_educ=r13_educ_02, 
                      alter_relig=r13_relig_02, 
                      alter_ideol=r13_ideol_02)

alter_3<-a %>%
        dplyr::select(.egoID, 
                      alter_sexo=r13_sexo_03, 
                      alter_edad=r13_edad_03, 
                      alter_rel=r13_relacion_03,
                      alter_tiempo=r13_tiempo_03,
                      alter_barrio=r13_barrio_03, 
                      alter_educ=r13_educ_03, 
                      alter_relig=r13_relig_03, 
                      alter_ideol=r13_ideol_03)

alter_4<- a %>%
        dplyr::select(.egoID, 
                      alter_sexo=r13_sexo_04, 
                      alter_edad=r13_edad_04, 
                      alter_rel=r13_relacion_04,
                      alter_tiempo=r13_tiempo_04, 
                      alter_barrio=r13_barrio_04, 
                      alter_educ=r13_educ_04, 
                      alter_relig=r13_relig_04, 
                      alter_ideol=r13_ideol_04)

alter_5<-a %>%
        dplyr::select(.egoID, 
                      alter_sexo=r13_sexo_05, 
                      alter_edad=r13_edad_05, 
                      alter_rel=r13_relacion_05,
                      alter_tiempo=r13_tiempo_05, 
                      alter_barrio=r13_barrio_05, 
                      alter_educ=r13_educ_05, 
                      alter_relig=r13_relig_05, 
                      alter_ideol=r13_ideol_05)

setear

Creamos un vector adicional en cada subset de alteris con un número constante que identifica a que alter representa la data.

alter_1$n<-1
alter_2$n<-2
alter_3$n<-3
alter_4$n<-4
alter_5$n<-5

Crear base en formato long

Con la función rbind agregamos la data hacia abajo en relación al orden establecido por el los vectores númericos creados anteriormente. Es necesario que todas las columnas (variables) tengan los mismos nombres. Posteriormente con la función arrange, ordenamos la data en orden descendente en función del vector identificador de los egos (respondentes).

alteris<-rbind(alter_1,alter_2,alter_3,alter_4,alter_5)
alteris<-arrange(alteris, .egoID)

Crear vector alter id

En el siguiente chunk creamos un vector identificador para cada uno de los alteris presentes en la data “alteris”. Lo identificamos como objeto tibble y eliminamos el vector “n”.

alteris   <- rowid_to_column(alteris, var = ".altID")
alteris   <- as_tibble(alteris)
#alteris$n <- NULL

Recod alteris

Recodificamos los valores de los atributos de los alteris.

alteris$alter_educ <-factor(Recode(alteris$alter_educ ,"1=1;2:3=2;4=3;5=4;-999=NA"))
alteris$alter_relig<-factor(Recode(alteris$alter_relig,"1=1;2=2;3=3;4=4;5=5;-999=NA"))
alteris$alter_ideol<-factor(Recode(alteris$alter_ideol,"1=1;2=2;3=3;4=4;5=5;6=6;-999=NA"))
alteris$alter_edad <-factor(Recode(alteris$alter_edad ,"0:18=1;19:29=2;30:40=3;41:51=4;52:62=5;63:100=6"))
alteris$alter_sexo <-factor(Recode(alteris$alter_sexo ,"1=1;2=2"))
#alteris<-na.omit(alteris)

Data Frame Ego’s

Creamos un subset con la data de ego equivalente a la data de los alteris. Las nombramos de la misma manera.

egos <-a %>%
       dplyr::select(.egoID, 
                     ego_sexo=m0_sexo, 
                     ego_edad=m0_edad, 
                     ego_ideol=c15, 
                     ego_educ=m01, 
                     ego_relig=m38, 
                     ego_ideol=c15)

egos <- as_tibble(egos)

Recod data Ego’s

Recodificamos las variables de la data de ego siguiendo el patrón de la data de alteris.

egos$ego_educ <-factor(Recode(egos$ego_educ,"1:3=1;4:5=2;6:7=3;8:10=4;-999:-888=NA"))
egos$ego_relig<-factor(Recode(egos$ego_relig,"1=1;2=2;9=3;7:8=4;3:6=5;-999:-888=NA"))
egos$ego_ideol<-factor(Recode(egos$ego_ideol,"9:10=1;6:8=2;5=3;2:4=4;0:1=5;11:12=6;-999:-888=NA"))
egos$ego_edad <-factor(Recode(egos$ego_edad,"18=1;19:29=2;30:40=3;41:51=4;52:62=5;63:100=6"))
egos$ego_sexo <-factor(Recode(egos$ego_sexo,"1=1;2=2"))

join

Con la función left_join agregamos la data de alteris y egos hacia el lado, en función del id de ego.

obs<-left_join(alteris,egos, by=".egoID")
obs$case<-1
obs[obs=="-999"] <- NA
obs[obs=="-888"] <- NA

Descriptivos (alter)

Observamos la frecuencia de las categorias de los atributos de alteris.

freq(obs$alter_educ)
freq(obs$alter_relig)
freq(obs$alter_ideol)
freq(obs$alter_edad)
freq(obs$alter_sexo)

Descriptivos (ego)

Observamos la frecuencia de las categorias de los atributos sociodemográficos de ego.

freq(obs$ego_educ)
freq(obs$ego_relig)
freq(obs$ego_ideol)
freq(obs$ego_edad)
freq(obs$ego_sexo)

Croos tab educ

Creamos una tabla cruzada de las categorías educativas de Ego y alteris para observar su distribución.

table_cont<-sjPlot::tab_xtab(var.row = obs$ego_educ, 
                             var.col = obs$alter_educ, 
                             title = "Mixtura social por nivel educativo ELSOC 2017", 
                             show.row.prc = TRUE)
table_cont

Croos tab Relig

table_cont2<-sjPlot::tab_xtab(var.row = obs$ego_relig, 
                             var.col = obs$alter_relig, 
                             title = "Mixtura social por religión ELSOC 2017", 
                             show.row.prc = TRUE)
table_cont2

Croos tab Sexo

table_cont3<-sjPlot::tab_xtab(var.row = obs$ego_sexo, 
                             var.col = obs$alter_sexo, 
                             title = "Mixtura social por sexo ELSOC 2017", 
                             show.row.prc = TRUE)
table_cont3

Croos tab edad

table_cont4<-sjPlot::tab_xtab(var.row = obs$ego_edad, 
                             var.col = obs$alter_edad, 
                             title = "Mixtura social por edad ELSOC 2017", 
                             show.row.prc = TRUE)
table_cont4

Croos tab ideol

table_cont5<-sjPlot::tab_xtab(var.row = obs$ego_ideol, 
                             var.col = obs$alter_ideol, 
                             title = "Mixtura social por ideol ELSOC 2017", 
                             show.row.prc = TRUE)
table_cont5

Tabla para plot (con ggplot en formato long)

El siguiente código crea una tabla long para ser ploteada como un heatmap en ggplot

Tabla educ

table<-as.data.frame(prop.table(table(obs$ego_educ,obs$alter_educ)),margin=1)
colnames(table)<-c("Ego_educ", "Alter_educ", "Prop")
#print(addmargins(table*100,1),3)
#table

Heatmap educ

ggplot(table,aes(Ego_educ, Alter_educ))+
  geom_tile(aes(fill=Prop))+
  scale_fill_gradient(low="white", high="black") +
  theme_ipsum()

E-I sexo

Tabla relig

table2<-as.data.frame(prop.table(table(obs$ego_relig,obs$alter_relig)),margin=1)
colnames(table2)<-c("Ego_relig", "Alter_relig", "Prop")
#print(addmargins(table*100,1),3)
#table

Heatmap relig

ggplot(table2,aes(Ego_relig, Alter_relig))+
  geom_tile(aes(fill=Prop))+
  scale_fill_gradient(low="white", high="black") +
  theme_ipsum()

E-I sexo

Mean en tiempo * tipos de relación

obs %>%
  summarise(
    mean.clo.esp   = mean(alter_tiempo[alter_rel=="1"], na.rm=T),
    mean.clo.hijo  = mean(alter_tiempo[alter_rel=="2"], na.rm=T),
    mean.clo.pari  = mean(alter_tiempo[alter_rel=="3"], na.rm=T),
    mean.clo.amig  = mean(alter_tiempo[alter_rel=="4"], na.rm=T),
    mean.clo.otro  = mean(alter_tiempo[alter_rel=="5"], na.rm=T),
    count.par.barr = sum((alter_rel=="3" & alter_barrio=="1"), na.rm=T))

Crear vectores de distancia sociodemográfica

Crear un vector que sea TRUE siempre que alter tenga distinto sexo que ego

obs$sexo_dist<-obs$alter_sexo != obs$ego_sexo

otra alternativa para crear vector de distancia o “mismatch”

obs$sexo_dist <-ifelse(obs$alter_sexo ==obs$ego_sexo,  0, 1) # mismatch
obs$edad_dist <-ifelse(obs$alter_edad ==obs$ego_edad,  0, 1) 
obs$educ_dist <-ifelse(obs$alter_educ ==obs$ego_educ,  0, 1) 
obs$ideol_dist<-ifelse(obs$alter_ideol==obs$ego_ideol, 0, 1) 
obs$relig_dist<-ifelse(obs$alter_relig==obs$ego_relig, 0, 1) 

Descriptivos

freq(obs$sexo_dist)
egltable(c("sexo_dist", "edad_dist", "educ_dist", "ideol_dist", "relig_dist"),
         data = obs, strict=T) 

Esta tabla es la misma de Smith et al. (2014). Describe la media de la distancia sociodemogrpafica por parámetro. Como alternativa, el valor TRUE del argumento strict de la función egltable, muestra los porcentajes por categoría de la variable dummy.

Bibliografía

  • Bargsted Valdés, M. A., Espinoza, V., & Plaza, A. (2020). Pautas de Homofilia en Chile. Papers. Revista de Sociología, 105