Ego-network

Descriptives

By Roberto Cantillan

August 9, 2023

Egonetwork

Egonetwork

El prsente documento tiene por objetivo realizar la construcción de una bbdd de egos y alteris (anidados) en formato long para anáisis posteriores considerando ELSOC 2017 (w2) y 2019 (w4). 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.

librerías

pacman::p_load(ggplot2,ggthemes,tidyverse,sjlabelled,sjPlot,vcd,texreg,ordinal,
               nnet,MASS,mlogit,matrixStats,expss,sjlabelled,sjmisc,tidyverse,
               survey,egor,haven,car,dplyr,stargazer,janitor,gridExtra,ggeffects,
               haven,summarytools,skimr,weights,ggcorrplot,ggridges,panelr,
               GLMMadaptive,survival,R.utils,questionr,car,corrplot,hrbrthemes,
               viridis,extrafont,JWileymisc,xtable,kableExtra)

2017

Cargamos data

load("/home/rober/Documents/ricantillan.rbind.io/dat/ELSOC/ELSOC_W02_v3.00_R.RData")
load("/home/rober/Documents/ricantillan.rbind.io/dat/ELSOC/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)
#View(alter_1)
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.

kbl(freq(obs$alter_educ)) %>%kable_paper()
n%val%
1136211.017.8
2354328.746.2
310428.413.6
4171913.922.4
NA469938.0NA
kbl(freq(obs$alter_relig))%>%kable_paper()
n%val%
1490739.760.8
2140711.417.4
311289.114.0
42512.03.1
53733.04.6
NA429934.8NA
kbl(freq(obs$alter_ideol))%>%kable_paper()
n%val%
17866.411.1
21911.52.7
33823.15.4
43032.54.3
57596.110.7
6464437.665.7
NA530042.9NA
kbl(freq(obs$alter_edad)) %>%kable_paper()
n%val%
13492.84.3
2147711.918.3
3187515.223.2
4171313.921.2
5146611.918.2
611869.614.7
NA429934.8NA
kbl(freq(obs$alter_sexo)) %>%kable_paper()
n%val%
1338827.442
2467837.858
NA429934.8NA

Descriptivos (ego)

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

kbl(freq(obs$ego_educ)) %>%kable_paper()
n%val%
298524.124.1
522542.342.3
201016.316.3
214517.317.3
kbl(freq(obs$ego_relig))%>%kable_paper()
n%val%
1691555.956.1
2249520.220.2
310558.58.6
44853.93.9
5138011.211.2
NA350.3NA
kbl(freq(obs$ego_ideol))%>%kable_paper()
n%val%
19157.47.5
210908.88.9
3235019.019.2
4138011.211.3
510758.78.8
6540043.744.2
NA1551.3NA
kbl(freq(obs$ego_edad)) %>%kable_paper()
n%val%
100.10.1
186515.115.1
253020.520.5
272022.022.0
287023.223.2
237019.219.2
kbl(freq(obs$ego_sexo)) %>%kable_paper()
n%val%
475538.538.5
761061.561.5

Croos tab educ

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

# recod labels. 
obs<-obs%>%
  dplyr::mutate(ego_educ=case_when(ego_educ==1~"basico",
                                   ego_educ==2~"media",
                                   ego_educ==3~"tecnica",
                                   TRUE~"universit."))%>%
  dplyr::mutate(alter_educ=case_when(alter_educ==1~"basico",
                                     alter_educ==2~"media",
                                     alter_educ==3~"tecnica",
                                     TRUE~"universit."))
  
table_cont<-sjPlot::tab_xtab(var.row = obs$ego_educ, 
                             var.col = obs$alter_educ, 
                             title = "Social mix by educational level ELSOC 2017", 
                             show.row.prc = TRUE,
                             show.summary = TRUE,
                             show.col.prc = TRUE,
                             use.viewer = FALSE)
table_cont
Social mix by educational level ELSOC 2017
ego_educalter_educTotal
basicomediatecnicauniversit.
basico570
19.1 %
41.9 %
825
27.6 %
23.3 %
89
3 %
8.5 %
1501
50.3 %
23.4 %
2985
100 %
24.1 %
media622
11.9 %
45.7 %
1881
36 %
53.1 %
336
6.4 %
32.2 %
2386
45.7 %
37.2 %
5225
100 %
42.3 %
tecnica116
5.8 %
8.5 %
481
23.9 %
13.6 %
389
19.4 %
37.3 %
1024
50.9 %
16 %
2010
100 %
16.3 %
universit.54
2.5 %
4 %
356
16.6 %
10 %
228
10.6 %
21.9 %
1507
70.3 %
23.5 %
2145
100 %
17.3 %
Total1362
11 %
100 %
3543
28.7 %
100 %
1042
8.4 %
100 %
6418
51.9 %
100 %
12365
100 %
100 %
χ2=1202.528 · df=9 · Cramer's V=0.180 · p=0.000

Tabla para plot (con ggplot en formato long)

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

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

Heatmap

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

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))
# A tibble: 1 × 6
  mean.clo.esp mean.clo.hijo mean.clo.pari mean.clo.amig mean.clo.otro
         <dbl>         <dbl>         <dbl>         <dbl>         <dbl>
1         4.50          4.92          4.88          4.08          3.68
# ℹ 1 more variable: count.par.barr <int>

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

kbl(egltable(c("sexo_dist", "edad_dist", "educ_dist", "ideol_dist", "relig_dist"),data = obs, strict=T))%>%  kable_paper()
M (SD)
sexo_dist0.36 (0.48)
edad_dist0.65 (0.48)
educ_dist0.65 (0.48)
ideol_dist0.55 (0.50)
relig_dist0.38 (0.49)

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.

Posted on:
August 9, 2023
Length:
6 minute read, 1093 words
See Also: