Ini pertanyaan yang sangat bagus. Pertama mari kita verifikasi apakah formula Anda benar. Informasi yang Anda berikan sesuai dengan model kausal berikut:
Dan seperti yang telah Anda katakan, kita dapat memperoleh estimasi dan untuk menggunakan aturan do-calculus. Di R kita bisa dengan mudah melakukannya dengan paket . Kami pertama-tama memuat untuk membuat objek dengan diagram sebab akibat yang Anda usulkan:P( Y|dHai ( 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")
Di mana dua istilah pertama X-+Y, Y-+X
mewakili perancu dan tidak teramati dan sisa istilah mewakili tepi terarah yang Anda sebutkan.YXY
Kemudian kami meminta estimasi kami:
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)
Yang memang bertepatan dengan formula Anda --- kasus pintu depan dengan perancu yang diamati.
Sekarang mari kita pergi ke bagian estimasi. Jika Anda menganggap linearitas (dan normalitas), banyak hal disederhanakan. Pada dasarnya apa yang ingin Anda lakukan adalah untuk memperkirakan koefisien jalur .X→Z→Y
Mari kita simulasikan beberapa data:
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)
Perhatikan dalam simulasi kami efek kausal sebenarnya dari perubahan pada adalah 21. Anda dapat memperkirakan ini dengan menjalankan dua regresi. Pertama untuk mendapatkan efek dari pada dan kemudian untuk mendapatkan efek dari pada . Perkiraan Anda akan menjadi produk dari kedua koefisien: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
Dan untuk kesimpulan Anda dapat menghitung kesalahan standar (asimptotik) dari produk:
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)
Yang dapat Anda gunakan untuk tes atau interval kepercayaan:
c(effect - 1.96*se, effect + 1.96*se) # 95% CI
x x
19.66441 23.08811
Anda juga dapat melakukan estimasi (non / semi) -parametric, saya akan mencoba memperbarui jawaban ini termasuk prosedur lain nanti.