首页 > 解决方案 > Diff-in-diff 使用工具变量:如何使用 ivreg 实现?(内生变量和外生变量之间的相互作用)

问题描述

我想估计一个治疗对两个不同群体的影响,所以某种形式

等式 1

T 是治疗,M 是分隔两组的假人。

问题是治疗与影响 Y 的其他变量相关。幸运的是,存在一个变量 Z 作为 T 的工具。我能够在 R 中实现的是“手动”运行 2SLS,遵循阶段

等式 2

等式 3

为了提供可重现的示例,首先进行模拟

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这一点TreatM:Treat实际上并不是两个独立的内生变量,但实际上只是同一个内生变量四处移动并与外生变量相互作用。

综上所述,

i)有什么方法可以解决ivreg这个问题吗?

ii) 2SLS 是否有其他功能可以手动接受第一阶段和第二阶段公式而没有这种限制,并且可以调整标准误差?

iii) 如果没有其他选择,获得正确 SE 的最简单方法是什么?我没有遇到任何直接的 R 代码,只是一堆矩阵乘法公式(尽管我没有为此深入挖掘)。

谢谢

标签: rlinear-regression

解决方案


本质上,如果 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

这就是我们要找的...


推荐阅读