Ensalada no saludable

2024
inferencia causal
full luxury bayes
análisis bayesiano
R
Author

José Luis Cañadas Reche

Published

May 2, 2024

Listening

Introducción

Este es el primero de varios posts que más que contenido propio es simplemente comentar lo leído en el blog de Richard McElreath, y en particular los 3 posts que me abrieron la mente sobre la inferencia causal.

La serie de post son los siguientes:

En el primero cuenta sobre lo que denomina “Causal Salad”, que no es más que la equivocada costumbre de meter en un modelo todas las variables que se te ocurren y el error de interpretar los coeficientes(en caso de que sea lineal) como efectos causales. Las revistas científicas están llenas de esta perjudicial ensalada.

En el segundo explica cómo si pensamos en el modelo causal, ya sea utilizando un DAG, o en otras formas se ha de razonar para a partir de ahí encontrar la forma de contestar a la pregunta de ¿Cuál es el efecto “causal” de X en Y?

En el tercero, explica como utilizando modelos bayesianos podemos ajustar un DAG completo, y utilizar ese modelo ajustado para responder diferentes cuestiones causales, haciendo simulaciones. En este último post es cuando utiliza el término “full luxury bayes”. También explica la diferencia entre tener un modelo para cada pregunta causal (a lo Pearl), y tener todo el DAG estimado , así como ambas perspectivas pueden combinarse. De hecho, se puede utilizar el enfoque de Pearl para detectar sobre qué variables no hay que “condicionar” y la perspectiva de full luxury para poder hacer cosas que el enfoque de Pearl no llega, tales como condicionar por un collider

Ensalada causal

En los posts parte de una muestra hipótetica de pares de madres e hijas, y se trata de estudiar si el número de hijos de la madre influye en el número de hijos de la hija. Y considera que hay variables de confusión no medidas, tales como entorno social común, cultura del país, etcétera. Otra variable que se cree que puede influir en el número de hijos tanto de la madre como de la hija es el orden de nacimiento ( si fueron primogénitas o no).

Para ilustrar la situación simula unos datos, pego su código Si no os gustan las asunciones, cambiad la simulación y los efectos y punto.

Show the code
set.seed(1908)
N <- 200 # number of pairs
U <- rnorm(N) # simulate confounds
# birth order and family sizes
B1 <- rbinom(N, size=1, prob=0.5) # 50% first borns
M <- rnorm( N , 2*B1 + U )
B2 <- rbinom(N,size=1,prob=0.5)
D <- rnorm( N , 2*B2 + U + 0*M ) # change the 0 to turn on causal influence of mom

En estos datos simulados ha supuesto que hay una variable de confusión no observada, y que afecta por igual manera (coeficiente 1) tanto al número de hijos de la madre como de la hija. Ha simulado también que la mitad de las madres y de las hijas son primogénitas. Ha considerado que ser primogénita afecta de igual manera(coeficiente 2) al número de hijos de madres e hijas.

Y por último ha puesto que el efecto del número de hijos de la madre (M) sobre el número de hijos de la hija(D) es 0.

Es decir, al simular los datos sabemos cuál es el verdadero efecto causal , que en este caso es nulo. Esto va a permitir que podamos comparar si la técnica o técnicas propuestas son adecuadas.

Ojo

Ciencia antes que estadística. En este caso sabemos cuál es la verdad y la relación entre las variables. En la vida real tendremos que crear hipótesis y modelos “causales” de cómo se relacionan las variables, y podrían ser erróneos

Lo primero que se nos ocurre para estimar el efecto de M sobre D, sería tan sencillo como una regresión simple.

Show the code

mod_simple <- lm(D ~ M)
summary(mod_simple)
#> 
#> Call:
#> lm(formula = D ~ M)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -3.9714 -0.9486 -0.0337  1.1119  4.0630 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)   0.7128     0.1244   5.729 3.71e-08 ***
#> M             0.2596     0.0619   4.194 4.12e-05 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 1.522 on 198 degrees of freedom
#> Multiple R-squared:  0.08161,    Adjusted R-squared:  0.07697 
#> F-statistic: 17.59 on 1 and 198 DF,  p-value: 4.124e-05

Y vemos que el coeficiente estimado está muy lejos de la verdad. En este caso se ha estimado como positivo y con un error estándard bastante pequeño.

¿Por qué se ha alejado tanto? Pues por la asociación que induce la variable U tanto en M como D, de hecho para poder estimar el efecto correcto habría que condicionar por U, es decir, en este caso incluir U en el modelo. Pero U es una variable que no tenemos medida y por tanto no podemos usarla.

En este momento es cuando alguien dice - ey, pues metamos todas las variables que tenemos medidas en el modelo, eso debería ayudar, ya sabéis, todo el rollo del ceteris paribus y demás- . Pues venga, vamos a hacer la ensalada causal

Y usamos todas las variables observadas en nuestro modelo de regresión lineal superchachi

Show the code

mod_salad <- lm(D ~ M + B1 + B2)
summary(mod_salad)
#> 
#> Call:
#> lm(formula = D ~ M + B1 + B2)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -3.2102 -0.8440  0.1087  0.8454  2.9353 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) -0.03980    0.15280  -0.260   0.7948    
#> M            0.39468    0.06326   6.239 2.67e-09 ***
#> B1          -0.52544    0.22049  -2.383   0.0181 *  
#> B2           1.80475    0.17101  10.553  < 2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 1.203 on 196 degrees of freedom
#> Multiple R-squared:  0.4321, Adjusted R-squared:  0.4234 
#> F-statistic: 49.71 on 3 and 196 DF,  p-value: < 2.2e-16

Oh vaya, no sólo no nos acercamos al verdadero valor del coeficiente buscado, sino que ha habido una amplificación del sesgo.

Pero, ¿acaso al incluir más variables no hemos mejorado la forma en que modelamos D?. Pues en principio si, tanto viendo los Adjusted R-squared como los AIC , el modelo con más variables predice mejor D. Pero esto es lo que pasa, porque el añadir más variables se está teniendo en cuenta la asociación estadística entre las variables, pero la asociación estadística es muy diferente de la pregunta que nos estamos haciendo. Si nuestro objetivo es hacer buenas predicciones, la “ensalada causal” puede ser útil, pero si el objetivo es entender cómo afecta el número de hijos de la madre sobre el número de hijos de su hija, se está antes un problema muy distinto.

Show the code

AIC(mod_simple)
#> [1] 739.5342
AIC(mod_salad)
#> [1] 647.3987

El problema de la aproximación como “ensalada causal” es que se ha usado y se sigue usando en muchos estudios, de econometría, de sociología, etcétera, dónde el objetivo no era predecir mejor una variable, sino entender como afecta el cambio de una variable sobre otra.

Para intentar (y ojo que digo intentar) estimar el efecto causal correctamente hay que pensar de otra manera, hay que hacer hipótesis, plantear modelos causales etcétera. Las técnicas estadísticas en muchos casos serán las mismas, pero hay que usarlas de forma correcta. De hecho, la parte técnica es la sencilla, lo díficil es plantear el modelo causal y que sea correcto, y hay que dar triples saltos mortales haciendo asunciones que pueden no ser comprobables. Pero es lo que hay, no nos podemos quedar en la frase de “asociación no implica causalidad”