EI Index

Homophily
R
Networks
Ego networks
Homophily
Author

Roberto Cantillan

Published

November 5, 2024

This document develops a data workflow to build a long-format database with the COES survey from waves w2 and w4. We also analyze panel data with the within-between model (Bell & Jones, 2014; Bell et al., 2019), which is well suited for hierarchical data structures, including repeated cross-sectional and panel data.

Our goal is to explore potential relationships between homophily indicators and selected measures of civic behavior. The data analysis relies on the panelr package for R, which builds on lme4. We favor panelr because it streamlines procedures and code while delivering the same results as lme4.

For categorical attributes of alters in the ego network, beyond the proportion of alters similar to ego, a commonly used measure is the EI index (Krackhardt & Stern, 1988; Perry et al., 2018). It is defined as the number of alters different from ego (external ties E) minus the number of alters similar to ego (internal ties I), divided by the total number of alters. This is a “reverse” measure of homophily because higher values indicate greater heterophily. Since it is a linear transformation of the proportion of homophilous ties, its correlation with that proportion is a perfect −1.

\[EI = \frac{E - I}{E + I}\]

The following sections walk through the code. All analyses use data from the ELSOC COES survey, waves 2 and 4. The datasets and documentation can be downloaded from this link.

Load libraries and datasets

pacman::p_load(ggplot2, 
               ggthemes, 
               tidyverse, 
               sjlabelled,
               sjPlot, 
               car, 
               vcd, 
               texreg, 
               ordinal,
               nnet, 
               MASS, 
               mlogit, 
               matrixStats, 
               expss,
               sjlabelled, 
               sjmisc, 
               tidyverse, 
               weights,
               survey,
               viridis,
               plotly)

Load data

load("../../../dat/ELSOC/ELSOC_W02_v3.00_R.RData")
load("../../../dat/ELSOC/ELSOC_W04_v2.01_R.RData")

Subset 2017

# Build 2019 dataset
ego2017 <- elsoc_2017 %>%
  dplyr::select(idencuesta,
                sexo=m0_sexo,
                sexoalter01=r13_sexo_01,
                sexoalter02=r13_sexo_02,
                sexoalter03=r13_sexo_03,
                sexoalter04=r13_sexo_04,
                sexoalter05=r13_sexo_05,
                edad=m0_edad,
                edadalter01=r13_edad_01,
                edadalter02=r13_edad_02,
                edadalter03=r13_edad_03,
                edadalter04=r13_edad_04,
                edadalter05=r13_edad_05,
                relig=m38,
                religalter01=r13_relig_01,
                religalter02=r13_relig_02,
                religalter03=r13_relig_03,
                religalter04=r13_relig_04,
                religalter05=r13_relig_05,
                educ=m01,
                educalter01=r13_educ_01,
                educalter02=r13_educ_02,
                educalter03=r13_educ_03,
                educalter04=r13_educ_04,
                educalter05=r13_educ_05,
                ideol=c15,
                ideolalter01=r13_ideol_01,
                ideolalter02=r13_ideol_02,
                ideolalter03=r13_ideol_03,
                ideolalter04=r13_ideol_04,
                ideolalter05=r13_ideol_05,
                c08_01,
                c08_02,
                c08_03,
                c08_04,
                ponderador01) 

Inspect dataset

ego2017 <- data.frame(ego2017)
#head(ego2017)
dim(ego2017)
[1] 2473   36
# Define missing values
ego2017[ego2017=="-999"] <- NA
ego2017[ego2017=="-888"] <- NA

Recode 2017 variables

Sex

sexolab<-c("man","woman")
ego2017$sexo_h<-factor(Recode(ego2017$sexo,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
ego2017$alterSexo1<-factor(Recode(ego2017$sexoalter01,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
ego2017$alterSexo2<-factor(Recode(ego2017$sexoalter02,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
ego2017$alterSexo3<-factor(Recode(ego2017$sexoalter03,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
ego2017$alterSexo4<-factor(Recode(ego2017$sexoalter04,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
ego2017$alterSexo5<-factor(Recode(ego2017$sexoalter05,"1=1;2=2;-888=NA;-999=NA"),labels=sexolab)
with(ego2017, summary(cbind(alterSexo1,alterSexo2,alterSexo3,alterSexo4,alterSexo5)))
   alterSexo1      alterSexo2      alterSexo3      alterSexo4   
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
 Median :2.000   Median :2.000   Median :2.000   Median :2.000  
 Mean   :1.617   Mean   :1.583   Mean   :1.552   Mean   :1.546  
 3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
 Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
 NA's   :1       NA's   :372     NA's   :864     NA's   :1370   
   alterSexo5   
 Min.   :1.000  
 1st Qu.:1.000  
 Median :2.000  
 Mean   :1.557  
 3rd Qu.:2.000  
 Max.   :2.000  
 NA's   :1692   

Age

edadlab <- c("18-24", "25-34", "35-44", "45-54", "55-64", ">65")
ego2017$edadR<-factor(Recode(ego2017$edad,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)

ego2017$alterAge1<-factor(Recode(ego2017$edadalter01,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)
ego2017$alterAge2<-factor(Recode(ego2017$edadalter02,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)
ego2017$alterAge3<-factor(Recode(ego2017$edadalter03,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)
ego2017$alterAge4<-factor(Recode(ego2017$edadalter04,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)
ego2017$alterAge5<-factor(Recode(ego2017$edadalter05,"lo:24=1;25:34=2;35:44=3;45:54=4;55:64=5;65:hi=6"),labels=edadlab)
with(ego2017, summary(cbind(alterAge1,alterAge2,alterAge3,alterAge4,alterAge5)))
   alterAge1       alterAge2       alterAge3       alterAge4       alterAge5   
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.00  
 1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.00  
 Median :4.000   Median :3.000   Median :3.000   Median :3.000   Median :3.00  
 Mean   :3.607   Mean   :3.376   Mean   :3.328   Mean   :3.312   Mean   :3.37  
 3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.00  
 Max.   :6.000   Max.   :6.000   Max.   :6.000   Max.   :6.000   Max.   :6.00  
 NA's   :1       NA's   :372     NA's   :864     NA's   :1370    NA's   :1692  

Religion

rellab = c("Catholic","Evangelical","Other religion","non-religious")
ego2017$religid<-factor(Recode(ego2017$relig,"1=1;2=2;3:6=3;7:9=4;-999:-888=4"),labels=rellab)
ego2017$alterRelig1<-factor(Recode(ego2017$religalter01,"1=1;2=2;3:4=4;5=3;-999:-888=4"),labels=rellab)
ego2017$alterRelig2<-factor(Recode(ego2017$religalter02,"1=1;2=2;3:4=4;5=3;-999:-888=4"),labels=rellab)
ego2017$alterRelig3<-factor(Recode(ego2017$religalter03,"1=1;2=2;3:4=4;5=3;-999:-888=4"),labels=rellab)
ego2017$alterRelig4<-factor(Recode(ego2017$religalter04,"1=1;2=2;3:4=4;5=3;-999:-888=4"),labels=rellab)
ego2017$alterRelig5<-factor(Recode(ego2017$religalter05,"1=1;2=2;3:4=4;5=3;-999:-888=4"),labels=rellab)
with(ego2017, summary(cbind(alterRelig1,alterRelig2,alterRelig3,alterRelig4,alterRelig5)))
  alterRelig1     alterRelig2     alterRelig3     alterRelig4   
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
 Median :1.000   Median :1.000   Median :1.000   Median :1.000  
 Mean   :1.747   Mean   :1.762   Mean   :1.836   Mean   :1.784  
 3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
 Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000  
 NA's   :1       NA's   :372     NA's   :864     NA's   :1370   
  alterRelig5   
 Min.   :1.000  
 1st Qu.:1.000  
 Median :1.000  
 Mean   :1.809  
 3rd Qu.:2.000  
 Max.   :4.000  
 NA's   :1692   

Education

edulab = c("Primary", "Secondary", "Technical higher", "University higher")
ego2017$educaF<-factor(Recode(ego2017$educ,"1:3=1;4:5=2;6:7=3;8:10=4;-888=NA;-999=NA"),labels=edulab)
ego2017$alterEduca1<-factor(Recode(ego2017$educalter01,"1=1;2:3=2;4=3;5=4;-888=NA;-999=NA"),labels=edulab)
ego2017$alterEduca2<-factor(Recode(ego2017$educalter02,"1=1;2:3=2;4=3;5=4;-888=NA;-999=NA"),labels=edulab)
ego2017$alterEduca3<-factor(Recode(ego2017$educalter03,"1=1;2:3=2;4=3;5=4;-888=NA;-999=NA"),labels=edulab)
ego2017$alterEduca4<-factor(Recode(ego2017$educalter04,"1=1;2:3=2;4=3;5=4;-888=NA;-999=NA"),labels=edulab)
ego2017$alterEduca5<-factor(Recode(ego2017$educalter05,"1=1;2:3=2;4=3;5=4;-888=NA;-999=NA"),labels=edulab)
with(ego2017, summary(cbind(alterEduca1,alterEduca2,alterEduca3,alterEduca4,alterEduca5)))
  alterEduca1     alterEduca2     alterEduca3     alterEduca4   
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
 Median :2.000   Median :2.000   Median :2.000   Median :2.000  
 Mean   :2.344   Mean   :2.394   Mean   :2.438   Mean   :2.489  
 3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:4.000  
 Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000  
 NA's   :142     NA's   :481     NA's   :940     NA's   :1412   
  alterEduca5   
 Min.   :1.000  
 1st Qu.:2.000  
 Median :2.000  
 Mean   :2.454  
 3rd Qu.:3.000  
 Max.   :4.000  
 NA's   :1724   

Political position

pollab <- c("Left", "Center", "Right", "Independent/None", "NA")
ego2017$izqderR<-factor(Recode(ego2017$ideol,"0:3=1;4:6=2;7:10=3;11:12=4;NA=5"),labels=pollab)
ego2017$alterPospol1=factor(Recode(ego2017$ideolalter01,"1:2=3;3=2;4:5=1;6=4;NA=5"),labels=pollab)
ego2017$alterPospol2=factor(Recode(ego2017$ideolalter02,"1:2=3;3=2;4:5=1;6=4;NA=5"),labels=pollab)
ego2017$alterPospol3=factor(Recode(ego2017$ideolalter03,"1:2=3;3=2;4:5=1;6=4;NA=5"),labels=pollab)
ego2017$alterPospol4=factor(Recode(ego2017$ideolalter04,"1:2=3;3=2;4:5=1;6=4;NA=5"),labels=pollab)
ego2017$alterPospol5=factor(Recode(ego2017$ideolalter05,"1:2=3;3=2;4:5=1;6=4;NA=5"),labels=pollab)
with(ego2017,summary(cbind(alterPospol1,alterPospol2,alterPospol3,alterPospol4,alterPospol5)))
  alterPospol1   alterPospol2    alterPospol3    alterPospol4    alterPospol5  
 Min.   :1.00   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:3.00   1st Qu.:3.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000  
 Median :4.00   Median :4.000   Median :4.000   Median :5.000   Median :5.000  
 Mean   :3.58   Mean   :3.747   Mean   :4.013   Mean   :4.318   Mean   :4.493  
 3rd Qu.:4.00   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000  
 Max.   :5.00   Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  

Network size

ego2017$tamred = as.numeric(!is.na(ego2017$sexoalter01)) + 
  as.numeric(!is.na(ego2017$sexoalter02)) +
  as.numeric(!is.na(ego2017$sexoalter03)) + 
  as.numeric(!is.na(ego2017$sexoalter04)) +
  as.numeric(!is.na(ego2017$sexoalter05))
print(prop.table(table(ego2017$tamred)), 2)

     0      1      2      3      4      5 
0.0004 0.1500 0.1989 0.2046 0.1302 0.3158 
ego2017$tamred[ego2017$tamred==0] <- NA
table(ego2017$tamred)

  1   2   3   4   5 
371 492 506 322 781 

Plot tamred

Alter political position by ego network size

ego2017$alterPospol1t<-Recode(ego2017$alterPospol1,"1:2=3;3=2;4:5=1;6:5=4")
ego2017$alterPospol2t<-Recode(ego2017$alterPospol2,"1:2=3;3=2;4:5=1;6:5=4")
ego2017$alterPospol3t<-Recode(ego2017$alterPospol3,"1:2=3;3=2;4:5=1;6:5=4")
ego2017$alterPospol4t<-Recode(ego2017$alterPospol4,"1:2=3;3=2;4:5=1;6:5=4")
ego2017$alterPospol5t<-Recode(ego2017$alterPospol5,"1:2=3;3=2;4:5=1;6:5=4")

Tpospol1=with(ego2017,table(tamred,alterPospol1t), na.rm=T)
Tpospol2=with(ego2017,table(tamred,alterPospol2t), na.rm=T)
Tpospol3=with(ego2017,table(tamred,alterPospol3t), na.rm=T)
Tpospol4=with(ego2017,table(tamred,alterPospol4t), na.rm=T)
Tpospol5=with(ego2017,table(tamred,alterPospol5t), na.rm=T)

Hpospol=Tpospol1+Tpospol2+Tpospol3+Tpospol4+Tpospol5
Hpospol=round(Hpospol, 0)
dimnames(Hpospol)=list(tamred= c("1", "2", "3", "4","5"),
                       alter = c("Left", "Center", "Right", "Independent/None", "NA"))

hom_tam<-as.data.frame(round(prop.table(Hpospol,1),2))
# First create the ggplot
p1 <- hom_tam %>%
  drop_na() %>%
  ggplot(aes(x = tamred, y = Freq, fill = alter, 
             text = paste("Network size:", tamred,
                         "<br>Political position:", alter,
                         "<br>Proportion:", scales::percent(Freq, accuracy = 0.1)))) +
  geom_bar(position = 'dodge', stat = 'identity') +
  labs(title = "Alter political position", 
       x = "Network size", 
       y = "") +
  scale_fill_viridis_d(alpha = 1, begin = 0, end = 1, direction = 1, option = "F") +  
  scale_y_continuous(limits = c(0, 1)) +
  theme_light()

# Convert to plotly
ggplotly(p1, tooltip = "text")

Homophily by political position

library(car)
#rec
ego2017$izqderRx<-Recode(ego2017$ideol,"0:3=1;3:6=2;7:10=3;11:12=4;-999:-888=NA")
ego2017$alterPospol1x=Recode(ego2017$ideolalter01,"1:2=3;3=2;4:5=1;6=4;-999:-888=NA")
ego2017$alterPospol2x=Recode(ego2017$ideolalter02,"1:2=3;3=2;4:5=1;6=4;-999:-888=NA")
ego2017$alterPospol3x=Recode(ego2017$ideolalter03,"1:2=3;3=2;4:5=1;6=4;-999:-888=NA")
ego2017$alterPospol4x=Recode(ego2017$ideolalter04,"1:2=3;3=2;4:5=1;6=4;-999:-888=NA")
ego2017$alterPospol5x=Recode(ego2017$ideolalter05,"1:2=3;3=2;4:5=1;6=4;-999:-888=NA")

Tpospol1=with(ego2017,table(izqderRx,alterPospol1x))
Tpospol2=with(ego2017,table(izqderRx,alterPospol2x))
Tpospol3=with(ego2017,table(izqderRx,alterPospol3x))
Tpospol4=with(ego2017,table(izqderRx,alterPospol4x))
Tpospol5=with(ego2017,table(izqderRx,alterPospol5x))

Hpospol=Tpospol1+Tpospol2+Tpospol3+Tpospol4+Tpospol5
Hpospol=round(Hpospol, 0)
dimnames(Hpospol)=list(ego=c("Left", "Center", "Right", "Independent/None"),
                       alter=c("Left", "Center", "Right", "Independent/None"))
round(prop.table(Hpospol,1),2)
                  alter
ego                Left Center Right Independent/None
  Left             0.41   0.04  0.10             0.45
  Center           0.14   0.10  0.14             0.61
  Right            0.12   0.07  0.39             0.42
  Independent/None 0.05   0.02  0.06             0.87
qq3<-as.data.frame(round(prop.table(Hpospol,1),2))
# First create the ggplot
p2 <- qq3 %>%
  ggplot(aes(x = ego, y = Freq, fill = alter,
             text = paste("Ego:", ego,
                         "<br>Alter:", alter,
                         "<br>Proportion:", scales::percent(Freq, accuracy = 0.1)))) +
  geom_bar(position = 'dodge', stat = 'identity') +
  labs(title = "Political dyads", 
       x = "Ego political position", 
       y = "") +
  scale_fill_viridis_d(alpha = 1, begin = 0, end = 1, direction = 1, option = "F") + 
  scale_y_continuous(limits = c(0, 1)) +
  theme_light()

# Convert to plotly
ggplotly(p2, tooltip = "text")

Calculating E-I homophily by political position (ELSOC 2017)

Krackhardt and Stern’s (1988) E-I Index

We classify alters as external (categories different from the ego’s) or internal (same category as the ego). Values of −1 imply perfect homophily, whereas values of +1 indicate perfect heterophily.

EI political position

ego2017$pospol_alt1_clasif<-ifelse(ego2017$izqderR==ego2017$alterPospol1,"External", "Internal")
ego2017$pospol_alt2_clasif<-ifelse(ego2017$izqderR==ego2017$alterPospol2,"External", "Internal")
ego2017$pospol_alt3_clasif<-ifelse(ego2017$izqderR==ego2017$alterPospol3,"External", "Internal")
ego2017$pospol_alt4_clasif<-ifelse(ego2017$izqderR==ego2017$alterPospol4,"External", "Internal")
ego2017$pospol_alt5_clasif<-ifelse(ego2017$izqderR==ego2017$alterPospol5,"External", "Internal")

# Add information about the tie types
ego2017$pospol_external<-count_row_if(criterion = "External", 
                                        ego2017$pospol_alt1_clasif, 
                                        ego2017$pospol_alt2_clasif,
                                        ego2017$pospol_alt3_clasif, 
                                        ego2017$pospol_alt4_clasif, 
                                        ego2017$pospol_alt5_clasif) 

ego2017$pospol_internal<-count_row_if(criterion = "Internal", 
                                        ego2017$pospol_alt1_clasif, 
                                        ego2017$pospol_alt2_clasif,
                                        ego2017$pospol_alt3_clasif, 
                                        ego2017$pospol_alt4_clasif, 
                                        ego2017$pospol_alt5_clasif) 

# Finally, calculate the EI indicator
ego2017$EI_index_pospol<-(ego2017$pospol_external-ego2017$pospol_internal)/
                         (ego2017$pospol_external+ego2017$pospol_internal)

summary(ego2017$EI_index_pospol)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -1.000  -1.000  -0.600  -0.423  -0.200   1.000 

EI religion

ego2017$alterRelig1_clasif<-ifelse(ego2017$religid==ego2017$alterRelig1,"External","Internal")
ego2017$alterRelig2_clasif<-ifelse(ego2017$religid==ego2017$alterRelig2,"External","Internal")
ego2017$alterRelig3_clasif<-ifelse(ego2017$religid==ego2017$alterRelig3,"External","Internal")
ego2017$alterRelig4_clasif<-ifelse(ego2017$religid==ego2017$alterRelig4,"External","Internal")
ego2017$alterRelig5_clasif<-ifelse(ego2017$religid==ego2017$alterRelig5,"External","Internal")

# Add information about the tie types
ego2017$relig_external<-count_row_if(criterion = "External", 
                                     ego2017$alterRelig1_clasif, 
                                     ego2017$alterRelig2_clasif,
                                     ego2017$alterRelig3_clasif, 
                                     ego2017$alterRelig4_clasif, 
                                     ego2017$alterRelig5_clasif) 

ego2017$relig_internal<-count_row_if(criterion = "Internal", 
                                     ego2017$alterRelig1_clasif, 
                                     ego2017$alterRelig2_clasif,
                                     ego2017$alterRelig3_clasif, 
                                     ego2017$alterRelig4_clasif, 
                                     ego2017$alterRelig5_clasif) 

# Finally, calculate the EI indicator
ego2017$EI_index_relig<-(ego2017$relig_external-ego2017$relig_internal)/
                        (ego2017$relig_external+ego2017$relig_internal)

summary(ego2017$EI_index_relig)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000 -0.3333  0.6000  0.2776  1.0000  1.0000       8 

EI education

ego2017$alterEduca1_clasif<-ifelse(ego2017$educaF==ego2017$alterEduca1,"External","Internal")
ego2017$alterEduca2_clasif<-ifelse(ego2017$educaF==ego2017$alterEduca2,"External","Internal")
ego2017$alterEduca3_clasif<-ifelse(ego2017$educaF==ego2017$alterEduca3,"External","Internal")
ego2017$alterEduca4_clasif<-ifelse(ego2017$educaF==ego2017$alterEduca4,"External","Internal")
ego2017$alterEduca5_clasif<-ifelse(ego2017$educaF==ego2017$alterEduca5,"External","Internal")

# Add information about the tie types
ego2017$educ_external<-count_row_if(criterion = "External", 
                                    ego2017$alterEduca1_clasif, 
                                    ego2017$alterEduca2_clasif,
                                    ego2017$alterEduca3_clasif, 
                                    ego2017$alterEduca4_clasif, 
                                    ego2017$alterEduca5_clasif) 

ego2017$educ_internal<-count_row_if(criterion = "Internal", 
                                    ego2017$alterEduca1_clasif, 
                                    ego2017$alterEduca2_clasif,
                                    ego2017$alterEduca3_clasif, 
                                    ego2017$alterEduca4_clasif, 
                                    ego2017$alterEduca5_clasif) 

# Finally, calculate the EI indicator
ego2017$EI_index_educ<-(ego2017$educ_external-ego2017$educ_internal)/
                        (ego2017$educ_external+ego2017$educ_internal)

summary(ego2017$EI_index_educ)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-1.00000 -1.00000  0.00000 -0.03621  0.60000  1.00000       59 

EI sex

ego2017$alterSexo1_clasif<-ifelse(ego2017$sexo_h==ego2017$alterSexo1,"External","Internal")
ego2017$alterSexo2_clasif<-ifelse(ego2017$sexo_h==ego2017$alterSexo2,"External","Internal")
ego2017$alterSexo3_clasif<-ifelse(ego2017$sexo_h==ego2017$alterSexo3,"External","Internal")
ego2017$alterSexo4_clasif<-ifelse(ego2017$sexo_h==ego2017$alterSexo4,"External","Internal")
ego2017$alterSexo5_clasif<-ifelse(ego2017$sexo_h==ego2017$alterSexo5,"External","Internal")

# Add information about the tie types
ego2017$sexo_external<-count_row_if(criterion = "External", 
                                    ego2017$alterSexo1_clasif, 
                                    ego2017$alterSexo2_clasif,
                                    ego2017$alterSexo3_clasif, 
                                    ego2017$alterSexo4_clasif, 
                                    ego2017$alterSexo5_clasif) 

ego2017$sexo_internal<-count_row_if(criterion = "Internal", 
                                    ego2017$alterSexo1_clasif, 
                                    ego2017$alterSexo2_clasif,
                                    ego2017$alterSexo3_clasif, 
                                    ego2017$alterSexo4_clasif, 
                                    ego2017$alterSexo5_clasif) 

# Finally, calculate the EI indicator
ego2017$EI_index_sexo<-(ego2017$sexo_external-ego2017$sexo_internal)/
                       (ego2017$sexo_external+ego2017$sexo_internal)

summary(ego2017$EI_index_sexo)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000 -0.2000  0.3333  0.2583  1.0000  1.0000       1 

EI age

ego2017$alterAge1_clasif<-ifelse(ego2017$edadR==ego2017$alterAge1,"External","Internal")
ego2017$alterAge2_clasif<-ifelse(ego2017$edadR==ego2017$alterAge2,"External","Internal")
ego2017$alterAge3_clasif<-ifelse(ego2017$edadR==ego2017$alterAge3,"External","Internal")
ego2017$alterAge4_clasif<-ifelse(ego2017$edadR==ego2017$alterAge4,"External","Internal")
ego2017$alterAge5_clasif<-ifelse(ego2017$edadR==ego2017$alterAge5,"External","Internal")

# Add information about the tie types
ego2017$age_external<-count_row_if(criterion = "External", 
                                   ego2017$alterAge1_clasif, 
                                   ego2017$alterAge2_clasif,
                                   ego2017$alterAge3_clasif, 
                                   ego2017$alterAge4_clasif, 
                                   ego2017$alterAge5_clasif) 

ego2017$age_internal<-count_row_if(criterion = "Internal", 
                                   ego2017$alterAge1_clasif, 
                                   ego2017$alterAge2_clasif,
                                   ego2017$alterAge3_clasif, 
                                   ego2017$alterAge4_clasif, 
                                   ego2017$alterAge5_clasif) 

# Finally, calculate the EI indicator
ego2017$EI_index_age<-(abs(ego2017$age_external-ego2017$age_internal)/
                      (ego2017$age_external+ego2017$age_internal))

summary(ego2017$EI_index_age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.0000  0.3333  0.6000  0.6177  1.0000  1.0000       1 
# Verifica que la variable existe
names(ego2017)  # Should display EI_index_pospol in the list
  [1] "idencuesta"         "sexo"               "sexoalter01"       
  [4] "sexoalter02"        "sexoalter03"        "sexoalter04"       
  [7] "sexoalter05"        "edad"               "edadalter01"       
 [10] "edadalter02"        "edadalter03"        "edadalter04"       
 [13] "edadalter05"        "relig"              "religalter01"      
 [16] "religalter02"       "religalter03"       "religalter04"      
 [19] "religalter05"       "educ"               "educalter01"       
 [22] "educalter02"        "educalter03"        "educalter04"       
 [25] "educalter05"        "ideol"              "ideolalter01"      
 [28] "ideolalter02"       "ideolalter03"       "ideolalter04"      
 [31] "ideolalter05"       "c08_01"             "c08_02"            
 [34] "c08_03"             "c08_04"             "ponderador01"      
 [37] "sexo_h"             "alterSexo1"         "alterSexo2"        
 [40] "alterSexo3"         "alterSexo4"         "alterSexo5"        
 [43] "edadR"              "alterAge1"          "alterAge2"         
 [46] "alterAge3"          "alterAge4"          "alterAge5"         
 [49] "religid"            "alterRelig1"        "alterRelig2"       
 [52] "alterRelig3"        "alterRelig4"        "alterRelig5"       
 [55] "educaF"             "alterEduca1"        "alterEduca2"       
 [58] "alterEduca3"        "alterEduca4"        "alterEduca5"       
 [61] "izqderR"            "alterPospol1"       "alterPospol2"      
 [64] "alterPospol3"       "alterPospol4"       "alterPospol5"      
 [67] "tamred"             "alterPospol1t"      "alterPospol2t"     
 [70] "alterPospol3t"      "alterPospol4t"      "alterPospol5t"     
 [73] "izqderRx"           "alterPospol1x"      "alterPospol2x"     
 [76] "alterPospol3x"      "alterPospol4x"      "alterPospol5x"     
 [79] "pospol_alt1_clasif" "pospol_alt2_clasif" "pospol_alt3_clasif"
 [82] "pospol_alt4_clasif" "pospol_alt5_clasif" "pospol_external"   
 [85] "pospol_internal"    "EI_index_pospol"    "alterRelig1_clasif"
 [88] "alterRelig2_clasif" "alterRelig3_clasif" "alterRelig4_clasif"
 [91] "alterRelig5_clasif" "relig_external"     "relig_internal"    
 [94] "EI_index_relig"     "alterEduca1_clasif" "alterEduca2_clasif"
 [97] "alterEduca3_clasif" "alterEduca4_clasif" "alterEduca5_clasif"
[100] "educ_external"      "educ_internal"      "EI_index_educ"     
[103] "alterSexo1_clasif"  "alterSexo2_clasif"  "alterSexo3_clasif" 
[106] "alterSexo4_clasif"  "alterSexo5_clasif"  "sexo_external"     
[109] "sexo_internal"      "EI_index_sexo"      "alterAge1_clasif"  
[112] "alterAge2_clasif"   "alterAge3_clasif"   "alterAge4_clasif"  
[115] "alterAge5_clasif"   "age_external"       "age_internal"      
[118] "EI_index_age"      
summary(ego2017$EI_index_pospol)  # Should display the statistical summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -1.000  -1.000  -0.600  -0.423  -0.200   1.000 
# Revised plot with viridis
p3 <- ggplot(data = ego2017,
             aes(x = EI_index_pospol)) + 
  geom_histogram(aes(y = after_stat(count),
                     fill = after_stat(count),  # Add fill within aes()
                     text = paste("E-I index:", round(x, 3),
                                "<br>Frequency:", after_stat(count))),
                 binwidth = 0.1) +
  scale_fill_viridis_c(alpha = 1,   # Use scale_fill_viridis_c() for continuous data
                       begin = 0,
                       end = 1,
                       direction = 1,
                       option = "F",
                       guide = FALSE) +  # Remove the legend
  labs(title = "Political homophily in personal networks",
       subtitle = "E-I homophily (Krackhardt & Stern, 1988)",
       caption = "Source: ELSOC COES 2017",
       x = "",
       y = "") +
  theme_light()

# Convert to plotly
ggplotly(p3, tooltip = "text")

References

  • Krackhardt, D., & Stern, R. N. (1988). Informal networks and organizational crises: An experimental simulation. Social Psychology Quarterly, 123–140.