Python Pandas差异的差异

我正在尝试使用Python和Pandas执行Difference in Differences(使用面板数据和固定效果)分析.我没有经济学背景,我只是想过滤数据并运行我被告知的方法.但是,据我所知,我明白基本的diff-in-diffs模型如下所示:

enter image description here

即,我正在处理一个多变量模型.

下面是R中的一个简单示例:

https://thetarzan.wordpress.com/2011/06/20/differences-in-differences-estimation-in-r-and-stata/

可以看出,回归将一个因变量和树组观察值作为输入.

我的输入数据如下所示:

    Name    Permits_13  Score_13    Permits_14  Score_14    Permits_15  Score_15
0   P.S. 015 ROBERTO CLEMENTE   12.0    284 22  279 32  283
1   P.S. 019 ASHER LEVY 18.0    296 51  301 55  308
2   P.S. 020 ANNA SILVER    9.0 294 9   290 10  293
3   P.S. 034 FRANKLIN D. ROOSEVELT  3.0 294 4   292 1   296
4   P.S. 064 ROBERT SIMON   3.0 287 15  288 17  291
5   P.S. 110 FLORENCE NIGHTINGALE   0.0 313 3   306 4   308
6   P.S. 134 HENRIETTA SZOLD    4.0 290 12  292 17  288
7   P.S. 137 JOHN L. BERNSTEIN  4.0 276 12  273 17  274
8   P.S. 140 NATHAN STRAUS  13.0    282 37  284 59  284
9   P.S. 142 AMALIA CASTRO  7.0 290 15  285 25  284
10  P.S. 184M SHUANG WEN    5.0 327 12  327 9   327

通过一些研究,我发现这是使用Pandas的固定效果和面板数据的方法:

Fixed effect in Pandas or Statsmodels

我执行了一些转换来获取多索引数据:

rng = pandas.date_range(start=pandas.datetime(2013,1,1),periods=3,freq='A')
index = pandas.MultiIndex.from_product([rng,df['Name']],names=['date','id'])
d1 = numpy.array(df.ix[:,['Permits_13','Score_13']])
d2 = numpy.array(df.ix[:,['Permits_14','Score_14']])
d3 = numpy.array(df.ix[:,['Permits_15','Score_15']])
data = numpy.concatenate((d1,d2,d3),axis=0)
s = pandas.DataFrame(data,index=index)  
s = s.astype('float')

但是,我没有得到如何将所有这些变量传递给模型,例如可以在R中完成:

reg1 = lm(work ~ post93 + anykids + p93kids.interaction,data = etc)

这里,13,14,15代表2013年,2014年,2015年的数据,我认为应该用于创建一个小组.
我这样称呼模型:

reg  = PanelOLS(y=s['y'],x=s[['x']],time_effects=True)

这就是结果:

enter image description here

有人告诉我(经济学家)这似乎没有固定效应.

– 编辑 –

我想验证的是,考虑到时间,许可数量对得分的影响.许可证的数量是治疗,这是一种强化治疗.

可在此处找到代码示例:https://www.dropbox.com/sh/ped312ur604357r/AACQGloHDAy8I2C6HITFzjqza?dl=0.

最佳答案
似乎你需要的不是差异(DD)回归的差异.当您可以区分对照组和治疗组时,DD回归是相关的.一个标准的简化例子是对医学的评估.你把一群病人分成两组.其中一半没有得到任何结果:他们是对照组.另一半给予药物:他们是治疗组.从本质上讲,DD回归将捕获这样一个事实,即药物的实际效果不能直接衡量给予药物的人数是多少健康.直觉上,你想知道这些人是否比那些没有服用任何药物的人做得更好.这个结果可以通过添加另一个类别来改进:一个安慰剂,即给予看起来像药物但实际上不是……的东西的人,但这又是一个明确定义的组.最后但并非最不重要的是,要使DD回归真正合适,您需要确保组不是异构的,这可能会导致结果偏差.如果治疗组仅包括年轻且超级健康的人(因此一般更容易愈合),而对照组是一群老酗酒者,那么你的药检的情况就会很糟糕……

在你的情况下,如果我没有弄错的话,每个人都会在某种程度上受到“待遇”……所以你更接近一个标准的回归框架,在那里测量X对Y的影响(例如工资的智商).我知道你想衡量许可证数量对分数的影响(或者是另一种方式?-_-),你有经典的内生性来处理,即如果彼得比保罗更熟练,他会通常获得更多许可和更高的分数.所以你真正想要使用的是这样一个事实:随着时间的推移,相同的技能水平,彼得(分别是保罗)将被“给予”不同级别的许可证多年……而且你真的会衡量许可证的影响力得分……

我可能不会猜测,但我想坚持这样一个事实,即如果你没有付出足够的努力来理解/解释数据中发生了什么,有很多方法可以获得有偏见的,因此毫无意义的结果.关于技术细节,您的估计只有年固定效应(可能没有估计,但通过贬值考虑,因此未在输出中返回),因此您要做的是添加entity_effects = True.如果你想更进一步……我担心到目前为止,任何Python软件包中都没有很好地涵盖面板数据回归,(如果是计量经济学的参考,则包括statsmodels),所以如果你不愿意投资……我宁可建议使用R或Stata.同时,如果你需要一个固定效应回归,你也可以使用statsmodels(如果需要也允许聚类标准错误……):

import statsmodels.formula.api as smf
df = s.reset_index(drop = False)
reg = smf.ols('y ~ x + C(date) + C(id)',data = df).fit()
print(reg.summary())
# clustering standard errors at individual level
reg_cl = smf.ols(formula='y ~ x + C(date) + C(id)',data=df).fit(cov_type='cluster',cov_kwds={'groups': df['id']})
print(reg_cl.summary())
# output only coeff and standard error of x
print(u'{:.3f} ({:.3f})'.format(reg.params.ix['x'],reg.bse.ix['x']))
print(u'{:.3f} ({:.3f})'.format(reg_cl.params.ix['x'],reg_cl.bse.ix['x']))

关于计量经济学,您可能会获得更多/更好的Cross Validated答案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文适合有 Python 基础的小伙伴进阶学习 作者:pwwang 一、前言 本文基于开源项目: https://github.com/pwwang/python-import-system 补充扩展讲解,希望能够让读者一文搞懂 Python 的 import 机制。 1.1 什么是 import
前言 目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用subprocess调用系统命令,镜像体积也没有想象中增加特别多。 准备ssh私钥和known_ho
前言 当网络不稳定或应用页面加载有问题,可以设置等待,避免网络问题导致找不到元素等异常。 隐式等待 隐式等待设置的是最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束。 隐式等待在driver的整个生命周期都有效,初始化的时候设置一次即可。 # 隐式等待10秒 drive
前言 map()、reduce()、filter()是python的三个高阶函数。所谓高阶函数,指的是将函数作为参数并返回函数作为结果的函数。下面代码的sing_ready只是一个简单高阶函数示例: def ready(name): return f"ready,{name}!"
入门使用 # 示例代码 warframe = ["saryn", "wisp", "volt"] counts = [len(n) for n in warframe] for i,j in zip(warframe,counts): pr
前言 功能描述:批量重命名指定目录下的文件,文件名加前缀,默认格式为“目录名_原文件名”。 示例代码 import argparse import os import sys import logging def gen_args(): """ 说明 解析命令行参数 &
前言 常见的应用配置方式有环境变量和配置文件,对于微服务应用,还会从配置中心加载配置,比如nacos、etcd等,有的应用还会把部分配置写在数据库中。此处主要记录从环境变量、.env文件、.ini文件、.yaml文件、.toml文件、.json文件读取配置。 ini文件 ini文件格式一般如下: [
前言 在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例: { "code": 200, "data": {
前言 我们一般使用如下方式点击元素: elem = driver.find_element(...) elem.click() # 或者使用带等待条件的方式 elem = WebDriverWait(driver, 10).until(EC.xxx(...)) elem.click() 正常情况下,
前言 从环境变量和配置文件中获取配置参数,相关库: python-dotenv:第三方库,需要使用pip安装 configparser:标准库 示例代码 test.ini [mysql] host = "192.168.0.10" port = 3306 user = &quot
前言 Relative Locators,相对定位器,是Selenium 4引入的一个新的定位器,相对定位器根据源点元素去定位相对位置的其它元素。 相对定位方法其实是基于JavaScript的 getBoundingClientRect() 而实现,简单的页面还行,复杂页面中可能会定位到需要相同类型
简介 The pytest framework makes it easy to write small, readable tests, and can scale to support complex functional testing for applications and librari
简介 Faker库可用于随机生成测试用的虚假数据。 可生成的数据参考底部的参考链接。 安装: python -m pip install faker 快速入门 from faker import Faker # 实例化一个对象,本地化使用中国 fk - Faker(locale="zh_C
前言 原本应用的日志是全部输出到os的stdout,也就是控制台输出。因其它团队要求也要保留日志文件,便于他们用其他工具统一采集,另一方面还要保留控制台输出,便于出问题的时候自己直接看pod日志。具体需求如下: 日志支持同时控制台输出和文件输出 控制台的输出级别可以高点,比如WARNING,个人这边
按列从多个文件中构建 假设有两个csv文件,列不相同,需要整合为一个dataframe,使用glob模块: from glob import glob import pandas as pd # glob会返回任意排序的文件名,所以需要sort排序 some_files = sorted(glob(
简介 diagrams是python的一个第三方库,用于实现使用代码绘制架构图。 安装 依赖于 Graphviz,安装diagrams之前需要先安装 Graphviz(下载压缩包后,将bin目录添加到系统环境变量Path里即可)。 python3 -m pip install diagrams 快速
前言 最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。(比如看漫画) 主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果有大量图片文件,用WPS就
前言 版本: python:3.9 selenium:4.1.5 获取元素文本 text = driver.find_element(by=By.XPATH, value="").text 获取元素属性值 attr1 = driver.find_element(by=By.XPA
Python中有个内置的函数叫做 enumerate,可以在迭代时返回元素的索引。 # 示例代码01 warframe = ["saryn", "wisp", "volt"] for i,name in enumerate(warframe
前言 版本: python:3.9 selenium:4.1.5 浏览器:firefox 创建浏览器对象 from selenium import webdriver driver = webdriver.Firefox(executable_path=r"C:\software\sele