Skip to content
Statistical RethinkingStatistical Rethinking

5.1 Asociación espuria

Una asociación bivariada fuerte puede desaparecer o incluso invertirse cuando se consideran otras variables. Este es el problema de la asociación espuria. La regresión múltiple nos ayuda a estimar la asociación directa entre dos variables mientras se controla por confusores.

5.1.1 Los datos de divorcio

El ejemplo clásico usa datos a nivel de estado de EE.UU. sobre tasa de divorcio, tasa de matrimonio y edad mediana al matrimonio. La pregunta: ¿la tasa de matrimonio causa la tasa de divorcio, o la asociación es espuria?

# Simulate the divorce data (WaffleDivorce-style)
set.seed(42)
n_states <- 50

# Median age at marriage influences both marriage rate and divorce rate

median_age <- rnorm(n_states, mean = 26, sd = 1.5)

# Marriage rate is influenced by median age

marriage_rate <- 20 - 0.5 * median_age + rnorm(n_states, sd = 3)

# Divorce rate is influenced by median age (not directly by marriage rate)

divorce_rate <- 12 - 0.4 * median_age + rnorm(n_states, sd = 1.5)

# Standardize

divorce_s <- (divorce_rate - mean(divorce_rate)) / sd(divorce_rate)
marriage_s <- (marriage_rate - mean(marriage_rate)) / sd(marriage_rate)
median_age_s <- (median_age - mean(median_age)) / sd(median_age)

# Bivariate correlations

cat("Correlation matrix:\n")
print(round(cor(cbind(divorce_s, marriage_s, median_age_s)), 3))

# Plot

par(mfrow = c(1, 3))
plot(marriage_s, divorce_s, pch = 16, col = "steelblue",
xlab = "Marriage rate (standardized)", ylab = "Divorce rate (standardized)",
main = "Bivariate: marriage vs divorce")
abline(lm(divorce_s ~ marriage_s), lwd = 2, col = "firebrick")

plot(median_age_s, divorce_s, pch = 16, col = "steelblue",
xlab = "Median age (standardized)", ylab = "Divorce rate (standardized)",
main = "Bivariate: age vs divorce")
abline(lm(divorce_s ~ median_age_s), lwd = 2, col = "firebrick")

plot(median_age_s, marriage_s, pch = 16, col = "steelblue",
xlab = "Median age (standardized)", ylab = "Marriage rate (standardized)",
main = "Bivariate: age vs marriage")
abline(lm(marriage_s ~ median_age_s), lwd = 2, col = "firebrick")
par(mfrow = c(1, 1))
Click Run to execute this code in your browser with WebR

La correlación bivariada entre la tasa de matrimonio y la tasa de divorcio es positiva y fuerte. Pero la edad mediana al matrimonio también está correlacionada con ambas. ¿Es la asociación matrimonio-divorcio real, o es espuria?

5.1.2 El modelo de regresión múltiple

El modelo de regresión múltiple incluye ambos predictores:

Di∼Normal(μi,σ)D_i \sim \text{Normal}(\mu_i, \sigma) μi=α+βMMi+βAAi\mu_i = \alpha + \beta_M M_i + \beta_A A_i α∼Normal(0,0.2)\alpha \sim \text{Normal}(0, 0.2) βM∼Normal(0,0.5)\beta_M \sim \text{Normal}(0, 0.5) βA∼Normal(0,0.5)\beta_A \sim \text{Normal}(0, 0.5) σ∼Exponential(1)\sigma \sim \text{Exponential}(1)

donde DiD_i es la tasa de divorcio, MiM_i es la tasa de matrimonio y AiA_i es la edad mediana al matrimonio (todas estandarizadas).

# Multiple regression: divorce ~ marriage + age
# Using simulated data from the previous block

# Bivariate model: divorce ~ marriage only

m_biv <- lm(divorce_s ~ marriage_s)
cat("Bivariate model (divorce ~ marriage):\n")
cat(" beta_M:", round(coef(m_biv)[2], 3), "\n")

# Multiple regression: divorce ~ marriage + age

m_multi <- lm(divorce_s ~ marriage_s + median_age_s)
cat("\nMultiple regression (divorce ~ marriage + age):\n")
cat(" beta_M:", round(coef(m_multi)[2], 3), "\n")
cat(" beta_A:", round(coef(m_multi)[3], 3), "\n")

cat("\nAfter controlling for median age,\n")
cat("the marriage rate coefficient shrinks toward zero.\n")
cat("This suggests the marriage-divorce association is spurious.\n")
Click Run to execute this code in your browser with WebR

5.1.3 Interpretación de los coeficientes

El coeficiente βM\beta_M en la regresión múltiple nos dice la asociación parcial entre la tasa de matrimonio y la tasa de divorcio, manteniendo la edad mediana constante. Si βM\beta_M se reduce casi a cero después de añadir la edad, la asociación bivariada era espuria — la edad era la causa común.

# Visualize the spurious association
# Plot the coefficients from bivariate vs multivariate models

# Bivariate coefficients

biv_M <- coef(m_biv)[2]

# Multivariate coefficients

multi_M <- coef(m_multi)[2]
multi_A <- coef(m_multi)[3]

# Plot

par(mfrow = c(1, 2))

# Coefficient comparison

barplot(c(biv_M, multi_M), names.arg = c("Bivariate", "Multivariate"),
col = c("steelblue", "firebrick"), border = "white",
main = "beta_M: marriage rate effect",
ylab = "Coefficient")
abline(h = 0, lty = 2)

# Predictor effects

barplot(c(multi_M, multi_A), names.arg = c("beta_M", "beta_A"),
col = c("steelblue", "firebrick"), border = "white",
main = "Multivariate coefficients",
ylab = "Coefficient")
abline(h = 0, lty = 2)

par(mfrow = c(1, 1))

cat("The marriage effect (beta_M) nearly disappears\n")
cat("after controlling for median age.\n")
cat("The age effect (beta_A) remains strong.\n")
cat("This is the signature of a spurious association.\n")
Click Run to execute this code in your browser with WebR

5.1.4 La historia causal

La asociación espuria surge porque la edad mediana al matrimonio es una causa común tanto de la tasa de matrimonio como de la tasa de divorcio. El grafo causal es:

A→MA \rightarrow M A→DA \rightarrow D

No hay una flecha directa de MM a DD. La asociación bivariada entre MM y DD se debe enteramente a la causa común AA. La regresión múltiple estima el efecto directo de MM sobre DD al condicionar sobre AA, lo que elimina el camino espurio.

Rethinking

Regresión no es causalidad. La regresión múltiple puede estimar efectos directos, pero solo si el grafo causal es correcto. Si condicionamos sobre las variables equivocadas, podemos crear o amplificar el sesgo. La clave es dibujar el grafo causal (un DAG) y usarlo para decidir qué variables incluir. Este es el enfoque de los modelos causales estructurales, que estudiamos con más detalle en capítulos posteriores. La regresión es una herramienta; el grafo causal es la estrategia.

Overthinking

La fórmula del coeficiente parcial. En una regresión múltiple y=α+β1x1+β2x2+ϵy = \alpha + \beta_1 x_1 + \beta_2 x_2 + \epsilon, el coeficiente β1\beta_1 es el efecto de x1x_1 sobre yy después de eliminar el efecto lineal de x2x_2 tanto de x1x_1 como de yy. Matemáticamente:

β1=Cov(y,x1)−Cov(y,x2)⋅Cov(x1,x2)/Var(x2)Var(x1)−Cov(x1,x2)2/Var(x2)\beta_1 = \frac{\text{Cov}(y, x_1) - \text{Cov}(y, x_2) \cdot \text{Cov}(x_1, x_2) / \text{Var}(x_2)}{\text{Var}(x_1) - \text{Cov}(x_1, x_2)^2 / \text{Var}(x_2)}

Este es el teorema de Frisch-Waugh-Lovell: el coeficiente parcial se puede obtener (1) regresando x1x_1 sobre x2x_2 y tomando los residuales, (2) regresando yy sobre x2x_2 y tomando los residuales, (3) regresando los residuales de yy sobre los residuales de x1x_1. Esto muestra que el coeficiente parcial mide la asociación entre x1x_1 y yy que no es explicada por x2x_2.

Resumen de la Sección 5.1

  • Las asociaciones espurias surgen cuando una causa común crea una asociación bivariada que desaparece después de controlar por el confusor.
  • La regresión múltiple estima la asociación parcial (directa) entre cada predictor y el resultado.
  • El ejemplo de divorcio muestra que la asociación matrimonio-divorcio es espuria — la edad mediana es la causa común.
  • Regresión no es causalidad: el grafo causal determina qué variables incluir.
  • El teorema de Frisch-Waugh-Lovell explica cómo funcionan los coeficientes parciales.