Esta es una muy buena pregunta. Primero verifiquemos si su fórmula es correcta. La información que ha proporcionado corresponde al siguiente modelo causal:
Y como usted ha dicho, podemos derivar el estimado para usando las reglas del cálculo. En R podemos hacer eso fácilmente con el paquete . Primero cargamos para crear un objeto con el diagrama causal que está proponiendo:PAG( YEl | reo ( X) )causaleffect
igraph
library(igraph)
g <- graph.formula(X-+Y, Y-+X, X-+Z-+Y, W-+X, W-+Z, W-+Y, simplify = FALSE)
g <- set.edge.attribute(graph = g, name = "description", index = 1:2, value = "U")
Donde los dos primeros términos X-+Y, Y-+X
representan los factores de confusión no observados de e y el resto de los términos representan los bordes dirigidos que mencionó.YXY
Luego pedimos nuestro estimado:
library(causaleffect)
cat(causal.effect("Y", "X", G = g, primes = TRUE, simp = T, expr = TRUE))
∑W, Z( ∑X′PAG( YEl | W, X′, Z) P( X′El | W) ) P( ZEl | W, X) P( W)
Lo que de hecho coincide con su fórmula: un caso de puerta frontal con un factor de confusión observado
Ahora vamos a la parte de estimación. Si asume linealidad (y normalidad), las cosas se simplifican enormemente. Básicamente lo que quiere hacer es estimar los coeficientes de la ruta .X→ Z→ Y
Simulemos algunos datos:
set.seed(1)
n <- 1e3
u <- rnorm(n) # y -> x unobserved confounder
w <- rnorm(n)
x <- w + u + rnorm(n)
z <- 3*x + 5*w + rnorm(n)
y <- 7*z + 11*w + 13*u + rnorm(n)
Observe en nuestra simulación que el verdadero efecto causal de un cambio de en es 21. Puede estimar esto ejecutando dos regresiones. En primer lugar para obtener el efecto de sobre y para obtener el efecto de en . Su estimación será el producto de ambos coeficientes:Y Y ∼ Z + W + X Z Y Z ∼ X + W X ZXYY∼ Z+ W+ XZYZ∼ X+ WXZ
yz_model <- lm(y ~ z + w + x)
zx_model <- lm(z ~ x + w)
yz <- coef(yz_model)[2]
zx <- coef(zx_model)[2]
effect <- zx*yz
effect
x
21.37626
Y por inferencia, puede calcular el error estándar (asintótico) del producto:
se_yz <- coef(summary(yz_model))[2, 2]
se_zx <- coef(summary(zx_model))[2, 2]
se <- sqrt(yz^2*se_zx^2 + zx^2*se_yz^2)
Que puede usar para pruebas o intervalos de confianza:
c(effect - 1.96*se, effect + 1.96*se) # 95% CI
x x
19.66441 23.08811
También puede realizar una estimación (no / semi) paramétrica, intentaré actualizar esta respuesta, incluidos otros procedimientos más adelante.