这个问题问得好。首先,让我们验证您的公式是否正确。您提供的信息与以下因果模型相对应:
正如您所说,我们可以得出 P(Y|do(X))使用做微积分的规则。在R中,我们可以使用package轻松地做到这一点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")
前两个词X-+Y, Y-+X
代表未观察到的混杂因素X 和 Y 其他术语代表您提到的有向边。
然后我们要求我们的估计:
library(causaleffect)
cat(causal.effect("Y", "X", G = g, primes = TRUE, simp = T, expr = TRUE))
∑W,Z(∑X′P(Y|W,X′,Z)P(X′|W))P(Z|W,X)P(W)
这确实与您的公式吻合---一个观察到混杂因素的前门案例。
现在让我们进入估计部分。如果假设线性(和正态性),那么事情将大大简化。基本上,您要做的是估算路径的系数X→Z→Y。
让我们模拟一些数据:
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)
注意在我们的模拟中,改变的真正因果关系 X 上 Y是21。您可以通过运行两个回归来估算。第一 Y∼Z+W+X 得到效果 Z 上 Y 然后 Z∼X+W 得到效果 X 上 Z。您的估计将是两个系数的乘积:
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
为了进行推断,您可以计算产品的(渐近)标准误差:
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)
可用于测试或置信区间:
c(effect - 1.96*se, effect + 1.96*se) # 95% CI
x x
19.66441 23.08811
您也可以执行(非/半)参数估计,稍后我将尝试更新此答案,包括其他步骤。