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

1 Librerías

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

2 BBDD 2017

2.1 Cargamos data

2.1.1 Renombrar ID

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

2.2 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)

2.3 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

2.4 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)

2.5 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)

2.6 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)

2.7 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)

2.7.1 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"))

2.7.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

2.7.3 Descriptivos (alter)

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

educ_alter <- freq(obs$alter_educ)
show_html(educ_alter, digits= 0)
n % val%
1 1362 11 18
2 3543 29 46
3 1042 8 14
4 1719 14 22
NA 4699 38 NA
relig_alter <- freq(obs$alter_relig)
show_html(relig_alter, digits= 0)
n % val%
1 4907 40 61
2 1407 11 17
3 1128 9 14
4 251 2 3
5 373 3 5
NA 4299 35 NA
ideol_alter <- freq(obs$alter_ideol)
show_html(ideol_alter, digits= 0)
n % val%
1 786 6 11
2 191 2 3
3 382 3 5
4 303 2 4
5 759 6 11
6 4644 38 66
NA 5300 43 NA
edad_alter <- freq(obs$alter_edad)
show_html(edad_alter, digits= 0)
n % val%
1 349 3 4
2 1477 12 18
3 1875 15 23
4 1713 14 21
5 1466 12 18
6 1186 10 15
NA 4299 35 NA
sexo_alter <- freq(obs$alter_sexo)
show_html(sexo_alter, digits= 0)
n % val%
1 3388 27 42
2 4678 38 58
NA 4299 35 NA

2.7.4 Descriptivos (ego)

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

educ_ego <- freq(obs$ego_educ)
show_html(educ_ego, digits= 0)
n % val%
1 2985 24 24
2 5225 42 42
3 2010 16 16
4 2145 17 17
relig_ego <- freq(obs$ego_relig)
show_html(relig_ego, digits= 0)
n % val%
1 6915 56 56
2 2495 20 20
3 1055 8 9
4 485 4 4
5 1380 11 11
NA 35 0 NA
ideol_ego <- freq(obs$ego_ideol)
show_html(ideol_ego, digits= 0)
n % val%
1 915 7 8
2 1090 9 9
3 2350 19 19
4 1380 11 11
5 1075 9 9
6 5400 44 44
NA 155 1 NA
edad_ego <- freq(obs$ego_edad)
show_html(edad_ego, digits= 0)
n % val%
1 10 0 0
2 1865 15 15
3 2530 20 20
4 2720 22 22
5 2870 23 23
6 2370 19 19
sexo_ego <- freq(obs$ego_sexo)
show_html(sexo_ego, digits= 0)
n % val%
1 4755 38 38
2 7610 62 62

2.7.5 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 
Mixtura social por nivel educativo ELSOC 2017
ego_educ alter_educ Total
1 2 3 4
1 570
35.3 %
825
51.1 %
89
5.5 %
130
8.1 %
1614
100 %
2 622
19.2 %
1881
58.1 %
336
10.4 %
397
12.3 %
3236
100 %
3 116
8.9 %
481
36.9 %
389
29.9 %
316
24.3 %
1302
100 %
4 54
3.6 %
356
23.5 %
228
15.1 %
876
57.9 %
1514
100 %
Total 1362
17.8 %
3543
46.2 %
1042
13.6 %
1719
22.4 %
7666
100 %
χ2=2319.426 · df=9 · Cramer’s V=0.318 · p=0.000

2.7.6 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
Mixtura social por religión ELSOC 2017
ego_relig alter_relig Total
1 2 3 4 5
1 3541
80.6 %
309
7 %
367
8.4 %
72
1.6 %
106
2.4 %
4395
100 %
2 491
29.3 %
903
53.9 %
207
12.4 %
20
1.2 %
53
3.2 %
1674
100 %
3 251
38.9 %
48
7.4 %
291
45.1 %
24
3.7 %
31
4.8 %
645
100 %
4 166
44.7 %
25
6.7 %
71
19.1 %
89
24 %
20
5.4 %
371
100 %
5 454
46.8 %
121
12.5 %
188
19.4 %
46
4.7 %
162
16.7 %
971
100 %
Total 4903
60.9 %
1406
17.5 %
1124
14 %
251
3.1 %
372
4.6 %
8056
100 %
χ2=3795.861 · df=16 · Cramer’s V=0.343 · p=0.000

2.7.7 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
Mixtura social por sexo ELSOC 2017
ego_sexo alter_sexo Total
1 2
1 1778
58.2 %
1276
41.8 %
3054
100 %
2 1610
32.1 %
3402
67.9 %
5012
100 %
Total 3388
42 %
4678
58 %
8066
100 %
χ2=529.419 · df=1 · φ=0.256 · p=0.000

2.7.8 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
Mixtura social por edad ELSOC 2017
ego_edad alter_edad Total
1 2 3 4 5 6
1 2
28.6 %
3
42.9 %
0
0 %
2
28.6 %
0
0 %
0
0 %
7
100 %
2 67
5.3 %
584
46.3 %
225
17.9 %
160
12.7 %
173
13.7 %
51
4 %
1260
100 %
3 109
6.5 %
252
15 %
676
40.1 %
318
18.9 %
202
12 %
127
7.5 %
1684
100 %
4 99
5.4 %
282
15.5 %
374
20.6 %
553
30.4 %
271
14.9 %
240
13.2 %
1819
100 %
5 54
2.9 %
266
14.3 %
379
20.3 %
364
19.5 %
529
28.4 %
272
14.6 %
1864
100 %
6 18
1.3 %
90
6.3 %
221
15.4 %
316
22.1 %
291
20.3 %
496
34.6 %
1432
100 %
Total 349
4.3 %
1477
18.3 %
1875
23.2 %
1713
21.2 %
1466
18.2 %
1186
14.7 %
8066
100 %
χ2=1882.056 · df=25 · Cramer’s V=0.216 · Fisher’s p=0.000

2.7.9 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
Mixtura social por ideol ELSOC 2017
ego_ideol alter_ideol Total
1 2 3 4 5 6
1 231
41.4 %
14
2.5 %
30
5.4 %
20
3.6 %
45
8.1 %
218
39.1 %
558
100 %
2 157
22.6 %
67
9.7 %
59
8.5 %
35
5 %
45
6.5 %
331
47.7 %
694
100 %
3 135
9.3 %
48
3.3 %
151
10.4 %
69
4.8 %
99
6.8 %
945
65.3 %
1447
100 %
4 66
7.5 %
19
2.2 %
61
6.9 %
97
11 %
214
24.3 %
425
48.2 %
882
100 %
5 55
8 %
14
2 %
25
3.6 %
41
6 %
252
36.7 %
299
43.6 %
686
100 %
6 139
5.1 %
28
1 %
55
2 %
40
1.5 %
103
3.8 %
2367
86.6 %
2732
100 %
Total 783
11.2 %
190
2.7 %
381
5.4 %
302
4.3 %
758
10.8 %
4585
65.5 %
6999
100 %
χ2=2204.021 · df=25 · Cramer’s V=0.251 · p=0.000

2.7.10 Tabla para plot (con ggplot en formato long)

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

2.7.11 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

2.7.12 Heatmap educ

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


scale_x_discrete(labels = c("Basica","Media","Técnica superior",
                              "Universitaria" ))+
scale_y_discrete(labels=c("Basica","Media","Técnica superior",
                              "Universitaria"))
g <- g + theme( axis.ticks.y=element_blank(),
                    legend.position = "left",
                    panel.grid.major.y=element_blank(),
                    plot.title = element_text(hjust = 0.5, size = 8),
                    axis.title = element_text(size=10),
                    axis.text.x = element_text(size = 8,angle = 90),
                    axis.text.y = element_text(size = 8))
print(g)

2.7.13 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

2.7.14 Heatmap relig

g2<- ggplot(table2,aes(Ego_relig, Alter_relig))+
  geom_tile(aes(fill=Prop))+
  scale_fill_gradient(low="white", high="black") +
  theme_ipsum()+
scale_x_discrete(labels = c("Catolico","Evangelico","Ninguno",
                              "Agnostico", "Otra" ))+
scale_y_discrete(labels=c("Catolico","Evangelico","Ninguno",
                              "Agnostico", "Otra"))
g2 <- g2 + theme( axis.ticks.y=element_blank(),
                    legend.position = "left",
                    panel.grid.major.y=element_blank(),
                    plot.title = element_text(hjust = 0.5, size = 8),
                    axis.title = element_text(size=10),
                    axis.text.x = element_text(size = 8,angle = 90),
                    axis.text.y = element_text(size = 8))

print (g2)

2.7.15 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 x 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
## # ... with 1 more variable: count.par.barr <int>

3 Bibliografía

  • Bargsted Valdés, M. A., Espinoza, V., & Plaza, A. (2020). Pautas de Homofilia en Chile. Papers. Revista de Sociología, 105(4), 583. https://doi.org/10.5565/rev/papers.2617

  • Smith, J. A., McPherson, M., & Smith-Lovin, L. (2014). Social Distance in the United States: Sex, Race, Religion, Age, and Education Homophily among Confidants, 1985 to 2004. American Sociological Review, 79(3), 432-456. https://doi.org/10.1177/0003122414531776