目录
回归理论
非随机数据的回归
回归理论
我不打算深入研究线性回归是如何构建和估计的。然而,一点点理论将有助于解释它在因果推断中的力量。首先,回归解决了理论上的最佳线性预测问题。令 是一个参数向量:
线性回归找到最小化均方误差 (MSE) 的参数。
如果你对上述等式进行微分并将其置零,你会发现这个问题的线性解由下式给出
面对样本估计的时候,我们可以使用等价如下公式估计这个 beta:
但不要只看上面的论述。如果相对钻研公式,您更喜欢直接写代码,那么不妨自己尝试一下:
X = data[["format_ol"]].assign(intercep=1)
y = data["falsexam"]
def regress(y, X):
return np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y))
beta = regress(y, X)
beta
array([-4.9122215 , 78.54748458])
上面的公式很笼统。 然而,我们研究只有一个回归变量的情况是值得的。 在因果推断中,我们经常想估计变量 T 对结果 y 的因果影响。 因此,我们使用带有这个单一变量的回归来估计这种影响。 即使我们在模型中包含其他变量,它们通常也只是辅助变量。 添加其他变量可以帮助我们估计干预的因果效应,但我们对估计它们的参数不是很感兴趣。
对于单个回归变量 T,与其关联的参数将由下式给出
如果 T 是随机分配的,则 是 ATE。
kapa = data["falsexam"].cov(data["format_ol"]) / data["format_ol"].var()
kapa
-4.912221498226952
如果我们有多个回归量,我们可以扩展以下公式来适应这一点。假设那些其他变量只是辅助变量,我们真正感兴趣的只是估计与T 关联的参数 。
可以通过以下公式获得
其中 是所有其他协变量 在 上回归的残差。现在,让我们欣赏一下这有多酷。这意味着多元回归的系数是在考虑模型中其他变量的影响后相同回归量的双变量系数。在因果推断方面, 是 T 在使用所有其他变量进行预测后的双变量系数。
这背后有一个很好的直觉解释。如果我们可以使用其他变量来预测 T,那就意味着它不是随机的。但是,一旦我们控制了其他可用变量,我们就可以使 T 与随机一样好。为此,我们使用线性回归从其他变量预测它,然后我们取该回归的残差 。根据定义, 不能被我们已经用来预测 T的其他变量 X 预测。非常优雅地, 是一种与X 中的任何其他变量无关的处理版本。
顺便说一下,这也是线性回归的一个特性。残差始终与创建它的模型中的任何变量正交或不相关:
e = y - X.dot(beta)
print("正交意味着矩阵相乘结果为0", np.dot(e, X))
X[["format_ol"]].assign(e=e).corr()
更酷的是,这些属性不依赖于任何东西!无论您的数据是什么样子,它们都是数学真理。
非随机数据的回归
到目前为止,我们使用的是随机实验数据,但正如我们所知,这些数据很难获得。进行实验的成本非常高,或者根本不可行。很难说服麦肯锡公司随机免费提供他们的服务,以便我们能够一劳永逸地将他们的咨询服务带来的价值与那些有能力支付他们的公司已经很好的事实区分开来离开。
出于这个原因,我们现在将深入研究非随机或观察数据。在以下示例中,我们将尝试估计多受教育一年对小时工资的影响。正如您可能已经猜到的那样,进行教育实验是极其困难的。你不能简单地将人们随机分配到 4、8 或 12 年的教育中。在这种情况下,我们只有观察数据。
首先,让我们估计一个非常简单的模型。我们将对受教育年限的小时工资进行回归。我们在这里使用对数,以便我们的参数估计有一个百分比解释。有了它,我们就可以说多接受 1 年的教育会使工资增加 x%。
wage = pd.read_csv("./data/wage.csv").dropna()
model_1 = smf.ols('np.log(hwage) ~ educ', data=wage.assign(hwage=wage["wage"]/wage["hours"])).fit()
model_1.summary().tables[1]
的估计值为 0.0536,95% 的置信区间为 (0.039, 0.068)。 这意味着该模型预测,每增加一年的教育,工资将增加约 5.3%。 这一百分比增长符合教育以指数方式影响工资的信念:我们预计从 11 年到 12 年的教育(平均到高中毕业)比从 14 到 16 年(平均到毕业 大学)。
from matplotlib import pyplot as plt
from matplotlib import style
style.use("fivethirtyeight")
x = np.array(range(5, 20))
plt.plot(x, np.exp(model_1.params["Intercept"] + model_1.params["educ"] * x))
plt.xlabel("Years of Education")
plt.ylabel("Hourly Wage")
plt.title("Impact of Education on Hourly Wage")
plt.show()
当然,并不是因为我们可以估计这个简单的模型是正确的。请注意我是如何小心地用我的话来预测来自教育的工资。我从来没有说过这个预测是因果关系。事实上,到现在为止,您可能有非常严重的理由相信这个模型是有偏见的。由于我们的数据并非来自随机实验,因此我们不知道受教育程度高的人和受教育程度低的人是否具有可比性。更进一步,根据我们对世界运作方式的理解,我们非常确定它们没有可比性。也就是说,我们可以争辩说,那些受教育年限更长的人可能拥有更富裕的父母,而且随着教育程度的提高,我们看到的工资增长只是家庭财富与受教育年限的关系的反映。用数学来说,我们认为,也就是说,那些受教育程度高的人无论如何都会有更高的收入,即使没有这么多年的教育。如果你对教育真的很冷淡,你可以争辩说它甚至可以通过让人们远离劳动力和降低他们的经验来减少工资。
幸运的是,在我们的数据中,我们可以访问许多其他变量。我们可以看到父母的教育‘meduc’、‘feduc’、那个人的‘IQ’分数、经验年数‘exper’以及他或她在当前公司的任期‘tenure’。我们甚至有一些关于婚姻和黑人种族的虚拟变量。
wage.head()
我们可以在模型中包含所有这些额外变量并对其进行估计:
要了解这如何帮助解决偏差问题,让我们回顾一下多元线性回归的二元细分。
这个公式说我们可以根据父母的教育、智商、经验等来预测“edu”。在我们这样做之后,我们将得到一个版本的 edu
,,它与之前包含的所有变量都不相关。这将打破诸如“受过更多教育年限的人因为他们的智商更高而拥有它。教育不会导致更高的工资的情况。只是与智商相关的情况,这就是推动工资”。好吧,如果我们在我们的模型中包含 IQ,那么 将成为额外一年教育的回报,同时保持 IQ 不变。暂停一下以了解这意味着什么。即使我们不能使用随机对照试验来保持治疗和未治疗之间的其他因素相等,回归可以通过在模型中包含这些相同的因素来做到这一点,即使数据不是随机的!
controls = ['IQ', 'exper', 'tenure', 'age', 'married', 'black',
'south', 'urban', 'sibs', 'brthord', 'meduc', 'feduc']
X = wage[controls].assign(intercep=1)
t = wage["educ"]
y = wage["lhwage"]
beta_aux = regress(t, X)
t_tilde = t - X.dot(beta_aux)
kappa = t_tilde.cov(y) / t_tilde.var()
kappa
0.04114719101005263
我们刚刚估计的这个系数告诉我们,对于具有相同智商、经验、任期、年龄等的人,我们应该预期多受教育一年与每小时工资增长 4.11% 相关。 这证实了我们的怀疑,即第一个只有 edu
的简单模型是有偏见的。 它还证实,这种偏见高估了教育的影响。 一旦我们控制了其他因素,教育的估计影响就会下降。
如果我们更聪明并使用其他人编写的软件而不是自己编写所有代码,我们甚至可以在这个估计值周围放置一个置信区间。
model_2 = smf.ols('lhwage ~ educ +' + '+'.join(controls), data=wage).fit()
model_2.summary().tables[1]