🔧
tool
相关软件(R代码)
```r # 因果推断示例:使用IPW和结果回归 # 模拟数据 set.seed(123) n <- 1000 Z1 <- rnorm(n) # 协变量1 Z2 <- rbinom(n, 1, 0.5) # 协变量2 U <- rnorm(n) # 未观测混杂(模拟中用于生成数据,但分析时假装不知道) # 干预分配(受协变量和混杂影响) ps <- plogis(0.5 * Z1 + 0.3...
📖 定义
# 因果推断示例:使用IPW和结果回归
# 模拟数据
set.seed(123)
n <- 1000
Z1 <- rnorm(n) # 协变量1
Z2 <- rbinom(n, 1, 0.5) # 协变量2
U <- rnorm(n) # 未观测混杂(模拟中用于生成数据,但分析时假装不知道)
# 干预分配(受协变量和混杂影响)
ps <- plogis(0.5 * Z1 + 0.3 * Z2 + 0.4 * U) # 真实倾向得分
X <- rbinom(n, 1, ps)
# 结果(受干预和混杂影响)
Y <- 2 * X + 1.5 * Z1 - 1 * Z2 + 2 * U + rnorm(n, 0, 1)
# 数据框
data <- data.frame(Y = Y, X = X, Z1 = Z1, Z2 = Z2)
# 1. 朴素估计(混淆估计)
naive_model <- lm(Y ~ X, data = data)
summary(naive_model)$coef[2, 1] # 有偏
# 2. 结果回归(调整Z1, Z2)
or_model <- lm(Y ~ X + Z1 + Z2, data = data)
summary(or_model)$coef[2, 1] # 仍然可能有偏,因为U未观测
# 3. IPW估计
# 估计倾向得分(注意:不能包含U,因为U未观测)
ps_model <- glm(X ~ Z1 + Z2, data = data, family = binomial)
ps_est <- predict(ps_model, type = "response")
# 稳定IPW权重
w <- ifelse(data$X == 1, 1 / ps_est, 1 / (1 - ps_est))
w_stable <- w / sum(w) * n
ipw_model <- lm(Y ~ X, weights = w_stable, data = data)
summary(ipw_model)$coef[2, 1]
# 4. 双稳健估计
# install.packages("survey")
library(survey)
# 先拟合结果模型
mu_model <- lm(Y ~ X + Z1 + Z2, data = data)
data$mu1 <- predict(mu_model, newdata = transform(data, X = 1))
data$mu0 <- predict(mu_model, newdata = transform(data, X = 0))
# 计算双稳健估计量
dr_term <- with(data,
X * (Y - mu1) / ps_est + mu1 -
(1 - X) * (Y - mu0) / (1 - ps_est) - mu0
)
mean(dr_term)
# 工具变量示例
# 模拟工具变量
Z_iv <- rbinom(n, 1, 0.5) # 工具变量(如出生季度)
X_iv <- rbinom(n, 1, plogis(0.5 * Z_iv + 0.3 * Z1 + 0.2 * U)) # 暴露(受教育年限)
Y_iv <- 2 * X_iv + 1.5 * Z1 + 2 * U + rnorm(n, 0, 1)
# 2SLS
# install.packages("AER")
library(AER)
iv_model <- ivreg(Y_iv ~ X_iv + Z1 | Z1 + Z_iv)
summary(iv_model)
# 第一阶段F统计量(检验工具变量强度)
stage1 <- lm(X_iv ~ Z_iv + Z1)
summary(stage1)
# F统计量应该 > 10