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

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

固定效应数据分析示例1 —投资与市场价值

公司投资的主要驱动力是什么?有大量的文献讨论了其驱动因素。Grunfeld认为,公司的市场价值是投资的主要解释和预测指标。在以下练习中,我将使用Grunfeld数据集(可在statsmodels.datasets中获得)来演示固定效果模型的使用。顺便说一句,Grunfeld数据集是计量经济学中的知名数据集,就像Machine Learning中的虹膜数据集一样。这篇学术文章“ 50岁时的Grunfeld数据”指出了它的广泛用途。

该数据包含11家公司中每家20年的数据:IBM,通用电气,美国钢铁,大西洋炼油,钻石比赛,西屋电气,通用汽车,固特异,克莱斯勒,联合石油和美国钢铁。在面板数据中,将“确定”和“年份”设置为索引。固定效果模型指定如下,其中单个公司因子为𝝆_i或在以下代码中称为`entity_effects。时间因子是𝝋_t或称为time_effects

image.png

或如下所示,其中D_j是公司i的虚拟变量,而I_t是t年的虚拟变量。

image.png

from statsmodels.datasets import grunfeld
data = grunfeld.load_pandas().data
data = data.set_index(["firm","year"])
print(data.head())

image.png

模块linearmodels提供PandelOLS进行固定效果模型。entity_effects=True表示模拟企业特定因素。这意味着为11家公司创建10(N-1)个虚拟变量。下面我展示了两种回归方法的代码。两者产生相同的结果。

# Coding method 1
from linearmodels.panel import PanelOLS
import statsmodels.api as sm
exog = sm.add_constant(gf[['value','capital']])
grunfeld_fe = PanelOLS(gf['invest'], exog, entity_effects=True, time_effects=False)
grunfeld_fe = grunfeld_fe.fit()
print(grunfeld_fe)
# Coding method 2
grunfeld_fe = PanelOLS.from_formula("invest ~ value + capital + EntityEffects", data=gf)                          
print(grunfeld_fe.fit())

image.png

“value”的系数在95%时具有统计学意义上的0.1101。因此,Grunfeld得出了因果关系,即高投资是由高市场价值驱动的。

下面的代码同时指定了公司特有的效果和时间效果。结论保持不变。

# Coding method 1
from linearmodels.panel import PanelOLS
import statsmodels.api as sm
exog = sm.add_constant(gf[['value','capital']])
grunfeld_fet = PanelOLS(gf['invest'], exog, entity_effects=True, time_effects=True)
grunfeld_fet = grunfeld_fe.fit()
print(grunfeld_fet)
# Coding method 2
grunfeld_fet = PanelOLS.from_formula("invest ~ value + capital + EntityEffects + TimeEffects", data=gf)                          
print(grunfeld_fet.fit())

image.png

固定收益数据分析示例2 –交通死亡率与啤酒税

更高的啤酒税是否有助于减少交通致死率?许多州降低了啤酒税,交通事故死亡率更高。我们可以说降低啤酒税会导致更高的死亡率吗?这种因果关系具有深远的政策含义。我将使用Stock&Watson广为接受的书籍“计量经济学概论”中的死亡数据集。

import pandas as pd
import numpy as np
import seaborn as sns
fatalities = pd.read_csv('/fatality.csv')
fatalities.head()

image.png

  • mrall = 车辆总死亡率
  • beertax = 酒精税
  • mlda = 最低法定饮酒年龄
  • jaild = 强制性入狱
  • comserd = 强制性社区服务
  • vmiles = 每位驾驶员的平均里程
  • unrate = 失业率
  • perinc = 人均个人收入

我将每年的数据生成平均值,以显示每年的平均啤酒税和死亡率。1982–1984年的平均啤酒税高于1986–1988年的啤酒税。

avg = fatalities.groupby('year')['mrall','beertax'].mean()

avg

image.png


我将使用`seaborn来显示相关性。

sns.set(style="darkgrid")
g = sns.jointplot("beertax", "mrall",
                    data=avg, kind="reg",
                    color="m", height=6)

image.png

我们可以建立任何因果关系吗?我将使用固定效果模型进行测试。下面,我演示了两个固定效果模型并用于讨论和汇总OLS。

  • 模型 1: 实体效果+时间效果
  • 模型 2: Entity_effects
  • 模型 3: 汇总OLS

image.png

或如下所示,其中D_j是状态i的虚拟变量,而I_t是状态t的虚拟变量。

image.png

下面对州的不随时间变化的变量(例如州文化,州居民对饮酒的态度(可能是不随时间进行变化)等)进行控制。对所有州随时间变化的遗漏变量的时效控制。例如,宏观经济条件或联邦政策措施在所有州都是通用的,但会随时间而变化。

您可能会询问如何确认需要固定效果的模型规范。这是通过可合并性测试Poolability Test)完成的。许多模块已经包含测试结果。用于F-test for poolability并显示输出。这是对没有固定效果的原假设的检验。模型1中的F-test是40.158,p值是0.0,因此我们可以拒绝原假设,并得出固定效果模型规格合适的结论。

模型1:实体效果+时间效果
# Coding method 1
from linearmodels.panel import PanelOLS
import statsmodels.api as sm
exog = sm.add_constant(fatalities[['beertax','mlda','jaild',
       'comserd','vmiles','unrate','perinc']])
fe = PanelOLS(fatalities['mrall'], exog, entity_effects=True, time_effects=True)
fe = fe.fit()
print(fe)
# Coding method 2
from linearmodels.panel import PanelOLS
fe = PanelOLS.from_formula("mrall ~ beertax + mlda + jaild
      + comserd + vmiles + unrate  + perinc + EntityEffects + TimeEffects",
      data=fatalities)                          
print(fe.fit())


模型1告诉我们,啤酒税与死亡率之间存在负相关关系(啤酒税系数为-.4649)。因此,我们可以得出因果关系,即较高的啤酒税会导致较低的死亡率。

image.png

模型2:Entity_effects

如何理解三个模型中的R-squared值?模型1中的R-squared为0.3577,高于模型2中的R-squared0.1286。这意味着模型1的拟合效果更好。模型3中的0.4662怎么样?尽管它比模型1和2的模型高得多,但是合并的OLS是一个错误指定的模型,如上面的公式(1)和(2)所述。由于模型3无法解决内生性问题,因此它无法帮助我们得出啤酒税和死亡率之间的因果关系。

# Coding method 1
from linearmodels.panel import PanelOLS
import statsmodels.api as sm
exog = sm.add_constant(fatalities[['beertax','mlda',
     'jaild','comserd','vmiles','unrate','perinc']])
fe2 = PanelOLS(fatalities['mrall'], exog,
     entity_effects=True, time_effects=False)
fe2 = fe2.fit()
print(fe2)
# Coding method 2
from linearmodels.panel import PanelOLS
fe2 = PanelOLS.from_formula("mrall ~ beertax + mlda +
    jaild + comserd + vmiles + unrate  + perinc + EntityEffects",
    data=fatalities)                          
print(fe2.fit())


image.png

模型3:汇总OLS
# Coding method 1
from linearmodels.panel import PanelOLS
import statsmodels.api as sm
exog = sm.add_constant(fatalities[['beertax','mlda',
    'jaild','comserd','vmiles','unrate','perinc']])
pooledOLS = PanelOLS(fatalities['mrall'], exog,
    entity_effects=False, time_effects=False)
pooledOLS = pooledOLS.fit()
print(pooledOLS)
# Coding method 2
from linearmodels.panel import PanelOLS
pooledOLS = PanelOLS.from_formula("mrall ~ beertax  +
    mlda + jaild + comserd + vmiles + unrate  + perinc ",
    data=fatalities)
print(pooledOLS.fit())


image.png

目录
相关文章
|
13天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
142 65
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
2月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
184 73
|
2月前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
90 21
|
2月前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
99 23
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
67 2
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
122 80
|
8天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
45 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
46 14

热门文章

最新文章