Python实现固定效应回归模型实现因果关系推断(一)

简介: Python实现固定效应回归模型实现因果关系推断(一)

相关可以表示因果关系 — 仅在满足某些条件时

让我们给出因果关系的正式定义。因果关系是x导致y。关联意味着x和y沿相同或相反的方向一起移动。因果关系应满足以下三个经典条件:

  • x必须在y之前发生
  • x必须与y相关
  • x和y之间的关系不能用其他原因解释。

从相关性推断因果关系是一件很难的事

image.png

图(A):从相关性推断因果关系很可怕

在图(A)中,冰淇淋销量的增长与夏季鲨鱼的袭击密切相关。您认为这有意义吗?这是一种关联,但不是因果关系,因为并非以上三个条件中的所有条件都成立。首先,鲨鱼袭击的次数不会随着冰淇淋销售的增加而增加。

其次,冰淇淋销售量的增长与鲨鱼袭击之间的相关性可能始终存在,也可能不是始终存在。第三,也是最重要的一点,两个因素之间的关系可以用夏季来解释。实际上,炎热的夏天是冰淇淋销售量增加和鲨鱼袭击增加的驱动力。

混杂因素Confounding Factor):冰淇淋销售量x和鲨鱼袭击次数y都受夏季热量,混杂因素z的驱动,如图(B)所示。混杂因素是一个既影响因变量y又影响自变量x的变量,从而导致了虚假关联。一项研究可能会忽略混杂因素。因为我们没有收集足够的数据,所以它是不可观察的。而补救措施是将混杂因素识别为可观察的因素。

image.png

图(B):混杂因素

内生性:如果存在一个混杂因素可以解释x和y之间的关系,则x是内生的。x和y之间的相关性也无法解释或毫无意义。您能说冰淇淋销售与鲨鱼袭击之间存在正相关关系吗?我们不应试图从正号或负号得出任何结论。事实是该系数可以更高,更低,甚至不同。

如何量化X对Y的影响?

为了衡量治疗的效果,我们必须与没有治疗的事实进行比较。换句话说,我们讨论如果个人不接受治疗会产生什么结果。

随机对照试验(RCT)通常是非常好的标准

我们要怎么解决这个难题呢?随机对照试验(RCT)通常被视为非常好的标准,因为可以确定因果关系(Shadish et al,2002)。如果我们可以将个体随机分配到治疗组和对照组,那么两组的个体特征将大致相等。那么,治疗效果就是两组之间的y之差。

让我用一种统计的方式来进行以上描述。普通最小二乘(OLS)假设x与不可观察项𝜺之间没有相关性,即没有内生性。这可以用RCT中实现,因为随机分配下不可能出现内生性或混杂问题。在下式中描述了OLS,其中i是N个个体中每个个体的标识符。第二个方程是矩阵形式。关键假设是E(X𝜺)= 0,这表示x与不可观测项𝜺之间没有相关性。错误项可能是任何不可观察的项。

image.png

但是,在大多数情况下进行RCT会不可行。RCT可能很耗时,或很昂贵,或难以向需要合作的公众解释,并且有时是不道德的。例如,在医院中,研究人员可能会建议将患者保留为对照组。这显然不可行,因为该研究使患者处于危险之中。并非所有决策问题或临床实验都可以遵循RCT。那我们还有什么办法?研究人员越来越依赖于准实验设计并取得了令人信服的结果。“准”一词表面上看起来表示不是真的。准实验设计类似于随机对照试验,但没有对研究者进行随机分配(Cook&Campbell,1979)。

准实验接近“一样好”

RCT中无法进行大量研究。因此,我们使用了准实验设计,其中已曝光和未曝光单位之间的唯一区别是曝光本身。典型的准实验包括回归不连续性回归——Regression Discontinuity(RD),差异——Difference-in-differences(DiD)和固定效应模型——Fixed-Effects Model (FE)。

不连续性回归(RD)

RD设计将刚好高于和刚好低于阈值的对象进行比较,如图(D)中“Before”方案中的绿色框所示。预计绿色框中的主题非常相似。在“After”场景中,正确的小组受到干预,结果有所不同。结果的这种跳跃或不连续可以解释为干预的结果。

image.png

图(D):RD

在“After”期间(“ 1” =After)对Y的预期影响为E [Y(1)| X],而“Before”期间(“ 0” =Before)为E [Y(0)| X ]。在小绿色框中,所有X都非常相似,因此,“之前”和“之后”期间的X被认为是相同的。RD的结果接近RCT。

面板数据(Panel Data):也称为纵向或横向时间序列数据。在面板数据中,您拥有所有时间段内个人的数据点。基本的面板数据回归模型类似于方程式(1),其中𝜶和𝜷是系数,而i和t是个体和时间的指标。面板数据使您可以控制变量并说明各个变量的差异性。有趣的是,在Python中使用Pandas模块时,您可能会奇怪为什么开发人员将其称为“ Pandas”-非常可爱!实际上,它来自“面板数据”。

image.png

假设我们可以在OLS中详尽详尽地指定所有因素:如果我们想知道一个人的婚姻状况是否会增加一个人的收入。假设我们可以指定一个详尽的模型,明确列出影响收入水平的所有因素:

image.png

其中y_it是时间t中i的收入,x_it是婚姻状况,Z_it都是观察到的随时间变化的变量,例如年龄或工作数量。W_i都是观察到的不随时间变化变量,例如种族,𝛆_it是误差项。如果我们可以列出所有因素,则可以得到𝜷的无偏差估计。

在面板数据上运行OLS时,它也称为“池化OLS”。当每个观察值彼此独立时,这是没问题的,虽然这不太可能,因为面板数据中同一个人的观察是相关的。话虽如此,有时观察结果在面板内的相关性很小,可以忽略不计。然后,您可以这样做。

但是,我们不太可能在OLS中指定所有可能的因素:很可能我们无法详尽列出所有OLS的因素。假设我们从上面的方程式中省略了Z_it和W_i,而仅将y_it回归到x_it上。我们知道婚姻状况(x_it),年龄(Z_it)和种族(W_i)很可能相关。在没有明确指定Z_it和W_i的情况下,OLS中𝜷的估计几乎可以肯定是有偏差的。这是因为未在方程式中指定Z_it和W_i使得它们变得不可观察并合并到误差项𝛆_it中。这使得婚姻状况(x_it)是内生的(请参见上面的说明)。所以结果𝜷,无论是正数还是负数,都将毫无意义。因此,遗漏变量的问题是一个非常严重的问题。如果省略了任何已知变量,则OLS中的结果都是不可靠的。

固定效果模型

image.png

上面的𝝆_i变量称为固定效果,因为它不会随时间变化。它捕获了个人的所有不随时间变化的因素,例如性别,种族甚至个人特质。y_it和x_it是i的收入和婚姻状况,Z_it代表i的所有其他随时间变化的因素。假定误差𝛆_it与所有上述因素都不相关(如果违反了此假设,则将面临省略变量导致的偏差)。

如何估算方程式(3)?在几乎所有教科书中,您都可以看到像方程式(3)一样的基本表述形式。可以将其视为i = 0,1。当有多个个体i = 1,…N时,𝝆_i可以视为具有各自系数𝜽_i的一组(N-1)个虚拟变量D_i的简写,如图所示。等式(4)是您在回归输出中看到的。

image.png

DiD是FE模型的特例

DiD是FE模型的特例。

image.png

图(E):DiD

DiD背后的想法很简单。首先,我们计算在“Before”期间两组之间的结果均值之差,即图(E)中的“ A”。其次,我们在“After”期间计算相同的值,即“ B”。然后我们取“第二差异”,即“A”和“ B”之间的差异,并标记为“ C”。第二差异衡量两组结果的变化如何不同。差异归因于干预的因果效应。

以面板数据形式,可以通过“differencing out”混淆因素从有限元模型中得出DiD。因为没有混淆因素,所以影响确实是因果关系。典型设置类似于公式(5)。

image.png

假设个体i在治疗组(x_i = 1)或对照组(x_i = 0)中,并且在治疗前(t_i = 1)或治疗后(t_i = 0)。后期的效应为𝜷_2,如图(E)所示。这是通过以下方式得出的:

image.png

DiD模型和FE模型之间的区别在于更改是外生的。更改是在个人i的选择之外进行的。例如,某州更改了其最低饮酒年龄法律。此政策是外生的。

目录
相关文章
|
28天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
170 73
|
1月前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
81 21
|
1月前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
80 23
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
114 19
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
58 2
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
27天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
107 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
158 59
|
15天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
34 14