Autor/a

Aníbal Olivera

Fecha de publicación

8 de enero de 2025

1. Introducción

Este módulo tiene como objetivo replicar la metodología de estimación de fuerza homofílica presentada en el paper:

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. [10.1177/0003122414531776].

El objetivo inferencial es estimar la homofilia relativa al azar: el efecto de la distancia sociodemográfica sobre la probabilidad de un lazo, una vez controlada la estructura de oportunidades inducida por las distribuciones marginales de atributos en la población.

Trabajamos con datos de la General Social Survey (GSS 1985 y 2004), específicamente el módulo de redes de discusión (core discussion network / important matters module), donde cada encuestado -ego- nomina hasta un número acotado de confidentes -alters-. Para detalles de acceso a los microdatos: [https://gss.norc.org/get-the-data/stata.html].

Blau space

Espacio de Blau es una forma de representar la “ubicación social” de las personas en un espacio multidimensional construido a partir de atributos sociodemográficos.

La idea central es tratar cada variable (p. ej., edad, educación, sexo, raza, religión) como una dimensión de un espacio \(M\)-dimensional, de modo que cada individuo i queda descrito por un vector de coordenadas \(s_i = (s_{i1}, s_{i2}, \dots, s_{iM})\) en un espacio euclídeo \(\mathbb{R}^M\).

Una operacionalización estándar de distancia es la euclidiana: \[ d_{ij} = \sqrt{ \sum_{m=1}^M (s_{im} - s_{jm})^2 }, \]

Donde cada coordenada \(s_{im}\) representa una dimensión social. Intuitivamente, a mayor \(d_{ij}\), mayor es la separación sociodemográfica entre dos personas. El espacio de Blau es útil porque conecta datos de encuestas tradicionales con una estructura relacional plausible.

Así que lo que queremos es algo del estilo \[ \text{logit}\big(\Pr(Y_{ij}=1)\big) = \alpha + \boldsymbol{\beta}^\top \mathbf{d}_{ij} \]

donde \(\mathbf{d}_{ij}\) es un vector de distancias sociodemográficas entre el ego \(i\) y el alter \(j\) y \(\boldsymbol{\beta}\) son los coeficientes de pendiente que cuantifican “cuánto cae” la probabilidad de un lazo al aumentar la distancia social: fuerza homofílica.

Case-control design

Para calcular \(\boldsymbol{\beta}\), necesitamos una variable respuesta \(Y_{ij}\) que indique si existe un lazo entre el ego \(i\) y el alter \(j\). Sin embargo, no nos podemos fiar de \(Y_{ij}=0\).

Nuestra unidad de análisis son díadas \((i,j)\), donde \(i\) indexa al ego y \(j\) al alter. Conceptualmente, la variable respuesta se define sobre el universo de pares potenciales:

\[ Y_{ij} = \begin{cases} 1 & \text{si existe un lazo de confidencia entre } i \text{ y } j \\ 0 & \text{si no existe dicho lazo} \end{cases} \]

En principio, una estimación “directa” requeriría construir el dataset completo de díadas potenciales. Si hay \(N > 10^3\) encuestados en un año, el número de diadas es:

\[ \binom{N}{2} = \frac{N(N-1)}{2}\sim 10^6. \]

Sin embargo, el problema no es únicamente computacional. En encuestas tipo GSS, no observamos el estado del lazo \(Y_{ij}\) para la gran mayoría de pares; solo observamos los lazos reportados (nominaciones). Por lo tanto, si intentáramos construir el universo completo, tendríamos que imputar que todos los pares no observados son no-lazos, lo cual equivale a asumir:

\[ Y_{ij}=0 \quad \forall (i,j)\ \text{no observados}. \]

Esta suposición puede ser demasiado fuerte dada (i) la truncación del generador —nominaciones máximas por ego—, (ii) potenciales errores de medición, y (iii) instrumentación que difieren entre olas.

Además, el evento “lazo de confidencia” es raro: el número de lazos observados escala como \(O(N)\), mientras que el número de pares potenciales escala como \(O(N^2)\). Por tanto, la prevalencia poblacional del evento se comporta aproximadamente como:

\[ \Pr(Y_{ij}=1)\ \approx\ \frac{O(N)}{O(N^2)}\ =\ O\!\left(\frac{1}{N}\right), \]

lo que produce un desbalance extremo entre \(Y=1\) y \(Y=0\) si se trabajara con el universo completo.

Finalmente, incluso si se pudiera enumerar el universo, las observaciones a nivel de díada no son independientes: un mismo encuestado aparece en muchas filas. Esto viola el supuesto de observaciones i.i.d. (independent and identically distributed): En este problema, lo que más afecta la inferencia naïve es la no-independencia: muchas díadas comparten el mismo ego (y/o el mismo alter), lo que induce correlación entre filas y tiende a producir errores estándar artificialmente pequeños si se ajusta una logística como si cada díada fuera una observación independiente.

Por estas razones, utilizamos un case-control design para la construcción de no-lazos plausibles mediante un mecanismo de muestreo definido:

  1. Casos (\(Y=1\)): díadas observadas.
  2. Controles (\(Y=0\)): díadas construidas artificialmente mediante emparejamiento aleatorio (random pairing) de encuestados dentro del mismo año dado el perfil demográfico observado.

En este esquema, la variable respuesta puede describirse como:

\[ Y_{ij} = \begin{cases} 1 & \text{si } (i,j) \text{ es un lazo observado } \\ 0 & \text{si } (i,j) \text{ proviene del muestreo de controles } \end{cases} \]

Además, existe una asimetría estructural: los casos (ego–confidant) están naturalmente “anidados” en el ego, mientras que los controles quedan “cruzados” entre muchos respondentes. Esa estructura dificulta imponer una sola jerarquía clara de anidamiento para un modelo multinivel estándar, y por ello el paper recurre a una estrategia de inferencia basada en bootstrap a nivel de encuestado: re-muestrean respondentes, reconstruyen casos y controles dentro de cada iteración (incluyendo random matching with replacement para controles), re-estiman el modelo y obtienen errores estándar desde la variabilidad de los coeficientes a través de iteraciones

2. Implementación

En esta sección implementamos (i) la construcción de controles plausibles (non-ties) y (ii) la estimación de modelos logísticos. El foco inferencial está en los coeficientes de pendiente \(\boldsymbol{\beta}\), que cuantifican “cuánto cae” la probabilidad (en log-odds) de un lazo al aumentar la distancia social.

2.1. Cargar Datos Limpios

Cargamos los datos procesados en el paso de Limpieza GSS y construimos los objetos cases_1985 y cases_2004 que contienen díadas ego–alter observadas (casos).

A partir de ellas construimos un “pool” de egos únicos egos_unique_* que sirve como base para muestrear controles.

Código
library(dplyr)
library(tidyr)
library(broom)
library(stargazer)

# Rutas de datos intermedios
FILE_1985 <- "data/clean_gss_1985.rds"
FILE_2004 <- "data/clean_gss_2004.rds"

# Cargamos
egos_1985 <- readRDS(FILE_1985)
cases_1985 <- egos_1985
egos_unique_1985 <- cases_1985 %>%
    select(
        ego_id, ego_age, ego_sex, ego_race,
        ego_relig, ego_educ, year
    ) %>%
    distinct()

egos_2004 <- readRDS(FILE_2004)
cases_2004 <- egos_2004
egos_unique_2004 <- cases_2004 %>%
    select(
        ego_id, ego_age, ego_sex, ego_race,
        ego_relig, ego_educ, year
    ) %>%
    distinct()

# Combinar años
all_cases <- bind_rows(cases_1985, cases_2004)
all_egos <- bind_rows(egos_unique_1985, egos_unique_2004)

Exploración rápida:

Dyads (cases) 1985: 4258 
Dyads (cases) 2004: 2743 
Dyads (cases) total: 7001 
Unique egos 1985: 1359 
Unique egos 2004: 1042 
Unique egos total: 2401 

2.2. Generación de Controles

En el diseño de casos y controles, los controles se interpretan como “no-lazos plausibles” obtenidos mediante emparejamiento aleatorio dentro del mismo año. Aquí implementamos una aproximación pedagógica:

  • Para cada ego del pool, generamos \(k\) controles seleccionando \(k\) alters al azar desde el mismo pool (con reemplazo).
  • Eliminamos auto-lazos accidentales (\(i=j\)).
  • Marcamos estas díadas como tie = 0.
Código
generate_controls <- function(ego_df, n_controls_per_case) {
    n_egos <- nrow(ego_df)

    # Expandir egos para generar múltiples controles
    controls <- ego_df[rep(1:n_egos, each = n_controls_per_case), ]

    # Samplear alters (otros egos) con reemplazo
    alter_indices <- sample(1:n_egos, nrow(controls), replace = TRUE)
    sampled_alters <- ego_df[alter_indices, ]

    # Asignar atributos del alter ficticio
    controls$alter_id <- sampled_alters$ego_id
    controls$alter_age <- sampled_alters$ego_age
    controls$alter_sex <- sampled_alters$ego_sex
    controls$alter_race <- sampled_alters$ego_race
    controls$alter_relig <- sampled_alters$ego_relig
    controls$alter_educ <- sampled_alters$ego_educ

    # Eliminar auto-lazos accidentales
    controls <- controls %>% filter(ego_id != alter_id)

    # Marcas: Y=0 (Control), is_kin=0 (Asumido no pariente)
    controls$tie <- 0
    controls$is_kin <- 0

    return(controls)
}

# Generamos controles por separado para mantener estructura temporal
controls_1985 <- generate_controls(egos_unique_1985, n_controls_per_case = 10)
controls_2004 <- generate_controls(egos_unique_2004, n_controls_per_case = 10)

all_controls <- bind_rows(controls_1985, controls_2004)

Exploración rápida:

Controls 1985: 13582 
Controls 2004: 10411 
Controls total: 23993 

Nota metodológica sobre \(k\). El valor de \(k\) controla el tamaño del control set. Esto afecta el intercepto (prevalencia) pero no debería afectar sustantivamente los \(\boldsymbol{\beta}\) en case–control ideal.

2.3. Distancia Social

Definimos el vector de distancias \(\mathbf{d}_{ij}\) para cada díada. Siguiendo la lógica del paper:

  • Para dimensiones categóricas usamos indicadores de mismatch: \[ d^{\mathrm{cat}}_{ij} = \mathbb{I}(x^{\mathrm{cat}}_i \neq x^{\mathrm{cat}}_j) \]
  • Para dimensiones continuas usamos distancia absoluta: \[ d^{\mathrm{cont}}_{ij} = |x^{\mathrm{cont}}_i - x^{\mathrm{cont}}_j| \]

Así, los coeficientes se interpretarán como penalizaciones (en log-odds) por “cruzar” una frontera categórica (sexo/raza/religión) o por aumentar una unidad de distancia (edad/educación).

Código
social_difference <- function(dyad_df) {
    dyad_df %>%
        mutate(
            # Mismatch Indicators
            diff_sex = if_else(ego_sex != alter_sex, 1, 0),
            diff_race = if_else(ego_race != alter_race, 1, 0),
            diff_relig = if_else(ego_relig != alter_relig, 1, 0),

            # Absolute Differences
            age_diff = abs(ego_age - alter_age),
            edu_diff = abs(ego_educ - alter_educ)
        )
}

# Preparar dataset analítico
all_cases$tie <- 1
all_cases$is_kin <- 0

# Unimos Casos y Controles
analysis_data <- bind_rows(
    all_cases %>% select(any_of(names(all_controls))),
    all_controls
)

analysis_data <- social_difference(analysis_data)

Exploración rápida (dataset analítico y distancias). Antes de modelar, conviene inspeccionar: tamaño final, tasa de tie=1, y rangos plausibles de distancias.

Analysis dataset rows: 30994 
Tie counts:

    0     1 
23993  7001 

Tie rate (P[Y=1] in analysis sample): 0.2258824 
Summary of distance predictors:
   diff_race        diff_relig        diff_sex         age_diff    
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   : 0.00  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.: 6.00  
 Median :0.0000   Median :1.0000   Median :0.0000   Median :14.00  
 Mean   :0.2032   Mean   :0.5232   Mean   :0.4719   Mean   :17.54  
 3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:27.00  
 Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :71.00  
                  NA's   :486                                      
    edu_diff     
 Min.   : 0.000  
 1st Qu.: 1.000  
 Median : 2.000  
 Mean   : 2.964  
 3rd Qu.: 4.000  
 Max.   :20.000  
                 

2.4. Modelos de Regresión Logística

Estimamos la probabilidad de lazo usando modelos logísticos. Manteniendo la notación del módulo:

Modelo Base

El modelo base es un modelo logístico simple que evalúa la probabilidad de lazo \(Y_{ij}\) como una función de la distancia social \(\mathbf{d}_{ij}\): \[ \text{logit}\big(\Pr(Y_{ij}=1)\big) = \alpha + \boldsymbol{\beta}^\top \mathbf{d}_{ij} + \delta \cdot \mathbb{I}(year=2004) \]

Donde los coeficientes \(\beta_k\) representan la fuerza homofílica. Un \(\beta_k < 0\) indica que mayor distancia reduce la probabilidad de lazo (es decir, hay homofilia).

Modelo de Cambio Temporal

El modelo de cambio temporal es un modelo logístico que evalúa la probabilidad de lazo \(Y_{ij}\) como una función de la distancia social \(\mathbf{d}_{ij}\) y la interacción entre la distancia y el año 2004:

\[ \text{logit}\big(\Pr(Y_{ij}=1)\big) = \alpha + \boldsymbol{\beta}^\top \mathbf{d}_{ij} + \boldsymbol{\gamma}^\top (\mathbf{d}_{ij} \cdot \mathbb{I}_{2004}) + \dots \]

  • \(\gamma_k < 0\): La homofilia se intensificó en 2004.
  • \(\gamma_k > 0\): La homofilia se debilitó en 2004.
Código
# Modelo 1: Efectos principales (Main Effects)
m1 <- glm(tie ~ diff_race + diff_relig + diff_sex + age_diff + edu_diff + factor(year),
    data = analysis_data,
    family = binomial(link = "logit")
)

# Modelo 2: Interacciones con Año (Cambio en homofilia)
m2 <- glm(tie ~ (diff_race + diff_relig + diff_sex + age_diff + edu_diff) * factor(year),
    data = analysis_data,
    family = binomial(link = "logit")
)

# Calcular Ns para reporte manual
n_dyads <- nrow(analysis_data)
# Número de encuestados únicos (egos)
n_respondents <- length(unique(analysis_data$ego_id))

stargazer(m1, m2,
    type = "html",
    title = "Replicación Tabla 3: Modelos Logísticos de Homofilia",
    column.labels = c("Modelo Base", "Interacción Temporal"),
    covariate.labels = c("Diff Raza", "Diff Relig", "Diff Sexo", "Diff Edad", "Diff Educ", "Año (2004)", "Diff Raza x Año", "Diff Relig x Año", "Diff Sexo x Año", "Diff Edad x Año", "Diff Educ x Año"),
    dep.var.labels = "Probabilidad de Lazo",
    star.cutoffs = c(0.05, 0.01, 0.001),
    report = "vc*", # Solo coeficientes y estrellas (No SEs)
    keep.stat = c("n"), # Solo N (aunque reportaremos manual)
    add.lines = list(
        c("N (Dyads)", format(n_dyads, big.mark = ","), format(n_dyads, big.mark = ",")),
        c("N (Respondents)", format(n_respondents, big.mark = ","), format(n_respondents, big.mark = ","))
    ),
    omit.table.layout = "n"
)
Replicación Tabla 3: Modelos Logísticos de Homofilia
Dependent variable:
Probabilidad de Lazo
Modelo Base Interacción Temporal
(1) (2)
Diff Raza -1.479*** -1.581***
Diff Relig -1.351*** -1.348***
Diff Sexo -0.375*** -0.440***
Diff Edad -0.046*** -0.045***
Diff Educ -0.162*** -0.139***
Año (2004) 0.011 0.104
Diff Raza x Año 0.190
Diff Relig x Año -0.012
Diff Sexo x Año 0.159*
Diff Edad x Año -0.002
Diff Educ x Año -0.064***
Constant 0.765*** 0.738***
N (Dyads) 30,994 30,994
N (Respondents) 1,885 1,885
Observations 30,508 30,508

2.5. Interpretación de Odds Ratios

Para interpretar la magnitud de los efectos, es útil convertir los coeficientes \(\hat{\beta}\) a Odds Ratios (OR) mediante la exponenciación (\(e^{\hat{\beta}}\)). Por ejemplo, si el coeficiente para Diff Raza es \(\approx -1.60\), entonces \[ OR = e^{-1.60} \approx 0.20 \] Esto significa que la chance de formar un lazo con alguien de otra raza es solo el 20% de la chance de formarlo con alguien de la misma raza (referencia), todo lo demás constante. Dicho de otra forma, tener la misma raza aumenta la probabilidad relativa de lazo en un factor de \(1/0.20 = 5\) veces.

Similarmente, para variables continuas como Diff Edad, si \(\hat{\beta}_{age} \approx -0.05\): \[ OR = e^{-0.05} \approx 0.95 \] Cada año de diferencia reduce la probabilidad relativa del lazo en un 5% (se multiplica por 0.95). Una diferencia de 10 años implicaría \(0.95^{10} \approx 0.60\).

3. Interpretación

Los coeficientes estimados describen la selección por similitud: los parámetros \(\hat\beta\) y \(\hat\gamma\) cuantifican cómo varían las odds de un lazo al aumentar la distancia social, manteniendo constantes las otras dimensiones.

  1. Significado \(\hat\beta\).
  • Si \(\hat\beta_k < 0\), hay evidencia de homofilia (homophily).
  • Para predictores categóricos (p. ej., diff_race), \(\exp(\hat\beta)\) se interpreta como el factor multiplicativo en las odds de un lazo cuando ego y alter son distintos, condicional a las demás covariables.
  • Para distancias continuas (p. ej., age_diff, edu_diff), \(\exp(\hat\beta)\) es el factor en odds por cada unidad adicional de distancia.
  1. Significado \(\hat\gamma\).
  • Si \(\hat\gamma_k < 0\), la penalización por distancia se vuelve más fuerte en 2004 (homofilia se intensifica).
  • Si \(\hat\gamma_k > 0\), la penalización por distancia se vuelve menos fuerte en 2004 (homofilia se debilita).
  1. Inferencia y no-independencia (advertencia).
    La tabla producida por glm() y stargazer() reporta errores estándar bajo el supuesto i.i.d. (independientes e idénticamente distribuidas). En case–control ese supuesto falla por no-independencia. Por eso, una replicación metodológicamente fiel debe reemplazar estos errores estándar por inferencia robusta, típicamente mediante:
  • bootstrap a nivel de encuestado (respondent-level bootstrap) con reconstrucción de casos/controles en cada iteración, y, idealmente,
  • ponderación poblacional (population weights) para alinear el control sample con la estructura de oportunidades del año.
  1. Conexión con imputación de redes.
    En el contexto del workshop, los coeficientes \(\hat{\boldsymbol{\beta}}\) (y, si se usa, \(\hat{\boldsymbol{\gamma}}\)) pueden reinterpretarse como parámetros para generar probabilidades relativas de lazo o pesos de afinidad entre pares, en función de la distancia social.

Bajo una parametrización logística, un esquema natural para imputación es: \[ \Pr(Y_{ij}=1 \mid \mathbf{d}_{ij}) = \text{logit}^{-1}\Big(\alpha + \boldsymbol{\beta}^\top \mathbf{d}_{ij} + \delta \cdot \mathbb{I}(year=2004)\Big), \]

con la salvedad central: para pasar de “preferencias relativas” a una red con densidad realista, se necesita calibrar \(\alpha\) (o imponer restricciones de densidad de red).

4. Referencias

  • 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.
  • McPherson, M., Smith-Lovin, L., & Brashears, M. E. (2009). Social Isolation in America: Changes in Core Discussion Networks over Two Decades. American Sociological Review, 71(3), 353-375.
  • Handcock, M. S., Hunter, D. R., Butts, C. T., Goodreau, S. M., & Morris, M. (2008). statnet: Software tools for the representation, visualization, analysis and simulation of network data.