r - Diff-in-diff 使用工具变量:如何使用 ivreg 实现?(内生变量和外生变量之间的相互作用)
问题描述
我想估计一个治疗对两个不同群体的影响,所以某种形式
T 是治疗,M 是分隔两组的假人。
问题是治疗与影响 Y 的其他变量相关。幸运的是,存在一个变量 Z 作为 T 的工具。我能够在 R 中实现的是“手动”运行 2SLS,遵循阶段
和
为了提供可重现的示例,首先进行模拟
n <- 100
set.seed(271)
Z <- runif(n)
e <- rnorm(n, sd = 0.5)
M <- as.integer(runif(n)) # dummy
u <- rnorm(n)
# Treat = 1 + 2*Z + e
alpha_0 <- 1
alpha_1 <- 2
Treat <- alpha_0 + alpha_1*Z + e
# Y = 3 + M + 2*Treat + 3*Treat * M + e + u (ommited vars that determine Treat affect Y)
beta_0 <- 3
beta_1 <- 1
beta_2 <- 2
beta_3 <- 3
Y <- beta_0 + beta_1*M + beta_2*Treat + beta_3 * M*Treat + e + u
第一阶段回归
fs <- lm(Treat ~ Z)
stargazer::stargazer(fs, type = "text")
===============================================
Dependent variable:
---------------------------
Treat
-----------------------------------------------
Z 2.383***
(0.168)
Constant 0.835***
(0.096)
-----------------------------------------------
Observations 100
R2 0.671
Adjusted R2 0.668
Residual Std. Error 0.445 (df = 98)
F Statistic 200.053*** (df = 1; 98)
===============================================
第二阶段
Treat_hat <- fitted(fs)
ss <- lm(Y ~ M + Treat_hat + M:Treat_hat)
stargazer::stargazer(ss, type = "text")
===============================================
Dependent variable:
---------------------------
Y
-----------------------------------------------
M 1.230
(1.717)
Treat_hat 2.243***
(0.570)
M:Treat_hat 2.636***
(0.808)
Constant 2.711**
(1.213)
-----------------------------------------------
Observations 100
R2 0.727
Adjusted R2 0.718
Residual Std. Error 2.539 (df = 96)
F Statistic 85.112*** (df = 3; 96)
===============================================
现在的问题是这些标准错误没有针对第一阶段进行调整,这看起来需要手动完成一些工作。正如我对任何其他 IV 回归所做的那样,我宁愿只使用AER::ivreg
.
但我似乎无法在那里得到同样的回归。这里有许多可能的迭代,它们永远不会做同样的事情
AER::ivreg(Y ~ M + Treat + M:Treat | Z)
AER::ivreg(Y ~ M + Treat + M:Treat | M + Z)
Warning message:
In ivreg.fit(X, Y, Z, weights, offset, ...) :
more regressors than instruments
这些是有道理的,我猜
AER::ivreg(Y ~ M + Treat + M:Treat | M + Z + M:Z)
Call:
AER::ivreg(formula = Y ~ M + Treat + M:Treat | M + Z + M:Z)
Coefficients:
(Intercept) M Treat M:Treat
2.641 1.450 2.229 2.687
出人意料地接近,但并不完全。
我找不到一种方法来说明ivreg
这一点Treat
,M:Treat
实际上并不是两个独立的内生变量,但实际上只是同一个内生变量四处移动并与外生变量相互作用。
综上所述,
i)有什么方法可以解决ivreg
这个问题吗?
ii) 2SLS 是否有其他功能可以手动接受第一阶段和第二阶段公式而没有这种限制,并且可以调整标准误差?
iii) 如果没有其他选择,获得正确 SE 的最简单方法是什么?我没有遇到任何直接的 R 代码,只是一堆矩阵乘法公式(尽管我没有为此深入挖掘)。
谢谢
解决方案
本质上,如果 Z 是有效的 Treat 工具,则 M:Z 应该是 M:Treat 的有效工具,所以,对我来说这是有道理的:
AER::ivreg(Y ~ M + Treat + M:Treat | M + Z + M:Z)
我实际上设法为修改后的模拟取消了正确的参数值:
n <- 100
set.seed(271)
Z <- runif(n)
e <- rnorm(n, sd = 0.5)
M <- round(runif(n)) # note: I changed from as.integer() to round() in order to get some 1's in the regression
u <- rnorm(n)
# Treat = 1 + 2*Z + e
alpha_0 <- 1
alpha_1 <- 2
Treat <- alpha_0 + alpha_1*Z + e
beta_0 <- 3
beta_1 <- 1
beta_2 <- 2
beta_3 <- 3
Y <- beta_0 + beta_1*M + beta_2*Treat + beta_3 * M*Treat
现在:
my_ivreg <- AER::ivreg(Y ~ M + Treat + M:Treat | M + Z + M:Z)
>summary(my_ivreg)
Call:
AER::ivreg(formula = Y ~ M + Treat + M:Treat | M + Z + M:Z)
Residuals:
Min 1Q Median 3Q Max
-1.332e-14 -7.105e-15 -3.553e-15 -8.882e-16 3.553e-15
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.000e+00 2.728e-15 1.100e+15 <2e-16 ***
M 1.000e+00 3.810e-15 2.625e+14 <2e-16 ***
Treat 2.000e+00 1.255e-15 1.593e+15 <2e-16 ***
M:Treat 3.000e+00 1.792e-15 1.674e+15 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.633e-15 on 96 degrees of freedom
Multiple R-Squared: 1, Adjusted R-squared: 1
Wald test: 1.794e+31 on 3 and 96 DF, p-value: < 2.2e-16
这就是我们要找的...
推荐阅读
- json - 为什么我从这段 kotlin 编程中得到“null”作为 JSON 字符串,成功的 GPS 位置报告的回调?
- amazon-web-services - 如何启用/禁用附加到 lambda 的 cloudwatch 事件?
- haskell - Haskell:如何使用 Tasty 和 Hspec 测试提升函数引发的断言异常
- tensorflow - 使用 ResNet50 进行二进制分类的恒定验证精度
- c# - 将复杂类型传递给 AWS API 网关端点
- python - 检测到碰撞时如何添加10个标记?
- python - 有没有更好的方法来检查一个数字是否是两个数字的范围
- python-3.x - Discord.py 在被踢/被禁止时加入/离开期望
- c - C程序在用户给定的数字内找到完美的正方形?
- django - 如何在 django 查询中处理可变数量的参数