【因果推断python】28_面板数据和固定效应2

2024-06-12 01:12

本文主要是介绍【因果推断python】28_面板数据和固定效应2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

固定效应


固定效应

为了方面后面更正式地讲述,让我们首先看一下我们拥有的数据。按照我们的例子,我们将尝试估计婚姻对收入的影响。我们的数据包含多年以来多个个体 (nr) 的这两个变量,married 和lwage。请注意,工资采用对数形式。除此之外,我们还有其他控制措施,例如当年的工作小时数、受教育年限等。

from linearmodels.datasets import wage_panel
data = wage_panel.load()
data.head()

通常,固定效应模型定义为

y_{it}=\beta X_{it}+\gamma U_i+e_{it}

其中 y_{it}是个体 i 在时间 t 的结果,X_{it} 是个体变量的向量i 在时间 t。 U_i 是单个 i 的一组不可观测值。请注意,这些不可观测值随着时间的推移是不变的,因此缺少时间下标。最后,e_{it} 是错误项。对于教育示例,y_{it} 是对数工资,X_{it} 是随时间变化的可观察变量,例如婚姻和经验,U_i是每个人没有观察到但不变的变量,例如美丽和智力。

现在,请记住我说过使用具有固定效果模型的面板数据就像为实体添加虚拟对象一样简单。这是真的,但在实践中,我们实际上并没有这样做。想象一个我们有 100 万客户的数据集。如果我们为它们中的每一个添加一个 dummy,我们最终会得到 100 万列,这可能不是一个好主意。相反,我们使用将线性回归划分为 2 个独立模型的技巧。我们以前见过这个,但现在是回顾它的好时机。假设您有一个线性回归模型,其中包含一组特征 X_1 和另一组特征 X_2

\hat{Y}=\hat{\beta_{1}}X_{1}+\hat{\beta_{2}}X_{2}

其中 X_1 和 X_2 是特征矩阵(每个特征一行,每个观察一列)和 \hat{\beta_{1}} 和 \hat{\beta_{2}} 是行向量。您可以通过执行获得完全相同的 \hat{\beta_{1}} 参数

  1. 在第二组特征 \hat{y^*}=\hat{\gamma_1}X_2 上回归结果 y
  2. 在第二个 \hat{X_1}=\hat{\gamma_2}X_2 上回归第一组特征
  3. 得到残差 \tilde{X}_1=X_1-\hat{X}_1 和 \tilde{y}_1=y_1-\hat{y^*}
  4. 将结果的残差回归到特征残差 \hat{y}=\hat{\beta_1}\tilde{X_1}

最后一次回归的参数将与使用所有特征运行回归完全相同。但这究竟对我们有什么帮助呢?好吧,我们可以将带有实体假人的模型的估计分解为 2。首先,我们使用假人来预测结果和特征。这些是上面的步骤 1 和 2。

现在,还记得在虚拟变量上运行回归是如何像估计该虚拟变量的平均值一样简单吗?如果你不这样做,让我们用我们的数据来证明这是真的。让我们运行一个模型,我们将工资预测为虚拟年份的函数。

mod = smf.ols("lwage ~ C(year)", data=data).fit()
mod.summary().tables[1]

请注意该模型如何预测 1980 年的平均收入为 1.3935,1981 年的平均收入为 1.5129 (1.3935+0.1194) 等等。 现在,如果我们按年份计算平均值,我们会得到完全相同的结果。 (请记住,基准年 1980 是截距。因此,您必须将截距添加到其他年份的参数中才能获得该年的平均lwage)。

data.groupby("year")["lwage"].mean()

这意味着,如果我们得到面板中每个人的平均值,我们基本上是在对其他变量进行个体虚拟回归。这激发了以下估计过程:

  1. 通过减去个人的平均值来创建时间贬损变量: $\ddot{Y}{it} = Y{it} - \bar{Y}i\ddot{X}{it} = X_{it} - \bar{X}_i$

  2. \ddot{X}{it}上回归上回归\ddot{Y}{it}

请注意,当我们这样做时,未观察到的 U_{i} 消失了。由于 U_{i} 在时间上是恒定的,所以我们有 \bar{U}_i=U_i。如果我们有以下两个方程组

Y_{it} = \beta X_{it} + \gamma U_i + e_{it} \\\bar{Y}{i} = \beta \bar{X}{it} + \gamma \bar{U}i + \bar{e}{it}

我们从另一个中减去一个,我们得到

(Y_{it} - \bar{Y}{i}) = (\beta X{it} - \beta \bar{X}{it}) + (\gamma U_i - \gamma U_i) + ( e{it}-\bar{e}{it}) \\ (Y{it} - \bar{Y}{i}) = \beta(X{it} - \bar{X}{it}) + (e{it}-\bar{e}{it}) \\ \ddot{Y}{it} = \beta \ddot{X}{it} + \ddot{e}{it}

它消除了所有未观察到的随时间不变的事物。老实说,不仅未观察到的变量消失了。这发生在所有时间不变的变量上。因此,您不能包含任何随时间保持不变的变量,因为它们将是虚拟变量的线性组合,并且模型不会运行。

要检查哪些变量是这些变量,我们可以按个体对数据进行分组并获得标准差的总和。如果它为零,则意味着对于任何个人来说,变量都不会随时间变化。

data.groupby("nr").std().sum()
year            1334.971910
black              0.000000
exper           1334.971910
hisp               0.000000
hours         203098.215649
married          140.372801
educ               0.000000
union            106.512445
lwage            173.929670
expersq        17608.242825
occupation       739.222281
dtype: float64

对于我们的数据,我们需要删除实体假人,blackhisp,因为它们对于个人来说是恒定的。 此外,我们需要取消教育。 我们也不会使用职业,因为这可能会调节婚姻对工资的影响(可能是单身男性能够承担更多时间要求更高的职位)。 选择了我们将使用的功能后,是时候估计这个模型了。

要运行我们的固定效应模型,首先,让我们获取平均数据。 我们可以通过按个人对所有内容进行分组并取平均值来实现这一点。

Y = "lwage"
T = "married"
X = [T, "expersq", "union", "hours"]mean_data = data.groupby("nr")[X+[Y]].mean()
mean_data.head()

为了将数据围绕均值标准化(demean),我们需要将原始数据的索引设置为个体标识符,nr。 然后,我们可以简单地从一个数据集中减去对应的数据均值的数据集。

demeaned_data = (data.set_index("nr") # set the index as the person indicator[X+[Y]]- mean_data) # subtract the mean datademeaned_data.head()

mod = smf.ols(f"{Y} ~ {'+'.join(X)}", data=demeaned_data).fit()
mod.summary().tables[1]

如果我们相信固定效应消除了所有遗漏的变量偏差,那么这个模型告诉我们婚姻使男人的工资增加了 11%。 这个结果非常显着。 这里的一个细节是,对于固定效应模型,需要对标准误差进行聚类。 因此,我们可以使用库 linearmodels 并将参数 cluster_entity 设置为 True,而不是手动进行所有估计(这只是出于教学原因)。

from linearmodels.panel import PanelOLS
mod = PanelOLS.from_formula("lwage ~ expersq+union+married+hours+EntityEffects",data=data.set_index(["nr", "year"]))result = mod.fit(cov_type='clustered', cluster_entity=True)
result.summary.tables[1]

mod = smf.ols("lwage ~ expersq+union+married+hours+black+hisp+educ", data=data).fit()
mod.summary().tables[1]

这个模型是说婚姻使男人的工资增加了 14%。 比我们在固定效应模型中发现的效应要大一些。 这表明由于固定的个体因素(如智力和美貌)没有被添加到模型中,结果存在一些省略变量偏差。

这篇关于【因果推断python】28_面板数据和固定效应2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052780

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互