【Python实战因果推断】31_双重差分2

目录

Canonical Difference-in-Differences

Diff-in-Diff with Outcome Growth


Canonical Difference-in-Differences

差分法的基本思想是,通过使用受治疗单位的基线,但应用对照单位的结果(增长)演变,来估算缺失的潜在结果 E[Y(0)|D=1,Post=1]

\begin{aligned}E[Y(0)|D=1,Post=1]&=E[Y|D=1,Post=0]\\&+(E[Y|D=0,Post=1]-E[Y|D=0,Post=0])\end{aligned}

其中,用样本平均数代替右侧期望值,就可以估计出 E[Y(0)|D=1,Post=1]。之所以称其为 "差异-差分(DID)估计法",是因为如果将前述表达式替换为 ATT 中的 E[Y(0)|D=1,Post=1],就会得到 "差异中的差异":

\begin{aligned}ATT&=(E[Y|D=1,Post=1]-E[Y|D=1,Post=0])\\&-(E[Y|D=0,Post=1]-E[Y|D=0,Post=0])\end{aligned}

不要被这些期望吓倒。以其典型形式,您可以很容易地得到 DID 估计值。首先,将数据的时间段分为干预前和干预后。然后,将单位分为治疗组和对照组。最后,您可以简单地计算所有四个单元的平均值:干预前与对照组、干预前与干预组、干预后与对照组、干预后与干预组:

 did_data = (mkt_data
 .groupby(["treated", "post"])
 .agg({"downloads":"mean", "date": "min"}))
 did_data

这些就是获得 DID 估计值所需的全部数据。对于干预基线 E[Y|D=1,Post=0],您可以使用 did_data.loc[1] 将其索引到干预中,然后使用 follow up .loc[0] 将其索引到干预前。要得到对照组结果的变化,即 E[Y|D=0,Post=1]-E[Y|D=0,Post=0] ,可以用 did_data.loc[0] 索引到对照组,用 .diff() 计算差值,然后用后续 .loc[1] 索引到最后一行。将对照组趋势与治疗基线相加,就得到了反事实 E[ Y(0) |D=1,Post=1 ] 的估计值。要得到 ATT,可以用干预后期间受治疗者的平均结果减去 ATT:

 y0_est = (did_data.loc[1].loc[0, "downloads"] # treated baseline
 # control evolution
 + did_data.loc[0].diff().loc[1, "downloads"])
 att = did_data.loc[1].loc[1, "downloads"] - y0_est
 att
 
 0.6917359536407233

如果将这个数字与真实 ATT(过滤干预单位和干预后时期)进行比较,可以发现 DID 估计值与其试图估计的结果相当接近:

 mkt_data.query("post==1").query("treated==1")["tau"].mean()
 
 0.7660316402518457

Diff-in-Diff with Outcome Growth

对 DID 的另一个非常有趣的理解是,它是在时间维度上对数据进行区分。让我们把单位 i 在不同时间的结果差异定义为 \Delta y_{i}=E\Big[y_{i}\Big|t>T_{pre}\Big]-E\Big[y_{i}\Big|t\leq T_{pre}\Big] 。现在,让我们把按时间和单位划分的原始数据转换成一个带有 Δyi 的数据框架,其中时间维度已被区分出来:

 pre = mkt_data.query("post==0").groupby("city")["downloads"].mean()
 post = mkt_data.query("post==1").groupby("city")["downloads"].mean()
 delta_y = ((post - pre)
 .rename("delta_y")
 .to_frame()
 # add the treatment dummy
 .join(mkt_data.groupby("city")["treated"].max()))
 delta_y.tail()

接下来,您可以使用潜在的结果符号来根据Δy来定义ATT ATT=E[\Delta y_1-\Delta y_0],

DID试图通过用控制单元的平均值替换Δy0来识别哪个控制单元:ATT=E[\Delta y|D=1]-E[\Delta y|D=0]​​​​​​​

如果你用样本平均值来代替这些期望,你会看到你得到了和之前相同的估计:

 (delta_y.query("treated==1")["delta_y"].mean()
 - delta_y.query("treated==0")["delta_y"].mean())
 
 0.6917359536407155

这是对 DID 的一个有趣的解释,因为它非常清楚地说明了它的假设,即 E[\Delta y_{0}]=E[\Delta y|D=0],但我们稍后会进一步讨论这个问题。

由于这些都是非常专业的数学知识,我想通过绘制治疗组和对照组随时间变化的观察结果,以及治疗组的估计反事实结果,让大家对 DID 有更直观的理解。在下图中,E[Y(0)|D=1] 的 DID 估计结果以虚线表示。它是通过将对照组的轨迹应用到干预基线中得到的。因此,估计的 ATT 将是估计的反事实结果 Y(0) 与观察到的结果 Y(1) 之间的差值,两者均处于干预后时期(圆点与十字之间的差值):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/793642.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

加减计数器

目录 描述 输入描述: 输出描述: 参考代码 描述 请编写一个十进制计数器模块,当mode信号为1,计数器输出信号递增,当mode信号为0,计数器输出信号递减。每次到达0,给出指示信号zero。 模块的接…

昇思25天学习打卡营第18天|MindNLP ChatGLM-6B StreamChat

MindNLP ChatGLM-6B StreamChat MindNLP ChatGLM-6B StreamChat是基于MindNLP框架和ChatGLM-6B模型实现的聊天应用,利用自然语言处理技术,实现与用户的自然语言交流。这样的应用可以广泛应用于智能客服、在线助理和社交聊天等场景。 在当前技术环境下&a…

鸿蒙语言基础类库:【@ohos.application.testRunner (TestRunner)】 测试

TestRunner TestRunner模块提供了框架测试的能力。包括准备单元测试环境、运行测试用例。 如果您想实现自己的单元测试框架,您必须继承这个类并覆盖它的所有方法。 说明: 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-…

法律咨询援助网站

1 项目介绍 1.1 摘要 随着互联网技术的飞速发展,公众对于便捷、高效的法律咨询服务需求日益增长。传统的法律咨询方式已难以满足人们即时性、多样化的咨询需求,促使法律咨询援助网站应运而生。这些平台旨在通过数字化手段,为用户提供法律知…

教务管理系统

教务管理系统 For Free 本项目免费获取,获取方式在后台发送教务管理系统。系统的实现比较简单,主要是对数据库的读取和前端数据调用的表格展示,并没有太多的交互,比较适合初学者学习Flask和数据库的使用,所以免费获取…

8626 原子量计数

分析: 1. **读取输入**:首先,我们需要读取输入中的第一行,了解有多少个化学式需要处理。之后,对于每个化学式,我们逐行读取并进行处理。 2. **解析化学式**:对于每个化学式,我们需要…

如何在Ubuntu环境下使用加速器配置Docker环境

一、安装并打开加速器 这个要根据每个加速器的情况来安装并打开,一般是会开放一个代理端口,比如1087 二、安装Docker https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script 三、配置Docker使用加速器 3.1 修改配置…

如何处理 PostgreSQL 中由于表锁定导致的并发访问问题?

文章目录 一、表锁定的类型二、表锁定导致的并发访问问题三、解决方案(一)使用合适的锁定模式(二)优化事务处理(三)避免不必要的锁定(四)使用索引(五)监控和分…

Protobuf: 大数据开发中的高效数据传输利器

作为一名大数据开发者,我经常需要处理海量的数据传输和存储。在这个过程中,选择一个高效、可靠的数据序列化工具至关重要。今天,我想和大家分享一下我在项目中使用 Protobuf 的经历。 目录 故事背景Protobuf 简介优点: 实战案例示…

在【Open3D】点云世界中精准定位,绘制立方体标记特定点位

Open3D精准定位点云特定点,绘制醒目立方体标记,提升数据解读效率与直观性。 Open3D是一个开源的跨平台计算机视觉库,它为开发人员提供了一个易于使用且高性能的3D数据处理平台。 # pcd:传入原始点云图 # point1:要进…

【HarmonyOS】获取通讯录信息

【HarmonyOS】获取通讯录信息 一、问题背景: 在Android和IOS中,获取手机通讯录信息的方式,一般是申请通讯录权限后,获得手机所有的通讯录列表信息。 在鸿蒙中,因为权限方式安全性提高的变更:将用户权限限…

springboot 旅游导航系统-计算机毕业设计源码69476

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后,是时候转换一下思路,回到平均干预效果上来了。在接下来的几章中,您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位,可以…

347. 前 K 个高频元素(中等)

347. 前 K 个高频元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:347. 前 K 个高频元素 2.详细题解 寻找出现频率前 k k k高的元素,因此需要先统计各个元素出现的次数,该步骤时间复杂度为 O ( n ) O(n) O(n)…

前端-Cookie篇

文章目录 一、由来什么是Cookie?特点Cookie的类型 二、原理三、Cookie生成机制客户端设置案例 四、属性五、缺陷最后分享一段自己工作中封装的一些关于cookie的公众方法✒️总结 前端Cookie是Web开发中非常重要的一部分,它是服务器发送到用户浏览器并保存…

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能,特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件: 迅捷文字识别 这是一款非…

对接高德开放平台API

高德开放平台API: https://lbs.amap.com/ 一、天气查询 天气查询: https://lbs.amap.com/api/webservice/guide/api/weatherinfo adcode城市码表下载: https://lbs.amap.com/api/webservice/download Component public class WeatherUtil {Resourceprivate GdCon…

如何使用Python在企业微信中发送测试结果?操作看这里!

在日常的自动化测试工作中,一般会需要把测试结果同步到工作群里,方便信息同步。那么我们今天就使用企业微信和Pythonrequests库来演示一下具体如何操作吧! 01 准备 开始之前,我们应该确保已经安装了python环境,并且要…

【Java16】多态

向上类型转换 对于引用变量,在程序中有两种形态:一种是编译时类型,这种引用变量的类型在声明它的时候就决定了;另一种则是运行时类型,这种变量的类型由实际赋给它的对象决定。 当一个引用变量的编译时类型和运行时类…

LabVIEW电容器充放电监测系统

概述 为了对车用超级电容器的特性进行研究,确保其在工作时稳定可靠并有效发挥性能优势,设计了一套车用超级电容器充放电监测系统。该系统通过利用传感器、USB数据采集卡、可调直流稳压电源、电子负载以及信号调理电路,完成对各信号的采集和超…