目录
De-Meaning and Fixed Effects
Omitted Variable Bias: Confounding Through the Lens of Regression
De-Meaning and Fixed Effects
您刚刚看到了如何在模型中加入虚拟变量来解释不同组间的不同干预分配。但是,FWL 定理真正的亮点在于虚拟变量。如果您有大量的组别,为每个组别添加一个虚拟变量不仅繁琐,而且计算成本高昂。您将创建很多很多大部分为零的列。您可以通过应用 FWL 和了解回归如何在涉及虚拟变量时进行正交化干预来轻松解决这个问题。
您已经知道,FWL 中的除杂步骤涉及从协变量(在本例中为假变量)预测干预:
model_deb = smf.ols("credit_limit ~ C(credit_score1_buckets)",
data=risk_data_rnd).fit()
model_deb.summary().tables[1]
由于虚拟变量基本上是作为组平均值工作的,因此您可以看到,通过这个模型,您预测的正是:如果 credit_score1_buckets=0, 您预测的是 credit_score1_buckets=0 组的平均线;如果 credit_score1_buckets=1, 您预测的是 credit_score1_buckets=1 组的平均线(通过将截距与该组的系数相加得出 1173. 0769 + 2195.4337 = 3368.510638),以此类推。这些正是各组的平均值:
risk_data_rnd.groupby("credit_score1_buckets")["credit_limit"].mean()
也就是说,如果想对干预进行残差处理,可以用更简单有效的方法来实现。首先,计算每组的平均干预治疗量:
risk_data_fe = risk_data_rnd.assign(
credit_limit_avg = lambda d: (d
.groupby("credit_score1_buckets")
["credit_limit"].transform("mean"))
)
然后,为了得到残差,从治疗中减去该组平均值。由于这种方法减去的是干预平均值,因此有时也被称为去干预平均值。如果您想在回归公式中实现这一点,您必须将数学运算包裹在 I(...) 周围:
model = smf.ols("default ~ I(credit_limit-credit_limit_avg)",
data=risk_data_fe).fit()
model.summary().tables[1]
您在这里得到的参数估计值与您在模型中添加虚拟变量时得到的参数估计值完全相同。这是因为,从数学上讲,它们是等价的。这种想法被称为固定效应,因为你要控制的是一个组内任何固定的因素。它来源于时间结构(面板数据)的因果推断文献
同一文献中的另一个想法是在回归模型中加入各组的平均干预措施(来自 Mundlak's, 1978)。回归会对所包含的额外变量的干预进行残差处理,因此这里的效果大致相同:
model = smf.ols("default ~ credit_limit + credit_limit_avg",
data=risk_data_fe).fit()
model.summary().tables[1]
Omitted Variable Bias: Confounding Through the Lens of Regression
共同原因--confounders--会使估计的治疗与结果之间的关系产生偏差。这就是为什么你需要将它们考虑在内,例如将它们纳入回归模型。然而,回归对混杂偏差有其自身的特殊看法。当然,到目前为止所说的一切仍然有效。但回归法可以让您更精确地考虑混杂偏差。例如,假设您想估计信用额度对违约的影响,而工资是唯一的混杂因素:
在这种情况下,你知道你应该估计包含混杂因素的模型:
但如果你估计一个更短的模型,其中忽略了混杂因素:
由此得出的估计值变得有偏差:
short_model = smf.ols("default ~ credit_limit", data=risk_data).fit()
short_model.params["credit_limit"]
-2.401961992596885e-05
正如你所看到的,看起来信贷额度越高,违约率就越低,这是无稽之谈。但你已经知道了。你不知道的是,你可以精确地判断出这种偏差的大小。通过回归,你可以说,遗漏变量导致的偏差等于包含该变量的模型中的影响加上遗漏变量对结果的影响乘以遗漏变量对包含变量的回归。别担心。我知道这很拗口,让我们一点一点来消化它。首先,这意味着 Y 对 T 的简单回归将是真正的因果参数 τ 加上一个偏差项:
这个偏差项就是被忽略的混杂因素对干预结果的系数 β 乘以被忽略变量对治疗的回归系数 δ。为了验证这一点,您可以用下面的代码来获得您之前得到的有偏差的参数估计,该代码重现了忽略变量偏差公式:
long_model = smf.ols("default ~ credit_limit + wage",
data=risk_data).fit()
omitted_model = smf.ols("wage ~ credit_limit", data=risk_data).fit()
(long_model.params["credit_limit"]
+ long_model.params["wage"]*omitted_model.params["credit_limit"])
-2.4019619925968762e-05